61 bool isNegative =
FALSE;
66 while (*(*expr) ==
' ')
70 if (*(*expr) ==
'-') {
74 if (*(*expr) ==
'+') {
79 if (*(*expr) ==
'(') {
83 if (*(*expr) !=
')') {
91 return isNegative ? -res : res;
95 res = strtol(*expr, &end_ptr, 0);
96 if (end_ptr == *expr) {
104 return isNegative ? -res : res;
116 while (*(*expr) ==
' ')
121 if (op !=
'/' && op !=
'*' && op !=
'%')
133 num1 = (int64_t)((
double)num1 / (double)num2);
135 else if (op ==
'*') {
152 while (*(*expr) ==
' ')
155 if (op !=
'-' && op !=
'+')
174 while (*(*expr) ==
' ')
177 if (op !=
'<' && op !=
'>')
180 if (*(*expr) != op) {
203 while (*(*expr) ==
' ')
222 while (*(*expr) ==
' ')
261 #define TEST_EXPRESSION(EXPR) assert(c_ee_exprEval(#EXPR) == (EXPR) && c_ee_getErr() == EEE_NO_ERROR) 262 void c_ee_testExprEval(
void) {
285 TEST_EXPRESSION(0x1080 | (0x3 << 8));
286 TEST_EXPRESSION(0x8180 + (4 * 4));
287 TEST_EXPRESSION(0xF * 3 % 2);
288 TEST_EXPRESSION((0xF * 3) % 2);
289 TEST_EXPRESSION(0xF * (3 % 2));
290 TEST_EXPRESSION(0xF % 5 * 2);
291 TEST_EXPRESSION((0xF % 5) * 2);
292 TEST_EXPRESSION(0xF % (5 * 2));
360 if (expression == NULL || dest == NULL)
363 char *expr_mod_tmp =
c_malloc(maxsize);
364 if (expr_mod_tmp == NULL)
367 char wildcard[] =
"idx";
368 size_t wcnchar =
sizeof(wildcard) - 1;
372 strncat(dest, expression, maxsize - 1);
374 while((ptr = strstr(dest, wildcard)) != NULL) {
377 snprintf(expr_mod_tmp, maxsize,
"%s%"PRIi32
"%s", dest, value, (ptr + wcnchar));
379 strncat(dest, expr_mod_tmp, maxsize - 1);
387 size_t originalsize = strlen(expression);
388 const size_t additionalsize = 20;
389 size_t totalsize = originalsize + additionalsize;
390 char *expr_mod =
c_malloc(totalsize);
391 if (expr_mod == NULL)
c_ee_err_t c_ee_getErr(void)
int64_t ParseAtom(const char **expr)
const char * c_ee_getErrPos(void)
int64_t c_ee_exprEval(const char *expr)
int64_t ParseShiftands(const char **expr)
int64_t ParseAND_ands(const char **expr)
void * c_malloc(size_t size)
Generic wrappers to platform-dependent functions.
Tools to compute the numeric result of a string.
int64_t ParseFactors(const char **expr)
void c_ee_substituteIdxExpression(const char *expression, int32_t value, char *dest, size_t maxsize)
#define c_use_decl_annotations
int64_t ParseOR_ands(const char **expr)
int32_t c_ee_modifyAndEvaluateExpression(const char *expression, int32_t idx, int64_t *result)
int64_t ParseSummands(const char **expr)