[brlcad-commits] SF.net SVN: brlcad:[50445] brlcad/trunk/src/libbu/argv.c
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: <bo...@us...> - 2012-05-04 18:32:45
|
Revision: 50445 http://brlcad.svn.sourceforge.net/brlcad/?rev=50445&view=rev Author: bob1961 Date: 2012-05-04 18:32:37 +0000 (Fri, 04 May 2012) Log Message: ----------- Added support for escaping double quotes in bu_argv_from_string(). This is necessary for feeding strings to bu_struct_parse() and fixes rtedge (i.e. couldn't specify more than one occlusion object). Modified Paths: -------------- brlcad/trunk/src/libbu/argv.c Modified: brlcad/trunk/src/libbu/argv.c =================================================================== --- brlcad/trunk/src/libbu/argv.c 2012-05-04 16:55:54 UTC (rev 50444) +++ brlcad/trunk/src/libbu/argv.c 2012-05-04 18:32:37 UTC (rev 50445) @@ -32,6 +32,7 @@ size_t argc = 0; /* number of words seen */ size_t skip = 0; int quoted = 0; + int escaped = 0; if (UNLIKELY(!argv)) { /* do this instead of crashing */ @@ -61,19 +62,51 @@ for (; *lp != '\0'; lp++) { + if (*lp == '\\') { + char *cp = lp; + + /* Shift everything to the left (i.e. stomp on the escape character) */ + while (*cp != '\0') { + *cp = *(cp+1); + cp++; + } + + /* mark the next character as escaped */ + escaped = 1; + + /* remember the loops lp++ */ + lp--; + + continue; + } + if (*lp == '"') { if (!quoted) { + char *cp = lp; + /* start collecting quoted string */ quoted = 1; - /* skip past the quote character */ - argv[argc] = lp + 1; + if (!escaped) { + /* Shift everything to the left (i.e. stomp on the quote character) */ + while (*cp != '\0') { + *cp = *(cp+1); + cp++; + } + + /* remember the loops lp++ */ + lp--; + } + continue; } /* end qoute */ quoted = 0; - *lp++ = '\0'; + if (escaped) + lp++; + else + *lp++ = '\0'; /* skip leading whitespace */ while (*lp != '\0' && isspace(*lp)) { @@ -86,6 +119,8 @@ goto nextword; } + escaped = 0; + /* skip over current word */ if (quoted || !isspace(*lp)) continue; @@ -119,6 +154,7 @@ /* always NULL-terminate the array */ argc++; argv[argc] = (char *)NULL; + return argc; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |