Mercurial > hg > Members > kono > nitros9-code
diff 3rdparty/packages/uucpbb/src/parse.c @ 1772:5ba8e711a1a3
source added
author | boisy |
---|---|
date | Fri, 01 Apr 2005 22:04:25 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/3rdparty/packages/uucpbb/src/parse.c Fri Apr 01 22:04:25 2005 +0000 @@ -0,0 +1,205 @@ +/* getargs.c + + This replaces the original parse.c. It is little more compact and with + a minor change it will parse quoted or unquoted arguments (double quotes, + ("). If there is nothing between two sets of quotes (""), the field is + replaced with the '\0' character and parsing continues. This routine was + originally posted to comp.lang.c by Steve Summit <scs@eskimo.c>. Thanks + to Steve for his okey dokey to use it in UUCPbb. + + Quote and OS-9 mods by Bob Billson <bob@kc2wz.bubble.org> (REB) +*/ + +/* + * takes a string (line) and builds an array of pointers to each word in it. + * words are separated by spaces or any control characters. At most maxargs + * pointers are calculated. \0's are inserted in line, so that each word + * becomes a string in its own right. The number of pointers (argc) is + * returned. + */ + +#ifndef ORIGINAL +#include "uucp.h" +#else +#include <stdio.h> +#endif + +#ifndef ORIGINAL +#define iswhite(c) ((c)==' ' || (c)=='\t' || (c)=='\x0D' || (c)=='\x0A') +#else +#define iswhite(c) ((c)==' ' || (c)=='\t' || (c)=='\n') /* original code */ +#endif + +int getargs(argv, line, maxargs) +#ifndef ORIGINAL +char *argv[]; +register char *line; +#else +register char *argv[]; +register char *line; +#endif +int maxargs; +{ +register int nargs = 0; +int firstquote = FALSE; /* added REB */ + +for(;;) + { + while(iswhite(*line)) + line++; + + if(*line == '\0') + { + if(nargs < maxargs) *argv = NULL; + return(nargs); + } +#ifndef ORIGINAL + if (*line == '"' && !firstquote) /* added REB */ + { + firstquote = TRUE; + line++; + } +#endif + *argv++ = line; + nargs++; + +#ifndef ORIGINAL + while (((!firstquote && !iswhite(*line)) /* added REB */ + || (firstquote && *line != '"')) && *line != '\0') +#else + while(!iswhite(*line) && *line != '\0') +#endif + line++; + + if(*line == '\0') + { + if(nargs < maxargs) *argv = NULL; + return(nargs); + } + +#ifndef ORIGINAL + if(*line == '"') /* added REB */ + firstquote = FALSE; +#endif + + *line++ = '\0'; + if(nargs == maxargs) return(nargs); + } +} + + + +/************************************************************ + ************************************************************ + *** The following code is not part of getargs.c. This *** + *** code IS covered by the GNU General Public license. *** + ************************************************************ + ************************************************************/ + + /* parse.c Routines to deal with parsing passed strings. + Copyright (C) 1990, 1993 Rick Adams and Bob Billson + + This file is part of the OS-9 UUCP package, UUCPbb. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + The author of UUCPbb, Bob Billson, can be contacted at: + bob@kc2wz.bubble.org or uunet!kc2wz!bob or by snail mail: + 21 Bates Way, Westfield, NJ 07090 +*/ + +/* Returns pointer to first non-whitespace character in string pointed to by + string. Added --REB */ + +char *skipspace (string) +char *string; +{ + register char *p; + + p = string; + + while (iswhite (*p)) + p++; + + return (p); +} + + + +/* Parse command line parameters. Broken out of docmd.c. Originally, this + was part of docmd.c. It was split into a separate file because it is + needed in osk.c as well. All the modules which link osk.c do not + necessarily link docmd.c as well. + + Modified for OSK -- BGP +*/ + +#ifdef _OSK +/* Parse the command passed us under OSK */ + +int parse_cmd (argvect, string) +char **argvect; +char *string; +{ + char *p, delimit; + int count = -1; + + p = string; + do + { + p = skipspace (p); /* skip leading spaces */ + + if (*p == '\"') + delimit = *(p++); /* quote is delimiter */ + else + delimit = ' '; /* space is delimiter */ + + argvect[++count] = p; + + /* include all between */ + while (*(++p) != delimit && *p != '\0'); + if (*p == '\0') + --p; + else + *p = '\0'; + } + while (*(++p) != '\0'); + + argvect[++count] = NULL; /* NULL terminate last */ +} + +#else +/* Parse the command passed us under OS-9/6809 */ + +char *parse_cmd (cmd) +char *cmd; +{ + register char *p; + + /* Make sure command line end with a \n */ + if ((p = strchr (cmd, '\n')) == NULL) + strcat (cmd, "\n"); + + /* Return a pointer to the command line parameters or the \n if there are + no parameters. */ + + if ((p = strchr (cmd, ' ')) != NULL) + *p++ = '\0'; + else + p = cmd + strlen (cmd) - 1; + + return (p); +} +#endif