diff options
Diffstat (limited to 'funtools/util/tparse.c')
-rw-r--r-- | funtools/util/tparse.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/funtools/util/tparse.c b/funtools/util/tparse.c new file mode 100644 index 0000000..6167b19 --- /dev/null +++ b/funtools/util/tparse.c @@ -0,0 +1,89 @@ +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <parse.h> + +extern char *optarg; +extern int optind; + +#ifdef ANSI_FUNC +int +main (int argc, char **argv) +#else +main(argc, argv) + int argc; + char **argv; +#endif +{ + int c; + int i; + int lptr=0; + int lastd=0; + int nullvalues=0; + int whitespace=0; + int dtab[PARSE_TABLE_SIZE]; + int ctab[PARSE_TABLE_SIZE]; + char *s; + char tbuf[SZ_LINE]; + char lbuf[SZ_LINE]; + char *delims=" \n"; + char *comchars="#\n"; + + /* we want the args in the same order in which they arrived, and + gnu getopt sometimes changes things without this */ + putenv("POSIXLY_CORRECT=true"); + + /* process switch arguments */ + while ((c = getopt(argc, argv, "c:d:nw")) != -1){ + switch(c){ + case 'c': + comchars=optarg; + break; + case 'd': + delims=optarg; + break; + case 'n': + nullvalues=1; + break; + case 'w': + whitespace=1; + break; + } + } + + memset(dtab, 0, PARSE_TABLE_SIZE*sizeof(int)); + for(s=delims; s && *s; s++){ + if( (i=(int)*s) == '\\' ){ + s++; + if( *s == 'n' ) i = '\n'; + else if( *s == 't' ) i = '\t'; + else if( *s == 'r' ) i = '\r'; + else if( *s == 'f' ) i = '\014'; + } + dtab[i] = 1; + } + + memset(ctab, 0, PARSE_TABLE_SIZE*sizeof(int)); + for(s=comchars; s && *s; s++){ + if( (i=(int)*s) == '\\' ){ + s++; + if( *s == 'n' ) i = '\n'; + else if( *s == 't' ) i = '\t'; + else if( *s == 'r' ) i = '\r'; + else if( *s == 'f' ) i = '\014'; + } + ctab[i] = 1; + } + + i = 0; + while( fgets(lbuf, SZ_LINE, stdin) ){ + lptr = 0; + fprintf(stdout, "#%d: %s", i++, lbuf); + while( ParseWord(dtab, ctab, nullvalues, whitespace, + lbuf, tbuf, SZ_LINE, &lptr, &lastd) ) + fprintf(stdout, "%s\n", tbuf); + } + + /* success */ + return 0; +} |