1 /*---------------------------------------------------------------------------*
2 * ExpressionEvaluator.c *
3 * *
4 * Copyright 2007, 2008 Nuance Communciations, Inc. *
5 * *
6 * Licensed under the Apache License, Version 2.0 (the 'License'); *
7 * you may not use this file except in compliance with the License. *
8 * *
9 * You may obtain a copy of the License at *
10 * http://www.apache.org/licenses/LICENSE-2.0 *
11 * *
12 * Unless required by applicable law or agreed to in writing, software *
13 * distributed under the License is distributed on an 'AS IS' BASIS, *
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
15 * See the License for the specific language governing permissions and *
16 * limitations under the License. *
17 * *
18 *---------------------------------------------------------------------------*/
19
20 #include "SR_ExpressionEvaluator.h"
21 #include "LCHAR.h"
22 #include "plog.h"
23
24
25
26 //static const char* MTAG = __FILE__;
27
28
EE_Init(ExpressionEvaluator ** self)29 ESR_ReturnCode EE_Init(ExpressionEvaluator** self)
30 {
31 return ESR_SUCCESS;
32 }
33
EE_Free(ExpressionEvaluator * self)34 ESR_ReturnCode EE_Free(ExpressionEvaluator* self)
35 {
36 return ESR_SUCCESS;
37 }
38
EE_concat(LCHAR * name,LCHAR ** operands,size_t opCount,void * data,LCHAR * resultBuf,size_t * resultLen)39 ESR_ReturnCode EE_concat(LCHAR* name, LCHAR** operands, size_t opCount, void* data, LCHAR* resultBuf, size_t* resultLen)
40 {
41 size_t i, opLen;
42 ESR_ReturnCode rc;
43
44 if (operands == NULL || resultBuf == NULL || resultLen == NULL)
45 {
46 PLogError(L("ESR_INVALID_ARGUMENT"));
47 return ESR_INVALID_ARGUMENT;
48 }
49 *resultLen = 0;
50 for (i = 0; i < opCount; ++i)
51 {
52 opLen = LSTRLEN(operands[i]);
53 MEMCHK(rc, (*resultLen + opLen), MAX_STRING_LEN);
54 LSTRCAT(resultBuf, operands[i]);
55 *resultLen += opLen;
56 }
57 return ESR_SUCCESS;
58 CLEANUP:
59 return rc;
60 }
61
EE_conditional(LCHAR * name,LCHAR ** operands,size_t opCount,void * data,LCHAR * resultBuf,size_t * resultLen)62 ESR_ReturnCode EE_conditional(LCHAR* name, LCHAR** operands, size_t opCount, void* data, LCHAR* resultBuf, size_t* resultLen)
63 {
64 if (operands == NULL || resultBuf == NULL || resultLen == NULL)
65 {
66 PLogError(L("ESR_INVALID_ARGUMENT"));
67 return ESR_INVALID_ARGUMENT;
68 }
69
70 if (!LSTRCMP(operands[0], UNDEFINED_SYMBOL) || !operands[0] ||
71 !LSTRCMP(operands[0], FALSE_SYMBOL))
72 {
73 if (strlen(operands[2]) >= *resultLen)
74 {
75 PLogError("EE_conditional overflow error %d<%d\n", *resultLen, strlen(operands[2]));
76 *resultLen = strlen(operands[2]);
77 return ESR_BUFFER_OVERFLOW;
78 }
79 LSTRCPY(resultBuf, operands[2]);
80 }
81 else
82 {
83 if (strlen(operands[1]) >= *resultLen)
84 {
85 PLogError("EE_conditional overflow error %d<%d\n", *resultLen, strlen(operands[1]));
86 *resultLen = strlen(operands[1]);
87 return ESR_BUFFER_OVERFLOW;
88 }
89 LSTRCPY(resultBuf, operands[1]);
90 }
91 *resultLen = LSTRLEN(resultBuf);
92 return ESR_SUCCESS;
93 }
94
95
EE_add(LCHAR * name,LCHAR ** operands,size_t opCount,void * data,LCHAR * resultBuf,size_t * resultLen)96 ESR_ReturnCode EE_add(LCHAR* name, LCHAR** operands, size_t opCount, void* data, LCHAR* resultBuf, size_t* resultLen)
97 {
98 size_t i, sum;
99
100 if (operands == NULL || resultBuf == NULL || resultLen == NULL)
101 {
102 PLogError(L("ESR_INVALID_ARGUMENT"));
103 return ESR_INVALID_ARGUMENT;
104 }
105 sum = 0;
106 for (i = 0; i < opCount; ++i)
107 sum += atoi(operands[i]);
108
109 return litostr(sum, resultBuf, resultLen, BASE_10);
110 }
111
EE_subtract(LCHAR * name,LCHAR ** operands,size_t opCount,void * data,LCHAR * resultBuf,size_t * resultLen)112 ESR_ReturnCode EE_subtract(LCHAR* name, LCHAR** operands, size_t opCount, void* data, LCHAR* resultBuf, size_t* resultLen)
113 {
114 size_t i;
115 int diff;
116
117 if (operands == NULL || resultBuf == NULL || resultLen == NULL)
118 {
119 PLogError(L("ESR_INVALID_ARGUMENT"));
120 return ESR_INVALID_ARGUMENT;
121 }
122 diff = atoi(operands[0]);
123 for (i = 1; i < opCount; ++i)
124 diff -= atoi(operands[i]);
125
126 return litostr(diff, resultBuf, resultLen, BASE_10);
127 }
128