diff options
Diffstat (limited to 'utils/Spiff/strings.c')
-rw-r--r-- | utils/Spiff/strings.c | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/utils/Spiff/strings.c b/utils/Spiff/strings.c new file mode 100644 index 0000000..0774563 --- /dev/null +++ b/utils/Spiff/strings.c @@ -0,0 +1,162 @@ +/* Copyright (c) 1988 Bellcore +** All Rights Reserved +** Permission is granted to copy or use this program, EXCEPT that it +** may not be sold for profit, the copyright notice must be reproduced +** on copies, and credit should be given to Bellcore where it is due. +** BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM. +*/ + + +#ifndef lint +static char rcsid[]= "$Header$"; +#endif + +#include <ctype.h> +#include "misc.h" +#include "strings.h" + +/* +** routines for handling strings. +** several routines manipulate "words" +** a "word" is a string not containing whitespace +*/ + +/* +** copy a single word. similar to strcpy +*/ +void +S_wordcpy(to,from) +char *to, *from; +{ + while ((*from != '\0') && isprint(*from) && (!isspace(*from))) + { + *to++ = *from++; + } + *to = '\0'; + return; +} + +/* +** find the next whitespace character. The address of the pointer +** is passed and the pointer itself is changed. +*/ +void +S_skipword(theptr) +char **theptr; +{ + while((**theptr != '\0') && isprint(**theptr) && (!isspace(**theptr))) + { + (*theptr)++; /* increment the pointer, NOT the pointer + to the pointer */ + } + return; +} + +/* +** find the next non-whitespace character. The address of the pointer +** is passed and the pointer itself is changed. +*/ +void +S_skipspace(theptr) +char **theptr; +{ + while((**theptr != '\0') && isspace(**theptr)) + { + (*theptr)++; /* increment the pointer, NOT the pointer + to the pointer */ + } + return; +} + +/* +** move the pointer to the beginning of the next word +*/ +void +S_nextword(theptr) +char **theptr; +{ + S_skipword(theptr); + S_skipspace(theptr); + return; +} + +/* +** see if the first string is a prefix of the second +** returns 0 if yes +** non zero if now +** sigh -- the way strcmp does +*/ +int +S_wordcmp(s1,s2) +char *s1,*s2; +{ + return(strncmp(s1,s2,strlen(s2))); +} + +/* +** chop off any trailing zeros on a string +** but leave one zero if there are only zeros +*/ +void +S_trimzeros(str) +char *str; +{ + /* + ** end starts out pointing at the null terminator + */ + char *end = str + strlen(str); + + /* + ** if there is more than one character left in the string + */ + while(end > (str+1)) + { + --end; + if ('0' == *end) + { + *end = '\0'; + } + else + { + return; + } + } + return; +} + +/* +** save a copy of the string +*/ +void +S_savestr(to,from) +char **to,*from; +{ + S_allocstr(to,strlen(from)); + (void) strcpy(*to,from); + return; +} + +/* +** save cnt characters of the string +*/ +void +S_savenstr(to,from,cnt) +char **to,*from; +{ + S_allocstr(to,cnt); + (void) strncpy(*to,from,cnt); + *((*to)+cnt) = '\0'; + return; +} + +/* +** allocate space for a string, add 1 to size to +** make sure that there is room for the terminating null character +*/ +void +S_allocstr(to,size) +char **to; +int size; +{ + *to = Z_ALLOC(size+1,char); +} |