Skip to content

Commit 5d449bc

Browse files
committed
fixed a bug and a portability issue
1 parent 3ae5390 commit 5d449bc

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

kexpr.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,14 @@ static void ke_func1_abs(ke1_t *p, ke1_t *q) { if (p->vtype == KEV_INT) p->i = a
160160
* Parser *
161161
**********/
162162

163+
static inline char *mystrndup(const char *src, int n)
164+
{
165+
char *dst;
166+
dst = (char*)calloc(n + 1, 1);
167+
strncpy(dst, src, n);
168+
return dst;
169+
}
170+
163171
// parse a token except "(", ")" and ","
164172
static ke1_t ke_read_token(char *p, char **r, int *err, int last_is_val) // it doesn't parse parentheses
165173
{
@@ -170,7 +178,7 @@ static ke1_t ke_read_token(char *p, char **r, int *err, int last_is_val) // it d
170178
for (; *p && (*p == '_' || isalnum(*p)); ++p);
171179
if (*p == '(') e.ttype = KET_FUNC, e.n_args = 1;
172180
else e.ttype = KET_VAL, e.vtype = KEV_REAL;
173-
e.name = strndup(q, p - q);
181+
e.name = mystrndup(q, p - q);
174182
e.i = 0, e.r = 0.;
175183
*r = p;
176184
} else if (isdigit(*p)) { // a number
@@ -195,7 +203,7 @@ static ke1_t ke_read_token(char *p, char **r, int *err, int last_is_val) // it d
195203
if (*p == '\\') ++p; // escaping
196204
if (*p == c) {
197205
e.ttype = KET_VAL, e.vtype = KEV_STR;
198-
e.s = strndup(q + 1, p - q - 1);
206+
e.s = mystrndup(q + 1, p - q - 1);
199207
*r = p + 1;
200208
} else *err |= KEE_UNQU, *r = p;
201209
} else { // an operator
@@ -401,14 +409,14 @@ void ke_destroy(kexpr_t *ke)
401409
free(ke->e); free(ke);
402410
}
403411

404-
int ke_set_int(kexpr_t *ke, const char *var, int64_t x)
412+
int ke_set_int(kexpr_t *ke, const char *var, int64_t y)
405413
{
406414
int i, n = 0;
407-
double xx = (double)x;
415+
double yy = (double)y;
408416
for (i = 0; i < ke->n; ++i) {
409417
ke1_t *e = &ke->e[i];
410418
if (e->ttype == KET_VAL && e->name && strcmp(e->name, var) == 0)
411-
e->i = x, e->r = xx, e->ttype = KEV_INT, e->assigned = 1, ++n;
419+
e->i = y, e->r = yy, e->vtype = KEV_INT, e->assigned = 1, ++n;
412420
}
413421
return n;
414422
}
@@ -420,7 +428,7 @@ int ke_set_real(kexpr_t *ke, const char *var, double x)
420428
for (i = 0; i < ke->n; ++i) {
421429
ke1_t *e = &ke->e[i];
422430
if (e->ttype == KET_VAL && e->name && strcmp(e->name, var) == 0)
423-
e->r = x, e->i = xx, e->ttype = KEV_REAL, e->assigned = 1, ++n;
431+
e->r = x, e->i = xx, e->vtype = KEV_REAL, e->assigned = 1, ++n;
424432
}
425433
return n;
426434
}
@@ -467,9 +475,7 @@ int ke_set_default_func(kexpr_t *ke)
467475
{
468476
int n = 0;
469477
n += ke_set_real_func1(ke, "exp", exp);
470-
n += ke_set_real_func1(ke, "exp2", exp2);
471478
n += ke_set_real_func1(ke, "log", log);
472-
n += ke_set_real_func1(ke, "log2", log2);
473479
n += ke_set_real_func1(ke, "log10", log10);
474480
n += ke_set_real_func1(ke, "sqrt", sqrt);
475481
n += ke_set_real_func1(ke, "sin", sin);

0 commit comments

Comments
 (0)