{
int ret;
char *arith_res;
- ret = parse_arith( name, &tail, &arith_res );
+ ret = parse_arith ( name, &tail, &arith_res );
if( ret < 0 ) {
free ( expcmd );
}
tmp = expcmd;
- new_len = asprintf( &expcmd, "%s%s%s", head, arith_res, tail );
+ new_len = asprintf ( &expcmd, "%s%s%s", head, arith_res, tail );
free ( tmp );
if ( new_len < 0 )
return NULL;
#define SEP1 -1
#define SEP2 -1, -1
+#ifndef __ARITH_TEST__
+#define EPARSE EUNIQ_01
+#define EDIV0 EUNIQ_02
+#define ENOOP EUNIQ_03
+#define EWRONGOP EUNIQ_04
+#else
+#define EPARSE 1
+#define EDIV0 2
+#define ENOOP 3
+#define EWRONGOP 4
+#endif
+
char *inp, *prev, *orig;
int tok;
int err_val;
static void skip ( int ch ) {
if ( !accept ( ch ) ) {
- err_val = -1;
+ err_val = -EPARSE;
}
}
t = isnum ( *buffer, &num );
free ( *buffer );
if ( t == 0 ) { /* Trying to do a -string, which should not be permitted */
- return ( err_val = -4 );
+ return ( err_val = -EWRONGOP );
}
return ( ( asprintf ( buffer, "%ld", -num ) < 0 ) ? (err_val = -ENOMEM ) : 0 );
}
input();
return ( ( asprintf ( buffer, "%ld", num ) < 0) ? (err_val = -ENOMEM ) : 0 );
}
- return ( err_val = -1 );
+ return ( err_val = -EPARSE );
}
if ( tok == TOK_STRING ) {
*buffer = tok_value.str_value;
input();
return 0;
}
- return ( err_val = -1 );
+ return ( err_val = -EPARSE );
}
static int eval(int op, char *op1, char *op2, char **buffer) {
bothints = 0;
if ( op <= 17 && ! bothints ) {
- return ( err_val = -4 );
+ return ( err_val = -EWRONGOP );
}
switch(op)
if(rhs != 0)
value = lhs / rhs;
else {
- return ( err_val = -2 );
+ return ( err_val = -EDIV0 );
}
break;
case 4:
value = strcmp ( op1, op2 ) == 0;
break;
default: /* This means the operator is in the op_table, but not defined in this switch statement */
- return ( err_val = -3 );
+ return ( err_val = -ENOOP );
}
return ( ( asprintf(buffer, "%ld", value) < 0) ? ( err_val = -ENOMEM ) : 0 );
}
if ( tok < MIN_TOK + 2 ) {
lc = NULL;
} else {
- return ( err_val = -1 );
+ return ( err_val = -EPARSE );
}
}
if ( tok < MIN_TOK ) {
if ( lc )
free(lc);
- return ( err_val = -1 );
+ return ( err_val = -EPARSE );
}
if ( op_prio[tok - MIN_TOK] <= prio - ( tok - MIN_TOK <= 1 ) ? 1 : 0 ) {
break;
if ( tok != ')' ) {
free ( *buffer );
- err_val = -1;
+ err_val = -EPARSE;
}
}
*end = inp;
if ( tok == TOK_STRING )
free ( tok_value.str_value );
switch ( err_val ) {
- case -1:
+ case -EPARSE:
printf ( "parse error:\n%s\n", orig );
break;
- case -2:
+ case -EDIV0:
printf ( "division by 0\n" );
break;
- case -3:
+ case -ENOOP:
printf ( "operator undefined\n" );
break;
- case -4:
+ case -EWRONGOP:
printf ( "wrong type of operand\n" );
break;
case -ENOMEM:
printf("out of memory\n");
break;
}
- return err_val;
+ return - ( EINVAL | -err_val );
}
return 0;
#ifdef __ARITH_TEST__
int main ( int argc, char *argv[] ) {
char *ret_val;
- int r = -1;
+ int r = 0;
char *head, *tail, *string, *t;
char line[100];