xref: /original-bsd/usr.bin/uucp/libuu/getargs.c (revision c43e4352)
1 #ifndef lint
2 static char sccsid[] = "@(#)getargs.c	5.1 (Berkeley) 07/02/83";
3 #endif
4 
5 #include <stdio.h>
6 
7 /*******
8  *	getargs(s, arps)
9  *	char *s, *arps[];
10  *
11  *	getargs  -  this routine will generate a vector of
12  *	pointers (arps) to the substrings in string "s".
13  *	Each substring is separated by blanks and/or tabs.
14  *
15  *	If FANCYARGS is defined, you get the following:
16  *	Strings containing blanks may be specified by quoting,
17  *	in a manner similar to using the shell.
18  *	Control characters are entered by ^X where X is any
19  *	character; ^? gets you a rubout and ^^ is a real ^.
20  *	Warning (rti!trt): I doubt FANCYARGS is wise, since getargs
21  *	is used all over the place.  Its features may be useful
22  *	but a separate fancy_getargs() should be called instead.
23  *
24  *	return - the number of subfields.
25  */
26 
27 getargs(s, arps)
28 register char *s;
29 char *arps[];
30 {
31 	register int i;
32 #ifdef	FANCYARGS
33 	register char *sp;
34 	register char qchar;
35 #endif
36 
37 	i = 0;
38 #ifndef	FANCYARGS
39 	for (;;) {
40 		arps[i] = NULL;
41 		while (*s == ' ' || *s == '\t')
42 			*s++ = '\0';
43 		if (*s == '\n')
44 			*s = '\0';
45 		if (*s == '\0')
46 			break;
47 		arps[i++] = s++;
48 		while (*s != '\0' && *s != ' '
49 			&& *s != '\t' && *s != '\n')
50 				s++;
51 	}
52 #else
53 	for (;;) {
54 		while (*s == ' ' || *s == '\t')
55 			++s;
56 		if (*s == '\n' || *s == '\0')
57 			break;
58 		arps[i++] = sp = s;
59 		qchar = 0;
60 		while(*s != '\0'  &&  *s != '\n') {
61 			if (qchar == 0 && (*s == ' ' || *s == '\t')) {
62 				++s;
63 				break;
64 			}
65 			switch(*s) {
66 			default:
67 				*sp++ = *s++;
68 				break;
69 			case '^':
70 				if(*++s == '^')
71 					*sp++ = '^';
72 				else if(*s == '?')
73 					*sp++ = 0177;
74 				else
75 					*sp++ = *s & 037;
76 				s++;
77 				break;
78 			case '"':
79 			case '\'':
80 				if(qchar == *s) {
81 					qchar = 0;
82 					++s;
83 					break;
84 				}
85 				if(qchar)
86 					*sp++ = *s++;
87 				else
88 					qchar = *s++;
89 				break;
90 			}
91 		}
92 		*sp++ = 0;
93 	}
94 	arps[i] = NULL;
95 #endif
96 	return(i);
97 }
98