mirror of
https://github.com/rfivet/uemacs.git
synced 2025-01-18 22:27:09 -05:00
Review buffer usage in & function evaluation.
This commit is contained in:
parent
a6669903b2
commit
4070a97fc9
144
eval.c
144
eval.c
@ -309,20 +309,13 @@ void varinit(void)
|
|||||||
char *gtfun(char *fname)
|
char *gtfun(char *fname)
|
||||||
{
|
{
|
||||||
int fnum; /* index to function to eval */
|
int fnum; /* index to function to eval */
|
||||||
char *tsp; /* temporary string pointer */
|
char argx[ 512] ;
|
||||||
char stmp[ 512] ;
|
|
||||||
char *arg1 ; /* value of first argument */
|
char *arg1 ; /* value of first argument */
|
||||||
char *arg2 ; /* value of second argument */
|
char *arg2 ; /* value of second argument */
|
||||||
char *arg3 ; /* value of third argument */
|
|
||||||
static char *result ; /* string result */
|
static char *result ; /* string result */
|
||||||
static int ressize = 0 ; /* mark result as uninitialized */
|
static int ressize = 0 ; /* mark result as uninitialized */
|
||||||
char *retstr ; /* return value */
|
char *retstr ; /* return value */
|
||||||
|
|
||||||
if( ressize == 0) {
|
|
||||||
result = malloc( NSTRING) ;
|
|
||||||
ressize = NSTRING ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* look the function up in the function table */
|
/* look the function up in the function table */
|
||||||
fname[3] = 0; /* only first 3 chars significant */
|
fname[3] = 0; /* only first 3 chars significant */
|
||||||
mklower(fname); /* and let it be upper or lower case */
|
mklower(fname); /* and let it be upper or lower case */
|
||||||
@ -334,59 +327,68 @@ char *gtfun(char *fname)
|
|||||||
if (fnum == ARRAY_SIZE(funcs))
|
if (fnum == ARRAY_SIZE(funcs))
|
||||||
return errorm;
|
return errorm;
|
||||||
|
|
||||||
arg1 = arg2 = arg3 = NULL ;
|
arg1 = arg2 = NULL ;
|
||||||
|
|
||||||
/* if needed, retrieve the first argument */
|
/* if needed, retrieve the first argument */
|
||||||
if (funcs[fnum].f_type >= MONAMIC) {
|
if (funcs[fnum].f_type >= MONAMIC) {
|
||||||
if( macarg( stmp, sizeof stmp) != TRUE)
|
if( macarg( argx, sizeof argx) != TRUE)
|
||||||
return errorm;
|
return errorm;
|
||||||
|
|
||||||
arg1 = malloc( strlen( stmp) + 1) ;
|
|
||||||
strcpy( arg1, stmp) ;
|
|
||||||
/* if needed, retrieve the second argument */
|
/* if needed, retrieve the second argument */
|
||||||
if (funcs[fnum].f_type >= DYNAMIC) {
|
if (funcs[fnum].f_type >= DYNAMIC) {
|
||||||
if( macarg( stmp, sizeof stmp) != TRUE)
|
arg1 = malloc( strlen( argx) + 1) ;
|
||||||
|
strcpy( arg1, argx) ;
|
||||||
|
if( macarg( argx, sizeof argx) != TRUE) {
|
||||||
|
free( arg1) ;
|
||||||
return errorm;
|
return errorm;
|
||||||
|
}
|
||||||
|
|
||||||
arg2 = malloc( strlen( stmp) + 1) ;
|
|
||||||
strcpy( arg2, stmp) ;
|
|
||||||
/* if needed, retrieve the third argument */
|
/* if needed, retrieve the third argument */
|
||||||
if (funcs[fnum].f_type >= TRINAMIC) {
|
if (funcs[fnum].f_type >= TRINAMIC) {
|
||||||
if( macarg( stmp, sizeof stmp) != TRUE)
|
arg2 = malloc( strlen( argx) + 1) ;
|
||||||
|
strcpy( arg2, argx) ;
|
||||||
|
if( macarg( argx, sizeof argx) != TRUE) {
|
||||||
|
free( arg1) ;
|
||||||
|
free( arg2) ;
|
||||||
return errorm;
|
return errorm;
|
||||||
|
}
|
||||||
arg3 = malloc( strlen( stmp) + 1) ;
|
|
||||||
strcpy( arg3, stmp) ;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if( ressize == 0) {
|
||||||
|
result = malloc( NSTRING) ;
|
||||||
|
ressize = NSTRING ;
|
||||||
|
}
|
||||||
|
|
||||||
/* and now evaluate it! */
|
/* and now evaluate it! */
|
||||||
switch (fnum) {
|
switch (fnum) {
|
||||||
|
int sz ;
|
||||||
|
|
||||||
case UFADD:
|
case UFADD:
|
||||||
retstr = i_to_a( atoi( arg1) + atoi( arg2)) ;
|
retstr = i_to_a( atoi( arg1) + atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFSUB:
|
case UFSUB:
|
||||||
retstr = i_to_a( atoi( arg1) - atoi( arg2)) ;
|
retstr = i_to_a( atoi( arg1) - atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFTIMES:
|
case UFTIMES:
|
||||||
retstr = i_to_a( atoi( arg1) * atoi( arg2)) ;
|
retstr = i_to_a( atoi( arg1) * atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFDIV:
|
case UFDIV:
|
||||||
retstr = i_to_a( atoi( arg1) / atoi( arg2)) ;
|
retstr = i_to_a( atoi( arg1) / atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFMOD:
|
case UFMOD:
|
||||||
retstr = i_to_a( atoi( arg1) % atoi( arg2)) ;
|
retstr = i_to_a( atoi( arg1) % atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFNEG:
|
case UFNEG:
|
||||||
retstr = i_to_a( -atoi( arg1)) ;
|
retstr = i_to_a( -atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFCAT: {
|
case UFCAT: {
|
||||||
int sz1, sz ;
|
int sz1 ;
|
||||||
|
|
||||||
sz1 = strlen( arg1) ;
|
sz1 = strlen( arg1) ;
|
||||||
sz = sz1 + strlen( arg2) + 1 ;
|
sz = sz1 + strlen( argx) + 1 ;
|
||||||
if( sz > ressize) {
|
if( sz > ressize) {
|
||||||
free( result) ;
|
free( result) ;
|
||||||
result = malloc( sz) ;
|
result = malloc( sz) ;
|
||||||
@ -394,14 +396,12 @@ char *gtfun(char *fname)
|
|||||||
}
|
}
|
||||||
|
|
||||||
strcpy( result, arg1) ;
|
strcpy( result, arg1) ;
|
||||||
strcat( &result[ sz1], arg2) ;
|
strcat( &result[ sz1], argx) ;
|
||||||
retstr = result ;
|
retstr = result ;
|
||||||
}
|
}
|
||||||
break ;
|
break ;
|
||||||
case UFLEFT: {
|
case UFLEFT:
|
||||||
int sz ;
|
sz = atoi( argx) ;
|
||||||
|
|
||||||
sz = atoi( arg2) ;
|
|
||||||
if( sz >= ressize) {
|
if( sz >= ressize) {
|
||||||
free( result) ;
|
free( result) ;
|
||||||
result = malloc( sz + 1) ;
|
result = malloc( sz + 1) ;
|
||||||
@ -411,12 +411,9 @@ char *gtfun(char *fname)
|
|||||||
strncpy( result, arg1, sz) ;
|
strncpy( result, arg1, sz) ;
|
||||||
result[ sz] = 0 ;
|
result[ sz] = 0 ;
|
||||||
retstr = result ;
|
retstr = result ;
|
||||||
}
|
|
||||||
break ;
|
break ;
|
||||||
case UFRIGHT: {
|
case UFRIGHT:
|
||||||
int sz ;
|
sz = atoi( argx) ;
|
||||||
|
|
||||||
sz = atoi( arg2) ;
|
|
||||||
if( sz >= ressize) {
|
if( sz >= ressize) {
|
||||||
free( result) ;
|
free( result) ;
|
||||||
result = malloc( sz + 1) ;
|
result = malloc( sz + 1) ;
|
||||||
@ -424,12 +421,9 @@ char *gtfun(char *fname)
|
|||||||
}
|
}
|
||||||
|
|
||||||
retstr = strcpy( result, &arg1[ strlen( arg1) - sz]) ;
|
retstr = strcpy( result, &arg1[ strlen( arg1) - sz]) ;
|
||||||
}
|
|
||||||
break ;
|
break ;
|
||||||
case UFMID: {
|
case UFMID:
|
||||||
int sz ;
|
sz = atoi( argx) ;
|
||||||
|
|
||||||
sz = atoi( arg3) ;
|
|
||||||
if( sz >= ressize) {
|
if( sz >= ressize) {
|
||||||
free( result) ;
|
free( result) ;
|
||||||
result = malloc( sz + 1) ;
|
result = malloc( sz + 1) ;
|
||||||
@ -439,55 +433,54 @@ char *gtfun(char *fname)
|
|||||||
strncpy( result, &arg1[ atoi( arg2) - 1], sz) ;
|
strncpy( result, &arg1[ atoi( arg2) - 1], sz) ;
|
||||||
result[ sz] = 0 ;
|
result[ sz] = 0 ;
|
||||||
retstr = result ;
|
retstr = result ;
|
||||||
}
|
|
||||||
break ;
|
break ;
|
||||||
case UFNOT:
|
case UFNOT:
|
||||||
retstr = ltos( stol( arg1) == FALSE) ;
|
retstr = ltos( stol( argx) == FALSE) ;
|
||||||
break ;
|
break ;
|
||||||
case UFEQUAL:
|
case UFEQUAL:
|
||||||
retstr = ltos( atoi( arg1) == atoi( arg2)) ;
|
retstr = ltos( atoi( arg1) == atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFLESS:
|
case UFLESS:
|
||||||
retstr = ltos( atoi( arg1) < atoi( arg2)) ;
|
retstr = ltos( atoi( arg1) < atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFGREATER:
|
case UFGREATER:
|
||||||
retstr = ltos( atoi( arg1) > atoi( arg2)) ;
|
retstr = ltos( atoi( arg1) > atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFSEQUAL:
|
case UFSEQUAL:
|
||||||
retstr = ltos( strcmp( arg1, arg2) == 0) ;
|
retstr = ltos( strcmp( arg1, argx) == 0) ;
|
||||||
break ;
|
break ;
|
||||||
case UFSLESS:
|
case UFSLESS:
|
||||||
retstr = ltos( strcmp( arg1, arg2) < 0) ;
|
retstr = ltos( strcmp( arg1, argx) < 0) ;
|
||||||
break ;
|
break ;
|
||||||
case UFSGREAT:
|
case UFSGREAT:
|
||||||
retstr = ltos( strcmp( arg1, arg2) > 0) ;
|
retstr = ltos( strcmp( arg1, argx) > 0) ;
|
||||||
break ;
|
break ;
|
||||||
case UFIND:
|
case UFIND:
|
||||||
retstr = strcpy( result, getval( arg1)) ;
|
retstr = strcpy( result, getval( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFAND:
|
case UFAND:
|
||||||
retstr = ltos( stol( arg1) && stol( arg2)) ;
|
retstr = ltos( stol( arg1) && stol( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFOR:
|
case UFOR:
|
||||||
retstr = ltos( stol( arg1) || stol( arg2)) ;
|
retstr = ltos( stol( arg1) || stol( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFLENGTH:
|
case UFLENGTH:
|
||||||
retstr = i_to_a( strlen( arg1)) ;
|
retstr = i_to_a( strlen( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFUPPER:
|
case UFUPPER:
|
||||||
retstr = mkupper( arg1) ;
|
retstr = mkupper( argx) ;
|
||||||
break ;
|
break ;
|
||||||
case UFLOWER:
|
case UFLOWER:
|
||||||
retstr = mklower( arg1) ;
|
retstr = mklower( argx) ;
|
||||||
break ;
|
break ;
|
||||||
case UFTRUTH:
|
case UFTRUTH:
|
||||||
retstr = ltos( atoi( arg1) == 42) ;
|
retstr = ltos( atoi( argx) == 42) ;
|
||||||
break ;
|
break ;
|
||||||
case UFASCII:
|
case UFASCII:
|
||||||
retstr = i_to_a( (int) arg1[ 0]) ;
|
retstr = i_to_a( (int) argx[ 0]) ;
|
||||||
break ;
|
break ;
|
||||||
case UFCHR:
|
case UFCHR:
|
||||||
result[0] = atoi(arg1);
|
result[0] = atoi(argx);
|
||||||
result[1] = 0;
|
result[1] = 0;
|
||||||
retstr = result ;
|
retstr = result ;
|
||||||
break ;
|
break ;
|
||||||
@ -497,46 +490,48 @@ char *gtfun(char *fname)
|
|||||||
retstr = result ;
|
retstr = result ;
|
||||||
break ;
|
break ;
|
||||||
case UFRND:
|
case UFRND:
|
||||||
retstr = i_to_a( (ernd() % abs( atoi( arg1))) + 1) ;
|
retstr = i_to_a( (ernd() % abs( atoi( argx))) + 1) ;
|
||||||
break ;
|
break ;
|
||||||
case UFABS:
|
case UFABS:
|
||||||
retstr = i_to_a( abs( atoi( arg1))) ;
|
retstr = i_to_a( abs( atoi( argx))) ;
|
||||||
break ;
|
break ;
|
||||||
case UFSINDEX:
|
case UFSINDEX:
|
||||||
retstr = i_to_a( sindex( arg1, arg2)) ;
|
retstr = i_to_a( sindex( arg1, argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFENV:
|
case UFENV:
|
||||||
#if ENVFUNC
|
#if ENVFUNC
|
||||||
tsp = getenv(arg1);
|
retstr = getenv( argx) ;
|
||||||
retstr = tsp == NULL ? "" : tsp ;
|
if( retstr == NULL)
|
||||||
|
retstr = "" ;
|
||||||
#else
|
#else
|
||||||
retstr = "" ;
|
retstr = "" ;
|
||||||
#endif
|
#endif
|
||||||
break ;
|
break ;
|
||||||
case UFBIND:
|
case UFBIND:
|
||||||
retstr = transbind( arg1) ;
|
retstr = transbind( argx) ;
|
||||||
break ;
|
break ;
|
||||||
case UFEXIST:
|
case UFEXIST:
|
||||||
retstr = ltos( fexist( arg1)) ;
|
retstr = ltos( fexist( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFFIND:
|
case UFFIND:
|
||||||
tsp = flook(arg1, TRUE);
|
retstr = flook( argx, TRUE) ;
|
||||||
retstr = tsp == NULL ? "" : tsp ;
|
if( retstr == NULL)
|
||||||
|
retstr = "" ;
|
||||||
break ;
|
break ;
|
||||||
case UFBAND:
|
case UFBAND:
|
||||||
retstr = i_to_a( atoi( arg1) & atoi( arg2)) ;
|
retstr = i_to_a( atoi( arg1) & atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFBOR:
|
case UFBOR:
|
||||||
retstr = i_to_a( atoi( arg1) | atoi( arg2)) ;
|
retstr = i_to_a( atoi( arg1) | atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFBXOR:
|
case UFBXOR:
|
||||||
retstr = i_to_a( atoi( arg1) ^ atoi( arg2)) ;
|
retstr = i_to_a( atoi( arg1) ^ atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFBNOT:
|
case UFBNOT:
|
||||||
retstr = i_to_a( ~atoi( arg1)) ;
|
retstr = i_to_a( ~atoi( argx)) ;
|
||||||
break ;
|
break ;
|
||||||
case UFXLATE:
|
case UFXLATE:
|
||||||
retstr = xlat( arg1, arg2, arg3) ;
|
retstr = xlat( arg1, arg2, argx) ;
|
||||||
break ;
|
break ;
|
||||||
default:
|
default:
|
||||||
exit(-11); /* never should get here */
|
exit(-11); /* never should get here */
|
||||||
@ -548,9 +543,6 @@ char *gtfun(char *fname)
|
|||||||
if( arg2)
|
if( arg2)
|
||||||
free( arg2) ;
|
free( arg2) ;
|
||||||
|
|
||||||
if( arg3)
|
|
||||||
free( arg3) ;
|
|
||||||
|
|
||||||
return retstr ;
|
return retstr ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user