/************************************************************************ * * * Copyright (c) 1982, Fred Fish * * All Rights Reserved * * * * This software and/or documentation is released for public * * distribution for personal, non-commercial use only. * * Limited rights to use, modify, and redistribute are hereby * * granted for non-commercial purposes, provided that all * * copyright notices remain intact and all changes are clearly * * documented. The author makes no warranty of any kind with * * respect to this product and explicitly disclaims any implied * * warranties of merchantability or fitness for any particular * * purpose. * * * ************************************************************************ */ /* * FILE * * dex2.c utility routines for DEX modules * * KEY WORDS * * dex files * utility routines * * DESCRIPTION * * Contains miscellaneous utility routines which will * eventually show up the the author's "ce" (C Environment) * library, which supplements the stdio library. * * FUNCTIONS * * nextw return pointer to next word in a string * skpnbt skip non-blanks and non-tabs * skpbt skip blanks and tabs * xfield extract next field from string * index find first occurrence of character * rindex find last occurrence of character * * AUTHOR * * Fred Fish * */ #include /* * FUNCTION * * NEXTW return pointer to next word in a string * * KEY WORDS * * string functions * words * nextw * string pointers * * SYNOPSIS * * char *nextw(buffer) * char *buffer; * * DESCRIPTION * * Nextw searches from the current pointer location for the * next occurrence of * which is taken to be the start of a new word. If found, * a pointer to the character is * returned. If the end of the string is found, a pointer to it * is returned. * * RETURNS * * Returns pointer to next word in buffer, if one is found. * Returns pointer to terminating null if no word found. * * BUGS * * "Words" are taken to be anything which is neither tab nor * blank. It might be hard to pronounce some of them. * Also note that control characters (ie newline) preceded * by tabs or blanks are also considered to be words. * */ /* * PSEUDO CODE * * Begin nextw * Skip over any non-tabs and non-blanks. * Skip over any tabs or blanks. * Return resulting pointer to first char of word. * End nextw * */ char *nextw(buffer) char *buffer; { char *skpbt(), *skpnbt(); buffer = skpnbt(buffer); buffer = skpbt(buffer); return (buffer); } /* * FUNCTION * * skpnbt return pointer to next tab or blank character * * KEY WORDS * * string functions * words * skpnbt * string pointers * * SYNOPSIS * * char *skpnbt(buffer) * char *buffer; * * DESCRIPTION * * Starting at the current pointer, as long as a NULL is * not encountered, skpnbt skips over anything which is not * a blank or tab, returning a pointer to the first blank * or tab found. If the end of the string is found first, * a pointer to it is returned. * * RETURNS * * Returns pointer to next blank or tab character. * */ /* * PSEUDO CODE * * Begin skpnbt * If passed point is not NULL then * While the current char is not a tab, blank, or null * Skip to next character. * End while * End if * Return pointer to the character found. * End skpnbt * */ char *skpnbt(buffer) char *buffer; { if (buffer != NULL) { while (*buffer != '\t' && *buffer != ' ' && *buffer != '\n') { buffer++; } } return (buffer); } /* * FUNCTION * * skpbt return pointer to next non-tab non-blank character * * KEY WORDS * * string functions * words * skpbt * string pointers * * SYNOPSIS * * char *skpbt(buffer) * char *buffer; * * DESCRIPTION * * Starting at the current pointer, skpbt skips over blanks * and tabs, returning pointer to the first non-tab non-blank * character found (which may be current). * * RETURNS * * Returns pointer to next non-tab and non-blank character. * */ /* * PSEUDO CODE * * Begin skpbt * If pointer is not NULL then * While the current character is a tab or blank * Skip to next character. * End while * End if * Return pointer to the character found. * End skpbt * */ char *skpbt(buffer) char *buffer; { if (buffer != NULL) { while (*buffer == '\t' || *buffer == ' ') { buffer++; } } return (buffer); } /* * FUNCTION * * xfield extract a field from string * * SYNOPSIS * * char *xfield(out,in) * char *out; * char *in; * * DESCRIPTION * * Extracts field from a string up to next tab, blank, * newline, or NULL character. * * If the field begins with a double quote then only another * double quote or a NULL will terminate the extraction. * * RETURNS * * Returns pointer to next character not transfered, or "in" * if no characters are transfered. * */ /* * PSEUDO CODE * * Begin xfield * If both pointers are ok then * If the field is quoted then * Discard the leading quote. * While end is not found * Transfer characters. * End while * If terminating character is quote * Discard the terminating quote. * End if * Terminate output string properly. * Else * While end is not found * Transfer characters. * End while * Terminate output string properly. * End if * End if * Return pointer to next input character. * End xfield * */ char *xfield(out,in) char *out; char *in; { if (out != NULL && in != NULL) { if (*in == '"') { in++; while (*in != '"' && *in != NULL) { *out++ = *in++; } if (*in == '"') { in++; } *out = NULL; } else { while(*in != ' ' && *in != '\t' && *in != NULL && *in != '\n') { *out++ = *in++; } *out = NULL; } } return(in); } /* * FUNCTION * * index return pointer to occurrence of a character * * KEY WORDS * * index * character functions * * SYNOPSIS * * char *index(s,c) * char *s; * char c; * * DESCRIPTION * * Find first occurrence of a the specified character in * the specified string. * * RETURNS * * Pointer to character if found. * NULL if no occurrence found. * */ /* * PSEUDO CODE * * Begin index * If string pointer valid then * Scan for character or end of string. * If end of string found then * Return NULL. * Else * Return pointer. * End if * Else * Return NULL. * End if * End index * */ char *index(s,c) char *s; char c; { if (s != NULL) { while (*s != NULL && *s != c) {s++;} if (*s == NULL) { return(NULL); } else { return(s); } } else { return(NULL); } } /* * FUNCTION * * rindex return pointer to last occurrence of a character * * KEY WORDS * * string functions * rindex * * SYNOPSIS * * char *rindex(s,c) * string *s; * char c; * * DESCRIPTION * * Find the last occurrence of the specified character in * the specified string. * * RETURNS * * Pointer to last occurrence if character found. * NULL if character not found. * */ /* * PSEUDO CODE * * Begin rindex * Initialize return value to NULL. * If string pointer is not invalid then * For each character in string * If character matches then * Save pointer. * End if * End for * End if * Return pointer. * End rindex * */ char *rindex(s,c) char *s; char c; { char *rtn; rtn = NULL; if (s != NULL) { for ( ; *s != NULL; *s++) { if (*s == c) { rtn = s; } } } return(rtn); }