diff options
| author | Xin LI <delphij@FreeBSD.org> | 2007-06-15 07:06:13 +0000 | 
|---|---|---|
| committer | Xin LI <delphij@FreeBSD.org> | 2007-06-15 07:06:13 +0000 | 
| commit | 18fd37a72c3a7549d2d4f6c6ea00bdcd2bdaca01 (patch) | |
| tree | fa574500c8a91fba34c02a5fbe177ac9ef1890ea /contrib/diff/lib/prepargs.c | |
| parent | 964382dc0066873eacb403467b4abb729f7cb0cd (diff) | |
Notes
Diffstat (limited to 'contrib/diff/lib/prepargs.c')
| -rw-r--r-- | contrib/diff/lib/prepargs.c | 93 | 
1 files changed, 93 insertions, 0 deletions
| diff --git a/contrib/diff/lib/prepargs.c b/contrib/diff/lib/prepargs.c new file mode 100644 index 0000000000000..f5735acdadd1e --- /dev/null +++ b/contrib/diff/lib/prepargs.c @@ -0,0 +1,93 @@ +/* Parse arguments from a string and prepend them to an argv. + +   Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + +   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, 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., 59 Temple Place - Suite 330, Boston, MA +   02111-1307, USA.  */ + +/* Written by Paul Eggert <eggert@twinsun.com>.  */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif +#include "prepargs.h" +#include <string.h> +#include <sys/types.h> +#include <xalloc.h> + +#include <ctype.h> + +/* IN_CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given +   as an argument to <ctype.h> macros like "isspace".  */ +#ifdef STDC_HEADERS +# define IN_CTYPE_DOMAIN(c) 1 +#else +# define IN_CTYPE_DOMAIN(c) ((c) <= 0177) +#endif + +#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c)) + +/* Find the white-space-separated options specified by OPTIONS, and +   using BUF to store copies of these options, set ARGV[0], ARGV[1], +   etc. to the option copies.  Return the number N of options found. +   Do not set ARGV[N].  If ARGV is zero, do not store ARGV[0] etc. +   Backslash can be used to escape whitespace (and backslashes).  */ +static int +prepend_args (char const *options, char *buf, char **argv) +{ +  char const *o = options; +  char *b = buf; +  int n = 0; + +  for (;;) +    { +      while (ISSPACE ((unsigned char) *o)) +	o++; +      if (!*o) +	return n; +      if (argv) +	argv[n] = b; +      n++; + +      do +	if ((*b++ = *o++) == '\\' && *o) +	  b[-1] = *o++; +      while (*o && ! ISSPACE ((unsigned char) *o)); + +      *b++ = '\0'; +    } +} + +/* Prepend the whitespace-separated options in OPTIONS to the argument +   vector of a main program with argument count *PARGC and argument +   vector *PARGV.  */ +void +prepend_default_options (char const *options, int *pargc, char ***pargv) +{ +  if (options) +    { +      char *buf = xmalloc (strlen (options) + 1); +      int prepended = prepend_args (options, buf, (char **) 0); +      int argc = *pargc; +      char * const *argv = *pargv; +      char **pp = (char **) xmalloc ((prepended + argc + 1) * sizeof *pp); +      *pargc = prepended + argc; +      *pargv = pp; +      *pp++ = *argv++; +      pp += prepend_args (options, buf, pp); +      while ((*pp++ = *argv++)) +	continue; +    } +} | 
