From 364ae1d2df84532fa659f6e6c305007dcd315083 Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Fri, 19 Jan 1979 16:11:56 -0500 Subject: [PATCH 1/1] Research V7 development Work on file usr/src/cmd/cb.c Co-Authored-By: Dennis Ritchie Synthesized-from: v7 --- usr/src/cmd/cb.c | 364 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 364 insertions(+) create mode 100644 usr/src/cmd/cb.c diff --git a/usr/src/cmd/cb.c b/usr/src/cmd/cb.c new file mode 100644 index 0000000000..9645aa0dce --- /dev/null +++ b/usr/src/cmd/cb.c @@ -0,0 +1,364 @@ +#include +int slevel[10]; +int clevel = 0; +int spflg[20][10]; +int sind[20][10]; +int siflev[10]; +int sifflg[10]; +int iflev = 0; +int ifflg = -1; +int level = 0; +int ind[10] = { + 0,0,0,0,0,0,0,0,0,0 }; +int eflg = 0; +int paren = 0; +int pflg[10] = { + 0,0,0,0,0,0,0,0,0,0 }; +char lchar; +char pchar; +int aflg = 0; +int ct; +int stabs[20][10]; +int qflg = 0; +char *wif[] = { + "if",0}; +char *welse[] = { + "else",0}; +char *wfor[] = { + "for",0}; +char *wds[] = { + "case","default",0}; +int j = 0; +char string[200]; +char cc; +int sflg = 1; +int peek = -1; +int tabs = 0; +int lastchar; +int c; +main(argc,argv) int argc; +char argv[]; +{ + while((c = getch()) != EOF){ + switch(c){ + case ' ': + case '\t': + if(lookup(welse) == 1){ + gotelse(); + if(sflg == 0 || j > 0)string[j++] = c; + puts(); + sflg = 0; + if(getnl() == 1){ + puts(); + printf("\n"); + sflg = 1; + pflg[level]++; + tabs++; + } + continue; + } + if(sflg == 0 || j > 0)string[j++] = c; + continue; + case '\n': + if((eflg = lookup(welse)) == 1)gotelse(); + puts(); + printf("\n"); + sflg = 1; + if(eflg == 1){ + pflg[level]++; + tabs++; + } + else + if(pchar == lchar) + aflg = 1; + continue; + case '{': + if(lookup(welse) == 1)gotelse(); + siflev[clevel] = iflev; + sifflg[clevel] = ifflg; + iflev = ifflg = 0; + clevel++; + if(sflg == 1 && pflg[level] != 0){ + pflg[level]--; + tabs--; + } + string[j++] = c; + puts(); + getnl(); + puts(); + printf("\n"); + tabs++; + sflg = 1; + if(pflg[level] > 0){ + ind[level] = 1; + level++; + slevel[level] = clevel; + } + continue; + case '}': + clevel--; + if((iflev = siflev[clevel]-1) < 0)iflev = 0; + ifflg = sifflg[clevel]; + if(pflg[level] >0 && ind[level] == 0){ + tabs -= pflg[level]; + pflg[level] = 0; + } + puts(); + tabs--; + ptabs(); + if((peek = getch()) == ';'){ + printf("%c;",c); + peek = -1; + } + else printf("%c",c); + getnl(); + puts(); + printf("\n"); + sflg = 1; + if(clevel < slevel[level])if(level > 0)level--; + if(ind[level] != 0){ + tabs -= pflg[level]; + pflg[level] = 0; + ind[level] = 0; + } + continue; + case '"': + case '\'': + string[j++] = c; + while((cc = getch()) != c){ + string[j++] = cc; + if(cc == '\\'){ + string[j++] = getch(); + } + if(cc == '\n'){ + puts(); + sflg = 1; + } + } + string[j++] = cc; + if(getnl() == 1){ + lchar = cc; + peek = '\n'; + } + continue; + case ';': + string[j++] = c; + puts(); + if(pflg[level] > 0 && ind[level] == 0){ + tabs -= pflg[level]; + pflg[level] = 0; + } + getnl(); + puts(); + printf("\n"); + sflg = 1; + if(iflev > 0) + if(ifflg == 1){iflev--; + ifflg = 0; + } + else iflev = 0; + continue; + case '\\': + string[j++] = c; + string[j++] = getch(); + continue; + case '?': + qflg = 1; + string[j++] = c; + continue; + case ':': + string[j++] = c; + if(qflg == 1){ + qflg = 0; + continue; + } + if(lookup(wds) == 0){ + sflg = 0; + puts(); + } + else{ + tabs--; + puts(); + tabs++; + } + if((peek = getch()) == ';'){ + printf(";"); + peek = -1; + } + getnl(); + puts(); + printf("\n"); + sflg = 1; + continue; + case '/': + string[j++] = c; + if((peek = getch()) != '*')continue; + string[j++] = peek; + peek = -1; + comment(); + continue; + case ')': + paren--; + string[j++] = c; + puts(); + if(getnl() == 1){ + peek = '\n'; + if(paren != 0)aflg = 1; + else if(tabs > 0){ + pflg[level]++; + tabs++; + ind[level] = 0; + } + } + continue; + case '#': + string[j++] = c; + while((cc = getch()) != '\n')string[j++] = cc; + string[j++] = cc; + sflg = 0; + puts(); + sflg = 1; + continue; + case '(': + string[j++] = c; + paren++; + if(lookup(wfor) == 1){ + while((c = gets()) != ';'); + ct=0; +cont: + while((c = gets()) != ')'){ + if(c == '(') ct++; + } + if(ct != 0){ + ct--; + goto cont; + } + paren--; + puts(); + if(getnl() == 1){ + peek = '\n'; + pflg[level]++; + tabs++; + ind[level] = 0; + } + continue; + } + if(lookup(wif) == 1){ + puts(); + stabs[clevel][iflev] = tabs; + spflg[clevel][iflev] = pflg[level]; + sind[clevel][iflev] = ind[level]; + iflev++; + ifflg = 1; + } + continue; + default: + string[j++] = c; + if(c != ',')lchar = c; + } + } +} +ptabs(){ + int i; + for(i=0; i < tabs; i++)printf("\t"); +} +getch(){ + if(peek < 0 && lastchar != ' ' && lastchar != '\t')pchar = lastchar; + lastchar = (peek<0) ? getc(stdin):peek; + peek = -1; + return(lastchar); +} +puts(){ + if(j > 0){ + if(sflg != 0){ + ptabs(); + sflg = 0; + if(aflg == 1){ + aflg = 0; + if(tabs > 0)printf(" "); + } + } + string[j] = '\0'; + printf("%s",string); + j = 0; + } + else{ + if(sflg != 0){ + sflg = 0; + aflg = 0; + } + } +} +lookup(tab) +char *tab[]; +{ + char r; + int l,kk,k,i; + if(j < 1)return(0); + kk=0; + while(string[kk] == ' ')kk++; + for(i=0; tab[i] != 0; i++){ + l=0; + for(k=kk;(r = tab[i][l++]) == string[k] && r != '\0';k++); + if(r == '\0' && (string[k] < 'a' || string[k] > 'z' || k >= j))return(1); + } + return(0); +} +gets(){ + char ch; +beg: + if((ch = string[j++] = getch()) == '\\'){ + string[j++] = getch(); + goto beg; + } + if(ch == '\'' || ch == '"'){ + while((cc = string[j++] = getch()) != ch)if(cc == '\\')string[j++] = getch(); + goto beg; + } + if(ch == '\n'){ + puts(); + aflg = 1; + goto beg; + } + else return(ch); +} +gotelse(){ + tabs = stabs[clevel][iflev]; + pflg[level] = spflg[clevel][iflev]; + ind[level] = sind[clevel][iflev]; + ifflg = 1; +} +getnl(){ + while((peek = getch()) == '\t' || peek == ' '){ + string[j++] = peek; + peek = -1; + } + if((peek = getch()) == '/'){ + peek = -1; + if((peek = getch()) == '*'){ + string[j++] = '/'; + string[j++] = '*'; + peek = -1; + comment(); + } + else string[j++] = '/'; + } + if((peek = getch()) == '\n'){ + peek = -1; + return(1); + } + return(0); +} +comment(){ +rep: + while((c = string[j++] = getch()) != '*') + if(c == '\n'){ + puts(); + sflg = 1; + } +gotstar: + if((c = string[j++] = getch()) != '/'){ + if(c == '*')goto gotstar; + goto rep; + } +} -- 2.20.1