xref: /original-bsd/old/sdb/decode.c (revision bac5051c)
1 static	char sccsid[] = "@(#)decode.c 4.1 10/09/80";
2 #include "head.h"
3 
4 /* decode() - read a line from standard input and decode it */
5 
6 decode(p)
7 char *p; {
8 	register char c, *q;
9 	register int diff;
10 	integ = scallf = reflag = colonflag = ncolonflag = percentflag = 0;
11 	proc[0] = cmd = args[0] = var[0] = '\0';
12 	argsp = args;
13 
14 	if (eqany(*p, "/?")) {	/* regular expression */
15 		c = *p;
16 		redir = (c == '/');
17 		reflag = 1;
18 		p++;
19 		if (*p == '\n' || *p == c) return(0);
20 		q = re;
21 		while(*p != c && *p != '\n') *q++ = *p++;
22 		*q = '\0';
23 		return(0);
24 	}
25 
26 	if (*p == '!') { /* shell escape */
27 		for (q = p; *q != '\n'; q++) ;
28 		*q = '\0';
29 		system(p+1);
30 		return(0);
31 	}
32 
33 	if (*p == '\n') {
34 		cmd = '\n';
35 		return(0);
36 	}
37 
38 	if (*p == ':') {
39 		colonflag++;
40 	}
41 
42 	while (*p != '\n') {	/* decode item by item */
43 
44 		if (number(*p)) {	/* decimal number */
45 			if (integ) {
46 				error("Too many numbers");
47 				return(1);
48 			}
49 			integ = readint(&p);
50 			if (*p == ':') {
51 				ncolonflag++;
52 				p++;
53 			}
54 			continue;
55 		}
56 
57 		if (varchar(*p) || eqany(*p, COMMANDS)) {
58 					/* proc, variable or command */
59 			if (cmd != '\0') {
60 				p = cpall(args, p);
61 				continue;
62 			}
63 			q = p;
64 			while (varchar(*q) || number(*q) || eqany(*q,COMMANDS))
65 				q++;
66 			if (*q == '(') {	/* procedure call */
67 				if (proc[0] != '\0') {
68 					error("Too many procedure calls");
69 					return(1);
70 				}
71 				scallf = 1;
72 				p = cpname(proc, p);
73 				p = cpall(args, p);
74 				continue;
75 			}
76 			if (*q == ':') {	/* procedure name */
77 				colonflag++;
78 				p = cpname(proc, p);
79 				continue;
80 			}
81 			if (*q == '$') {	/* variable name */
82 				p = cpname(var, p);
83 				continue;
84 			}
85 			if (((q-p == 1 && eqany(*p,COMMANDS) &&
86 				(proc[0]=='\0' || eqany(*p, "abcd"))) ||
87 				(integ && eqany(*p,COMMANDS)) ||
88 				 eqany(*p, "+-?"))
89 				&& !(*p=='-' && *(p+1) == '>'))
90 							{  /* command */
91 				cmd = *p++;
92 				if (eqany(cmd, "Macers")) {
93 					while(*p == ' ')
94 						p++;
95 					p = cpall(args, p);
96 				}
97 				continue;
98 			}
99 			/* otherwise, its a variable */
100 			if (var[0] != '\0') {
101 				error("Too many variable names");
102 				return(1);
103 			}
104 			p = cpname(var, p);
105 			if (*p == '%') {
106 				percentflag++;
107 				p++;
108 			}
109 			if (eqstr(var, ".?")) {
110 				var[1] = '\0';
111 				cmd = '?';
112 			}
113 			if (*p == '\n') {
114 				cmd = '/';
115 				continue;
116 			}
117 			if (cmd == '\0') cmd = *p ? *p : '/';
118 			p++;
119 			p = cpall(args,p);
120 			continue;
121 		}
122 		p++;	/* otherwise ignore p */
123 	}
124 	return(0);
125 }
126