ExpressionEvaluator.c revision 4a68b3365c8c50aa93505e99ead2565ab73dcdb0
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
29ESR_ReturnCode EE_Init(ExpressionEvaluator** self)
30{
31  return ESR_SUCCESS;
32}
33
34ESR_ReturnCode EE_Free(ExpressionEvaluator* self)
35{
36  return ESR_SUCCESS;
37}
38
39ESR_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;
58CLEANUP:
59  return rc;
60}
61
62ESR_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
96ESR_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
112ESR_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