home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource3
/
143_01
/
cb.c
< prev
next >
Wrap
Text File
|
1985-11-15
|
12KB
|
548 lines
/*
%CC1 $1.C -X -e5000
%CLINK $1 DIO -S
%DELETE $1.CRL
*/
/*******************************************************************
* CB *
********************************************************************
* COPYRIGHT 1983 EUGENE H. MALLORY *
*******************************************************************/
#include <bdscio.h>
#include <dio.h>
#define flush /**/
#define AND &&
#define OR ||
#define EQUAL ==
#define NOTEQUAL !=
#define NOT !
#define LOOPTYPE 1
#define IFTYPE 2
FUNCTION char *do_comment();
FUNCTION char *do_begin();
FUNCTION char *do_end();
FUNCTION char *do_case();
FUNCTION char *do_default();
FUNCTION char *do_semi();
FUNCTION char *do_paren();
FUNCTION char *do_quote();
FUNCTION char *do_string();
FUNCTION char *do_next_word();
FUNCTION char inline[MAXLINE];
int indent,nlflag,step;
int verb, verbx, verbstk[20];
main(argc,argv)
char **argv;
int argc;
BEGIN
char c;
int ii,jj,optionerr;
char *ss;
char *stgptr;
dioinit(&argc,argv);
/*********************************************************************
* ARGUMENT PROCESSING *
*********************************************************************/
step = 2;
optionerr = FALSE;
for (ii=argc-1;ii>0;ii--)
if (argv[ii][0] == '-')
THEN
for (ss = &argv[ii][1]; *ss != '\0';)
LOOP
switch (toupper(*ss++))
BEGIN
case 'I':
step = atoi(ss);
break;
case 'H':
optionerr = TRUE;
break;
default:
fprintf(STDERR,"CB: Illegal option %c.\n",*--ss);
ss++;
optionerr = TRUE;
break;
END
while (isdigit(*ss))
LOOP
ss++;
ENDLOOP
ENDLOOP
for (jj=ii;jj<(argc-1);jj++) argv[jj] = argv[jj+1];
argc--;
ENDIF
if (optionerr)
THEN
fprintf(STDERR,"CB: Formats a C Program with structured indentation\n");
fprintf(STDERR,"CB: -In n is indent step, default is 2\n");
fprintf(STDERR,"Ex. A:CB <T-UNFORM.C >T-FORMAT.C\n");
exit(0);
ENDIF
/********************************************************************
* END OF ARGUMENT PROCESSING *
********************************************************************/
indent = 0; /* start indent at 0 */
nlflag = 0; /* set to bol */
verbx = 0; /* set verb stack empty */
while (!getstring(inline))
LOOP
stgptr = inline;
while (*stgptr EQUAL ' ' OR *stgptr EQUAL '\t')
LOOP
stgptr++;
ENDLOOP
if (*stgptr EQUAL '\n')
THEN
nlflag = -1;
ENDIF
if (is_begin(stgptr)) ;
else if (is_loop(stgptr)) verb = LOOPTYPE;
else if (is_if(stgptr)) verb = IFTYPE;
else verb = 0;
while (*stgptr NOTEQUAL '\n')
LOOP
if (*stgptr EQUAL ';') stgptr = do_semi(stgptr);
else if (is_comment(stgptr)) stgptr = do_comment(stgptr);
else if (is_begin(stgptr)) stgptr = do_begin(stgptr);
else if (is_default(stgptr)) stgptr = do_default(stgptr);
else if (is_case(stgptr)) stgptr = do_case(stgptr);
else if (is_end(stgptr)) stgptr = do_end(stgptr);
else if (is_paren(stgptr)) stgptr = do_paren(stgptr);
else if (is_quote(stgptr)) stgptr = do_quote(stgptr);
else if (is_string(stgptr)) stgptr = do_string(stgptr);
else stgptr = do_next_word(stgptr);
ENDLOOP
newline();
ENDLOOP
if (verbx NOTEQUAL 0) error("CB: Too few ENDs.");
dioflush();
END
FUNCTION is_comment(string)
char string[];
BEGIN
if ((string[0] EQUAL '/') AND (string[1] EQUAL '*')) return TRUE;
return FALSE;
END
FUNCTION is_quote(string)
char string[];
BEGIN
if (string[0] EQUAL '\'') return TRUE;
return FALSE;
END
FUNCTION is_paren(string)
char string[];
BEGIN
if (string[0] EQUAL '(') return TRUE;
return FALSE;
END
FUNCTION is_string(string)
char string[];
BEGIN
if (string[0] EQUAL '"') return TRUE;
return FALSE;
END
FUNCTION is_begin(string)
char string[];
BEGIN
if (string[0] EQUAL '{') return TRUE;
if (strmatch(string,"BEGIN")) return TRUE;
if (strmatch(string,"LOOP")) return TRUE;
if (strmatch(string,"THEN")) return TRUE;
return FALSE;
END
FUNCTION is_end(string)
char string[];
BEGIN
if (string[0] EQUAL '}') return TRUE;
if (strmatch(string,"ENDLOOP")) return TRUE;
if (strmatch(string,"ENDIF")) return TRUE;
if (strmatch(string,"END")) return TRUE;
return FALSE;
END
FUNCTION is_case(string)
char string[];
BEGIN
if (strmatch(string,"CASE")) return TRUE;
return FALSE;
END
FUNCTION is_default(string)
char string[];
BEGIN
if (strmatch(string,"default:")) return TRUE;
return FALSE;
END
FUNCTION is_if(string)
char string[];
BEGIN
if (strmatch(string,"IF")) return TRUE;
if (strmatch(string,"else")) return TRUE;
return FALSE;
END
FUNCTION is_loop(string)
char string[];
BEGIN
if (strmatch(string,"WHILE")) return TRUE;
if (strmatch(string,"DO")) return TRUE;
if (strmatch(string,"FOR")) return TRUE;
return FALSE;
END
FUNCTION pushv()
BEGIN
verbstk[verbx++] = verb;
END
FUNCTION pullv()
BEGIN
verb = verbstk[--verbx];
if (verbx < 0) error("CB: Too many ENDs.");
return verb;
END
FUNCTION strmatch(s1,s2)
char *s1, *s2;
BEGIN
while (*s2)
LOOP
if (toupper(*s1++) NOTEQUAL *s2++)
THEN
return FALSE;
ENDIF
ENDLOOP
if (isalpha(*s1)) return FALSE;
if (isdigit(*s1)) return FALSE;
if (*s1 EQUAL '_') return FALSE;
if (*s1 EQUAL ':') return FALSE;
if (*s1 EQUAL ';') return FALSE;
return TRUE;
END
FUNCTION newline()
BEGIN
if (nlflag < 0)
THEN
putchar('\n');
nlflag = 0;
ENDIF
END
FUNCTION char *do_comment(string)
char *string;
BEGIN
if (string NOTEQUAL inline) tabin();
putchar(*string++);
putchar(*string++);
nlflag = -1;
while (TRUE)
LOOP
if (*string EQUAL '\n')
THEN
if (getstring(inline))
THEN
error("CB: EOF encountered in comment.");
ENDIF
putchar('\n');
string = inline;
continue;
ENDIF
if (*string NOTEQUAL '*')
THEN
if (is_comment(string))
THEN
string = do_comment(string);
ENDIF
else
THEN
putchar(*string++);
ENDIF
continue;
ENDIF
else
THEN
if (string[1] EQUAL '/') /* comment end */
THEN
putchar(*string++);
putchar(*string++);
return string;
ENDIF
else
putchar(*string++);
ENDIF
ENDLOOP
END
FUNCTION char *do_string(string)
char *string;
BEGIN
tabin();
nlflag = -1;
putchar(*string++);
while (*string NOTEQUAL '"')
LOOP
putchar(*string);
if (*string EQUAL '\n') error("CB: Double quote unmatched at EOL.");
if (*string++ EQUAL '\\')
putchar(*string++);
ENDLOOP
putchar(*string++);
return string;
END
FUNCTION char *do_quote(string)
char *string;
BEGIN
tabin();
nlflag = -1;
putchar(*string++);
while (*string NOTEQUAL '\'')
LOOP
putchar(*string);
if (*string EQUAL '\n') error("CB: Single quote unmatched at EOL.");
if (*string++ EQUAL '\\') putchar(*string++);
ENDLOOP
putchar(*string++);
return string;
END
FUNCTION char *do_paren(string)
char *string;
BEGIN
int isave;
indent += step;
tabin();
nlflag = -1;
putchar(*string++);
while (*string NOTEQUAL ')')
LOOP
if (*string EQUAL '\n')
THEN
if (getstring(inline))
THEN
error("CB: EOF encountered in parens.");
ENDIF
nlflag = -1;
newline();
tabin();
nlflag = -1;
string = inline;
while (*string EQUAL ' ' OR *string EQUAL '\t')
LOOP
string++;
ENDLOOP
continue;
ENDIF
if (*string EQUAL '(') string = do_paren(string);
else if (*string EQUAL '\'') string = do_quote(string);
else if (*string EQUAL '"') string = do_string(string);
e