|
|
1.1 root 1: /* sstr2arg: convert string into argument list */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/compat/RCS/sstr2arg.c,v 7.0 89/11/23 21:23:34 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/compat/RCS/sstr2arg.c,v 7.0 89/11/23 21:23:34 mrose Rel $
9: *
10: *
11: * $Log: sstr2arg.c,v $
12: * Revision 7.0 89/11/23 21:23:34 mrose
13: * Release 6.0
14: *
15: */
16:
17: /*
18: * NOTICE
19: *
20: * Acquisition, use, and distribution of this module and related
21: * materials are subject to the restrictions of a license agreement.
22: * Consult the Preface in the User's Manual for the full terms of
23: * this agreement.
24: *
25: */
26:
27:
28: /* LINTLIBRARY */
29:
30: #include <stdio.h>
31: #include "manifest.h"
32: #include <errno.h>
33:
34: extern int errno;
35:
36: /* */
37:
38: /*
39: stash a pointer to each field into the passed array. any common seperators
40: split the words. extra white-space between fields is ignored.
41:
42: specially-interpreted characters:
43: double-quote, backslash (preceding a special char with a backslash
44: removes its interpretation. A backslash not followed by a special is
45: used to preface an octal specification for one character a string begun
46: with double-quote has only double-quote and backslash as special
47: characters.
48:
49: */
50:
51:
52:
53:
54: sstr2arg (srcptr, maxpf, argv, dlmstr)
55: register char *srcptr; /* source data */
56: int maxpf; /* maximum number of permitted fields */
57: char *argv[]; /* where to put the pointers */
58: char *dlmstr; /* Delimiting character */
59: {
60: char gotquote; /* currently parsing quoted string */
61: register int ind;
62: register char *destptr;
63:
64: if (srcptr == 0) {
65: errno = EINVAL; /* emulate system-call failure */
66: return (NOTOK);
67: }
68:
69: for (ind = 0, maxpf -= 2;; ind++) {
70: if (ind >= maxpf) {
71: errno = E2BIG; /* emulate system-call failure */
72: return (NOTOK);
73: }
74:
75: /* Skip leading white space */
76: for (; *srcptr == '\t' || *srcptr == ' '; srcptr++);
77:
78: argv [ind] = srcptr;
79: destptr = srcptr;
80:
81: for (gotquote = 0; ; ) {
82: register char *cp;
83:
84: for (cp = dlmstr; (*cp != '\0') && (*cp != *srcptr); cp++);
85:
86: if (*cp != '\0')
87: {
88: if (gotquote) { /* don't interpret the char */
89: *destptr++ = *srcptr++;
90: continue;
91: }
92:
93: srcptr++;
94: *destptr = '\0';
95: goto nextarg;
96: } else {
97: switch (*srcptr) {
98: default: /* just copy it */
99: *destptr++ = *srcptr++;
100: break;
101:
102: case '\"': /* beginning or end of string */
103: gotquote = (gotquote) ? 0 : 1 ;
104: srcptr++; /* just toggle */
105: break;
106:
107: case '\\': /* quote next character */
108: srcptr++; /* just skip the back-slash */
109: if (*srcptr >= '0' && *srcptr <= '7') {
110: *destptr = '\0';
111: do
112: *destptr = (*destptr << 3) | (*srcptr++ - '0');
113: while (*srcptr >= '0' && *srcptr <= '7');
114: destptr++;
115: break;
116: }
117: else
118: *destptr++ = *srcptr++;
119: break;
120:
121: case '\0':
122: *destptr = '\0';
123: ind++;
124: argv[ind] = (char *) 0;
125: return (ind);
126: }
127: }
128: }
129: nextarg:
130: continue;
131: }
132: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.