home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_300
/
344_01
/
cb.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-11
|
14KB
|
537 lines
/*
HEADER: CUG236;
TITLE: C Source Formatter;
DATE: 04/04/1987;
DESCRIPTION: "Formats a C source program with proper indents for
each statement.";
VERSION: 2.1;
KEYWORDS: Pretty Printer;
FILENAME: CB.C;
SEE-ALSO: CB.DOC;
COMPILERS: vanilla;
AUTHORS: W. C. Colley III, J. W. Kindschi Jr.;
*/
/*
Modified for Turbo C and to clean up some problems
with "if", "else", "for" and comments.
by: Don Holland (5 Dec 1990)
Modified for Portable C
by: William C. Colley, III (4 APR 1987)
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 standard output.
*/
#include <stdio.h>
#include <ctype.h>
#include <stddef.h>
/*
* Portability Note: The AZTEC C compilers handle the binary/text file
* dichotomy differently from most other compilers. Uncomment the following
* pair of #defines if you are running AZTEC C:
*/
/*
#define getc(f) agetc(f)
#define putc(c,f) aputc(c,f)
*/
char cc, lchar, pchar, string[200];
char *wif[] = {
"if", NULL };
char *welse[] = {
"else", NULL };
char *wfor[] = {
"for", NULL };
char *wds[] = {
"case", "default", NULL };
int clevel, ct, iflev, ind[10], level, paren, sifflg[10], siflev[10];
int sind[20][10], slevel[10], spflg[20][10], stabs[20][10];
int aflg, bflg, eflg, ifflg = 0, pflg[10], qflg, sflg = 1;
int c, j, lastchar, peek = -1, tabs, ifnlflg; /* 12/5/90 */
FILE *f1, *f2 = stdout;
void comment(), gotelse(), ptabs(), put_str();
/*************************************************************************/
int main(argc,argv)
int argc;
char *argv[];
{
int getchr(), get_nl(), get_str(), lookup();
/* Initialize everything here */
if (argc < 2 || argc > 3) {
fprintf(stderr,"Usage: CB input.fil { output.fil }\n");
return !0;
}
if (!(f1 = fopen(*++argv,"r"))) {
fprintf(stderr,"ERROR: Cannot find file %s\n",*argv);
return !0;
}
if (argc == 3 && !(f2 = fopen(*++argv,"w"))) {
fprintf(stderr,"ERROR: Cannot create file %s\n",*argv);
return !0;
}
/* End of Initialization */
while ((c = getchr()) != EOF) {
switch (c) {
default:
string[j++] = c;
if (c != ',')
lchar = c;
break;
case ' ':
case '\t':
string[j] = NULL; /* 12/5/90 */
if (!paren) /* 12/5/90 */
ifnlflg = 0; /* 12/5/90 */
if (lookup(welse)) { /* 12/5/90 */
if (get_nl()) /* 12/5/90 */
goto prelse; /* 12/5/90 */
if (peek == '{') { /* 12/5/90 */
string[j++] = ' '; /* 12/5/90 */
c = '{'; /* 12/5/90 */
peek = -1; /* 12/5/90 */
goto brelse; /* 12/5/90 */
} /* 12/5/90 */
else /* 12/5/90 */
goto prelse; /* 12/5/90 */
} /* 12/5/90 */
if (sflg == 0 || j > 0)
string[j++] = c;
break;
case '\n':
string[j] = NULL; /* 12/5/90 */
ifnlflg = 0; /* 12/5/90 */
prelse: /* 12/5/90 */
if (eflg = lookup(welse) == 1)
gotelse();
put_str();
fprintf(f2,"\n");
sflg = 1;
if (eflg == 1) {
pflg[level]++;
tabs++;
}
else
if (pchar == lchar)
aflg = 1;
break;
case '{':
ifnlflg = 0; /* 12/5/90 */
brelse: /* 12/5/90 */
if (lookup(welse)) { /* 12/5/90 */
gotelse();
pflg[level]++; /* 12/5/90 */
tabs++; /* 12/5/90 */
} /* 12/5/90 */
siflev[clevel] = iflev;
sifflg[clevel] = ifflg;
iflev = ifflg = 0;
clevel++;
if (sflg == 1 && pflg[level] != 0) {
pflg[level]--;
tabs--;
}
string[j++] = c;
put_str();
get_nl();
put_str();
fprintf(f2,"\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];
put_str();
tabs--;
ptabs();
if ((peek = getchr()) == ';') {
fprintf(f2,"%c;",c);
peek = -1;
}
else
fprintf(f2,"%c",c);
get_nl();
put_str();
fprintf(f2,"\n");
sflg = 1;
if (clevel < slevel[level] && level > 0)
level--;
if (ind[level] != 0) {
tabs -= pflg[level];
pflg[level] = ind[level] = 0;
}
break;
case '"':
case '\'':
string[j++] = c;
while ((cc = getchr()) != c) {
string[j++] = cc;
if (cc == '\\')
string[j++] = getchr();
if (cc == '\n') {
put_str();
sflg = 1;
}
}
string[j++] = cc;
if (get_nl() == 1) {
lchar = cc;
peek = '\n';
}
break;
case ';':
string[j++] = c;
put_str();
if (pflg[level] > 0 && ind[level] == 0) {
tabs -= pflg[level];
pflg[level] = 0;
}
get_nl();
put_str();
fprintf(f2,"\n");
sflg = 1;
if(iflev) /* 12/5/90 */
if (ifflg == 1) /* 12/5/90 */
ifflg = iflev = 0; /* 12/5/90 */
else { /* 12/5/90 */
ifflg--; /* 12/5/90 */
iflev--; /* 12/5/90 */
} /* 12/5/90 */
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)) {
sflg = 0;
put_str();
}
else {
tabs--;
put_str();
tabs++;
}
if ((peek = getchr()) == ';') {
fprintf(f2,";");
peek = -1;
}
get_nl();
put_str();
fprintf(f2,"\n");
sflg = 1;
break;
case '/':
string[j++] = c;
if ((peek = getchr()) != '*')
break;
string[j++] = peek;
peek = -1;
comment();
get_nl(); /* 12/5/90 */
if (peek != -1) /* 12/5/90 */
ungetc(peek, f1); /* 12/5/90 */
put_str(); /* 12/5/90 */
peek = '\n'; /* 12/5/90 */
break;
case ')':
paren--;
string[j++] = c;
put_str();
if (get_nl() == 1 || (!paren && ifnlflg)) { /* 12/5/90 */
ifnlflg = 0; /* 12/5/90 */
if (peek != '{') { /* 12/5/90 */
if (peek != -1) /* 12/5/90 */
ungetc(peek, f1); /* 12/5/90 */
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;
put_str();
sflg = 1;
break;
case '(':
string[j++] = c;
paren++;
if (lookup(wfor) == 1) {
while ((c = get_str()) != ';');
ct = 0;
cont:
while ((c = get_str()) != ')')
if (c == '(')
ct++;
if (ct != 0) {
ct--;
goto cont;
}
paren--;
put_str();
if (get_nl() == 1 || !paren)
if (peek != '{') {
if (peek != -1)
ungetc(peek, f1);
peek = '\n';
pflg[level]++;
tabs++;
ind[level] = 0;
}
break;
}
if (lookup(wif) == 1) {
ifnlflg = 1; /* 12/5/90 */
put_str();
stabs[clevel][iflev] = tabs;
spflg[clevel][iflev] = pflg[level];
sind[clevel][iflev] = ind[level];
iflev++;
ifflg++; /* 12/5/90 */
}
}
}
if (f2 != stdout && (ferror(f2) || fclose(f2))) {
fprintf(stderr,"ERROR: Disk full\n");
return !0;
}
fclose(f1);
return 0;
}
/*************************************************************************/
void ptabs()
{
int i;
for (i=0; i < tabs; i++)
fprintf(f2,"\t");
}
/*************************************************************************/
int getchr()
{
if (peek < 0 && lastchar != ' ' && lastchar != '\t')
pchar = lastchar;
lastchar = (peek < 0) ? getc(f1) : peek;
peek = -1;
return lastchar;
}
/*************************************************************************/
void put_str()
{
if (j > 0) {
if (sflg != 0) {
ptabs();
sflg = 0;
if (aflg == 1) {
aflg = 0;
if (tabs > 0)
fprintf(f2," ");
}
}
string[j] = NULL;
fprintf(f2,"%s",string);
j = 0;
}
else
if (sflg != 0) {
sflg = 0;
aflg = 0;
}
}
/*************************************************************************/
int lookup(tab)
char *tab[];
{
char r;
int i,kk,k,l;
if (j < 1)
return 0;
for (kk = 0; string[kk] == ' '; ++kk)
;
for (i = 0; tab[i] != 0; i++) {
l = 0;
for (k=kk; (r = tab[i][l++]) == string[k] && r != NULL; ++k)
;
if (r == NULL && /* 12/5/90 */
(isspace(string[k]) || ispunct(string[k]) || string[k] == NULL))
return 1;
}
return 0;
}
/*************************************************************************/
int get_str()
{
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') {
put_str();
aflg = 1;
goto beg;
}
else
return ch;
}
/*************************************************************************/
void gotelse()
{
tabs = stabs[clevel][iflev];
pflg[level] = spflg[clevel][iflev];
ind[level] = sind[clevel][iflev];
ifflg++; /* 12/5/90 */
}
/*************************************************************************/
int get_nl()
{
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;
}
/*************************************************************************/
void comment()
{
rep:
while ((c = string[j++] = getchr()) != '*')
if (c == '\n') {
put_str();
sflg = 1;
}
gotstar:
if ((c = string[j++] = getchr()) != '/') {
if (c == '*')
goto gotstar;
goto rep;
}
}
/*************************************************************************/