cb.c (MSDOS 'C' beautifier)

Peter da Silva peter at baylor.UUCP
Sat Aug 24 03:05:03 AEST 1985


The following is the old faithful 'CB' program, modified for CP/M, and then
further modified from MS-DOG. I downloaded it off a BBS in town and I offer
it just as I got it, as-is, with no further documentation. It should be
pretty self-explanatory, since it has no flags I can see...

/*
        Modified for Lattice C Ver 1.01
        by: John W. Kindschi Jr. (10-30-83)

        Swiped from CPIG'S UNIX system and modified to
        run under BDS C by William C. Colley, III


To use the program type the following command line:

        A>cb input.fil [output.fil]

        Where input.fil is the file to be pretty printed and [output.fil]
        is the destination file. If no output file is specified, then
        the output goes to the console:
*/
#include <stdio.h>
int slevel[10];
int clevel;
int spflg[20][10];
int sind[20][10];
int siflev[10];
int sifflg[10];
int iflev;
int ifflg;
int level;
int eflg;
int paren;
int aflg;
int ct;
int stabs[20][10];
int qflg;
int j;
int sflg;
int bflg;
int peek;
int tabs;
FILE *f1, *f2;

static int ind[10] = { 
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
static int pflg[10] = { 
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

char lchar;
char pchar;
char *wif[2];
char *welse[2];
char *wfor[2];
char *wds[3];
char cc;
char string[200];
int lastchar;
int c;
char *outvect;


main(argc,argv)
int argc;
char *argv[];
{        
	int k;        /* Initialize everything here */
	outvect = 1;
	if (argc < 2 || argc > 3){
		print("Usage: A>Cpretty input.fil [output.fil]\n");
		exit();
	}
	if ((f1 = fopen(*++argv,"r")) == NULL){
		print("File not found\n\n");
		exit();
	}
	if (argc == 3){
		if ((f2 = fopen(*++argv,"w")) == NULL){
			print("Couldn't create output file\n");
			exit();
		}
		outvect = 0;
	}
	clevel = iflev = level = eflg = paren = 0;
	aflg = qflg = j = bflg = tabs = 0;
	ifflg = peek = -1;
	sflg = 1;
	wif[0] = "if";
	welse[0] = "else";
	wfor[0] = "for";
	wds[0] = "case";
	wds[1] = "default";
	wif[1] = welse[1] = wfor[1] = wds[2] = 0;

	/* End of Initialization */

	while ((c = getchr()) != EOF){
		switch(c){
		default:
			string[j++] = c;
			if (c != ',') lchar = c;
			break;
		case ' ':
		case '\t':
			if (lookup (welse) == 1){
				gotelse();
				if(sflg == 0 || j > 0)string[j++] = c;
				puts();
				sflg = 0;
				break;
			}
			if(sflg == 0 || j > 0) string[j++] = c;
			break;
		case '\n':
			if (eflg = lookup(welse) == 1) gotelse();
			puts();
			print ("\n");
			sflg = 1;
			if (eflg == 1){
				pflg[level]++;
				tabs++;
			}
			else
				if(pchar == lchar)
					aflg = 1;
			break;
		case '{':
			if (lookup(welse) == 1) gotelse();
			siflev[clevel] = iflev;
			sifflg[clevel] = ifflg;
			iflev = ifflg = 0;
			clevel++;
			if (sflg == 1 && pflg[level] != 0){
				pflg[level]--;
				tabs--;
			}
			string[j++] = c;
			puts();
			getnl();
			puts();
			print("\n");
			tabs++;
			sflg = 1;
			if (pflg[level] > 0){
				ind[level] = 1;
				level++;
				slevel[level] = clevel;
			}
			break;
		case '}':
			clevel--;
			if ((iflev = siflev[clevel]-1) < 0) iflev = 0;
			ifflg = sifflg[clevel];
			puts();
			tabs--;
			ptabs();
			if ((peek = getchr()) == ';'){
				print("%c;",c);
				peek = -1;
			}
			else print("%c",c);
			getnl();
			puts();
			print("\n");
			sflg = 1;
			if (clevel < slevel[level]) if (level > 0) level--;
			if (ind[level] != 0){
				tabs -= pflg[level];
				pflg[level] = 0;
				ind[level] = 0;
			}
			break;
		case '"':
		case '\'':
			string[j++] = c;
			while((cc = getchr()) != c){
				string[j++] = cc;
				if(cc == '\\'){
					string[j++] = getchr();
				}
				if(cc == '\n'){
					puts();
					sflg = 1;
				}
			}
			string[j++] = cc;
			if(getnl() == 1){
				lchar = cc;
				peek = '\n';
			}
			break;
		case ';':
			string[j++] = c;
			puts();
			if(pflg[level] > 0 && ind[level] == 0){
				tabs -= pflg[level];
				pflg[level] = 0;
			}
			getnl();
			puts();
			print("\n");
			sflg = 1;
			if(iflev > 0)
				if(ifflg == 1){
					iflev--;
					ifflg = 0;
				}
				else iflev = 0;
			break;
		case '\\':
			string[j++] = c;
			string[j++] = getchr();
			break;
		case '?':
			qflg = 1;
			string[j++] = c;
			break;
		case ':':
			string[j++] = c;
			if(qflg == 1){
				qflg = 0;
				break;
			}
			if(lookup(wds) == 0){
				sflg = 0;
				puts();
			}
			else{
				tabs--;
				puts();
				tabs++;
			}
			if((peek = getchr()) == ';'){
				print(";");
				peek = -1;
			}
			getnl();
			puts();
			print("\n");
			sflg = 1;
			break;
		case '/':
			string[j++] = c;
			if((peek = getchr()) != '*') break;
			string[j++] = peek;
			peek = -1;
			comment();
			break;
		case ')':
			paren--;
			string[j++] = c;
			puts();
			if(getnl() == 1){
				peek = '\n';
				if(paren != 0) aflg = 1;
				else if(tabs > 0){
					pflg[level]++;
					tabs++;
					ind[level] = 0;
				}
			}
			break;
		case '#':
			string[j++] = c;
			while((cc = getchr()) != '\n') string[j++] = cc;
			string[j++] = cc;
			sflg = 0;
			puts();
			sflg = 1;
			break;
		case '(':
			string[j++] = c;
			paren++;
			if(lookup(wfor) == 1){
				while((c = gets()) != ';');
				ct = 0;
cont:
				while((c = gets()) != ')'){
					if(c == '(') ct++;
				}
				if(ct != 0){
					ct--;
					goto cont;
				}
				paren--;
				puts();
				if(getnl() == 1){
					peek = '\n';
					pflg[level]++;
					tabs++;
					ind[level] = 0;
				}
				break;
			}
			if(lookup(wif) == 1){
				puts();
				stabs[clevel][iflev] = tabs;
				spflg[clevel][iflev] = pflg[level];
				sind[clevel][iflev] = ind[level];
				iflev++;
				ifflg = 1;
			}
		}
	}
}


ptabs(){
	int i;
	for (i=0; i < tabs; i++) print("\t");
}
getchr(){
	if(peek<0 && lastchar != ' ' && lastchar != '\t')pchar = lastchar;
	lastchar = (peek < 0) ? getc(f1) : peek;
	peek = -1;
	return(lastchar == '\r' ? getchr() : lastchar);
}
puts(){
	if (j > 0)
	{
		if (sflg != 0)
		{
			ptabs();
			sflg = 0;
			if (aflg == 1)
			{
				aflg = 0;
				if (tabs > 0) print ("    ");
			}
		}
		string[j] = '\0';
		print("%s",string);
		j = 0;
	}
	else
	{
		if (sflg != 0)
		{
			sflg = 0;
			aflg = 0;
		}
	}
}
lookup(tab)
char *tab[];
{
	char r;
	int i,kk,k,l;
	if(j < 1) return(0);
	kk = 0;
	while (string[kk] == ' ') kk++;
	for (i = 0; tab[i] != 0; i++)
	{
		l = 0;
		for(k=kk;(r = tab[i][l++]) == string[k] && r != '\0';k++);
		if(r == '\0' && (string[k] < 'a' || string[k] > 'z'))return(1);
	}
	return(0);
}
gets(){
	char ch;
beg:
	if((ch = string[j++] = getchr()) == '\\')
	{
		string[j++] = getchr();
		goto beg;
	}
	if(ch == '\'' || ch == '"')
	{
		while((cc = string[j++] = getchr()) != ch) if(cc == '\\') string[j++] = getchr();
		goto beg;
	}
	if(ch == '\n'){
		puts();
		aflg = 1;
		goto beg;
	}
	else return(ch);
}
gotelse(){
	tabs = stabs[clevel][iflev];
	pflg[level] = spflg[clevel][iflev];
	ind[level] = sind[clevel][iflev];
	ifflg = 1;
}
getnl(){
	while ((peek = getchr()) == '\t' || peek == ' '){
		string[j++] = peek;
		peek = -1;
	}
	if((peek = getchr()) == '/'){
		peek = -1;
		if ((peek = getchr()) == '*'){
			string[j++] = '/';
			string[j++] = '*';
			peek = -1;
			comment();
		}
		else string[j++] = '/';
	}
	if((peek = getchr()) == '\n'){
		peek = -1;
		return(1);
	}
	return(0);
}
comment(){
rep:
	while ((c = string[j++] = getchr()) != '*')
		if (c == '\n'){
			puts();
			sflg = 1;
		}
gotstar:
	if ((c = string[j++] = getchr()) != '/'){
		if (c == '*') goto gotstar;
		goto rep;
	}
}

print(fmt,args)
char *fmt;
unsigned args;
{
	if (outvect == 1) printf(fmt,args);
	else if (outvect == 0) fprintf(f2,fmt,args);
}

-- 
	Peter (Made in Australia) da Silva
		UUCP: ...!shell!neuro1!{hyd-ptd,baylor,datafac}!peter
		MCI: PDASILVA; CIS: 70216,1076



More information about the Comp.sources.unix mailing list