mirror of
https://github.com/rfivet/uemacs.git
synced 2024-12-19 07:46:24 -05:00
Introduce newtoken()/getnewtoken() for full length extraction of tokens.
This commit is contained in:
parent
2c9cbbfb1e
commit
b5eb424ad0
78
exec.c
78
exec.c
@ -212,16 +212,21 @@ static int docmd( char *cline) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* token:
|
* new token:
|
||||||
* chop a token off a string
|
* chop a token off a string
|
||||||
* return a pointer past the token
|
* return a pointer past the token
|
||||||
*
|
*
|
||||||
* char *src, *tok; source string, destination token string
|
* char *src in, source string
|
||||||
* int size; maximum size of token
|
* char **tokref out, destination of newly allocated token string
|
||||||
*/
|
*/
|
||||||
static char *token( char *src, char *tok, int size) {
|
static char *newtoken( char *src, char **tokref) {
|
||||||
int quotef; /* is the current string quoted? */
|
boolean quotef ; /* is the current string quoted? */
|
||||||
char c; /* temporary character */
|
char *tok ; /* allocated string */
|
||||||
|
int size ; /* allocated size */
|
||||||
|
int idx = 0 ; /* insertion point into token string */
|
||||||
|
|
||||||
|
tok = malloc( NSTRING) ;
|
||||||
|
size = (tok == NULL) ? 0 : NSTRING ;
|
||||||
|
|
||||||
/* first scan past any whitespace in the source string */
|
/* first scan past any whitespace in the source string */
|
||||||
while (*src == ' ' || *src == '\t')
|
while (*src == ' ' || *src == '\t')
|
||||||
@ -230,6 +235,8 @@ static char *token( char *src, char *tok, int size) {
|
|||||||
/* scan through the source string */
|
/* scan through the source string */
|
||||||
quotef = FALSE;
|
quotef = FALSE;
|
||||||
while (*src) {
|
while (*src) {
|
||||||
|
char c ; /* temporary character */
|
||||||
|
|
||||||
/* process special characters */
|
/* process special characters */
|
||||||
if (*src == '~') {
|
if (*src == '~') {
|
||||||
++src;
|
++src;
|
||||||
@ -254,9 +261,6 @@ static char *token( char *src, char *tok, int size) {
|
|||||||
default:
|
default:
|
||||||
c = *(src - 1);
|
c = *(src - 1);
|
||||||
}
|
}
|
||||||
if (--size > 0) {
|
|
||||||
*tok++ = c;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/* check for the end of the token */
|
/* check for the end of the token */
|
||||||
if (quotef) {
|
if (quotef) {
|
||||||
@ -273,31 +277,67 @@ static char *token( char *src, char *tok, int size) {
|
|||||||
|
|
||||||
/* record the character */
|
/* record the character */
|
||||||
c = *src++;
|
c = *src++;
|
||||||
if (--size > 0)
|
|
||||||
*tok++ = c;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( idx < size - 1)
|
||||||
|
tok[ idx++] = c ;
|
||||||
|
else if( size > 1) {
|
||||||
|
char *tmptok ;
|
||||||
|
|
||||||
|
tmptok = malloc( size + 32) ;
|
||||||
|
if( tmptok == NULL)
|
||||||
|
size = 0 ;
|
||||||
|
else {
|
||||||
|
memcpy( tmptok, tok, idx) ;
|
||||||
|
free( tok) ;
|
||||||
|
tok = tmptok ;
|
||||||
|
size += 32 ;
|
||||||
|
tok[ idx++] = c ;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* terminate the token and exit */
|
/* terminate the token and exit */
|
||||||
if (*src)
|
if (*src)
|
||||||
++src;
|
++src;
|
||||||
*tok = 0;
|
|
||||||
|
if( tok != NULL)
|
||||||
|
tok[ idx] = 0 ;
|
||||||
|
|
||||||
|
*tokref = tok ;
|
||||||
return src;
|
return src;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *token( char *srcstr, char *tok, int maxtoksize) {
|
||||||
|
char *newtok ;
|
||||||
|
|
||||||
|
srcstr = newtoken( srcstr, &newtok) ;
|
||||||
|
if( newtok == NULL)
|
||||||
|
tok[ 0] = 0 ;
|
||||||
|
else {
|
||||||
|
strncpy( tok, newtok, maxtoksize - 1) ;
|
||||||
|
tok[ maxtoksize - 1] = 0 ;
|
||||||
|
free( newtok) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return srcstr ;
|
||||||
|
}
|
||||||
|
|
||||||
void gettoken( char *tok, int maxtoksize) {
|
void gettoken( char *tok, int maxtoksize) {
|
||||||
execstr = token( execstr, tok, maxtoksize) ;
|
execstr = token( execstr, tok, maxtoksize) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getnewtoken( char **tokref) {
|
||||||
|
execstr = newtoken( execstr, tokref) ;
|
||||||
|
}
|
||||||
|
|
||||||
boolean gettokval( char *tok, int size) {
|
boolean gettokval( char *tok, int size) {
|
||||||
char *tmpbuf ;
|
char *tmpbuf ;
|
||||||
|
|
||||||
tmpbuf = malloc( size) ;
|
|
||||||
if( tmpbuf == NULL)
|
|
||||||
return FALSE ;
|
|
||||||
|
|
||||||
/* grab token and advance past */
|
/* grab token and advance past */
|
||||||
gettoken( tmpbuf, size) ;
|
getnewtoken( &tmpbuf) ;
|
||||||
|
if( tmpbuf == NULL)
|
||||||
|
return FALSE ;
|
||||||
|
|
||||||
/* evaluate it */
|
/* evaluate it */
|
||||||
strncpy( tok, getval( tmpbuf), size - 1) ;
|
strncpy( tok, getval( tmpbuf), size - 1) ;
|
||||||
@ -770,10 +810,8 @@ static int dobuf(struct buffer *bp)
|
|||||||
case DGOTO: /* GOTO directive */
|
case DGOTO: /* GOTO directive */
|
||||||
/* .....only if we are currently executing */
|
/* .....only if we are currently executing */
|
||||||
if (execlevel == 0) {
|
if (execlevel == 0) {
|
||||||
|
|
||||||
/* grab label to jump to */
|
/* grab label to jump to */
|
||||||
eline =
|
eline = token( eline, golabel, sizeof golabel) ;
|
||||||
token( eline, golabel, sizeof golabel) ;
|
|
||||||
linlen = strlen(golabel);
|
linlen = strlen(golabel);
|
||||||
glp = hlp->l_fp;
|
glp = hlp->l_fp;
|
||||||
while (glp != hlp) {
|
while (glp != hlp) {
|
||||||
|
Loading…
Reference in New Issue
Block a user