home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_100
/
176_01
/
xlstr.c
< prev
next >
Wrap
Text File
|
1985-10-05
|
3KB
|
131 lines
/* xlstr - xlisp string builtin functions */
/* Copyright (c) 1985, by David Michael Betz
All Rights Reserved
Permission is granted for unrestricted non-commercial use */
#include "xlisp.h"
/* external variables */
extern NODE ***xlstack;
extern char buf[];
/* external procedures */
extern char *strcat();
/* xstrcat - concatenate a bunch of strings */
NODE *xstrcat(args)
NODE *args;
{
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(getstring(xlmatch(STR,&p)));
/* create the result string */
val = newstring(len);
str = getstring(val);
*str = 0;
/* combine the strings */
while (args)
strcat(str,getstring(xlmatch(STR,&args)));
/* restore the previous stack frame */
xlstack = oldstk;
/* return the new string */
return (val);
}
/* xsubstr - return a substring */
NODE *xsubstr(args)
NODE *args;
{
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 = args;
/* get string and its length */
src = xlmatch(STR,&arg);
srcptr = getstring(src);
srclen = strlen(srcptr);
/* get starting pos -- must be present */
start = getfixnum(xlmatch(INT,&arg));
/* get length -- if not present use remainder of string */
forlen = (arg ? getfixnum(xlmatch(INT,&arg)) : srclen);
/* make sure there aren't any more arguments */
xllastarg(arg);
/* 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 = newstring(forlen);
dstptr = getstring(val);
/* move string */
for (srcptr += start-1; forlen--; *dstptr++ = *srcptr++)
;
*dstptr = 0;
/* restore the previous stack frame */
xlstack = oldstk;
/* return the substring */
return (val);
}
/* xstring - return a string consisting of a single character */
NODE *xstring(args)
NODE *args;
{
/* get the character (integer) */
buf[0] = getfixnum(xlmatch(INT,&args));
xllastarg(args);
/* make a one character string */
buf[1] = 0;
return (cvstring(buf));
}
/* xchar - extract a character from a string */
NODE *xchar(args)
NODE *args;
{
char *str;
int n;
/* get the string and the index */
str = getstring(xlmatch(STR,&args));
n = getfixnum(xlmatch(INT,&args));
xllastarg(args);
/* range check the index */
if (n < 0 || n >= strlen(str))
xlerror("index out of range",cvfixnum((FIXNUM)n));
/* return the character */
return (cvfixnum((FIXNUM)str[n]));
}