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