home *** CD-ROM | disk | FTP | other *** search
- /* xlstr - xlisp string builtin functions */
-
- #ifdef AZTEC
- #include "stdio.h"
- #else
- #include <stdio.h>
- #endif
-
- #include "xlisp.h"
-
- /* external variables */
- extern struct node *xlstack;
-
- /* external procedures */
- extern char *strcat();
-
- /* xstrlen - length of a string */
- struct node *xstrlen(args)
- struct node *args;
- {
- struct node *val;
- int total;
-
- /* initialize */
- total = 0;
-
- /* loop over args and total */
- while (args != NULL)
- total += strlen(xlmatch(STR,&args)->n_str);
-
- /* create the value node */
- val = newnode(INT);
- val->n_int = total;
-
- /* return the total */
- return (val);
- }
-
- /* xstrcat - concatenate a bunch of strings */
- struct node *xstrcat(args)
- struct node *args;
- {
- struct node *oldstk,val,*p;
- char *str;
- int len;
-
- /* create a new stack frame */
- oldstk = xlsave(&val,NULL);
-
- /* find the length of the new string */
- for (p = args, len = 0; p; )
- len += strlen(xlmatch(STR,&p)->n_str);
-
- /* create the result string */
- val.n_ptr = newnode(STR);
- val.n_ptr->n_str = str = stralloc(len);
- *str = 0;
-
- /* combine the strings */
- while (args)
- strcat(str,xlmatch(STR,&args)->n_str);
-
- /* restore the previous stack frame */
- xlstack = oldstk;
-
- /* return the new string */
- return (val.n_ptr);
- }
-
- /* xsubstr - return a substring */
- struct node *xsubstr(args)
- struct node *args;
- {
- struct node *oldstk,arg,src,val;
- int start,forlen,srclen;
- char *srcptr,*dstptr;
-
- /* create a new stack frame */
- oldstk = xlsave(&arg,&src,&val,NULL);
-
- /* initialize */
- arg.n_ptr = args;
-
- /* get string and its length */
- src.n_ptr = xlmatch(STR,&arg.n_ptr);
- srcptr = src.n_ptr->n_str;
- srclen = strlen(srcptr);
-
- /* get starting pos -- must be present */
- start = xlmatch(INT,&arg.n_ptr)->n_int;
-
- /* get length -- if not present use remainder of string */
- if (arg.n_ptr != NULL)
- forlen = xlmatch(INT,&arg.n_ptr)->n_int;
- else
- forlen = srclen; /* use len and fix below */
-
- /* make sure there aren't any more arguments */
- xllastarg(arg.n_ptr);
-
- /* don't take more than exists */
- if (start + forlen > srclen)
- forlen = srclen - start + 1;
-
- /* if start beyond string -- return null string */
- if (start > srclen) {
- start = 1;
- forlen = 0; }
-
- /* create return node */
- val.n_ptr = newnode(STR);
- val.n_ptr->n_str = dstptr = stralloc(forlen);
-
- /* move string */
- for (srcptr += start-1; forlen--; *dstptr++ = *srcptr++)
- ;
- *dstptr = 0;
-
- /* restore the previous stack frame */
- xlstack = oldstk;
-
- /* return the substring */
- return (val.n_ptr);
- }
-
- /* xascii - return ascii value */
- struct node *xascii(args)
- struct node *args;
- {
- struct node *val;
-
- /* build return node */
- val = newnode(INT);
- val->n_int = *(xlmatch(STR,&args)->n_str);
-
- /* make sure there aren't any more arguments */
- xllastarg(args);
-
- /* return the character */
- return (val);
- }
-
- /* xchr - convert an INT into a one character ascii string */
- struct node *xchr(args)
- struct node *args;
- {
- struct node *oldstk,val;
- char *sptr;
-
- /* create a new stack frame */
- oldstk = xlsave(&val,NULL);
-
- /* build return node */
- val.n_ptr = newnode(STR);
- val.n_ptr->n_str = sptr = stralloc(1);
- *sptr++ = xlmatch(INT,&args)->n_int;
- *sptr = 0;
-
- /* make sure there aren't any more arguments */
- xllastarg(args);
-
- /* restore the previous stack frame */
- xlstack = oldstk;
-
- /* return the new string */
- return (val.n_ptr);
- }
-
- /* xatoi - convert an ascii string to an integer */
- struct node *xatoi(args)
- struct node *args;
- {
- struct node *val;
- int n;
-
- /* get the string and convert it */
- n = atoi(xlmatch(STR,&args)->n_str);
-
- /* make sure there aren't any more arguments */
- xllastarg(args);
-
- /* create the value node */
- val = newnode(INT);
- val->n_int = n;
-
- /* return the number */
- return (val);
- }
-
- /* xitoa - convert an integer to an ascii string */
- struct node *xitoa(args)
- struct node *args;
- {
- struct node *val;
- char buf[20];
- int n;
-
- /* get the integer */
- n = xlmatch(INT,&args)->n_int;
- xllastarg(args);
-
- /* convert it to ascii */
- sprintf(buf,"%d",n);
-
- /* create the value node */
- val = newnode(STR);
- val->n_str = strsave(buf);
-
- /* return the string */
- return (val);
- }