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