xref: /plan9/sys/src/cmd/cb/cb.c (revision ef7141bf6fd20bbc1132dfd69c9dfe3c339b3089)
12da9d879SDavid du Colombier #include <u.h>
22da9d879SDavid du Colombier #include <libc.h>
32da9d879SDavid du Colombier #include <bio.h>
42da9d879SDavid du Colombier #include "cb.h"
52da9d879SDavid du Colombier #include "cbtype.h"
62da9d879SDavid du Colombier 
7*ef7141bfSDavid du Colombier static void
usage(void)8*ef7141bfSDavid du Colombier usage(void)
9*ef7141bfSDavid du Colombier {
10*ef7141bfSDavid du Colombier 	fprint(2, "usage: cb [-sj] [-l width]\n");
11*ef7141bfSDavid du Colombier 	exits("usage");
12*ef7141bfSDavid du Colombier }
13*ef7141bfSDavid du Colombier 
142da9d879SDavid du Colombier void
main(int argc,char * argv[])152da9d879SDavid du Colombier main(int argc, char *argv[])
162da9d879SDavid du Colombier {
172da9d879SDavid du Colombier 	Biobuf stdin, stdout;
182da9d879SDavid du Colombier 
19*ef7141bfSDavid du Colombier 	ARGBEGIN{
202da9d879SDavid du Colombier 	case 'j':
212da9d879SDavid du Colombier 		join = 1;
22*ef7141bfSDavid du Colombier 		break;
232da9d879SDavid du Colombier 	case 'l':
24*ef7141bfSDavid du Colombier 		maxleng = atoi(EARGF(usage()));
252da9d879SDavid du Colombier 		maxtabs = maxleng/TABLENG - 2;
262da9d879SDavid du Colombier 		maxleng -= (maxleng + 5)/10;
27*ef7141bfSDavid du Colombier 		break;
28*ef7141bfSDavid du Colombier 	case 's':
29*ef7141bfSDavid du Colombier 		strict = 1;
30*ef7141bfSDavid du Colombier 		break;
312da9d879SDavid du Colombier 	default:
32*ef7141bfSDavid du Colombier 		usage();
33*ef7141bfSDavid du Colombier 	}ARGEND
34*ef7141bfSDavid du Colombier 
352da9d879SDavid du Colombier 	Binit(&stdout, 1, OWRITE);
362da9d879SDavid du Colombier 	output = &stdout;
372da9d879SDavid du Colombier 	if (argc <= 0){
382da9d879SDavid du Colombier 		Binit(&stdin, 0, OREAD);
392da9d879SDavid du Colombier 		input = &stdin;
402da9d879SDavid du Colombier 		work();
413be656c8SDavid du Colombier 		Bterm(input);
422da9d879SDavid du Colombier 	} else {
432da9d879SDavid du Colombier 		while (argc-- > 0){
44*ef7141bfSDavid du Colombier 			if ((input = Bopen(*argv, OREAD)) == 0)
45*ef7141bfSDavid du Colombier 				sysfatal("can't open input file %s: %r", *argv);
462da9d879SDavid du Colombier 			work();
473be656c8SDavid du Colombier 			Bterm(input);
482da9d879SDavid du Colombier 			argv++;
492da9d879SDavid du Colombier 		}
502da9d879SDavid du Colombier 	}
512da9d879SDavid du Colombier 	exits(0);
522da9d879SDavid du Colombier }
532da9d879SDavid du Colombier void
work(void)5488110b43SDavid du Colombier work(void)
5588110b43SDavid du Colombier {
5688110b43SDavid du Colombier 	int c, cc;
572da9d879SDavid du Colombier 	struct keyw *lptr;
582da9d879SDavid du Colombier 	char *pt;
592da9d879SDavid du Colombier 	int ct;
602da9d879SDavid du Colombier 
612da9d879SDavid du Colombier 	while ((c = getch()) != Beof){
622da9d879SDavid du Colombier 		switch (c){
632da9d879SDavid du Colombier 		case '{':
642da9d879SDavid du Colombier 			if ((lptr = lookup(lastlook,p)) != 0){
652da9d879SDavid du Colombier 				if (lptr->type == ELSE)gotelse();
662da9d879SDavid du Colombier 				else if(lptr->type == DO)gotdo();
672da9d879SDavid du Colombier 				else if(lptr->type == STRUCT)structlev++;
682da9d879SDavid du Colombier 			}
692da9d879SDavid du Colombier 			if(++clev >= &ind[CLEVEL-1]){
702da9d879SDavid du Colombier 				fprint(2,"too many levels of curly brackets\n");
712da9d879SDavid du Colombier 				clev = &ind[CLEVEL-1];
722da9d879SDavid du Colombier 			}
732da9d879SDavid du Colombier 			clev->pdepth = 0;
742da9d879SDavid du Colombier 			clev->tabs = (clev-1)->tabs;
752da9d879SDavid du Colombier 			clearif(clev);
762da9d879SDavid du Colombier 			if(strict && clev->tabs > 0)
772da9d879SDavid du Colombier 				putspace(' ',NO);
782da9d879SDavid du Colombier 			putch(c,NO);
792da9d879SDavid du Colombier 			getnl();
802da9d879SDavid du Colombier 			if(keyflag == DATADEF){
812da9d879SDavid du Colombier 				OUT;
822da9d879SDavid du Colombier 			}
832da9d879SDavid du Colombier 			else {
842da9d879SDavid du Colombier 				OUTK;
852da9d879SDavid du Colombier 			}
862da9d879SDavid du Colombier 			clev->tabs++;
872da9d879SDavid du Colombier 			pt = getnext(0);		/* to handle initialized structures */
882da9d879SDavid du Colombier 			if(*pt == '{'){		/* hide one level of {} */
892da9d879SDavid du Colombier 				while((c=getch()) != '{')
902da9d879SDavid du Colombier 					if(c == Beof)error("{");
912da9d879SDavid du Colombier 				putch(c,NO);
922da9d879SDavid du Colombier 				if(strict){
932da9d879SDavid du Colombier 					putch(' ',NO);
942da9d879SDavid du Colombier 					eatspace();
952da9d879SDavid du Colombier 				}
962da9d879SDavid du Colombier 				keyflag = SINIT;
972da9d879SDavid du Colombier 			}
982da9d879SDavid du Colombier 			continue;
992da9d879SDavid du Colombier 		case '}':
1002da9d879SDavid du Colombier 			pt = getnext(0);		/* to handle initialized structures */
1012da9d879SDavid du Colombier 			if(*pt == ','){
1022da9d879SDavid du Colombier 				if(strict){
1032da9d879SDavid du Colombier 					putspace(' ',NO);
1042da9d879SDavid du Colombier 					eatspace();
1052da9d879SDavid du Colombier 				}
1062da9d879SDavid du Colombier 				putch(c,NO);
1072da9d879SDavid du Colombier 				putch(*pt,NO);
1082da9d879SDavid du Colombier 				*pt = '\0';
1092da9d879SDavid du Colombier 				ct = getnl();
1102da9d879SDavid du Colombier 				pt = getnext(0);
1112da9d879SDavid du Colombier 				if(*pt == '{'){
1122da9d879SDavid du Colombier 					OUT;
1132da9d879SDavid du Colombier 					while((cc = getch()) != '{')
1142da9d879SDavid du Colombier 						if(cc == Beof)error("}");
1152da9d879SDavid du Colombier 					putch(cc,NO);
1162da9d879SDavid du Colombier 					if(strict){
1172da9d879SDavid du Colombier 						putch(' ',NO);
1182da9d879SDavid du Colombier 						eatspace();
1192da9d879SDavid du Colombier 					}
1202da9d879SDavid du Colombier 					getnext(0);
1212da9d879SDavid du Colombier 					continue;
1222da9d879SDavid du Colombier 				}
1232da9d879SDavid du Colombier 				else if(strict || ct){
1242da9d879SDavid du Colombier 					OUT;
1252da9d879SDavid du Colombier 				}
1262da9d879SDavid du Colombier 				continue;
1272da9d879SDavid du Colombier 			}
1282da9d879SDavid du Colombier 			else if(keyflag == SINIT && *pt == '}'){
1292da9d879SDavid du Colombier 				if(strict)
1302da9d879SDavid du Colombier 					putspace(' ',NO);
1312da9d879SDavid du Colombier 				putch(c,NO);
1322da9d879SDavid du Colombier 				getnl();
1332da9d879SDavid du Colombier 				OUT;
1342da9d879SDavid du Colombier 				keyflag = DATADEF;
1352da9d879SDavid du Colombier 				*pt = '\0';
1362da9d879SDavid du Colombier 				pt = getnext(0);
1372da9d879SDavid du Colombier 			}
1382da9d879SDavid du Colombier 			outs(clev->tabs);
1392da9d879SDavid du Colombier 			if(--clev < ind)clev = ind;
1402da9d879SDavid du Colombier 			ptabs(clev->tabs);
1412da9d879SDavid du Colombier 			putch(c,NO);
1422da9d879SDavid du Colombier 			lbegin = 0;
1432da9d879SDavid du Colombier 			lptr=lookup(pt,lastplace+1);
1442da9d879SDavid du Colombier 			c = *pt;
1452da9d879SDavid du Colombier 			if(*pt == ';' || *pt == ','){
1462da9d879SDavid du Colombier 				putch(*pt,NO);
1472da9d879SDavid du Colombier 				*pt = '\0';
1482da9d879SDavid du Colombier 				lastplace=pt;
1492da9d879SDavid du Colombier 			}
1502da9d879SDavid du Colombier 			ct = getnl();
1512da9d879SDavid du Colombier 			if((dolevel && clev->tabs <= dotabs[dolevel]) || (structlev )
1522da9d879SDavid du Colombier 			    || (lptr != 0 &&lptr->type == ELSE&& clev->pdepth == 0)){
1532da9d879SDavid du Colombier 				if(c == ';'){
1542da9d879SDavid du Colombier 					OUTK;
1552da9d879SDavid du Colombier 				}
1562da9d879SDavid du Colombier 				else if(strict || (lptr != 0 && lptr->type == ELSE && ct == 0)){
1572da9d879SDavid du Colombier 					putspace(' ',NO);
1582da9d879SDavid du Colombier 					eatspace();
1592da9d879SDavid du Colombier 				}
1602da9d879SDavid du Colombier 				else if(lptr != 0 && lptr->type == ELSE){
1612da9d879SDavid du Colombier 					OUTK;
1622da9d879SDavid du Colombier 				}
1632da9d879SDavid du Colombier 				if(structlev){
1642da9d879SDavid du Colombier 					structlev--;
1652da9d879SDavid du Colombier 					keyflag = DATADEF;
1662da9d879SDavid du Colombier 				}
1672da9d879SDavid du Colombier 			}
1682da9d879SDavid du Colombier 			else {
1692da9d879SDavid du Colombier 				OUTK;
1702da9d879SDavid du Colombier 				if(strict && clev->tabs == 0){
1712da9d879SDavid du Colombier 					if((c=getch()) != '\n'){
1722da9d879SDavid du Colombier 						Bputc(output, '\n');
1732da9d879SDavid du Colombier 						Bputc(output, '\n');
1742da9d879SDavid du Colombier 						unget(c);
1752da9d879SDavid du Colombier 					}
1762da9d879SDavid du Colombier 					else {
1772da9d879SDavid du Colombier 						lineno++;
1782da9d879SDavid du Colombier 						Bputc(output, '\n');
1792da9d879SDavid du Colombier 						if((c=getch()) != '\n')unget(c);
1802da9d879SDavid du Colombier 						else lineno++;
1812da9d879SDavid du Colombier 						Bputc(output, '\n');
1822da9d879SDavid du Colombier 					}
1832da9d879SDavid du Colombier 				}
1842da9d879SDavid du Colombier 			}
1852da9d879SDavid du Colombier 			if(lptr != 0 && lptr->type == ELSE && clev->pdepth != 0){
1862da9d879SDavid du Colombier 				UNBUMP;
1872da9d879SDavid du Colombier 			}
1882da9d879SDavid du Colombier 			if(lptr == 0 || lptr->type != ELSE){
1892da9d879SDavid du Colombier 				clev->iflev = 0;
1902da9d879SDavid du Colombier 				if(dolevel && docurly[dolevel] == NO && clev->tabs == dotabs[dolevel]+1)
1912da9d879SDavid du Colombier 					clev->tabs--;
1922da9d879SDavid du Colombier 				else if(clev->pdepth != 0){
1932da9d879SDavid du Colombier 					UNBUMP;
1942da9d879SDavid du Colombier 				}
1952da9d879SDavid du Colombier 			}
1962da9d879SDavid du Colombier 			continue;
1972da9d879SDavid du Colombier 		case '(':
1982da9d879SDavid du Colombier 			paren++;
1992da9d879SDavid du Colombier 			if ((lptr = lookup(lastlook,p)) != 0){
2002da9d879SDavid du Colombier 				if(!(lptr->type == TYPE || lptr->type == STRUCT))keyflag=KEYWORD;
2012da9d879SDavid du Colombier 				if (strict){
2022da9d879SDavid du Colombier 					putspace(lptr->punc,NO);
2032da9d879SDavid du Colombier 					opflag = 1;
2042da9d879SDavid du Colombier 				}
2052da9d879SDavid du Colombier 				putch(c,NO);
2062da9d879SDavid du Colombier 				if (lptr->type == IF)gotif();
2072da9d879SDavid du Colombier 			}
2082da9d879SDavid du Colombier 			else {
2092da9d879SDavid du Colombier 				putch(c,NO);
2102da9d879SDavid du Colombier 				lastlook = p;
2112da9d879SDavid du Colombier 				opflag = 1;
2122da9d879SDavid du Colombier 			}
2132da9d879SDavid du Colombier 			continue;
2142da9d879SDavid du Colombier 		case ')':
2152da9d879SDavid du Colombier 			if(--paren < 0)paren = 0;
2162da9d879SDavid du Colombier 			putch(c,NO);
2172da9d879SDavid du Colombier 			if((lptr = lookup(lastlook,p)) != 0){
2182da9d879SDavid du Colombier 				if(lptr->type == TYPE || lptr->type == STRUCT)
2192da9d879SDavid du Colombier 					opflag = 1;
2202da9d879SDavid du Colombier 			}
2212da9d879SDavid du Colombier 			else if(keyflag == DATADEF)opflag = 1;
2222da9d879SDavid du Colombier 			else opflag = 0;
2232da9d879SDavid du Colombier 			outs(clev->tabs);
2242da9d879SDavid du Colombier 			pt = getnext(1);
2252da9d879SDavid du Colombier 			if ((ct = getnl()) == 1 && !strict){
2262da9d879SDavid du Colombier 				if(dolevel && clev->tabs <= dotabs[dolevel])
2272da9d879SDavid du Colombier 					resetdo();
2282da9d879SDavid du Colombier 				if(clev->tabs > 0 && (paren != 0 || keyflag == 0)){
2292da9d879SDavid du Colombier 					if(join){
2302da9d879SDavid du Colombier 						eatspace();
2312da9d879SDavid du Colombier 						putch(' ',YES);
2322da9d879SDavid du Colombier 						continue;
2332da9d879SDavid du Colombier 					} else {
2342da9d879SDavid du Colombier 						OUT;
2352da9d879SDavid du Colombier 						split = 1;
2362da9d879SDavid du Colombier 						continue;
2372da9d879SDavid du Colombier 					}
2382da9d879SDavid du Colombier 				}
2392da9d879SDavid du Colombier 				else if(clev->tabs > 0 && *pt != '{'){
2402da9d879SDavid du Colombier 					BUMP;
2412da9d879SDavid du Colombier 				}
2422da9d879SDavid du Colombier 				OUTK;
2432da9d879SDavid du Colombier 			}
2442da9d879SDavid du Colombier 			else if(strict){
2452da9d879SDavid du Colombier 				if(clev->tabs == 0){
2462da9d879SDavid du Colombier 					if(*pt != ';' && *pt != ',' && *pt != '(' && *pt != '['){
2472da9d879SDavid du Colombier 						OUTK;
2482da9d879SDavid du Colombier 					}
2492da9d879SDavid du Colombier 				}
2502da9d879SDavid du Colombier 				else {
2512da9d879SDavid du Colombier 					if(keyflag == KEYWORD && paren == 0){
2522da9d879SDavid du Colombier 						if(dolevel && clev->tabs <= dotabs[dolevel]){
2532da9d879SDavid du Colombier 							resetdo();
2542da9d879SDavid du Colombier 							eatspace();
2552da9d879SDavid du Colombier 							continue;
2562da9d879SDavid du Colombier 						}
2572da9d879SDavid du Colombier 						if(*pt != '{'){
2582da9d879SDavid du Colombier 							BUMP;
2592da9d879SDavid du Colombier 							OUTK;
2602da9d879SDavid du Colombier 						}
2612da9d879SDavid du Colombier 						else {
2622da9d879SDavid du Colombier 							*pt='\0';
2632da9d879SDavid du Colombier 							eatspace();
2642da9d879SDavid du Colombier 							unget('{');
2652da9d879SDavid du Colombier 						}
2662da9d879SDavid du Colombier 					}
2672da9d879SDavid du Colombier 					else if(ct){
2682da9d879SDavid du Colombier 						if(paren){
2692da9d879SDavid du Colombier 							if(join){
2702da9d879SDavid du Colombier 								eatspace();
2712da9d879SDavid du Colombier 							} else {
2722da9d879SDavid du Colombier 								split = 1;
2732da9d879SDavid du Colombier 								OUT;
2742da9d879SDavid du Colombier 							}
2752da9d879SDavid du Colombier 						}
2762da9d879SDavid du Colombier 						else {
2772da9d879SDavid du Colombier 							OUTK;
2782da9d879SDavid du Colombier 						}
2792da9d879SDavid du Colombier 					}
2802da9d879SDavid du Colombier 				}
2812da9d879SDavid du Colombier 			}
2822da9d879SDavid du Colombier 			else if(dolevel && clev->tabs <= dotabs[dolevel])
2832da9d879SDavid du Colombier 				resetdo();
2842da9d879SDavid du Colombier 			continue;
2852da9d879SDavid du Colombier 		case ' ':
2862da9d879SDavid du Colombier 		case '\t':
2872da9d879SDavid du Colombier 			if ((lptr = lookup(lastlook,p)) != 0){
2882da9d879SDavid du Colombier 				if(!(lptr->type==TYPE||lptr->type==STRUCT))
2892da9d879SDavid du Colombier 					keyflag = KEYWORD;
2902da9d879SDavid du Colombier 				else if(paren == 0)keyflag = DATADEF;
2912da9d879SDavid du Colombier 				if(strict){
2922da9d879SDavid du Colombier 					if(lptr->type != ELSE){
2932da9d879SDavid du Colombier 						if(lptr->type == TYPE){
2942da9d879SDavid du Colombier 							if(paren != 0)putch(' ',YES);
2952da9d879SDavid du Colombier 						}
2962da9d879SDavid du Colombier 						else
2972da9d879SDavid du Colombier 							putch(lptr->punc,NO);
2982da9d879SDavid du Colombier 						eatspace();
2992da9d879SDavid du Colombier 					}
3002da9d879SDavid du Colombier 				}
3012da9d879SDavid du Colombier 				else putch(c,YES);
3022da9d879SDavid du Colombier 				switch(lptr->type){
3032da9d879SDavid du Colombier 				case CASE:
3042da9d879SDavid du Colombier 					outs(clev->tabs-1);
3052da9d879SDavid du Colombier 					continue;
3062da9d879SDavid du Colombier 				case ELSE:
3072da9d879SDavid du Colombier 					pt = getnext(1);
3082da9d879SDavid du Colombier 					eatspace();
3092da9d879SDavid du Colombier 					if((cc = getch()) == '\n' && !strict){
3102da9d879SDavid du Colombier 						unget(cc);
3112da9d879SDavid du Colombier 					}
3122da9d879SDavid du Colombier 					else {
3132da9d879SDavid du Colombier 						unget(cc);
3142da9d879SDavid du Colombier 						if(checkif(pt))continue;
3152da9d879SDavid du Colombier 					}
3162da9d879SDavid du Colombier 					gotelse();
3172da9d879SDavid du Colombier 					if(strict) unget(c);
3182da9d879SDavid du Colombier 					if(getnl() == 1 && !strict){
3192da9d879SDavid du Colombier 						OUTK;
3202da9d879SDavid du Colombier 						if(*pt != '{'){
3212da9d879SDavid du Colombier 							BUMP;
3222da9d879SDavid du Colombier 						}
3232da9d879SDavid du Colombier 					}
3242da9d879SDavid du Colombier 					else if(strict){
3252da9d879SDavid du Colombier 						if(*pt != '{'){
3262da9d879SDavid du Colombier 							OUTK;
3272da9d879SDavid du Colombier 							BUMP;
3282da9d879SDavid du Colombier 						}
3292da9d879SDavid du Colombier 					}
3302da9d879SDavid du Colombier 					continue;
3312da9d879SDavid du Colombier 				case IF:
3322da9d879SDavid du Colombier 					gotif();
3332da9d879SDavid du Colombier 					continue;
3342da9d879SDavid du Colombier 				case DO:
3352da9d879SDavid du Colombier 					gotdo();
3362da9d879SDavid du Colombier 					pt = getnext(1);
3372da9d879SDavid du Colombier 					if(*pt != '{'){
3382da9d879SDavid du Colombier 						eatallsp();
3392da9d879SDavid du Colombier 						OUTK;
3402da9d879SDavid du Colombier 						docurly[dolevel] = NO;
3412da9d879SDavid du Colombier 						dopdepth[dolevel] = clev->pdepth;
3422da9d879SDavid du Colombier 						clev->pdepth = 0;
3432da9d879SDavid du Colombier 						clev->tabs++;
3442da9d879SDavid du Colombier 					}
3452da9d879SDavid du Colombier 					continue;
3462da9d879SDavid du Colombier 				case TYPE:
3472da9d879SDavid du Colombier 					if(paren)continue;
3482da9d879SDavid du Colombier 					if(!strict)continue;
3492da9d879SDavid du Colombier 					gottype(lptr);
3502da9d879SDavid du Colombier 					continue;
3512da9d879SDavid du Colombier 				case STRUCT:
3522da9d879SDavid du Colombier 					gotstruct();
3532da9d879SDavid du Colombier 					continue;
3542da9d879SDavid du Colombier 				}
3552da9d879SDavid du Colombier 			}
3562da9d879SDavid du Colombier 			else if (lbegin == 0 || p > string)
3572da9d879SDavid du Colombier 				if(strict)
3582da9d879SDavid du Colombier 					putch(c,NO);
3592da9d879SDavid du Colombier 				else putch(c,YES);
3602da9d879SDavid du Colombier 			continue;
3612da9d879SDavid du Colombier 		case ';':
3622da9d879SDavid du Colombier 			putch(c,NO);
3632da9d879SDavid du Colombier 			if(paren != 0){
3642da9d879SDavid du Colombier 				if(strict){
3652da9d879SDavid du Colombier 					putch(' ',YES);
3662da9d879SDavid du Colombier 					eatspace();
3672da9d879SDavid du Colombier 				}
3682da9d879SDavid du Colombier 				opflag = 1;
3692da9d879SDavid du Colombier 				continue;
3702da9d879SDavid du Colombier 			}
3712da9d879SDavid du Colombier 			outs(clev->tabs);
3722da9d879SDavid du Colombier 			pt = getnext(0);
3732da9d879SDavid du Colombier 			lptr=lookup(pt,lastplace+1);
3742da9d879SDavid du Colombier 			if(lptr == 0 || lptr->type != ELSE){
3752da9d879SDavid du Colombier 				clev->iflev = 0;
3762da9d879SDavid du Colombier 				if(clev->pdepth != 0){
3772da9d879SDavid du Colombier 					UNBUMP;
3782da9d879SDavid du Colombier 				}
3792da9d879SDavid du Colombier 				if(dolevel && docurly[dolevel] == NO && clev->tabs <= dotabs[dolevel]+1)
3802da9d879SDavid du Colombier 					clev->tabs--;
3812da9d879SDavid du Colombier /*
3822da9d879SDavid du Colombier 				else if(clev->pdepth != 0){
3832da9d879SDavid du Colombier 					UNBUMP;
3842da9d879SDavid du Colombier 				}
3852da9d879SDavid du Colombier */
3862da9d879SDavid du Colombier 			}
3872da9d879SDavid du Colombier 			getnl();
3882da9d879SDavid du Colombier 			OUTK;
3892da9d879SDavid du Colombier 			continue;
3902da9d879SDavid du Colombier 		case '\n':
3912da9d879SDavid du Colombier 			if ((lptr = lookup(lastlook,p)) != 0){
3922da9d879SDavid du Colombier 				pt = getnext(1);
3932da9d879SDavid du Colombier 				if (lptr->type == ELSE){
3942da9d879SDavid du Colombier 					if(strict)
3952da9d879SDavid du Colombier 						if(checkif(pt))continue;
3962da9d879SDavid du Colombier 					gotelse();
3972da9d879SDavid du Colombier 					OUTK;
3982da9d879SDavid du Colombier 					if(*pt != '{'){
3992da9d879SDavid du Colombier 						BUMP;
4002da9d879SDavid du Colombier 					}
4012da9d879SDavid du Colombier 				}
4022da9d879SDavid du Colombier 				else if(lptr->type == DO){
4032da9d879SDavid du Colombier 					OUTK;
4042da9d879SDavid du Colombier 					gotdo();
4052da9d879SDavid du Colombier 					if(*pt != '{'){
4062da9d879SDavid du Colombier 						docurly[dolevel] = NO;
4072da9d879SDavid du Colombier 						dopdepth[dolevel] = clev->pdepth;
4082da9d879SDavid du Colombier 						clev->pdepth = 0;
4092da9d879SDavid du Colombier 						clev->tabs++;
4102da9d879SDavid du Colombier 					}
4112da9d879SDavid du Colombier 				}
4122da9d879SDavid du Colombier 				else {
4132da9d879SDavid du Colombier 					OUTK;
4142da9d879SDavid du Colombier 					if(lptr->type == STRUCT)gotstruct();
4152da9d879SDavid du Colombier 				}
4162da9d879SDavid du Colombier 			}
4172da9d879SDavid du Colombier 			else if(p == string)Bputc(output, '\n');
4182da9d879SDavid du Colombier 			else {
4192da9d879SDavid du Colombier 				if(clev->tabs > 0 &&(paren != 0 || keyflag == 0)){
4202da9d879SDavid du Colombier 					if(join){
4212da9d879SDavid du Colombier 						putch(' ',YES);
4222da9d879SDavid du Colombier 						eatspace();
4232da9d879SDavid du Colombier 						continue;
4242da9d879SDavid du Colombier 					} else {
4252da9d879SDavid du Colombier 						OUT;
4262da9d879SDavid du Colombier 						split = 1;
4272da9d879SDavid du Colombier 						continue;
4282da9d879SDavid du Colombier 					}
4292da9d879SDavid du Colombier 				}
4302da9d879SDavid du Colombier 				else if(keyflag == KEYWORD){
4312da9d879SDavid du Colombier 					OUTK;
4322da9d879SDavid du Colombier 					continue;
4332da9d879SDavid du Colombier 				}
4342da9d879SDavid du Colombier 				OUT;
4352da9d879SDavid du Colombier 			}
4362da9d879SDavid du Colombier 			continue;
4372da9d879SDavid du Colombier 		case '"':
4382da9d879SDavid du Colombier 		case '\'':
4392da9d879SDavid du Colombier 			putch(c,NO);
4402da9d879SDavid du Colombier 			while ((cc = getch()) != c){
4412da9d879SDavid du Colombier 				if(cc == Beof)
4422da9d879SDavid du Colombier 					error("\" or '");
4432da9d879SDavid du Colombier 				putch(cc,NO);
4442da9d879SDavid du Colombier 				if (cc == '\\'){
4452da9d879SDavid du Colombier 					putch(getch(),NO);
4462da9d879SDavid du Colombier 				}
4472da9d879SDavid du Colombier 				if (cc == '\n'){
4482da9d879SDavid du Colombier 					outs(clev->tabs);
4492da9d879SDavid du Colombier 					lbegin = 1;
4502da9d879SDavid du Colombier 					count = 0;
4512da9d879SDavid du Colombier 				}
4522da9d879SDavid du Colombier 			}
4532da9d879SDavid du Colombier 			putch(cc,NO);
4542da9d879SDavid du Colombier 			opflag=0;
4552da9d879SDavid du Colombier 			if (getnl() == 1){
4562da9d879SDavid du Colombier 				unget('\n');
4572da9d879SDavid du Colombier 			}
4582da9d879SDavid du Colombier 			continue;
4592da9d879SDavid du Colombier 		case '\\':
4602da9d879SDavid du Colombier 			putch(c,NO);
4612da9d879SDavid du Colombier 			putch(getch(),NO);
4622da9d879SDavid du Colombier 			continue;
4632da9d879SDavid du Colombier 		case '?':
4642da9d879SDavid du Colombier 			question = 1;
4652da9d879SDavid du Colombier 			gotop(c);
4662da9d879SDavid du Colombier 			continue;
4672da9d879SDavid du Colombier 		case ':':
468ab3dc52fSDavid du Colombier 			if ((cc = getch()) == ':') {
469ab3dc52fSDavid du Colombier 				putch(c,NO);
470ab3dc52fSDavid du Colombier 				putch(cc,NO);
471ab3dc52fSDavid du Colombier 				continue;
472ab3dc52fSDavid du Colombier 			}
47388110b43SDavid du Colombier 			unget(cc);
4742da9d879SDavid du Colombier 			if (question == 1){
4752da9d879SDavid du Colombier 				question = 0;
4762da9d879SDavid du Colombier 				gotop(c);
4772da9d879SDavid du Colombier 				continue;
4782da9d879SDavid du Colombier 			}
4792da9d879SDavid du Colombier 			putch(c,NO);
4802da9d879SDavid du Colombier 			if(structlev)continue;
4812da9d879SDavid du Colombier 			if ((lptr = lookup(lastlook,p)) != 0){
4822da9d879SDavid du Colombier 				if (lptr->type == CASE)outs(clev->tabs - 1);
4832da9d879SDavid du Colombier 			}
4842da9d879SDavid du Colombier 			else {
4852da9d879SDavid du Colombier 				lbegin = 0;
4862da9d879SDavid du Colombier 				outs(clev->tabs);
4872da9d879SDavid du Colombier 			}
4882da9d879SDavid du Colombier 			getnl();
4892da9d879SDavid du Colombier 			OUTK;
4902da9d879SDavid du Colombier 			continue;
4912da9d879SDavid du Colombier 		case '/':
492aade22e6SDavid du Colombier 			if ((cc = getch()) == '/') {
493aade22e6SDavid du Colombier 				putch(c,NO);
494aade22e6SDavid du Colombier 				putch(cc,NO);
495aade22e6SDavid du Colombier 				cpp_comment(YES);
496aade22e6SDavid du Colombier 				OUT;
497aade22e6SDavid du Colombier 				lastlook = 0;
498aade22e6SDavid du Colombier 				continue;
499aade22e6SDavid du Colombier 			}
500aade22e6SDavid du Colombier 			else if (cc != '*') {
5012da9d879SDavid du Colombier 				unget(cc);
5022da9d879SDavid du Colombier 				gotop(c);
5032da9d879SDavid du Colombier 				continue;
5042da9d879SDavid du Colombier 			}
5052da9d879SDavid du Colombier 			putch(c,NO);
5062da9d879SDavid du Colombier 			putch(cc,NO);
5072da9d879SDavid du Colombier 			cc = comment(YES);
5082da9d879SDavid du Colombier 			if(getnl() == 1){
5092da9d879SDavid du Colombier 				if(cc == 0){
5102da9d879SDavid du Colombier 					OUT;
5112da9d879SDavid du Colombier 				}
5122da9d879SDavid du Colombier 				else {
5132da9d879SDavid du Colombier 					outs(0);
5142da9d879SDavid du Colombier 					Bputc(output, '\n');
5152da9d879SDavid du Colombier 					lbegin = 1;
5162da9d879SDavid du Colombier 					count = 0;
5172da9d879SDavid du Colombier 				}
5182da9d879SDavid du Colombier 				lastlook = 0;
5192da9d879SDavid du Colombier 			}
5202da9d879SDavid du Colombier 			continue;
5212da9d879SDavid du Colombier 		case '[':
5222da9d879SDavid du Colombier 			putch(c,NO);
5232da9d879SDavid du Colombier 			ct = 0;
5242da9d879SDavid du Colombier 			while((c = getch()) != ']' || ct > 0){
5252da9d879SDavid du Colombier 				if(c == Beof)error("]");
5262da9d879SDavid du Colombier 				putch(c,NO);
5272da9d879SDavid du Colombier 				if(c == '[')ct++;
5282da9d879SDavid du Colombier 				if(c == ']')ct--;
5292da9d879SDavid du Colombier 			}
5302da9d879SDavid du Colombier 			putch(c,NO);
5312da9d879SDavid du Colombier 			continue;
5322da9d879SDavid du Colombier 		case '#':
5332da9d879SDavid du Colombier 			putch(c,NO);
5342da9d879SDavid du Colombier 			while ((cc = getch()) != '\n'){
5352da9d879SDavid du Colombier 				if(cc == Beof)error("newline");
5362da9d879SDavid du Colombier 				if (cc == '\\'){
5372da9d879SDavid du Colombier 					putch(cc,NO);
5382da9d879SDavid du Colombier 					cc = getch();
5392da9d879SDavid du Colombier 				}
5402da9d879SDavid du Colombier 				putch(cc,NO);
5412da9d879SDavid du Colombier 			}
5422da9d879SDavid du Colombier 			putch(cc,NO);
5432da9d879SDavid du Colombier 			lbegin = 0;
5442da9d879SDavid du Colombier 			outs(clev->tabs);
5452da9d879SDavid du Colombier 			lbegin = 1;
5462da9d879SDavid du Colombier 			count = 0;
5472da9d879SDavid du Colombier 			continue;
5482da9d879SDavid du Colombier 		default:
5492da9d879SDavid du Colombier 			if (c == ','){
5502da9d879SDavid du Colombier 				opflag = 1;
5512da9d879SDavid du Colombier 				putch(c,YES);
5522da9d879SDavid du Colombier 				if (strict){
5532da9d879SDavid du Colombier 					if ((cc = getch()) != ' ')unget(cc);
5542da9d879SDavid du Colombier 					if(cc != '\n')putch(' ',YES);
5552da9d879SDavid du Colombier 				}
5562da9d879SDavid du Colombier 			}
5572da9d879SDavid du Colombier 			else if(isop(c))gotop(c);
5582da9d879SDavid du Colombier 			else {
5592da9d879SDavid du Colombier 				if(isalnum(c) && lastlook == 0)lastlook = p;
5602da9d879SDavid du Colombier 				if(isdigit(c)){
5612da9d879SDavid du Colombier 					putch(c,NO);
5622da9d879SDavid du Colombier 					while(isdigit(c=Bgetc(input))||c == '.')putch(c,NO);
5632da9d879SDavid du Colombier 					if(c == 'e'){
5642da9d879SDavid du Colombier 						putch(c,NO);
5652da9d879SDavid du Colombier 						c = Bgetc(input);
5662da9d879SDavid du Colombier 						putch(c, NO);
5672da9d879SDavid du Colombier 						while(isdigit(c=Bgetc(input)))putch(c,NO);
5682da9d879SDavid du Colombier 					}
5692da9d879SDavid du Colombier 					Bungetc(input);
5702da9d879SDavid du Colombier 				}
5712da9d879SDavid du Colombier 				else putch(c,NO);
5722da9d879SDavid du Colombier 				if(keyflag != DATADEF)opflag = 0;
5732da9d879SDavid du Colombier 			}
5742da9d879SDavid du Colombier 		}
5752da9d879SDavid du Colombier 	}
5762da9d879SDavid du Colombier }
5772da9d879SDavid du Colombier void
gotif(void)5782da9d879SDavid du Colombier gotif(void){
5792da9d879SDavid du Colombier 	outs(clev->tabs);
5802da9d879SDavid du Colombier 	if(++clev->iflev >= IFLEVEL-1){
5812da9d879SDavid du Colombier 		fprint(2,"too many levels of if %d\n",clev->iflev );
5822da9d879SDavid du Colombier 		clev->iflev = IFLEVEL-1;
5832da9d879SDavid du Colombier 	}
5842da9d879SDavid du Colombier 	clev->ifc[clev->iflev] = clev->tabs;
5852da9d879SDavid du Colombier 	clev->spdepth[clev->iflev] = clev->pdepth;
5862da9d879SDavid du Colombier }
5872da9d879SDavid du Colombier void
gotelse(void)5882da9d879SDavid du Colombier gotelse(void){
5892da9d879SDavid du Colombier 	clev->tabs = clev->ifc[clev->iflev];
5902da9d879SDavid du Colombier 	clev->pdepth = clev->spdepth[clev->iflev];
5912da9d879SDavid du Colombier 	if(--(clev->iflev) < 0)clev->iflev = 0;
5922da9d879SDavid du Colombier }
5932da9d879SDavid du Colombier int
checkif(char * pt)5942da9d879SDavid du Colombier checkif(char *pt)
5952da9d879SDavid du Colombier {
5962da9d879SDavid du Colombier 	struct keyw *lptr;
5972da9d879SDavid du Colombier 	int cc;
5982da9d879SDavid du Colombier 	if((lptr=lookup(pt,lastplace+1))!= 0){
5992da9d879SDavid du Colombier 		if(lptr->type == IF){
6002da9d879SDavid du Colombier 			if(strict)putch(' ',YES);
6012da9d879SDavid du Colombier 			copy(lptr->name);
6022da9d879SDavid du Colombier 			*pt='\0';
6032da9d879SDavid du Colombier 			lastplace = pt;
6042da9d879SDavid du Colombier 			if(strict){
6052da9d879SDavid du Colombier 				putch(lptr->punc,NO);
6062da9d879SDavid du Colombier 				eatallsp();
6072da9d879SDavid du Colombier 			}
6082da9d879SDavid du Colombier 			clev->tabs = clev->ifc[clev->iflev];
6092da9d879SDavid du Colombier 			clev->pdepth = clev->spdepth[clev->iflev];
6102da9d879SDavid du Colombier 			keyflag = KEYWORD;
6112da9d879SDavid du Colombier 			return(1);
6122da9d879SDavid du Colombier 		}
6132da9d879SDavid du Colombier 	}
6142da9d879SDavid du Colombier 	return(0);
6152da9d879SDavid du Colombier }
6162da9d879SDavid du Colombier void
gotdo(void)6172da9d879SDavid du Colombier gotdo(void){
6182da9d879SDavid du Colombier 	if(++dolevel >= DOLEVEL-1){
6192da9d879SDavid du Colombier 		fprint(2,"too many levels of do %d\n",dolevel);
6202da9d879SDavid du Colombier 		dolevel = DOLEVEL-1;
6212da9d879SDavid du Colombier 	}
6222da9d879SDavid du Colombier 	dotabs[dolevel] = clev->tabs;
6232da9d879SDavid du Colombier 	docurly[dolevel] = YES;
6242da9d879SDavid du Colombier }
6252da9d879SDavid du Colombier void
resetdo(void)6262da9d879SDavid du Colombier resetdo(void){
6272da9d879SDavid du Colombier 	if(docurly[dolevel] == NO)
6282da9d879SDavid du Colombier 		clev->pdepth = dopdepth[dolevel];
6292da9d879SDavid du Colombier 	if(--dolevel < 0)dolevel = 0;
6302da9d879SDavid du Colombier }
6312da9d879SDavid du Colombier void
gottype(struct keyw * lptr)6322da9d879SDavid du Colombier gottype(struct keyw *lptr)
6332da9d879SDavid du Colombier {
6342da9d879SDavid du Colombier 	char *pt;
6352da9d879SDavid du Colombier 	struct keyw *tlptr;
6362da9d879SDavid du Colombier 	int c;
6372da9d879SDavid du Colombier 	while(1){
6382da9d879SDavid du Colombier 		pt = getnext(1);
6392da9d879SDavid du Colombier 		if((tlptr=lookup(pt,lastplace+1))!=0){
6402da9d879SDavid du Colombier 			putch(' ',YES);
6412da9d879SDavid du Colombier 			copy(tlptr->name);
6422da9d879SDavid du Colombier 			*pt='\0';
6432da9d879SDavid du Colombier 			lastplace = pt;
6442da9d879SDavid du Colombier 			if(tlptr->type == STRUCT){
6452da9d879SDavid du Colombier 				putch(tlptr->punc,YES);
6462da9d879SDavid du Colombier 				gotstruct();
6472da9d879SDavid du Colombier 				break;
6482da9d879SDavid du Colombier 			}
6492da9d879SDavid du Colombier 			lptr=tlptr;
6502da9d879SDavid du Colombier 			continue;
6512da9d879SDavid du Colombier 		}
6522da9d879SDavid du Colombier 		else{
6532da9d879SDavid du Colombier 			putch(lptr->punc,NO);
6542da9d879SDavid du Colombier 			while((c=getch())== ' ' || c == '\t');
6552da9d879SDavid du Colombier 			unget(c);
6562da9d879SDavid du Colombier 			break;
6572da9d879SDavid du Colombier 		}
6582da9d879SDavid du Colombier 	}
6592da9d879SDavid du Colombier }
6602da9d879SDavid du Colombier void
gotstruct(void)6612da9d879SDavid du Colombier gotstruct(void){
6622da9d879SDavid du Colombier 	int c;
6632da9d879SDavid du Colombier 	int cc;
6642da9d879SDavid du Colombier 	char *pt;
6652da9d879SDavid du Colombier 	while((c=getch()) == ' ' || c == '\t')
6662da9d879SDavid du Colombier 		if(!strict)putch(c,NO);
6672da9d879SDavid du Colombier 	if(c == '{'){
6682da9d879SDavid du Colombier 		structlev++;
6692da9d879SDavid du Colombier 		unget(c);
6702da9d879SDavid du Colombier 		return;
6712da9d879SDavid du Colombier 	}
6722da9d879SDavid du Colombier 	if(isalpha(c)){
6732da9d879SDavid du Colombier 		putch(c,NO);
6742da9d879SDavid du Colombier 		while(isalnum(c=getch()))putch(c,NO);
6752da9d879SDavid du Colombier 	}
6762da9d879SDavid du Colombier 	unget(c);
6772da9d879SDavid du Colombier 	pt = getnext(1);
6782da9d879SDavid du Colombier 	if(*pt == '{')structlev++;
6792da9d879SDavid du Colombier 	if(strict){
6802da9d879SDavid du Colombier 		eatallsp();
6812da9d879SDavid du Colombier 		putch(' ',NO);
6822da9d879SDavid du Colombier 	}
6832da9d879SDavid du Colombier }
6842da9d879SDavid du Colombier void
gotop(int c)6852da9d879SDavid du Colombier gotop(int c)
6862da9d879SDavid du Colombier {
6872da9d879SDavid du Colombier 	char optmp[OPLENGTH];
6882da9d879SDavid du Colombier 	char *op_ptr;
6892da9d879SDavid du Colombier 	struct op *s_op;
6902da9d879SDavid du Colombier 	char *a, *b;
6912da9d879SDavid du Colombier 	op_ptr = optmp;
6922da9d879SDavid du Colombier 	*op_ptr++ = c;
6932da9d879SDavid du Colombier 	while (isop(( *op_ptr = getch())))op_ptr++;
6942da9d879SDavid du Colombier 	if(!strict)unget(*op_ptr);
6952da9d879SDavid du Colombier 	else if (*op_ptr != ' ')unget( *op_ptr);
6962da9d879SDavid du Colombier 	*op_ptr = '\0';
6972da9d879SDavid du Colombier 	s_op = op;
6982da9d879SDavid du Colombier 	b = optmp;
6992da9d879SDavid du Colombier 	while ((a = s_op->name) != 0){
7002da9d879SDavid du Colombier 		op_ptr = b;
7012da9d879SDavid du Colombier 		while ((*op_ptr == *a) && (*op_ptr != '\0')){
7022da9d879SDavid du Colombier 			a++;
7032da9d879SDavid du Colombier 			op_ptr++;
7042da9d879SDavid du Colombier 		}
7052da9d879SDavid du Colombier 		if (*a == '\0'){
7062da9d879SDavid du Colombier 			keep(s_op);
7072da9d879SDavid du Colombier 			opflag = s_op->setop;
7082da9d879SDavid du Colombier 			if (*op_ptr != '\0'){
7092da9d879SDavid du Colombier 				b = op_ptr;
7102da9d879SDavid du Colombier 				s_op = op;
7112da9d879SDavid du Colombier 				continue;
7122da9d879SDavid du Colombier 			}
7132da9d879SDavid du Colombier 			else break;
7142da9d879SDavid du Colombier 		}
7152da9d879SDavid du Colombier 		else s_op++;
7162da9d879SDavid du Colombier 	}
7172da9d879SDavid du Colombier }
7182da9d879SDavid du Colombier void
keep(struct op * o)7192da9d879SDavid du Colombier keep(struct op *o)
7202da9d879SDavid du Colombier {
7212da9d879SDavid du Colombier 	char	*s;
7222da9d879SDavid du Colombier 	int ok;
7232da9d879SDavid du Colombier 	if(o->blanks == NEVER)ok = NO;
7242da9d879SDavid du Colombier 	else ok = YES;
7252da9d879SDavid du Colombier 	if (strict && ((o->blanks & ALWAYS)
7262da9d879SDavid du Colombier 	    || ((opflag == 0 && o->blanks & SOMETIMES) && clev->tabs != 0)))
7272da9d879SDavid du Colombier 		putspace(' ',YES);
7282da9d879SDavid du Colombier 	for(s=o->name; *s != '\0'; s++){
7292da9d879SDavid du Colombier 		if(*(s+1) == '\0')putch(*s,ok);
7302da9d879SDavid du Colombier 		else
7312da9d879SDavid du Colombier 			putch(*s,NO);
7322da9d879SDavid du Colombier 	}
7332da9d879SDavid du Colombier 	if (strict && ((o->blanks & ALWAYS)
7342da9d879SDavid du Colombier 	    || ((opflag == 0 && o->blanks & SOMETIMES) && clev->tabs != 0))) putch(' ',YES);
7352da9d879SDavid du Colombier }
7362da9d879SDavid du Colombier int
getnl(void)7372da9d879SDavid du Colombier getnl(void){
7382da9d879SDavid du Colombier 	int ch;
7392da9d879SDavid du Colombier 	char *savp;
7402da9d879SDavid du Colombier 	int gotcmt;
7412da9d879SDavid du Colombier 	gotcmt = 0;
7422da9d879SDavid du Colombier 	savp = p;
7432da9d879SDavid du Colombier 	while ((ch = getch()) == '\t' || ch == ' ')putch(ch,NO);
7442da9d879SDavid du Colombier 	if (ch == '/'){
7452da9d879SDavid du Colombier 		if ((ch = getch()) == '*'){
7462da9d879SDavid du Colombier 			putch('/',NO);
7472da9d879SDavid du Colombier 			putch('*',NO);
7482da9d879SDavid du Colombier 			comment(NO);
7492da9d879SDavid du Colombier 			ch = getch();
7502da9d879SDavid du Colombier 			gotcmt=1;
7512da9d879SDavid du Colombier 		}
752aade22e6SDavid du Colombier 		else if (ch == '/') {
753aade22e6SDavid du Colombier 			putch('/',NO);
754aade22e6SDavid du Colombier 			putch('/',NO);
755aade22e6SDavid du Colombier 			cpp_comment(NO);
756aade22e6SDavid du Colombier 			ch = getch();
757aade22e6SDavid du Colombier 			gotcmt = 1;
758aade22e6SDavid du Colombier 		}
7592da9d879SDavid du Colombier 		else {
7602da9d879SDavid du Colombier 			if(inswitch)*(++lastplace) = ch;
7612da9d879SDavid du Colombier 			else {
7622da9d879SDavid du Colombier 				inswitch = 1;
7632da9d879SDavid du Colombier 				*lastplace = ch;
7642da9d879SDavid du Colombier 			}
7652da9d879SDavid du Colombier 			unget('/');
7662da9d879SDavid du Colombier 			return(0);
7672da9d879SDavid du Colombier 		}
7682da9d879SDavid du Colombier 	}
7692da9d879SDavid du Colombier 	if(ch == '\n'){
7702da9d879SDavid du Colombier 		if(gotcmt == 0)p=savp;
7712da9d879SDavid du Colombier 		return(1);
7722da9d879SDavid du Colombier 	}
7732da9d879SDavid du Colombier 	unget(ch);
7742da9d879SDavid du Colombier 	return(0);
7752da9d879SDavid du Colombier }
7762da9d879SDavid du Colombier void
ptabs(int n)7772da9d879SDavid du Colombier ptabs(int n){
7782da9d879SDavid du Colombier 	int	i;
7792da9d879SDavid du Colombier 	int num;
7802da9d879SDavid du Colombier 	if(n > maxtabs){
7812da9d879SDavid du Colombier 		if(!folded){
7822da9d879SDavid du Colombier 			Bprint(output, "/* code folded from here */\n");
7832da9d879SDavid du Colombier 			folded = 1;
7842da9d879SDavid du Colombier 		}
7852da9d879SDavid du Colombier 		num = n-maxtabs;
7862da9d879SDavid du Colombier 	}
7872da9d879SDavid du Colombier 	else {
7882da9d879SDavid du Colombier 		num = n;
7892da9d879SDavid du Colombier 		if(folded){
7902da9d879SDavid du Colombier 			folded = 0;
7912da9d879SDavid du Colombier 			Bprint(output, "/* unfolding */\n");
7922da9d879SDavid du Colombier 		}
7932da9d879SDavid du Colombier 	}
7942da9d879SDavid du Colombier 	for (i = 0; i < num; i++)Bputc(output, '\t');
7952da9d879SDavid du Colombier }
7962da9d879SDavid du Colombier void
outs(int n)7972da9d879SDavid du Colombier outs(int n){
7982da9d879SDavid du Colombier 	if (p > string){
7992da9d879SDavid du Colombier 		if (lbegin){
8002da9d879SDavid du Colombier 			ptabs(n);
8012da9d879SDavid du Colombier 			lbegin = 0;
8022da9d879SDavid du Colombier 			if (split == 1){
8032da9d879SDavid du Colombier 				split = 0;
804ab3dc52fSDavid du Colombier 				if (clev->tabs > 0)Bprint(output, "\t");
8052da9d879SDavid du Colombier 			}
8062da9d879SDavid du Colombier 		}
8072da9d879SDavid du Colombier 		*p = '\0';
8082da9d879SDavid du Colombier 		Bprint(output, "%s", string);
8092da9d879SDavid du Colombier 		lastlook = p = string;
8102da9d879SDavid du Colombier 	}
8112da9d879SDavid du Colombier 	else {
8122da9d879SDavid du Colombier 		if (lbegin != 0){
8132da9d879SDavid du Colombier 			lbegin = 0;
8142da9d879SDavid du Colombier 			split = 0;
8152da9d879SDavid du Colombier 		}
8162da9d879SDavid du Colombier 	}
8172da9d879SDavid du Colombier }
8182da9d879SDavid du Colombier void
putch(char c,int ok)8192da9d879SDavid du Colombier putch(char c,int ok)
8202da9d879SDavid du Colombier {
8212da9d879SDavid du Colombier 	int cc;
8222da9d879SDavid du Colombier 	if(p < &string[LINE-1]){
8232da9d879SDavid du Colombier 		if(count+TABLENG*clev->tabs >= maxleng && ok && !folded){
8242da9d879SDavid du Colombier 			if(c != ' ')*p++ = c;
8252da9d879SDavid du Colombier 			OUT;
8262da9d879SDavid du Colombier 			split = 1;
8272da9d879SDavid du Colombier 			if((cc=getch()) != '\n')unget(cc);
8282da9d879SDavid du Colombier 		}
8292da9d879SDavid du Colombier 		else {
8302da9d879SDavid du Colombier 			*p++ = c;
8312da9d879SDavid du Colombier 			count++;
8322da9d879SDavid du Colombier 		}
8332da9d879SDavid du Colombier 	}
8342da9d879SDavid du Colombier 	else {
8352da9d879SDavid du Colombier 		outs(clev->tabs);
8362da9d879SDavid du Colombier 		*p++ = c;
8372da9d879SDavid du Colombier 		count = 0;
8382da9d879SDavid du Colombier 	}
8392da9d879SDavid du Colombier }
8402da9d879SDavid du Colombier struct keyw *
lookup(char * first,char * last)8412da9d879SDavid du Colombier lookup(char *first, char *last)
8422da9d879SDavid du Colombier {
8432da9d879SDavid du Colombier 	struct keyw *ptr;
8442da9d879SDavid du Colombier 	char	*cptr, *ckey, *k;
8452da9d879SDavid du Colombier 
8462da9d879SDavid du Colombier 	if(first == last || first == 0)return(0);
8472da9d879SDavid du Colombier 	cptr = first;
8482da9d879SDavid du Colombier 	while (*cptr == ' ' || *cptr == '\t')cptr++;
8492da9d879SDavid du Colombier 	if(cptr >= last)return(0);
8502da9d879SDavid du Colombier 	ptr = key;
8512da9d879SDavid du Colombier 	while ((ckey = ptr->name) != 0){
8522da9d879SDavid du Colombier 		for (k = cptr; (*ckey == *k && *ckey != '\0'); k++, ckey++);
8532da9d879SDavid du Colombier 		if(*ckey=='\0' && (k==last|| (k<last && !isalnum(*k)))){
8542da9d879SDavid du Colombier 			opflag = 1;
8552da9d879SDavid du Colombier 			lastlook = 0;
8562da9d879SDavid du Colombier 			return(ptr);
8572da9d879SDavid du Colombier 		}
8582da9d879SDavid du Colombier 		ptr++;
8592da9d879SDavid du Colombier 	}
8602da9d879SDavid du Colombier 	return(0);
8612da9d879SDavid du Colombier }
8622da9d879SDavid du Colombier int
comment(int ok)8632da9d879SDavid du Colombier comment(int ok)
8642da9d879SDavid du Colombier {
8652da9d879SDavid du Colombier 	int ch;
8662da9d879SDavid du Colombier 	int hitnl;
8672da9d879SDavid du Colombier 
8682da9d879SDavid du Colombier 	hitnl = 0;
8692da9d879SDavid du Colombier 	while ((ch  = getch()) != Beof){
8702da9d879SDavid du Colombier 		putch(ch, NO);
8712da9d879SDavid du Colombier 		if (ch == '*'){
8722da9d879SDavid du Colombier gotstar:
8732da9d879SDavid du Colombier 			if ((ch  = getch()) == '/'){
8742da9d879SDavid du Colombier 				putch(ch,NO);
8752da9d879SDavid du Colombier 				return(hitnl);
8762da9d879SDavid du Colombier 			}
8772da9d879SDavid du Colombier 			putch(ch,NO);
8782da9d879SDavid du Colombier 			if (ch == '*')goto gotstar;
8792da9d879SDavid du Colombier 		}
8802da9d879SDavid du Colombier 		if (ch == '\n'){
8812da9d879SDavid du Colombier 			if(ok && !hitnl){
8822da9d879SDavid du Colombier 				outs(clev->tabs);
8832da9d879SDavid du Colombier 			}
8842da9d879SDavid du Colombier 			else {
8852da9d879SDavid du Colombier 				outs(0);
8862da9d879SDavid du Colombier 			}
8872da9d879SDavid du Colombier 			lbegin = 1;
8882da9d879SDavid du Colombier 			count = 0;
8892da9d879SDavid du Colombier 			hitnl = 1;
8902da9d879SDavid du Colombier 		}
8912da9d879SDavid du Colombier 	}
8922da9d879SDavid du Colombier 	return(hitnl);
8932da9d879SDavid du Colombier }
894aade22e6SDavid du Colombier int
cpp_comment(int ok)895aade22e6SDavid du Colombier cpp_comment(int ok)
896aade22e6SDavid du Colombier {
897aade22e6SDavid du Colombier 	int ch;
898aade22e6SDavid du Colombier 	int hitnl;
899aade22e6SDavid du Colombier 
900aade22e6SDavid du Colombier 	hitnl = 0;
901aade22e6SDavid du Colombier 	while ((ch = getch()) != -1) {
902aade22e6SDavid du Colombier 		if (ch == '\n') {
903aade22e6SDavid du Colombier 			if (ok && !hitnl)
904aade22e6SDavid du Colombier 				outs(clev->tabs);
905aade22e6SDavid du Colombier 			else
906aade22e6SDavid du Colombier 				outs(0);
907aade22e6SDavid du Colombier 			lbegin = 1;
908aade22e6SDavid du Colombier 			count = 0;
909aade22e6SDavid du Colombier 			hitnl = 1;
910aade22e6SDavid du Colombier 			break;
911aade22e6SDavid du Colombier 		}
912aade22e6SDavid du Colombier 		putch(ch, NO);
913aade22e6SDavid du Colombier 	}
914aade22e6SDavid du Colombier 	return hitnl;
915aade22e6SDavid du Colombier }
9162da9d879SDavid du Colombier void
putspace(char ch,int ok)9172da9d879SDavid du Colombier putspace(char ch, int ok)
9182da9d879SDavid du Colombier {
9192da9d879SDavid du Colombier 	if(p == string)putch(ch,ok);
9202da9d879SDavid du Colombier 	else if (*(p - 1) != ch) putch(ch,ok);
9212da9d879SDavid du Colombier }
9222da9d879SDavid du Colombier int
getch(void)9232da9d879SDavid du Colombier getch(void){
9242da9d879SDavid du Colombier 	char c;
9252da9d879SDavid du Colombier 	if(inswitch){
9262da9d879SDavid du Colombier 		if(next != '\0'){
9272da9d879SDavid du Colombier 			c=next;
9282da9d879SDavid du Colombier 			next = '\0';
9292da9d879SDavid du Colombier 			return(c);
9302da9d879SDavid du Colombier 		}
9312da9d879SDavid du Colombier 		if(tptr <= lastplace){
9322da9d879SDavid du Colombier 			if(*tptr != '\0')return(*tptr++);
9332da9d879SDavid du Colombier 			else if(++tptr <= lastplace)return(*tptr++);
9342da9d879SDavid du Colombier 		}
9352da9d879SDavid du Colombier 		inswitch=0;
9362da9d879SDavid du Colombier 		lastplace = tptr = temp;
9372da9d879SDavid du Colombier 	}
9382da9d879SDavid du Colombier 	return(Bgetc(input));
9392da9d879SDavid du Colombier }
9402da9d879SDavid du Colombier void
unget(char c)9412da9d879SDavid du Colombier unget(char c)
9422da9d879SDavid du Colombier {
9432da9d879SDavid du Colombier 	if(inswitch){
9442da9d879SDavid du Colombier 		if(tptr != temp)
9452da9d879SDavid du Colombier 			*(--tptr) = c;
9462da9d879SDavid du Colombier 		else next = c;
9472da9d879SDavid du Colombier 	}
9482da9d879SDavid du Colombier 	else Bungetc(input);
9492da9d879SDavid du Colombier }
9502da9d879SDavid du Colombier char *
getnext(int must)9512da9d879SDavid du Colombier getnext(int must){
9522da9d879SDavid du Colombier 	int c;
9532da9d879SDavid du Colombier 	char *beg;
9542da9d879SDavid du Colombier 	int prect,nlct;
9552da9d879SDavid du Colombier 	prect = nlct = 0;
9562da9d879SDavid du Colombier 	if(tptr > lastplace){
9572da9d879SDavid du Colombier 		tptr = lastplace = temp;
9582da9d879SDavid du Colombier 		err = 0;
9592da9d879SDavid du Colombier 		inswitch = 0;
9602da9d879SDavid du Colombier 	}
9612da9d879SDavid du Colombier 	tp = lastplace;
9622da9d879SDavid du Colombier 	if(inswitch && tptr <= lastplace)
9632da9d879SDavid du Colombier 		if (isalnum(*lastplace)||ispunct(*lastplace)||isop(*lastplace))return(lastplace);
9642da9d879SDavid du Colombier space:
9652da9d879SDavid du Colombier 	while(isspace(c=Bgetc(input)))puttmp(c,1);
9662da9d879SDavid du Colombier 	beg = tp;
9672da9d879SDavid du Colombier 	puttmp(c,1);
9682da9d879SDavid du Colombier 	if(c == '/'){
9692da9d879SDavid du Colombier 		if(puttmp(Bgetc(input),1) == '*'){
9702da9d879SDavid du Colombier cont:
9712da9d879SDavid du Colombier 			while((c=Bgetc(input)) != '*'){
9722da9d879SDavid du Colombier 				puttmp(c,0);
9732da9d879SDavid du Colombier 				if(must == 0 && c == '\n')
9742da9d879SDavid du Colombier 					if(nlct++ > 2)goto done;
9752da9d879SDavid du Colombier 			}
9762da9d879SDavid du Colombier 			puttmp(c,1);
9772da9d879SDavid du Colombier 	star:
9782da9d879SDavid du Colombier 			if(puttmp((c=Bgetc(input)),1) == '/'){
9792da9d879SDavid du Colombier 				beg = tp;
9802da9d879SDavid du Colombier 				puttmp((c=Bgetc(input)),1);
9812da9d879SDavid du Colombier 			}
9822da9d879SDavid du Colombier 			else if(c == '*')goto star;
9832da9d879SDavid du Colombier 			else goto cont;
9842da9d879SDavid du Colombier 		}
9852da9d879SDavid du Colombier 		else goto done;
9862da9d879SDavid du Colombier 	}
9872da9d879SDavid du Colombier 	if(isspace(c))goto space;
9882da9d879SDavid du Colombier 	if(c == '#' && tp > temp+1 && *(tp-2) == '\n'){
9892da9d879SDavid du Colombier 		if(prect++ > 2)goto done;
9902da9d879SDavid du Colombier 		while(puttmp((c=Bgetc(input)),1) != '\n')
9912da9d879SDavid du Colombier 			if(c == '\\')puttmp(Bgetc(input),1);
9922da9d879SDavid du Colombier 		goto space;
9932da9d879SDavid du Colombier 	}
9942da9d879SDavid du Colombier 	if(isalnum(c)){
9952da9d879SDavid du Colombier 		while(isalnum(c = Bgetc(input)))puttmp(c,1);
9962da9d879SDavid du Colombier 		Bungetc(input);
9972da9d879SDavid du Colombier 	}
9982da9d879SDavid du Colombier done:
9992da9d879SDavid du Colombier 	puttmp('\0',1);
10002da9d879SDavid du Colombier 	lastplace = tp-1;
10012da9d879SDavid du Colombier 	inswitch = 1;
10022da9d879SDavid du Colombier 	return(beg);
10032da9d879SDavid du Colombier }
10042da9d879SDavid du Colombier void
copy(char * s)10052da9d879SDavid du Colombier copy(char *s)
10062da9d879SDavid du Colombier {
10072da9d879SDavid du Colombier 	while(*s != '\0')putch(*s++,NO);
10082da9d879SDavid du Colombier }
10092da9d879SDavid du Colombier void
clearif(struct indent * cl)10102da9d879SDavid du Colombier clearif(struct indent *cl)
10112da9d879SDavid du Colombier {
10122da9d879SDavid du Colombier 	int i;
10132da9d879SDavid du Colombier 	for(i=0;i<IFLEVEL-1;i++)cl->ifc[i] = 0;
10142da9d879SDavid du Colombier }
10152da9d879SDavid du Colombier char
puttmp(char c,int keep)10162da9d879SDavid du Colombier puttmp(char c, int keep)
10172da9d879SDavid du Colombier {
10182da9d879SDavid du Colombier 	if(tp < &temp[TEMP-120])
10192da9d879SDavid du Colombier 		*tp++ = c;
10202da9d879SDavid du Colombier 	else {
10212da9d879SDavid du Colombier 		if(keep){
10222da9d879SDavid du Colombier 			if(tp >= &temp[TEMP-1]){
10232da9d879SDavid du Colombier 				fprint(2,"can't look past huge comment - quiting\n");
10242da9d879SDavid du Colombier 				exits("boom");
10252da9d879SDavid du Colombier 			}
10262da9d879SDavid du Colombier 			*tp++ = c;
10272da9d879SDavid du Colombier 		}
10282da9d879SDavid du Colombier 		else if(err == 0){
10292da9d879SDavid du Colombier 			err++;
10302da9d879SDavid du Colombier 			fprint(2,"truncating long comment\n");
10312da9d879SDavid du Colombier 		}
10322da9d879SDavid du Colombier 	}
10332da9d879SDavid du Colombier 	return(c);
10342da9d879SDavid du Colombier }
10352da9d879SDavid du Colombier void
error(char * s)10362da9d879SDavid du Colombier error(char *s)
10372da9d879SDavid du Colombier {
10382da9d879SDavid du Colombier 	fprint(2,"saw EOF while looking for %s\n",s);
10392da9d879SDavid du Colombier 	exits("boom");
10402da9d879SDavid du Colombier }
1041