@@ -160,6 +160,14 @@ static void ke_func1_abs(ke1_t *p, ke1_t *q) { if (p->vtype == KEV_INT) p->i = a
160
160
* Parser *
161
161
**********/
162
162
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
+
163
171
// parse a token except "(", ")" and ","
164
172
static ke1_t ke_read_token (char * p , char * * r , int * err , int last_is_val ) // it doesn't parse parentheses
165
173
{
@@ -170,7 +178,7 @@ static ke1_t ke_read_token(char *p, char **r, int *err, int last_is_val) // it d
170
178
for (; * p && (* p == '_' || isalnum (* p )); ++ p );
171
179
if (* p == '(' ) e .ttype = KET_FUNC , e .n_args = 1 ;
172
180
else e .ttype = KET_VAL , e .vtype = KEV_REAL ;
173
- e .name = strndup (q , p - q );
181
+ e .name = mystrndup (q , p - q );
174
182
e .i = 0 , e .r = 0. ;
175
183
* r = p ;
176
184
} 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
195
203
if (* p == '\\' ) ++ p ; // escaping
196
204
if (* p == c ) {
197
205
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 );
199
207
* r = p + 1 ;
200
208
} else * err |= KEE_UNQU , * r = p ;
201
209
} else { // an operator
@@ -401,14 +409,14 @@ void ke_destroy(kexpr_t *ke)
401
409
free (ke -> e ); free (ke );
402
410
}
403
411
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 )
405
413
{
406
414
int i , n = 0 ;
407
- double xx = (double )x ;
415
+ double yy = (double )y ;
408
416
for (i = 0 ; i < ke -> n ; ++ i ) {
409
417
ke1_t * e = & ke -> e [i ];
410
418
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 ;
412
420
}
413
421
return n ;
414
422
}
@@ -420,7 +428,7 @@ int ke_set_real(kexpr_t *ke, const char *var, double x)
420
428
for (i = 0 ; i < ke -> n ; ++ i ) {
421
429
ke1_t * e = & ke -> e [i ];
422
430
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 ;
424
432
}
425
433
return n ;
426
434
}
@@ -467,9 +475,7 @@ int ke_set_default_func(kexpr_t *ke)
467
475
{
468
476
int n = 0 ;
469
477
n += ke_set_real_func1 (ke , "exp" , exp );
470
- n += ke_set_real_func1 (ke , "exp2" , exp2 );
471
478
n += ke_set_real_func1 (ke , "log" , log );
472
- n += ke_set_real_func1 (ke , "log2" , log2 );
473
479
n += ke_set_real_func1 (ke , "log10" , log10 );
474
480
n += ke_set_real_func1 (ke , "sqrt" , sqrt );
475
481
n += ke_set_real_func1 (ke , "sin" , sin );
0 commit comments