Bell 32V development
[unix-history] / usr / src / cmd / sdb / decode.c
#include "head.h"
/* decode() - read a line from standard input and decode it */
decode() {
register char c, *q;
char *p;
integ = scallf = reflag = 0;
proc[0] = cmd = args[0] = var[0] = '\0';
argsp = args;
p = readline(stdin);
/*
if (*p == '/' && *(p+1) == '\n') {
cmd = '/';
return(0);
}
*/
if (eqany(*p, "/?")) { /* regular expression */
c = *p;
redir = (c == '/');
reflag = 1;
p++;
if (*p == '\n' || *p == c) return(0);
q = re;
while(*p != c && *p != '\n') *q++ = *p++;
*q = '\0';
return(0);
}
if (*p == '!') { /* shell escape */
for (q = p; *q != '\n'; q++) ;
*q = '\0';
system(p+1);
return(0);
}
if (*p == '\n') {
cmd = '\n';
return(0);
}
while (*p != '\n') { /* decode item by item */
if (number(*p)) { /* decimal number */
if(integ) {
error("Too many numbers");
return(1);
}
integ = readint(&p);
continue;
}
if (varchar(*p) || eqany(*p, COMMANDS)) {
/* proc, variable or command */
if (cmd != '\0') {
p = cpall(args, p);
continue;
}
q = p;
while (varchar(*q) || number(*q) || eqany(*q,COMMANDS))
q++;
if (*q == '(') { /* procedure call */
if (proc[0] != '\0') {
error("Too many procedure calls");
return(1);
}
scallf = 1;
p = cpname(proc, p);
p = cpall(args, p);
continue;
}
if (*q == ':') { /* procedure name */
p = cpname(proc, p);
continue;
}
if (*q == '$') { /* variable name */
p = cpname(var, p);
continue;
}
if ((q-p == 1 && eqany(*p,COMMANDS) &&
(proc[0]=='\0' || *p == 'b')) ||
integ || eqany(*p, "+-"))
{ /* command */
cmd = *p++;
continue;
}
/* otherwise, its a variable */
if (var[0] != '\0') {
error("Too many variable names");
return(1);
}
p = cpname(var, p);
if (*p == '\n') {
cmd = '/';
continue;
}
if (cmd == '\0') cmd = *p ? *p : '/';
p++;
p = cpall(args,p);
continue;
}
p++; /* otherwise ignore p */
}
return(0);
}