home *** CD-ROM | disk | FTP | other *** search
- Subject: v11i042: Inline code expander for C, Part04/04
- Newsgroups: comp.sources.unix
- Sender: sources
- Approved: rs@uunet.UU.NET
-
- Submitted-by: omepd!mcg
- Posting-number: Volume 11, Issue 42
- Archive-name: inline/Part04
-
- # This is a shell archive. Remove anything before this line
- # then unpack it by saving it in a file and typing "sh file"
- # (Files unpacked will be owned by you and have original permissions).
- # This archive contains the following files:
- # ./patchlevel.h
- # ./Makefile
- # ./scan.l
- # ./BUGS
- # ./MINVERS
- # ./test.c
- # ./test2.c
- #
- if `test ! -s ./patchlevel.h`
- then
- echo "writing ./patchlevel.h"
- sed 's/^X//' > ./patchlevel.h << '\Rogue\Monster\'
- X/* patchlevel file */
- X
- X#define PATCHLEVEL 0
- X
- X
- \Rogue\Monster\
- else
- echo "will not over write ./patchlevel.h"
- fi
- chmod 444 ./patchlevel.h
- if [ `wc -c ./patchlevel.h | awk '{printf $1}'` -ne 46 ]
- then
- echo `wc -c ./patchlevel.h | awk '{print "Got " $1 ", Expected " 46}'`
- fi
- if `test ! -s ./Makefile`
- then
- echo "writing ./Makefile"
- sed 's/^X//' > ./Makefile << '\Rogue\Monster\'
- X#
- X# Makefile for 'inline' program - C inline code substituter
- X#
- X# (c) copyright 1986, 1987, S. McGeady, all rights reserved
- X#
- X#
- X# NOTE - comment out some lines below if you don't have RCS
- X#
- X
- X# CFLAGS=-g -pg
- X# CFLAGS=-g
- XCFLAGS=-O
- X
- Xall: inline test
- X
- XMAJVERS = "3"
- XHDRS = inline.h tokens.h
- XSRCS = inline.c declare.c expand.c rewrite.c yylex.c tokens.c utils.c mem.c
- XOBJS = inline.o declare.o expand.o rewrite.o yylex.o tokens.o utils.o mem.o
- X
- Xinline: $(OBJS) vers.o
- X $(CC) -o inline $(CFLAGS) $(OBJS) vers.o
- X
- Xyylex.o: yylex.c $(HDRS)
- Xdeclare.o: declare.c $(HDRS)
- Xexpand.o: expand.c $(HDRS)
- Xutils.o: utils.c $(HDRS)
- Xinline.o: inline.c $(HDRS)
- Xrewrite.o: rewrite.c $(HDRS)
- Xmem.o: mem.c
- Xtokens.o: tokens.c
- X
- Xvers.o: $(OBJS) patchlevel.h
- X -@chmod u+w MINVERS
- X -expr "`cat MINVERS`" + 1 > MINVERS
- X echo '#include "patchlevel.h"' > vers.c
- X echo 'static char *vers[] = {' >> vers.c
- X echo '"$$''Header: inline version' $(MAJVERS).`cat MINVERS` 'compiled' "`date`" "flags '$(CFLAGS)'" '$$",' >> vers.c
- X # if you don't have RCS, this will fail
- X # COMMENT THIS LINE OUT IF YOU DON'T HAVE RCS ON YOUR SYSTEM
- X # perhaps replace with:
- X # grep '\$$''Header:' $(HDRS) $(SRCS) | sed 's/^.*\$$\(.*\)\$$$$/"$$\1$$",/' >> vers.c
- X -ident $(HDRS) $(SRCS) | grep '\$$''Header:' | sed 's/^.*\$$\(.*\)\$$$$/"$$\1$$",/' >> vers.c
- X
- X # END OF RCS SECTION
- X
- X echo '};' >> vers.c
- X $(CC) -c vers.c
- X
- X#
- X# this is all for verification
- X#
- X
- Xbasex: test.c
- X $(CC) -o basex -Dinline=static test.c
- X
- Xtestx: inline test.c
- X ./inline -w -s < test.c > x.c
- X $(CC) -o testx x.c
- X
- Xtest2x: inline test2.c
- X ./inline -w -2 -s test2.c > x2.c
- X $(CC) -o test2x x2.c
- X
- Xtest: inline basex testx test2x
- X @echo 'starting validation tests'
- X ./basex > base.out
- X ./testx > test.out
- X @sh -c 'if grep -s FAIL base.out; then echo "your compiler is broken"; exit 1; else exit 0; fi'
- X @sh -c 'if grep -s FAIL test.out; then echo "something is wrong with inline or your compiler"; exit 1; else exit 0; fi'
- X @sh -c 'if test `wc -l <base.out` -ne `wc -l <test.out`; then echo "something is wrong with inline or your compiler"; exit 1; else exit 0; fi'
- X @echo 'testing two-pass mode'
- X ./test2x > test2.out
- X @sh -c 'if grep -s FAIL test2.out; then echo "something is wrong with inline in 2-pass mode"; exit 1; else exit 0; fi'
- X @sh -c 'if test `wc -l <base.out` -ne `wc -l <test2.out`; then echo "something is wrong with inline in 2-pass mode"; exit 1; else exit 0; fi'
- X @echo 'testing complete - everything looks ok'
- X
- Xclean:
- X rm -f scan.c tstscan.c $(OBJS) vers.o \
- X mon.out core tstscan.o x.c basex testx base.out test.out
- X
- Xlint: $(SRCS) $(HDRS)
- X lint -h -c -n inline.c declare.c expand.c rewrite.c utils.c mem.c yylex.c tokens.c
- X
- X#
- X# this expects the 'rogue monster' (mips!roger) shar
- X# -c includes size checking, -p retains permissions, -x X prepends 'X' to lines
- X#
- Xshar: $(SRCS) $(HDRS) Makefile inline.1 scan.l
- X shar -c -p -x X -f inline. inline.1 $(HDRS) $(SRCS) patchlevel.h \
- X Makefile scan.l NOTES COPYRIGHT BUGS MINVERS test.c test2.c
- X
- X
- X# scan.o: scan.l inline.h tokens.h
- X# tstscan: scan.c tokens.o
- X# cp scan.c tstscan.c
- X# $(CC) -c -DTEST tstscan.c
- X# $(CC) -o tstscan -g tstscan.o tokens.o
- X
- \Rogue\Monster\
- else
- echo "will not over write ./Makefile"
- fi
- chmod 444 ./Makefile
- if [ `wc -c ./Makefile | awk '{printf $1}'` -ne 3126 ]
- then
- echo `wc -c ./Makefile | awk '{print "Got " $1 ", Expected " 3126}'`
- fi
- if `test ! -s ./scan.l`
- then
- echo "writing ./scan.l"
- sed 's/^X//' > ./scan.l << '\Rogue\Monster\'
- XD [0-9]
- XL [a-zA-Z_]
- XH [a-fA-F0-9]
- XE [Ee][+-]?{D}+
- XLS (l|L)
- XUS (u|U)
- X
- X%{
- X/*
- X * inline code expander
- X *
- X * (c) 1986 - copyright 1986, s. mcgeady, all rights reserved
- X */
- X
- X/* $Header: scan.l,v 1.5 87/04/27 18:16:48 mcg Rel $ */
- X
- X
- X#include <stdio.h>
- X#include "tokens.h"
- X#include "inline.h"
- X
- X#ifdef COUNTCOLUMN
- Xvoid count();
- X#else
- X#define count()
- X#endif
- X
- X#define COMMENT 1
- X#define CPPLINE 2
- X#define STRING 3
- X
- Xextern char *gather();
- X
- Xchar *yylval;
- X
- Xint line = 1;
- Xint column = 0;
- X
- Xstatic int bracelev = 0;
- Xstatic int parenlev = 0;
- X%}
- X
- X%%
- X"/*" { count(); yylval = gather(COMMENT,yytext);
- X /* T_COMMENT gets changed to T_WS later */
- X return(T_COMMENT); }
- X^[ \t]*# { count(); yylval = gather(CPPLINE,yytext);
- X return(T_CPP); }
- X\" { count(); yylval = gather(STRING,yytext);
- X return(T_STR); }
- X
- X"auto" { count(); yylval = 0; return(T_AUTO); }
- X"break" { count(); yylval = 0; return(T_BREAK); }
- X"case" { count(); yylval = 0; return(T_CASE); }
- X"char" { count(); yylval = 0; return(T_CHAR); }
- X"const" { count(); yylval = 0; return(T_CONST); }
- X"continue" { count(); yylval = 0; return(T_CONTINUE); }
- X"default" { count(); yylval = 0; return(T_DEFAULT); }
- X"do" { count(); yylval = 0; return(T_DO); }
- X"double" { count(); yylval = 0; return(T_DOUBLE); }
- X"else" { count(); yylval = 0; return(T_ELSE); }
- X"enum" { count(); yylval = 0; return(T_ENUM); }
- X"extern" { count(); yylval = 0; return(T_EXTERN); }
- X"float" { count(); yylval = 0; return(T_FLOAT); }
- X"for" { count(); yylval = 0; return(T_FOR); }
- X"goto" { count(); yylval = 0; return(T_GOTO); }
- X"if" { count(); yylval = 0; return(T_IF); }
- X"inline" { count(); yylval = 0; return(T_INLINE); }
- X"int" { count(); yylval = 0; return(T_INT); }
- X"long" { count(); yylval = 0; return(T_LONG); }
- X"register" { count(); yylval = 0; return(T_REGISTER); }
- X"return" { count(); yylval = 0; return(T_RETURN); }
- X"short" { count(); yylval = 0; return(T_SHORT); }
- X"signed" { count(); yylval = 0; return(T_SIGNED); }
- X"sizeof" { count(); yylval = 0; return(T_SIZEOF); }
- X"static" { count(); yylval = 0; return(T_STATIC); }
- X"struct" { count(); yylval = 0; return(T_STRUCT); }
- X"switch" { count(); yylval = 0; return(T_SWITCH); }
- X"typedef" { count(); yylval = 0; return(T_TYPEDEF); }
- X"union" { count(); yylval = 0; return(T_UNION); }
- X"unsigned" { count(); yylval = 0; return(T_UNSIGNED); }
- X"void" { count(); yylval = 0; return(T_VOID); }
- X"volatile" { count(); yylval = 0; return(T_VOLATILE); }
- X"while" { count(); yylval = 0; return(T_WHILE); }
- X
- X{L}({L}|{D})* { count(); yylval= yytext; return(T_IDENT);
- X /* typedefing is checked in gettok() */ }
- X
- X"0fnan" { count(); yylval = yytext; return(T_NUM); }
- X"0fNAN" { count(); yylval = yytext; return(T_NUM); }
- X"0finf" { count(); yylval = yytext; return(T_NUM); }
- X"0fINF" { count(); yylval = yytext; return(T_NUM); }
- X
- X0[xX]{H}+{LS}?{US}? { count(); yylval = yytext; return(T_NUM); }
- X0[xX]{H}+{US}?{LS}? { count(); yylval = yytext; return(T_NUM); }
- X0{D}+{LS}?{US}? { count(); yylval = yytext; return(T_NUM); }
- X0{D}+{US}?{LS}? { count(); yylval = yytext; return(T_NUM); }
- X{D}+{LS}?{US}? { count(); yylval = yytext; return(T_NUM); }
- X{D}+{US}?{LS}? { count(); yylval = yytext; return(T_NUM); }
- X
- X{D}+{E}{LS}? { count(); yylval = yytext; return(T_NUM); }
- X{D}*"."{D}+({E})?{LS}? { count(); yylval = yytext; return(T_NUM); }
- X{D}+"."{D}*({E})?{LS}? { count(); yylval = yytext; return(T_NUM); }
- X
- X'(\\.|[^\\'])+' { count(); yylval = yytext; return(T_CHARCONST); }
- X"..." { count(); yylval = 0; return(T_ELLIPSES); }
- X">>=" { count(); yylval = 0; return(T_RS_EQ); }
- X"<<=" { count(); yylval = 0; return(T_LS_EQ); }
- X"+=" { count(); yylval = 0; return(T_ADD_EQ); }
- X"-=" { count(); yylval = 0; return(T_SUB_EQ); }
- X"*=" { count(); yylval = 0; return(T_MUL_EQ); }
- X"/=" { count(); yylval = 0; return(T_DIV_EQ); }
- X"%=" { count(); yylval = 0; return(T_MOD_EQ); }
- X"&=" { count(); yylval = 0; return(T_AND_EQ); }
- X"^=" { count(); yylval = 0; return(T_XOR_EQ); }
- X"|=" { count(); yylval = 0; return(T_OR_EQ); }
- X">>" { count(); yylval = 0; return(T_RS); }
- X"<<" { count(); yylval = 0; return(T_LS); }
- X"++" { count(); yylval = 0; return(T_INC); }
- X"--" { count(); yylval = 0; return(T_DEC); }
- X"->" { count(); yylval = 0; return(T_PTR); }
- X"&&" { count(); yylval = 0; return(T_CAND); }
- X"||" { count(); yylval = 0; return(T_COR); }
- X"<=" { count(); yylval = 0; return(T_LE); }
- X">=" { count(); yylval = 0; return(T_GE); }
- X"==" { count(); yylval = 0; return(T_CEQ); }
- X"!=" { count(); yylval = 0; return(T_NE); }
- X";" { count(); yylval = 0; return(T_SEMIC); }
- X"{" { count(); yylval = 0; bracelev++; return(T_LBRACE); }
- X"}" { count(); yylval = 0; bracelev--; return(T_RBRACE); }
- X"," { count(); yylval = 0; return(T_COMMA); }
- X":" { count(); yylval = 0; return(T_COLON); }
- X"=" { count(); yylval = 0; return(T_EQ); }
- X"(" { count(); yylval = 0; parenlev++; return(T_LPAREN); }
- X")" { count(); yylval = 0; parenlev--; return(T_RPAREN); }
- X"[" { count(); yylval = 0; return(T_LSQ); }
- X"]" { count(); yylval = 0; return(T_RSQ); }
- X"." { count(); yylval = 0; return(T_DOT); }
- X"&" { count(); yylval = 0; return(T_AMPER); }
- X"!" { count(); yylval = 0; return(T_NOT); }
- X"~" { count(); yylval = 0; return(T_TILDE); }
- X"-" { count(); yylval = 0; return(T_MINUS); }
- X"+" { count(); yylval = 0; return(T_PLUS); }
- X"*" { count(); yylval = 0; return(T_STAR); }
- X"/" { count(); yylval = 0; return(T_DIV); }
- X"%" { count(); yylval = 0; return(T_MOD); }
- X"<" { count(); yylval = 0; return(T_LT); }
- X">" { count(); yylval = 0; return(T_GT); }
- X"^" { count(); yylval = 0; return(T_XOR); }
- X"|" { count(); yylval = 0; return(T_OR); }
- X"?" { count(); yylval = 0; return(T_QUEST); }
- X
- X[ \t\v\n\f]* { count(); yylval = yytext; return(T_WS); }
- X. { /* ignore bad characters */ }
- X
- X%%
- X
- Xyywrap()
- X{
- X return(1);
- X}
- X
- X/*
- X */
- X
- Xchar *
- Xgather(type,init)
- Xint type;
- Xchar *init;
- X{
- X char buf[1024];
- X register char *tbuf;
- X register int tbufsize = 0;
- X register char *bb = buf;
- X register char *p = bb;
- X register char *ebuf = &buf[1023];
- X
- X
- X strcpy(buf,init);
- X p = buf + strlen(init);
- X while (*p = input()) {
- X if (*p == 0)
- X break;
- X switch (type) {
- X case COMMENT:
- X if (*p == '/' && p != bb && p[-1] == '*') {
- X goto end;
- X }
- X break;
- X case CPPLINE:
- X if (*p == '\n' && p != bb && p[-1] != '\\') {
- X unput('\n');
- X *p = '\0';
- X goto end;
- X }
- X break;
- X case STRING:
- X if (*p == '"' && p != bb && p[-1] != '\\') {
- X goto end;
- X }
- X break;
- X }
- X if (++p >= ebuf) {
- X *p = '\0';
- X if (tbufsize == 0) {
- X tbufsize = 1024;
- X }
- X tbuf = (char *) malloc(tbufsize *= 2);
- X strcpy(tbuf, bb);
- X p = tbuf + (p - bb);
- X if (bb != buf) {
- X free(bb);
- X }
- X bb = tbuf;
- X ebuf = bb + tbufsize;
- X }
- X }
- X end:
- X *++p = '\0';
- X p++;
- X if (tbufsize == 0) {
- X tbuf = (char *) malloc(p-bb);
- X strcpy(tbuf, bb);
- X bb = tbuf;
- X }
- X return(bb);
- X}
- X
- X#ifdef COUNTCOLUMN
- Xvoid
- Xcount()
- X{
- X int i;
- X
- X for (i = 0; yytext[i] != '\0'; i++)
- X if (yytext[i] == '\n') {
- X column = 0;
- X line++;
- X }
- X else if (yytext[i] == '\t')
- X column += 8 - (column % 8);
- X else
- X column++;
- X}
- X#endif
- X
- X#ifndef TEST
- X
- Xcheck_type(tok)
- Xregister struct token *tok;
- X{
- X register int i;
- X register char **p;
- X
- X for (i = 0; (i < NSCOPE) && (typeid[i] != NIL); i++) {
- X for (p = typeid[i]->type_id; *p != NIL; p++) {
- X if (strcmp(tok->t_id,*p) == 0) {
- X tok->t_tok = T_TYPE_ID;
- X return;
- X }
- X }
- X }
- X}
- X
- Xstruct token *
- Xgettok(mem)
- Xregister int mem;
- X{
- X register int t;
- X struct token *tok;
- X
- X if ((t = yylex()) == 0)
- X return((struct token *) 0);
- X tok = newtok(mem, t, yylval);
- X tok->t_line = yylineno;
- X switch(t) {
- X case T_COMMENT:
- X case T_CPP:
- X tok->t_tok = T_WS;
- X /*FALLTHROUGH*/
- X case T_STR:
- X free(yylval);
- X break;
- X
- X case T_LBRACE:
- X tok->t_level = bracelev-1;
- X tok->t_paren = parenlev;
- X pushscope(bracelev);
- X break;
- X case T_LPAREN:
- X tok->t_paren = parenlev-1;
- X tok->t_level = bracelev;
- X break;
- X case T_RBRACE:
- X popscope(bracelev+1);
- X /*FALLTHROUGH*/
- X default:
- X tok->t_level = bracelev;
- X tok->t_paren = parenlev;
- X break;
- X }
- X if (t == T_IDENT) {
- X check_type(tok);
- X }
- X return(tok);
- X}
- X#endif
- X
- X#ifdef TEST
- Xmain() {
- X int tok;
- X extern char *tokens[];
- X
- X while(tok = yylex()) {
- X switch (tok) {
- X case T_COMMENT:
- X case T_STR:
- X case T_CPP:
- X free(yylval);
- X
- X case T_IDENT:
- X case T_WS:
- X case T_NUM:
- X case T_CHARCONST:
- X case T_TYPE_ID:
- X fputs(yylval,stdout);
- X break;
- X case T_ACTUAL:
- X fputs("<ACTUAL>",stdout);
- X break;
- X case T_RETVAL:
- X fputs("<RETVAL>",stdout);
- X break;
- X case T_ARGLIST:
- X fprintf(stdout,"%s(ARGLIST)", yylval);
- X break;
- X case T_RETLAB:
- X fputs("<RETLAB>",stdout);
- X break;
- X case T_FORMAL:
- X fprintf(stdout,"<FORMAL '%s'>",yylval);
- X break;
- X default:
- X if (tok <= T_INLINE)
- X fputs(tokens[tok],stdout);
- X else
- X fputs("???",stdout);
- X
- X break;
- X }
- X }
- X}
- X#endif
- \Rogue\Monster\
- else
- echo "will not over write ./scan.l"
- fi
- chmod 444 ./scan.l
- if [ `wc -c ./scan.l | awk '{printf $1}'` -ne 8829 ]
- then
- echo `wc -c ./scan.l | awk '{print "Got " $1 ", Expected " 8829}'`
- fi
- if `test ! -s ./BUGS`
- then
- echo "writing ./BUGS"
- sed 's/^X//' > ./BUGS << '\Rogue\Monster\'
- XFri May 8 17:13:05 PDT 1987
- X
- XCurrent bugs:
- X - multi-line comments that begin on pre-processor lines are not
- X handled correctly
- X
- X - comma operators don't work correctly, e.g.
- X x = (cond, inline_func());
- X (inline_func() gets called too soon)
- X
- XImportant enhancements to be added:
- X
- X -
- X
- XMiscellaneous features to be added:
- X
- X -
- \Rogue\Monster\
- else
- echo "will not over write ./BUGS"
- fi
- chmod 444 ./BUGS
- if [ `wc -c ./BUGS | awk '{printf $1}'` -ne 329 ]
- then
- echo `wc -c ./BUGS | awk '{print "Got " $1 ", Expected " 329}'`
- fi
- if `test ! -s ./MINVERS`
- then
- echo "writing ./MINVERS"
- sed 's/^X//' > ./MINVERS << '\Rogue\Monster\'
- X0
- \Rogue\Monster\
- else
- echo "will not over write ./MINVERS"
- fi
- chmod 444 ./MINVERS
- if [ `wc -c ./MINVERS | awk '{printf $1}'` -ne 2 ]
- then
- echo `wc -c ./MINVERS | awk '{print "Got " $1 ", Expected " 2}'`
- fi
- if `test ! -s ./test.c`
- then
- echo "writing ./test.c"
- sed 's/^X//' > ./test.c << '\Rogue\Monster\'
- X
- X/* test cases for 'inline' */
- X
- X/* $Header: test.c,v 1.6 87/06/24 13:06:22 mcg Rel $ */
- X
- X
- X/* simple inline */
- Xinline int foo(a,b) {
- X register int x = 0;
- X
- X printf("foo(%d, %d)\n", a,b);
- X return(a+b);
- X}
- Xinline int bar(x,y) {
- X register int a;
- X
- X a = 0;
- X printf("bar(%d, %d)\n", x,y);
- X return(x-y);
- X}
- X/* inline with some control flow */
- Xinline biff(a) {
- X while(1) return a;
- X}
- X
- X/* inline with a switch */
- Xinline insw(i)
- Xint i;
- X{
- X switch(i) {
- X case 0: return('0');
- X case 1: return('1');
- X case 2: return('2');
- X case 3: return('3');
- X case 4: return(foo(i,'0'));
- X case 5: return('5');
- X case 6: return('6');
- X case 7: return(foo(i,'0'));
- X case 8: return('8');
- X case 9: return('9');
- X }
- X return(0);
- X}
- X
- Xtypedef char *cptr;
- X
- Xinline barf() {
- X printf("!!!\n");
- X}
- X
- X/* inline returning a typedef */
- Xinline cptr
- Xboff(c,s)
- Xchar c;
- Xcptr s;
- X{
- X s[0] = c;
- X return(&s[1]);
- X}
- X
- X/* inline returning a pointer type */
- Xinline char *
- Xboff2(c,s)
- Xchar c;
- Xcptr s;
- X{
- X s[0] = c;
- X return(&s[1]);
- X}
- X
- Xstruct str {
- X int a;
- X int b;
- X int c;
- X};
- X
- X/* inline returning a structure */
- Xinline struct str bipp(a,b,c)
- Xint a, b, c;
- X{
- X struct str x;
- X
- X x.a = a;
- X x.b = b;
- X x.c = c;
- X return(x);
- X}
- X
- X/* inline returning a structure pointer */
- Xinline struct str *bupp(z,a,b,c)
- Xregister struct str *z;
- Xregister int a,b,c;
- X{
- X z->a = a;
- X z->b = b;
- X z->c = c;
- X return(z);
- X}
- X
- Xnil(){}
- X
- X/* inline returning function pointer */
- Xinline int (*fp())()
- X{
- X return(nil);
- X}
- X
- Xint effect = 0;
- X
- Xinline int side_effect(a)
- Xint a;
- X{
- X int old;
- X
- X old = effect;
- X effect = a;
- X
- X return(old);
- X}
- X
- X/* should have no effect on arguments */
- Xinline int swaparg(a,b)
- X{
- X int tmp;
- X
- X tmp = a;
- X a = b;
- X b = tmp;
- X
- X return(a+b);
- X}
- X
- Xinline struct str modarg(a,b)
- Xint a;
- Xstruct str b; /* struct arg */
- X{
- X switch(a) {
- X case 0:
- X a = 1;
- X b.a = 1;
- X break;
- X case 1:
- X a >>= 1;
- X a <<= 1;
- X b.a = a;
- X break;
- X case 2:
- X a *= 3;
- X b.a = a;
- X break;
- X }
- X return(b);
- X}
- X
- Xinline hardcase1(a,b)
- Xint a,b;
- X{
- X { ; }
- X if (a);
- X {{}}
- X if (a) { } else ;
- X return(b);
- X}
- Xinline char *
- Xhardcase2(a,b,c)
- Xchar *a;
- Xint b,c;
- X{
- X char *s = "foo", c = 'c';
- X int x = b;
- X
- X if (a) return(s);
- X else {
- X if (b) return(a+c);
- X }
- X return(a+c);
- X}
- X
- Xinline expr1(a,b)
- Xint a,b;
- X{
- X int x = 0;
- X
- X if (foo(0,a+b) == 100) return x+2; /* a+b == 100, ret = 2 */
- X if (foo(50,50) == 100 && a) return x; /* a != 0, return = 0 */
- X if (foo(100,0) == 100 && b) return x+1; /* a == 0 && b != 0, ret = 1 */
- X return x+3; /* ret = 3 */
- X}
- X
- Xinline expr2(a,b)
- Xint a,b;
- X{
- X register int x = 0, y = 1;
- X
- X if (a) {
- X return(x+y); /* a != 0, return = 1 */
- X } else {
- X register int x = 100, y = 101;
- X
- X if (b) {
- X return(x+y); /* a == 0 && b != 0, return = 201 */
- X } else {
- X register int x = 200, y = 300;
- X
- X return(x+y); /* a == 0 && b == 0, return = 500 */
- X }
- X }
- X}
- X
- Xinline labs(i)
- Xint i;
- X{
- X if (i == 1) goto L1;
- X if (i == 2) goto L2;
- X if (i == 3) goto L3;
- X if (i == 4) goto L4;
- X goto L5;
- XL6:
- X return(i);
- X
- XL1: i++; return(1);
- XL2: if (i == 2) return(2);
- XL3: return(3);
- XL4: {
- X return(4);
- X }
- XL5: goto L6;
- X}
- X
- Xm() {
- X register int x,y,z;
- X
- X x = foo(x++,y++);
- X}
- X
- Xmain() {
- X t1(1);
- X t2(2);
- X t3(3);
- X t4(4);
- X t5(5);
- X t6(6);
- X t7(7);
- X t8(8);
- X t9(9);
- X t10(10);
- X t11(11);
- X t12(12);
- X t13(13);
- X t14(14);
- X t15(15,50);
- X t16(16);
- X t17(17);
- X t18(18);
- X return(0);
- X}
- X
- X/*
- X * basic expansion of single inline
- X */
- X
- Xt1(i)
- Xint i;
- X{
- X int a;
- X
- X printf("test%d:\n",i);
- X a = foo(1,2);
- X if (a == 3) {
- X printf("test%d ok\n",i);
- X } else {
- X printf("test%d FAIL\n",i);
- X }
- X}
- X
- X/*
- X * expansion of multiple inlines in single expression
- X */
- X
- Xt2(i)
- Xint i;
- X{
- X int a;
- X
- X printf("test%d:\n",i);
- X a = foo(1,2) + foo(3,4);
- X if (a == 10) {
- X printf("test%d ok\n",i);
- X } else {
- X printf("test%d FAIL\n",i);
- X }
- X}
- X
- X/*
- X * expansion of inlines in various styles of if() statement
- X * - check parsing of if compound statement
- X */
- X
- Xt3(i)
- Xint i;
- X{
- X printf("test%d:\n",i);
- X if (foo(1,2) != 3) {
- X printf("test%d FAIL\n",i);
- X return;
- X }
- X
- X if (foo(1,2) == 3) {
- X ;
- X } else {
- X printf("test%d FAIL\n");
- X return;
- X }
- X
- X if (!foo(1,2)) printf("test%d FAIL\n",i);
- X
- X if (foo(1,2) == 3) nil(); else printf("test%d FAIL\n",i);
- X
- X if (foo(1,2) == 3) nil(); else {
- X printf("test%d FAIL\n",i);
- X }
- X
- X if (foo(1,2) == 3) {
- X printf("test%d ok\n",i);
- X } else
- X printf("test%d FAIL\n",i);
- X}
- X
- X/*
- X * inlines as arguments to other inlines
- X */
- X
- Xt4(i)
- Xint i;
- X{
- X register int a;
- X
- X printf("test%d:\n",i);
- X a = foo(foo(1,2),2);
- X if (a != 5) {
- X printf("test%d FAIL\n",i);
- X }
- X
- X a = foo(100,bar(5,4));
- X if (a != 101) {
- X printf("test%d FAIL\n",i);
- X }
- X printf("test%d ok\n",i);
- X}
- X
- X/*
- X */
- X
- Xt5(j)
- Xint j;
- X{
- X register int i;
- X for(i=0; i < 10; i++) {
- X switch(insw(i)) {
- X case '0':
- X if (foo(i,i) != 0) break;
- X if (i != 0) break;
- X continue;
- X case '1':
- X if (i != 1) break;
- X if (foo(i,i) != 2) break;
- X continue;
- X case '2':
- X if (foo(i,i) != 4) break;
- X if (i != 2) break;
- X continue;
- X case '3':
- X if (foo(i,i) != 6) break;
- X if (i != 3) break;
- X continue;
- X case '4':
- X if (i != 4) break;
- X if (foo(i,i) != 8) break;
- X continue;
- X case '5':
- X if (foo(i,i) != 10) break;
- X if (i != 5) break;
- X continue;
- X case '6':
- X if (foo(i,i) != 12) break;
- X if (i != 6) break;
- X continue;
- X case '7':
- X if (i != 7) break;
- X if (foo(i,i) != 14) break;
- X continue;
- X case '8':
- X if (foo(i,i) != 16) break;
- X if (i != 8) break;
- X continue;
- X case '9':
- X if (i != 9) break;
- X continue;
- X }
- X printf("test5 FAIL\n");
- X return;
- X }
- X printf("test5 ok\n");
- X}
- X
- X/*
- X * inlines with typedefs and pointer return types
- X */
- X
- Xt6(i)
- Xint i;
- X{
- X char buf[20];
- X cptr p;
- X
- X p = boff('c',buf);
- X if (p != &buf[1] || buf[0] != 'c') {
- X printf("test6 FAIL\n");
- X }
- X p = boff('b',p);
- X if (p != &buf[2] || buf[1] != 'b') {
- X printf("test6 FAIL\n");
- X }
- X p = boff2('d',buf);
- X if (p != &buf[1] || buf[0] != 'd') {
- X printf("test6 FAIL\n");
- X }
- X p = boff2('e',p);
- X if (p != &buf[2] || buf[1] != 'e') {
- X printf("test6 FAIL\n");
- X }
- X printf("test6 ok\n");
- X}
- X
- X/*
- X * inlines with looping structures inside
- X */
- X
- Xt7(i)
- Xint i;
- X{
- X if (biff(1) != 1) {
- X printf("test7 FAIL\n");
- X }
- X if (1) biff(1);
- X if (1) nil();
- X else printf("test7 FAIL\n");
- X printf("test7 ok\n");
- X}
- X
- Xt8(i)
- Xint i;
- X{
- X if (fp() != nil) {
- X printf("test8 FAIL\n");
- X return;
- X }
- X printf("test8 ok\n");
- X}
- X
- X/*
- X * inlines with structure and structure pointer returns
- X */
- X
- Xt9(j)
- Xint j;
- X{
- X struct str z;
- X struct str *zp, *zp2;
- X int i;
- X
- X z = bipp(1,100,3000);
- X if ((z.a != 1) || (z.b != 100) || (z.c != 3000)) {
- X printf("test9 FAIL\n");
- X return;
- X }
- X z = bipp(foo(100,bar(5,4)), z.c, z.b);
- X if ((z.a != 101) || (z.b != 3000) || (z.c != 100)) {
- X printf("test9 FAIL\n");
- X return;
- X }
- X/****************
- X i = bipp(1,2,3).a;
- X if (i != 1) {
- X printf("test9 FAIL\n");
- X return;
- X }
- X*************/
- X zp = &z;
- X i = bupp(&z,1,2,3)->a;
- X if (i != 1) {
- X printf("test9 FAIL\n");
- X return;
- X }
- X if (zp != bupp(zp,1,2,3)) {
- X printf("test9 FAIL\n");
- X return;
- X }
- X printf("test 9 ok\n");
- X}
- X
- X
- X/* special syntax check for function pointer returns */
- X
- X/* declare fp as function returning pointer to function returning int */
- Xint (*fp3())() { return nil; }
- X
- X/* declare fp as function returning pointer to function returning int */
- Xinline int (*fp2())() { return nil; }
- X
- X/* declare fp as function returning pointer to function returning pointer
- X * to function returning int */
- Xinline int (*(*fp1())())() { return fp3; }
- X
- X
- Xfpt1() {
- X
- X/* declare fp as pointer to function returning pointer to function
- X * returning int
- X */
- X int (*(*fx)())();
- X
- X fx = fp1();
- X}
- X
- X/***/
- X
- X/* declare fp as pointer to function returning int */
- Xfpt2() {
- X
- X int (*fx)();
- X
- X fx = fp2();
- X}
- X
- X/* check expression rewriting cases */
- X
- Xt10(n)
- Xint n;
- X{
- X int i = 0;
- X int j;
- X
- X while (i < foo(5,5)) {
- X if (i < 0 || i > 10) {
- X printf("test10 FAIL\n");
- X return;
- X }
- X i = foo(i,1);
- X j = foo(1,2);
- X if (j != 3) {
- X printf("test10 FAIL\n");
- X return;
- X }
- X }
- X
- X for (i = foo(5,5); i > 0; i--) {
- X if (i < 0 || i > 10) {
- X printf("test10 FAIL\n");
- X return;
- X }
- X j = foo(1,2);
- X if (j != 3) {
- X printf("test10 FAIL\n");
- X return;
- X }
- X }
- X printf("test10 ok\n");
- X}
- X
- X/*
- X * side-effect tests
- X */
- X
- Xt11(n)
- Xint n;
- X{
- X register int i;
- X
- X effect = 0;
- X
- X if (effect == 1 && (side_effect(1) == 0)) {
- X printf("test11 FAIL\n");
- X return;
- X }
- X
- X /* effect should still be 0 */
- X
- X if (effect == 0 || (side_effect(1) == 1)) {
- X nil();
- X }
- X
- X /* effect should still be 0 */
- X
- X if (effect != 0) {
- X printf("test11 FAIL\n");
- X return;
- X }
- X
- X i = (side_effect(1) ? 100 : 200); /* assert i == 200 */
- X /* assert effect == 1 */
- X
- X if (i != 200) {
- X printf("test11 FAIL\n");
- X return;
- X }
- X
- X /* a non-expansion case */
- X i = (effect ? side_effect(100) : side_effect(200));
- X /* assert i == 1 */
- X
- X if (i != 1) {
- X printf("test11 FAIL\n");
- X return;
- X }
- X
- X if (effect != 100) {
- X printf("test11 FAIL\n");
- X return;
- X }
- X
- X /* should have a comma-operator test, but it breaks now */
- X
- X printf("test11 ok\n");
- X}
- X
- X/*
- X * more side-effect tests
- X */
- X
- Xt12(n)
- Xint n;
- X{
- X int i,j,k,l;
- X struct str b;
- X
- X /* might cause syntax errors, might return wrong value */
- X i = swaparg(1,2);
- X if (i != 3) {
- X printf("test12 FAIL\n");
- X return;
- X }
- X i = 100;
- X j = 200;
- X if (swaparg(i,j) != 300 || i != 100 || j != 200) {
- X printf("test12 FAIL\n");
- X return;
- X }
- X for (i = 0; i < 3; i++) {
- X j = i;
- X b = modarg(i,b);
- X if (i != j) {
- X printf("test12 FAIL\n");
- X return;
- X }
- X if (i == 2) {
- X if (b.a != 6 || j != 2) {
- X printf("test12 FAIL\n");
- X return;
- X }
- X }
- X }
- X printf("test12 ok\n");
- X}
- X
- Xt13(n)
- Xint n;
- X{
- X register int i,j,k;
- X
- X for (i = 0; i < 5; i++) {
- X if (i == 1) goto i2;
- X i1:
- X j = foo(i,100);
- X if (i == 2) {
- X i2: k = foo(i,200);
- X if (i > 1 && j != i+100) { printf("test 13 FAIL\n"); return;}
- X goto i4;
- X }
- X if (i == 3) {
- X foo(i,300);
- X i3 /* comment */ :
- X if (j != i+100) { printf("test 13 FAIL\n"); return;}
- X continue;
- X }
- X if (i == 4) {
- X if (j != i+100) { printf("test 13 FAIL\n"); return;}
- X k = foo(i,400);
- X i4:
- X if (i == 2 && k != 202) { printf("test 13 FAIL\n"); return; }
- X if (i == 4 && k != 404) { printf("test 13 FAIL\n"); return; }
- X k = foo(i,500);
- X continue;
- X }
- X k = foo(i,600);
- X j = 0;
- X }
- X printf("test13 ok\n");
- X}
- X
- Xint var = 0;
- X
- Xinline evar() {
- X return(var);
- X}
- X
- Xinline mvar(x) {
- X var = x;
- X}
- X
- Xt14(n)
- Xint n;
- X{
- X int var = 1; /* hide outer def'n */
- X
- X if (evar() != 0) { printf("test14 FAIL\n"); return;}
- X if (var != 1) { printf("test14 FAIL\n"); return;}
- X mvar(100);
- X if (var != 1) { printf("test14 FAIL\n"); return;}
- X if (evar() != 100) { printf("test14 FAIL\n"); return;}
- X printf("test14 ok\n");
- X}
- X
- Xt15(i,var)
- Xint i;
- Xint var;
- X{
- X int a,b,c;
- X
- X mvar(-100);
- X
- X a = 1;
- X b = 2;
- X c = 3;
- X
- X {
- X int a,b;
- X
- X a = 100;
- X b = 200;
- X
- X c = foo(a,b);
- X }
- X
- X if (a != 1 || b != 2 || c != 300) { printf("test15 FAIL\n"); return; }
- X
- X c = var;
- X {
- X int var;
- X
- X var = 1000;
- X
- X {
- X cptr var, a, b, c;
- X
- X a = "-1";
- X b = "-2";
- X c = "-3";
- X var = "-4";
- X if (evar() != -100) { printf("test15 FAIL\n"); return;}
- X }
- X
- X if (evar() != -100) { printf("test15 FAIL\n"); return;}
- X }
- X if (var != c) { printf("test15 FAIL\n"); return; }
- X if (evar() != -100) { printf("test15 FAIL\n"); return;}
- X printf("test15 ok\n");
- X}
- X
- Xt16(n)
- Xint n;
- X{
- X char *s = "foo";
- X
- X if (hardcase1(0,1) != 1) { printf("test16 FAIL\n"); return;}
- X while (1 && (hardcase1(0,1) != 1)) printf("test16 FAIL\n");
- X s = hardcase2("foo",1,0);
- X printf("test16 ok\n");
- X}
- X
- Xt17(n)
- Xint n;
- X{
- X int x = 1;
- X
- X if (x && expr1(1,0) != 0) {printf("test17 FAIL(1)\n"); return;}
- X if (x && expr1(0,1) != 1) {printf("test17 FAIL(2)\n"); return;}
- X if (x && expr1(0,100) != 2) {printf("test17 FAIL(3)\n"); return;}
- X if (x && expr1(0,0) != 3) {printf("test17 FAIL(4)\n"); return;}
- X if (x && expr2(1,0) != 1) {printf("test17 FAIL(5)\n"); return;}
- X if (x && expr2(0,1) != 201) {printf("test17 FAIL(6)\n"); return;}
- X if (x && expr2(0,0) != 500) {printf("test17 FAIL(7)\n"); return;}
- X printf("test17 ok\n");
- X}
- X
- Xt18(n)
- Xint n;
- X{
- X int i,j;
- X
- X i = 0;
- XL1:
- X j = labs(i);
- X if (j != i) {printf("test18 FAIL\n"); return; }
- X i++;
- X if (i > 10) goto L2;
- X goto L1;
- XL2:
- X printf("test18 ok\n");
- X}
- X
- \Rogue\Monster\
- else
- echo "will not over write ./test.c"
- fi
- chmod 444 ./test.c
- if [ `wc -c ./test.c | awk '{printf $1}'` -ne 11843 ]
- then
- echo `wc -c ./test.c | awk '{print "Got " $1 ", Expected " 11843}'`
- fi
- if `test ! -s ./test2.c`
- then
- echo "writing ./test2.c"
- sed 's/^X//' > ./test2.c << '\Rogue\Monster\'
- X
- X/* test cases for 'inline' */
- X
- X/* $Header: test2.c,v 1.2 87/06/24 13:06:48 mcg Rel $ */
- X
- X
- Xm() {
- X register int x,y,z;
- X
- X x = foo(x++,y++);
- X}
- X
- Xmain() {
- X t1(1);
- X t2(2);
- X t3(3);
- X t4(4);
- X t5(5);
- X t6(6);
- X t7(7);
- X t8(8);
- X t9(9);
- X t10(10);
- X t11(11);
- X t12(12);
- X t13(13);
- X t14(14);
- X t15(15,50);
- X t16(16);
- X t17(17);
- X t18(18);
- X return(0);
- X}
- X
- X/*
- X * basic expansion of single inline
- X */
- X
- Xt1(i)
- Xint i;
- X{
- X int a;
- X
- X printf("test%d:\n",i);
- X a = foo(1,2);
- X if (a == 3) {
- X printf("test%d ok\n",i);
- X } else {
- X printf("test%d FAIL\n",i);
- X }
- X}
- X
- X/*
- X * expansion of multiple inlines in single expression
- X */
- X
- Xt2(i)
- Xint i;
- X{
- X int a;
- X
- X printf("test%d:\n",i);
- X a = foo(1,2) + foo(3,4);
- X if (a == 10) {
- X printf("test%d ok\n",i);
- X } else {
- X printf("test%d FAIL\n",i);
- X }
- X}
- X
- X/*
- X * expansion of inlines in various styles of if() statement
- X * - check parsing of if compound statement
- X */
- X
- Xt3(i)
- Xint i;
- X{
- X printf("test%d:\n",i);
- X if (foo(1,2) != 3) {
- X printf("test%d FAIL\n",i);
- X return;
- X }
- X
- X if (foo(1,2) == 3) {
- X ;
- X } else {
- X printf("test%d FAIL\n");
- X return;
- X }
- X
- X if (!foo(1,2)) printf("test%d FAIL\n",i);
- X
- X if (foo(1,2) == 3) nil(); else printf("test%d FAIL\n",i);
- X
- X if (foo(1,2) == 3) nil(); else {
- X printf("test%d FAIL\n",i);
- X }
- X
- X if (foo(1,2) == 3) {
- X printf("test%d ok\n",i);
- X } else
- X printf("test%d FAIL\n",i);
- X}
- X
- X/*
- X * inlines as arguments to other inlines
- X */
- X
- Xt4(i)
- Xint i;
- X{
- X register int a;
- X
- X printf("test%d:\n",i);
- X a = foo(foo(1,2),2);
- X if (a != 5) {
- X printf("test%d FAIL\n",i);
- X }
- X
- X a = foo(100,bar(5,4));
- X if (a != 101) {
- X printf("test%d FAIL\n",i);
- X }
- X printf("test%d ok\n",i);
- X}
- X
- X/*
- X */
- X
- Xt5(j)
- Xint j;
- X{
- X register int i;
- X for(i=0; i < 10; i++) {
- X switch(insw(i)) {
- X case '0':
- X if (foo(i,i) != 0) break;
- X if (i != 0) break;
- X continue;
- X case '1':
- X if (i != 1) break;
- X if (foo(i,i) != 2) break;
- X continue;
- X case '2':
- X if (foo(i,i) != 4) break;
- X if (i != 2) break;
- X continue;
- X case '3':
- X if (foo(i,i) != 6) break;
- X if (i != 3) break;
- X continue;
- X case '4':
- X if (i != 4) break;
- X if (foo(i,i) != 8) break;
- X continue;
- X case '5':
- X if (foo(i,i) != 10) break;
- X if (i != 5) break;
- X continue;
- X case '6':
- X if (foo(i,i) != 12) break;
- X if (i != 6) break;
- X continue;
- X case '7':
- X if (i != 7) break;
- X if (foo(i,i) != 14) break;
- X continue;
- X case '8':
- X if (foo(i,i) != 16) break;
- X if (i != 8) break;
- X continue;
- X case '9':
- X if (i != 9) break;
- X continue;
- X }
- X printf("test5 FAIL\n");
- X return;
- X }
- X printf("test5 ok\n");
- X}
- X
- X/*
- X * inlines with typedefs and pointer return types
- X */
- X
- Xt6(i)
- Xint i;
- X{
- X char buf[20];
- X cptr p;
- X
- X p = boff('c',buf);
- X if (p != &buf[1] || buf[0] != 'c') {
- X printf("test6 FAIL\n");
- X }
- X p = boff('b',p);
- X if (p != &buf[2] || buf[1] != 'b') {
- X printf("test6 FAIL\n");
- X }
- X p = boff2('d',buf);
- X if (p != &buf[1] || buf[0] != 'd') {
- X printf("test6 FAIL\n");
- X }
- X p = boff2('e',p);
- X if (p != &buf[2] || buf[1] != 'e') {
- X printf("test6 FAIL\n");
- X }
- X printf("test6 ok\n");
- X}
- X
- X/*
- X * inlines with looping structures inside
- X */
- X
- Xt7(i)
- Xint i;
- X{
- X if (biff(1) != 1) {
- X printf("test7 FAIL\n");
- X }
- X if (1) biff(1);
- X if (1) nil();
- X else printf("test7 FAIL\n");
- X printf("test7 ok\n");
- X}
- X
- Xt8(i)
- Xint i;
- X{
- X if (fp() != nil) {
- X printf("test8 FAIL\n");
- X return;
- X }
- X printf("test8 ok\n");
- X}
- X
- X/*
- X * inlines with structure and structure pointer returns
- X */
- X
- Xt9(j)
- Xint j;
- X{
- X struct str z;
- X struct str *zp, *zp2;
- X int i;
- X
- X z = bipp(1,100,3000);
- X if ((z.a != 1) || (z.b != 100) || (z.c != 3000)) {
- X printf("test9 FAIL\n");
- X return;
- X }
- X z = bipp(foo(100,bar(5,4)), z.c, z.b);
- X if ((z.a != 101) || (z.b != 3000) || (z.c != 100)) {
- X printf("test9 FAIL\n");
- X return;
- X }
- X/****************
- X i = bipp(1,2,3).a;
- X if (i != 1) {
- X printf("test9 FAIL\n");
- X return;
- X }
- X*************/
- X zp = &z;
- X i = bupp(&z,1,2,3)->a;
- X if (i != 1) {
- X printf("test9 FAIL\n");
- X return;
- X }
- X if (zp != bupp(zp,1,2,3)) {
- X printf("test9 FAIL\n");
- X return;
- X }
- X printf("test 9 ok\n");
- X}
- X
- X
- X/* special syntax check for function pointer returns */
- X
- X/* declare fp as function returning pointer to function returning int */
- Xint (*fp3())() { return nil; }
- X
- X/* declare fp as function returning pointer to function returning int */
- Xinline int (*fp2())() { return nil; }
- X
- X/* declare fp as function returning pointer to function returning pointer
- X * to function returning int */
- Xinline int (*(*fp1())())() { return fp3; }
- X
- X
- Xfpt1() {
- X
- X/* declare fp as pointer to function returning pointer to function
- X * returning int
- X */
- X int (*(*fx)())();
- X
- X fx = fp1();
- X}
- X
- X/***/
- X
- X/* declare fp as pointer to function returning int */
- Xfpt2() {
- X
- X int (*fx)();
- X
- X fx = fp2();
- X}
- X
- X/* check expression rewriting cases */
- X
- Xt10(n)
- Xint n;
- X{
- X int i = 0;
- X int j;
- X
- X while (i < foo(5,5)) {
- X if (i < 0 || i > 10) {
- X printf("test10 FAIL\n");
- X return;
- X }
- X i = foo(i,1);
- X j = foo(1,2);
- X if (j != 3) {
- X printf("test10 FAIL\n");
- X return;
- X }
- X }
- X
- X for (i = foo(5,5); i > 0; i--) {
- X if (i < 0 || i > 10) {
- X printf("test10 FAIL\n");
- X return;
- X }
- X j = foo(1,2);
- X if (j != 3) {
- X printf("test10 FAIL\n");
- X return;
- X }
- X }
- X printf("test10 ok\n");
- X}
- X
- X/*
- X * side-effect tests
- X */
- X
- Xt11(n)
- Xint n;
- X{
- X register int i;
- X
- X effect = 0;
- X
- X if (effect == 1 && (side_effect(1) == 0)) {
- X printf("test11 FAIL\n");
- X return;
- X }
- X
- X /* effect should still be 0 */
- X
- X if (effect == 0 || (side_effect(1) == 1)) {
- X nil();
- X }
- X
- X /* effect should still be 0 */
- X
- X if (effect != 0) {
- X printf("test11 FAIL\n");
- X return;
- X }
- X
- X i = (side_effect(1) ? 100 : 200); /* assert i == 200 */
- X /* assert effect == 1 */
- X
- X if (i != 200) {
- X printf("test11 FAIL\n");
- X return;
- X }
- X
- X /* a non-expansion case */
- X i = (effect ? side_effect(100) : side_effect(200));
- X /* assert i == 1 */
- X
- X if (i != 1) {
- X printf("test11 FAIL\n");
- X return;
- X }
- X
- X if (effect != 100) {
- X printf("test11 FAIL\n");
- X return;
- X }
- X
- X /* should have a comma-operator test, but it breaks now */
- X
- X printf("test11 ok\n");
- X}
- X
- X/*
- X * more side-effect tests
- X */
- X
- Xt12(n)
- Xint n;
- X{
- X int i,j,k,l;
- X struct str b;
- X
- X /* might cause syntax errors, might return wrong value */
- X i = swaparg(1,2);
- X if (i != 3) {
- X printf("test12 FAIL\n");
- X return;
- X }
- X i = 100;
- X j = 200;
- X if (swaparg(i,j) != 300 || i != 100 || j != 200) {
- X printf("test12 FAIL\n");
- X return;
- X }
- X for (i = 0; i < 3; i++) {
- X j = i;
- X b = modarg(i,b);
- X if (i != j) {
- X printf("test12 FAIL\n");
- X return;
- X }
- X if (i == 2) {
- X if (b.a != 6 || j != 2) {
- X printf("test12 FAIL\n");
- X return;
- X }
- X }
- X }
- X printf("test12 ok\n");
- X}
- X
- Xt13(n)
- Xint n;
- X{
- X register int i,j,k;
- X
- X for (i = 0; i < 5; i++) {
- X if (i == 1) goto i2;
- X i1:
- X j = foo(i,100);
- X if (i == 2) {
- X i2: k = foo(i,200);
- X if (i > 1 && j != i+100) { printf("test 13 FAIL\n"); return;}
- X goto i4;
- X }
- X if (i == 3) {
- X foo(i,300);
- X i3 /* comment */ :
- X if (j != i+100) { printf("test 13 FAIL\n"); return;}
- X continue;
- X }
- X if (i == 4) {
- X if (j != i+100) { printf("test 13 FAIL\n"); return;}
- X k = foo(i,400);
- X i4:
- X if (i == 2 && k != 202) { printf("test 13 FAIL\n"); return; }
- X if (i == 4 && k != 404) { printf("test 13 FAIL\n"); return; }
- X k = foo(i,500);
- X continue;
- X }
- X k = foo(i,600);
- X j = 0;
- X }
- X printf("test13 ok\n");
- X}
- X
- Xint var = 0;
- X
- Xinline evar() {
- X return(var);
- X}
- X
- Xinline mvar(x) {
- X var = x;
- X}
- X
- Xt14(n)
- Xint n;
- X{
- X int var = 1; /* hide outer def'n */
- X
- X if (evar() != 0) { printf("test14 FAIL\n"); return;}
- X if (var != 1) { printf("test14 FAIL\n"); return;}
- X mvar(100);
- X if (var != 1) { printf("test14 FAIL\n"); return;}
- X if (evar() != 100) { printf("test14 FAIL\n"); return;}
- X printf("test14 ok\n");
- X}
- X
- Xt15(i,var)
- Xint i;
- Xint var;
- X{
- X int a,b,c;
- X
- X mvar(-100);
- X
- X a = 1;
- X b = 2;
- X c = 3;
- X
- X {
- X int a,b;
- X
- X a = 100;
- X b = 200;
- X
- X c = foo(a,b);
- X }
- X
- X if (a != 1 || b != 2 || c != 300) { printf("test15 FAIL\n"); return; }
- X
- X c = var;
- X {
- X int var;
- X
- X var = 1000;
- X
- X {
- X cptr var, a, b, c;
- X
- X a = "-1";
- X b = "-2";
- X c = "-3";
- X var = "-4";
- X if (evar() != -100) { printf("test15 FAIL\n"); return;}
- X }
- X
- X if (evar() != -100) { printf("test15 FAIL\n"); return;}
- X }
- X if (var != c) { printf("test15 FAIL\n"); return; }
- X if (evar() != -100) { printf("test15 FAIL\n"); return;}
- X printf("test15 ok\n");
- X}
- X
- Xt16(n)
- Xint n;
- X{
- X char *s = "foo";
- X
- X if (hardcase1(0,1) != 1) { printf("test16 FAIL\n"); return;}
- X while (1 && (hardcase1(0,1) != 1)) printf("test16 FAIL\n");
- X s = hardcase2("foo",1,0);
- X printf("test16 ok\n");
- X}
- X
- Xt17(n)
- Xint n;
- X{
- X int x = 1;
- X
- X if (x && expr1(1,0) != 0) {printf("test17 FAIL(1)\n"); return;}
- X if (x && expr1(0,1) != 1) {printf("test17 FAIL(2)\n"); return;}
- X if (x && expr1(0,100) != 2) {printf("test17 FAIL(3)\n"); return;}
- X if (x && expr1(0,0) != 3) {printf("test17 FAIL(4)\n"); return;}
- X if (x && expr2(1,0) != 1) {printf("test17 FAIL(5)\n"); return;}
- X if (x && expr2(0,1) != 201) {printf("test17 FAIL(6)\n"); return;}
- X if (x && expr2(0,0) != 500) {printf("test17 FAIL(7)\n"); return;}
- X printf("test17 ok\n");
- X}
- X
- Xt18(n)
- Xint n;
- X{
- X int i,j;
- X
- X i = 0;
- XL1:
- X j = labs(i);
- X if (j != i) {printf("test18 FAIL\n"); return; }
- X i++;
- X if (i > 10) goto L2;
- X goto L1;
- XL2:
- X printf("test18 ok\n");
- X}
- X
- X/* simple inline */
- Xinline int foo(a,b) {
- X register int x = 0;
- X
- X printf("foo(%d, %d)\n", a,b);
- X return(a+b);
- X}
- Xinline int bar(x,y) {
- X register int a;
- X
- X a = 0;
- X printf("bar(%d, %d)\n", x,y);
- X return(x-y);
- X}
- X/* inline with some control flow */
- Xinline biff(a) {
- X while(1) return a;
- X}
- X
- X/* inline with a switch */
- Xinline insw(i)
- Xint i;
- X{
- X switch(i) {
- X case 0: return('0');
- X case 1: return('1');
- X case 2: return('2');
- X case 3: return('3');
- X case 4: return(foo(i,'0'));
- X case 5: return('5');
- X case 6: return('6');
- X case 7: return(foo(i,'0'));
- X case 8: return('8');
- X case 9: return('9');
- X }
- X return(0);
- X}
- X
- Xtypedef char *cptr;
- X
- Xinline barf() {
- X printf("!!!\n");
- X}
- X
- X/* inline returning a typedef */
- Xinline cptr
- Xboff(c,s)
- Xchar c;
- Xcptr s;
- X{
- X s[0] = c;
- X return(&s[1]);
- X}
- X
- X/* inline returning a pointer type */
- Xinline char *
- Xboff2(c,s)
- Xchar c;
- Xcptr s;
- X{
- X s[0] = c;
- X return(&s[1]);
- X}
- X
- Xstruct str {
- X int a;
- X int b;
- X int c;
- X};
- X
- X/* inline returning a structure */
- Xinline struct str bipp(a,b,c)
- Xint a, b, c;
- X{
- X struct str x;
- X
- X x.a = a;
- X x.b = b;
- X x.c = c;
- X return(x);
- X}
- X
- X/* inline returning a structure pointer */
- Xinline struct str *bupp(z,a,b,c)
- Xregister struct str *z;
- Xregister int a,b,c;
- X{
- X z->a = a;
- X z->b = b;
- X z->c = c;
- X return(z);
- X}
- X
- Xnil(){}
- X
- X/* inline returning function pointer */
- Xinline int (*fp())()
- X{
- X return(nil);
- X}
- X
- Xint effect = 0;
- X
- Xinline int side_effect(a)
- Xint a;
- X{
- X int old;
- X
- X old = effect;
- X effect = a;
- X
- X return(old);
- X}
- X
- X/* should have no effect on arguments */
- Xinline int swaparg(a,b)
- X{
- X int tmp;
- X
- X tmp = a;
- X a = b;
- X b = tmp;
- X
- X return(a+b);
- X}
- X
- Xinline struct str modarg(a,b)
- Xint a;
- Xstruct str b; /* struct arg */
- X{
- X switch(a) {
- X case 0:
- X a = 1;
- X b.a = 1;
- X break;
- X case 1:
- X a >>= 1;
- X a <<= 1;
- X b.a = a;
- X break;
- X case 2:
- X a *= 3;
- X b.a = a;
- X break;
- X }
- X return(b);
- X}
- X
- Xinline hardcase1(a,b)
- Xint a,b;
- X{
- X { ; }
- X if (a);
- X {{}}
- X if (a) { } else ;
- X return(b);
- X}
- Xinline char *
- Xhardcase2(a,b,c)
- Xchar *a;
- Xint b,c;
- X{
- X char *s = "foo", c = 'c';
- X int x = b;
- X
- X if (a) return(s);
- X else {
- X if (b) return(a+c);
- X }
- X return(a+c);
- X}
- X
- Xinline expr1(a,b)
- Xint a,b;
- X{
- X int x = 0;
- X
- X if (foo(0,a+b) == 100) return x+2; /* a+b == 100, ret = 2 */
- X if (foo(50,50) == 100 && a) return x; /* a != 0, return = 0 */
- X if (foo(100,0) == 100 && b) return x+1; /* a == 0 && b != 0, ret = 1 */
- X return x+3; /* ret = 3 */
- X}
- X
- Xinline expr2(a,b)
- Xint a,b;
- X{
- X register int x = 0, y = 1;
- X
- X if (a) {
- X return(x+y); /* a != 0, return = 1 */
- X } else {
- X register int x = 100, y = 101;
- X
- X if (b) {
- X return(x+y); /* a == 0 && b != 0, return = 201 */
- X } else {
- X register int x = 200, y = 300;
- X
- X return(x+y); /* a == 0 && b == 0, return = 500 */
- X }
- X }
- X}
- X
- X
- Xinline labs(i)
- Xint i;
- X{
- X if (i == 1) goto L1;
- X if (i == 2) goto L2;
- X if (i == 3) goto L3;
- X if (i == 4) goto L4;
- X goto L5;
- XL6:
- X return(i);
- X
- XL1: i++; return(1);
- XL2: if (i == 2) return(2);
- XL3: return(3);
- XL4: {
- X return(4);
- X }
- XL5: goto L6;
- X}
- \Rogue\Monster\
- else
- echo "will not over write ./test2.c"
- fi
- chmod 444 ./test2.c
- if [ `wc -c ./test2.c | awk '{printf $1}'` -ne 11844 ]
- then
- echo `wc -c ./test2.c | awk '{print "Got " $1 ", Expected " 11844}'`
- fi
- echo "Finished archive 1 of 3"
- # if you want to concatenate archives, remove anything after this line
- exit
-