Lines Matching defs:calculator
25 int CalculatorInit(LogicCalculator *calculator, int dataNumber, int dataUnit, int needCondition)
27 PARAM_CHECK(calculator != NULL, return -1, "Invalid param");
34 calculator->data = (char *)calloc(1, dataSize);
35 PARAM_CHECK(calculator->data != NULL, return -1, "Failed to malloc for calculator");
36 calculator->dataNumber = dataNumber;
37 calculator->endIndex = 0;
38 calculator->dataUnit = dataUnit;
41 calculator->conditionName = calculator->data + dataSize;
43 calculator->conditionContent = calculator->data + dataSize;
45 calculator->inputName = calculator->data + dataSize;
47 calculator->inputContent = calculator->data + dataSize;
49 calculator->readContent = calculator->data + dataSize;
50 return memset_s(calculator->triggerContent,
51 sizeof(calculator->triggerContent), 0, sizeof(calculator->triggerContent));
54 void CalculatorFree(LogicCalculator *calculator)
56 PARAM_CHECK(calculator != NULL, return, "Invalid param");
57 if (calculator->data != NULL) {
58 free(calculator->data);
60 calculator->data = NULL;
63 static void CalculatorClear(LogicCalculator *calculator)
65 PARAM_CHECK(calculator != NULL, return, "Invalid param");
66 calculator->endIndex = 0;
69 static int CalculatorPushChar(LogicCalculator *calculator, char data)
71 PARAM_CHECK(calculator != NULL, return -1, "Invalid param");
72 PARAM_CHECK(calculator->endIndex < calculator->dataNumber, return -1, "More data for calculator support");
73 PARAM_CHECK(sizeof(char) == calculator->dataUnit, return -1, "More data for calculator support");
74 calculator->data[calculator->endIndex++] = data;
78 static int CalculatorPopChar(LogicCalculator *calculator, char *data)
80 PARAM_CHECK(calculator != NULL, return -1, "Invalid param");
81 PARAM_CHECK(calculator->endIndex < calculator->dataNumber, return -1, "More data for calculator support");
82 if (calculator->endIndex == 0) {
85 *data = calculator->data[--calculator->endIndex];
89 static int CalculatorPush(LogicCalculator *calculator, const void *data)
91 PARAM_CHECK(calculator != NULL, return -1, "Invalid param");
92 PARAM_CHECK(calculator->endIndex < calculator->dataNumber, return -1, "More data for calculator support");
93 char *tmpData = (char *)calculator->data + calculator->dataUnit * calculator->endIndex;
94 int ret = memcpy_s(tmpData, calculator->dataUnit, data, calculator->dataUnit);
96 calculator->endIndex++;
100 static int CalculatorPop(LogicCalculator *calculator, void *data)
102 PARAM_CHECK(calculator != NULL && data != NULL, return -1, "Invalid param");
103 PARAM_CHECK(calculator->endIndex < calculator->dataNumber, return -1, "More data for calculator support");
104 if (calculator->endIndex == 0) {
107 char *tmpData = (char *)calculator->data + calculator->dataUnit * (calculator->endIndex - 1);
108 int ret = memcpy_s(data, calculator->dataUnit, tmpData, calculator->dataUnit);
110 calculator->endIndex--;
114 static int CalculatorLength(const LogicCalculator *calculator)
116 PARAM_CHECK(calculator != NULL, return 0, "Invalid param");
117 return calculator->endIndex;
131 static int HandleOperationOr(LogicCalculator *calculator, char *prefix, uint32_t *prefixIndex, uint32_t prefixLen)
135 if (CalculatorLength(calculator) == 0) {
136 CalculatorPushChar(calculator, '|');
139 CalculatorPopChar(calculator, &e);
141 CalculatorPushChar(calculator, e);
146 } while (CalculatorLength(calculator) > 0 && e != '(');
147 CalculatorPushChar(calculator, '|');
167 static int ComputeSubCondition(const LogicCalculator *calculator, LogicData *data, const char *condition)
172 uint32_t triggerContentSize = strlen(calculator->triggerContent);
176 if (strncmp(condition + data->startIndex, calculator->triggerContent, triggerContentSize) == 0) {
182 data->endIndex - data->startIndex, 0, calculator->conditionName, SUPPORT_DATA_BUFFER_MAX);
185 strlen(calculator->conditionName) + 1, calculator->conditionContent, SUPPORT_DATA_BUFFER_MAX);
188 if ((calculator->inputName != NULL) && (strcmp(calculator->conditionName, calculator->inputName) == 0)) {
189 return CompareValue(calculator->conditionContent, calculator->inputContent);
190 } else if (strlen(calculator->conditionName) > 0) {
192 ret = SystemReadParam(calculator->conditionName, calculator->readContent, &len);
196 return CompareValue(calculator->conditionContent, calculator->readContent);
219 int ComputeCondition(LogicCalculator *calculator, const char *condition)
221 PARAM_CHECK(calculator != NULL && condition != NULL, return -1, "Invalid calculator");
226 CalculatorClear(calculator);
232 int ret = CalculatorPop(calculator, (void*)&data2);
233 int ret1 = CalculatorPop(calculator, (void*)&data1);
236 ret = ComputeSubCondition(calculator, &data1, condition);
241 (ComputeSubCondition(calculator, &data2, condition) == 1)) {
244 ret = CalculatorPush(calculator, (void *)&data1);
255 int ret = CalculatorPush(calculator, (void *)&data1);
266 int ret = CalculatorPop(calculator, &data1);
267 PARAM_CHECK(ret == 0, return -1, "Invalid calculator");
269 return ComputeSubCondition(calculator, &data1, condition);
280 LogicCalculator calculator;
281 PARAM_CHECK(CalculatorInit(&calculator, MAX_CALC_PARAM, 1, 0) == 0, return -1, "Failed to init calculator");
285 CalculatorPopChar(&calculator, &e);
289 CalculatorFree(&calculator); return -1, "Invalid prefix");
290 CalculatorPopChar(&calculator, &e);
294 CalculatorFree(&calculator); return -1, "Invalid condition");
295 ret = HandleOperationOr(&calculator, prefix, &prefixIndex, prefixLen);
297 CalculatorFree(&calculator); return -1, "Invalid prefix");
301 CalculatorFree(&calculator); return -1, "Invalid condition");
303 CalculatorPushChar(&calculator, condition[curr]);
306 CalculatorPushChar(&calculator, condition[curr]);
312 CalculatorFree(&calculator); return -1, "Invalid prefixIndex");
315 while (CalculatorLength(&calculator) > 0) {
316 CalculatorPopChar(&calculator, &e);
319 CalculatorFree(&calculator);
323 CalculatorFree(&calculator);