home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume11 / inline / part04 < prev    next >
Text File  |  1987-09-14  |  41KB  |  2,213 lines

  1. Subject:  v11i042:  Inline code expander for C, Part04/04
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rs@uunet.UU.NET
  5.  
  6. Submitted-by: omepd!mcg
  7. Posting-number: Volume 11, Issue 42
  8. Archive-name: inline/Part04
  9.  
  10. # This is a shell archive.  Remove anything before this line
  11. # then unpack it by saving it in a file and typing "sh file"
  12. # (Files unpacked will be owned by you and have original permissions).
  13. # This archive contains the following files:
  14. #    ./patchlevel.h
  15. #    ./Makefile
  16. #    ./scan.l
  17. #    ./BUGS
  18. #    ./MINVERS
  19. #    ./test.c
  20. #    ./test2.c
  21. #
  22. if `test ! -s ./patchlevel.h`
  23. then
  24. echo "writing ./patchlevel.h"
  25. sed 's/^X//' > ./patchlevel.h << '\Rogue\Monster\'
  26. X/* patchlevel file */
  27. X
  28. X#define PATCHLEVEL 0
  29. X
  30. X
  31. \Rogue\Monster\
  32. else
  33.   echo "will not over write ./patchlevel.h"
  34. fi
  35. chmod 444 ./patchlevel.h
  36. if [ `wc -c ./patchlevel.h | awk '{printf $1}'` -ne 46 ]
  37. then
  38. echo `wc -c ./patchlevel.h | awk '{print "Got " $1 ", Expected " 46}'`
  39. fi
  40. if `test ! -s ./Makefile`
  41. then
  42. echo "writing ./Makefile"
  43. sed 's/^X//' > ./Makefile << '\Rogue\Monster\'
  44. X#
  45. X# Makefile for 'inline' program - C inline code substituter
  46. X#
  47. X# (c) copyright 1986, 1987, S. McGeady, all rights reserved
  48. X#
  49. X#
  50. X# NOTE - comment out some lines below if you don't have RCS
  51. X#
  52. X
  53. X# CFLAGS=-g -pg
  54. X# CFLAGS=-g
  55. XCFLAGS=-O
  56. X
  57. Xall: inline test
  58. X
  59. XMAJVERS = "3"
  60. XHDRS = inline.h tokens.h
  61. XSRCS = inline.c declare.c expand.c rewrite.c yylex.c tokens.c utils.c mem.c
  62. XOBJS = inline.o declare.o expand.o rewrite.o yylex.o tokens.o utils.o mem.o
  63. X
  64. Xinline: $(OBJS) vers.o
  65. X    $(CC) -o inline $(CFLAGS) $(OBJS) vers.o
  66. X
  67. Xyylex.o: yylex.c $(HDRS)
  68. Xdeclare.o: declare.c $(HDRS)
  69. Xexpand.o: expand.c $(HDRS)
  70. Xutils.o: utils.c $(HDRS)
  71. Xinline.o: inline.c $(HDRS)
  72. Xrewrite.o: rewrite.c $(HDRS)
  73. Xmem.o: mem.c
  74. Xtokens.o: tokens.c
  75. X
  76. Xvers.o: $(OBJS) patchlevel.h
  77. X    -@chmod u+w MINVERS
  78. X    -expr "`cat MINVERS`" + 1 > MINVERS
  79. X    echo '#include "patchlevel.h"' > vers.c
  80. X    echo 'static char *vers[] = {' >> vers.c
  81. X    echo '"$$''Header: inline version' $(MAJVERS).`cat MINVERS` 'compiled' "`date`" "flags '$(CFLAGS)'" '$$",' >> vers.c
  82. X    # if you don't have RCS, this will fail
  83. X    # COMMENT THIS LINE OUT IF YOU DON'T HAVE RCS ON YOUR SYSTEM
  84. X    # perhaps replace with:
  85. X    # grep '\$$''Header:' $(HDRS) $(SRCS) | sed 's/^.*\$$\(.*\)\$$$$/"$$\1$$",/' >> vers.c
  86. X    -ident $(HDRS) $(SRCS) | grep '\$$''Header:' | sed 's/^.*\$$\(.*\)\$$$$/"$$\1$$",/' >> vers.c
  87. X
  88. X    # END OF RCS SECTION
  89. X
  90. X    echo '};' >> vers.c
  91. X    $(CC) -c vers.c
  92. X
  93. X#
  94. X# this is all for verification
  95. X#
  96. X
  97. Xbasex: test.c
  98. X    $(CC) -o basex -Dinline=static test.c
  99. X
  100. Xtestx: inline test.c
  101. X    ./inline -w -s < test.c > x.c
  102. X    $(CC) -o testx x.c
  103. X
  104. Xtest2x: inline test2.c
  105. X    ./inline -w -2 -s test2.c > x2.c
  106. X    $(CC) -o test2x x2.c
  107. X
  108. Xtest: inline basex testx test2x
  109. X    @echo 'starting validation tests'
  110. X    ./basex > base.out
  111. X    ./testx > test.out
  112. X    @sh -c 'if grep -s FAIL base.out; then echo "your compiler is broken"; exit 1; else exit 0; fi'
  113. 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'
  114. 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'
  115. X    @echo 'testing two-pass mode'
  116. X    ./test2x > test2.out
  117. 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'
  118. 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'
  119. X    @echo 'testing complete - everything looks ok'
  120. X
  121. Xclean:
  122. X    rm -f scan.c tstscan.c $(OBJS) vers.o \
  123. X        mon.out core tstscan.o x.c basex testx base.out test.out
  124. X
  125. Xlint:    $(SRCS) $(HDRS)
  126. X    lint -h -c -n inline.c declare.c expand.c rewrite.c utils.c mem.c yylex.c tokens.c
  127. X
  128. X#
  129. X# this expects the 'rogue monster' (mips!roger) shar 
  130. X# -c includes size checking, -p retains permissions, -x X prepends 'X' to lines
  131. X#
  132. Xshar:    $(SRCS) $(HDRS) Makefile inline.1 scan.l
  133. X    shar -c -p -x X -f inline. inline.1 $(HDRS) $(SRCS) patchlevel.h \
  134. X        Makefile scan.l NOTES COPYRIGHT BUGS MINVERS test.c test2.c
  135. X
  136. X
  137. X# scan.o: scan.l inline.h tokens.h
  138. X# tstscan: scan.c tokens.o
  139. X#    cp scan.c tstscan.c
  140. X#    $(CC) -c -DTEST tstscan.c
  141. X#    $(CC) -o tstscan -g tstscan.o tokens.o
  142. X
  143. \Rogue\Monster\
  144. else
  145.   echo "will not over write ./Makefile"
  146. fi
  147. chmod 444 ./Makefile
  148. if [ `wc -c ./Makefile | awk '{printf $1}'` -ne 3126 ]
  149. then
  150. echo `wc -c ./Makefile | awk '{print "Got " $1 ", Expected " 3126}'`
  151. fi
  152. if `test ! -s ./scan.l`
  153. then
  154. echo "writing ./scan.l"
  155. sed 's/^X//' > ./scan.l << '\Rogue\Monster\'
  156. XD            [0-9]
  157. XL            [a-zA-Z_]
  158. XH            [a-fA-F0-9]
  159. XE            [Ee][+-]?{D}+
  160. XLS            (l|L)
  161. XUS            (u|U)
  162. X
  163. X%{
  164. X/*
  165. X * inline code expander
  166. X *
  167. X * (c) 1986 - copyright 1986, s. mcgeady, all rights reserved
  168. X */
  169. X
  170. X/* $Header: scan.l,v 1.5 87/04/27 18:16:48 mcg Rel $ */
  171. X
  172. X
  173. X#include <stdio.h>
  174. X#include "tokens.h"
  175. X#include "inline.h"
  176. X
  177. X#ifdef COUNTCOLUMN
  178. Xvoid count();
  179. X#else
  180. X#define    count()
  181. X#endif
  182. X
  183. X#define    COMMENT        1
  184. X#define    CPPLINE        2
  185. X#define    STRING        3
  186. X
  187. Xextern char *gather();
  188. X
  189. Xchar *yylval;
  190. X
  191. Xint line = 1;
  192. Xint column = 0;
  193. X
  194. Xstatic int bracelev = 0;
  195. Xstatic int parenlev = 0;
  196. X%}
  197. X
  198. X%%
  199. X"/*"            { count(); yylval = gather(COMMENT,yytext);
  200. X                /* T_COMMENT gets changed to T_WS later */
  201. X                return(T_COMMENT); }
  202. X^[ \t]*#        { count(); yylval = gather(CPPLINE,yytext);
  203. X                return(T_CPP); }
  204. X\"            { count(); yylval = gather(STRING,yytext);
  205. X                return(T_STR); }
  206. X
  207. X"auto"            { count(); yylval = 0; return(T_AUTO); }
  208. X"break"            { count(); yylval = 0; return(T_BREAK); }
  209. X"case"            { count(); yylval = 0; return(T_CASE); }
  210. X"char"            { count(); yylval = 0; return(T_CHAR); }
  211. X"const"            { count(); yylval = 0; return(T_CONST); }
  212. X"continue"        { count(); yylval = 0; return(T_CONTINUE); }
  213. X"default"        { count(); yylval = 0; return(T_DEFAULT); }
  214. X"do"            { count(); yylval = 0; return(T_DO); }
  215. X"double"        { count(); yylval = 0; return(T_DOUBLE); }
  216. X"else"            { count(); yylval = 0; return(T_ELSE); }
  217. X"enum"            { count(); yylval = 0; return(T_ENUM); }
  218. X"extern"        { count(); yylval = 0; return(T_EXTERN); }
  219. X"float"            { count(); yylval = 0; return(T_FLOAT); }
  220. X"for"            { count(); yylval = 0; return(T_FOR); }
  221. X"goto"            { count(); yylval = 0; return(T_GOTO); }
  222. X"if"            { count(); yylval = 0; return(T_IF); }
  223. X"inline"        { count(); yylval = 0; return(T_INLINE); }
  224. X"int"            { count(); yylval = 0; return(T_INT); }
  225. X"long"            { count(); yylval = 0; return(T_LONG); }
  226. X"register"        { count(); yylval = 0; return(T_REGISTER); }
  227. X"return"        { count(); yylval = 0; return(T_RETURN); }
  228. X"short"            { count(); yylval = 0; return(T_SHORT); }
  229. X"signed"        { count(); yylval = 0; return(T_SIGNED); }
  230. X"sizeof"        { count(); yylval = 0; return(T_SIZEOF); }
  231. X"static"        { count(); yylval = 0; return(T_STATIC); }
  232. X"struct"        { count(); yylval = 0; return(T_STRUCT); }
  233. X"switch"        { count(); yylval = 0; return(T_SWITCH); }
  234. X"typedef"        { count(); yylval = 0; return(T_TYPEDEF); }
  235. X"union"            { count(); yylval = 0; return(T_UNION); }
  236. X"unsigned"        { count(); yylval = 0; return(T_UNSIGNED); }
  237. X"void"            { count(); yylval = 0; return(T_VOID); }
  238. X"volatile"        { count(); yylval = 0; return(T_VOLATILE); }
  239. X"while"            { count(); yylval = 0; return(T_WHILE); }
  240. X
  241. X{L}({L}|{D})*        { count(); yylval= yytext; return(T_IDENT);
  242. X            /* typedefing is checked in gettok() */ }
  243. X
  244. X"0fnan"            { count(); yylval = yytext; return(T_NUM); }
  245. X"0fNAN"            { count(); yylval = yytext; return(T_NUM); }
  246. X"0finf"            { count(); yylval = yytext; return(T_NUM); }
  247. X"0fINF"            { count(); yylval = yytext; return(T_NUM); }
  248. X
  249. X0[xX]{H}+{LS}?{US}?    { count(); yylval = yytext; return(T_NUM); }
  250. X0[xX]{H}+{US}?{LS}?    { count(); yylval = yytext; return(T_NUM); }
  251. X0{D}+{LS}?{US}?        { count(); yylval = yytext; return(T_NUM); }
  252. X0{D}+{US}?{LS}?        { count(); yylval = yytext; return(T_NUM); }
  253. X{D}+{LS}?{US}?        { count(); yylval = yytext; return(T_NUM); }
  254. X{D}+{US}?{LS}?        { count(); yylval = yytext; return(T_NUM); }
  255. X
  256. X{D}+{E}{LS}?        { count(); yylval = yytext; return(T_NUM); }
  257. X{D}*"."{D}+({E})?{LS}?    { count(); yylval = yytext; return(T_NUM); }
  258. X{D}+"."{D}*({E})?{LS}?    { count(); yylval = yytext; return(T_NUM); }
  259. X
  260. X'(\\.|[^\\'])+'        { count(); yylval = yytext; return(T_CHARCONST); }
  261. X"..."            { count(); yylval = 0; return(T_ELLIPSES); }
  262. X">>="            { count(); yylval = 0; return(T_RS_EQ); }
  263. X"<<="            { count(); yylval = 0; return(T_LS_EQ); }
  264. X"+="            { count(); yylval = 0; return(T_ADD_EQ); }
  265. X"-="            { count(); yylval = 0; return(T_SUB_EQ); }
  266. X"*="            { count(); yylval = 0; return(T_MUL_EQ); }
  267. X"/="            { count(); yylval = 0; return(T_DIV_EQ); }
  268. X"%="            { count(); yylval = 0; return(T_MOD_EQ); }
  269. X"&="            { count(); yylval = 0; return(T_AND_EQ); }
  270. X"^="            { count(); yylval = 0; return(T_XOR_EQ); }
  271. X"|="            { count(); yylval = 0; return(T_OR_EQ); }
  272. X">>"            { count(); yylval = 0; return(T_RS); }
  273. X"<<"            { count(); yylval = 0; return(T_LS); }
  274. X"++"            { count(); yylval = 0; return(T_INC); }
  275. X"--"            { count(); yylval = 0; return(T_DEC); }
  276. X"->"            { count(); yylval = 0; return(T_PTR); }
  277. X"&&"            { count(); yylval = 0; return(T_CAND); }
  278. X"||"            { count(); yylval = 0; return(T_COR); }
  279. X"<="            { count(); yylval = 0; return(T_LE); }
  280. X">="            { count(); yylval = 0; return(T_GE); }
  281. X"=="            { count(); yylval = 0; return(T_CEQ); }
  282. X"!="            { count(); yylval = 0; return(T_NE); }
  283. X";"            { count(); yylval = 0; return(T_SEMIC); }
  284. X"{"            { count(); yylval = 0; bracelev++; return(T_LBRACE); }
  285. X"}"            { count(); yylval = 0; bracelev--; return(T_RBRACE); }
  286. X","            { count(); yylval = 0; return(T_COMMA); }
  287. X":"            { count(); yylval = 0; return(T_COLON); }
  288. X"="            { count(); yylval = 0; return(T_EQ); }
  289. X"("            { count(); yylval = 0; parenlev++; return(T_LPAREN); }
  290. X")"            { count(); yylval = 0; parenlev--; return(T_RPAREN); }
  291. X"["            { count(); yylval = 0; return(T_LSQ); }
  292. X"]"            { count(); yylval = 0; return(T_RSQ); }
  293. X"."            { count(); yylval = 0; return(T_DOT); }
  294. X"&"            { count(); yylval = 0; return(T_AMPER); }
  295. X"!"            { count(); yylval = 0; return(T_NOT); }
  296. X"~"            { count(); yylval = 0; return(T_TILDE); }
  297. X"-"            { count(); yylval = 0; return(T_MINUS); }
  298. X"+"            { count(); yylval = 0; return(T_PLUS); }
  299. X"*"            { count(); yylval = 0; return(T_STAR); }
  300. X"/"            { count(); yylval = 0; return(T_DIV); }
  301. X"%"            { count(); yylval = 0; return(T_MOD); }
  302. X"<"            { count(); yylval = 0; return(T_LT); }
  303. X">"            { count(); yylval = 0; return(T_GT); }
  304. X"^"            { count(); yylval = 0; return(T_XOR); }
  305. X"|"            { count(); yylval = 0; return(T_OR); }
  306. X"?"            { count(); yylval = 0; return(T_QUEST); }
  307. X
  308. X[ \t\v\n\f]*        { count(); yylval = yytext; return(T_WS); }
  309. X.            { /* ignore bad characters */ }
  310. X
  311. X%%
  312. X
  313. Xyywrap()
  314. X{
  315. X    return(1);
  316. X}
  317. X
  318. X/*
  319. X */
  320. X
  321. Xchar *
  322. Xgather(type,init)
  323. Xint type;
  324. Xchar *init;
  325. X{
  326. X    char buf[1024];
  327. X    register char *tbuf;
  328. X    register int tbufsize = 0;
  329. X    register char *bb = buf;
  330. X    register char *p = bb;
  331. X    register char *ebuf = &buf[1023];
  332. X    
  333. X
  334. X    strcpy(buf,init);
  335. X    p = buf + strlen(init);
  336. X    while (*p = input()) {
  337. X        if (*p == 0)
  338. X            break;
  339. X        switch (type) {
  340. X        case COMMENT:
  341. X            if (*p == '/' && p != bb && p[-1] == '*') {
  342. X                goto end;
  343. X            }
  344. X            break;
  345. X        case CPPLINE:
  346. X            if (*p == '\n' && p != bb && p[-1] != '\\') {
  347. X                unput('\n');
  348. X                *p = '\0';
  349. X                goto end;
  350. X            }
  351. X            break;
  352. X        case STRING:
  353. X            if (*p == '"' && p != bb && p[-1] != '\\') {
  354. X                goto end;
  355. X            }
  356. X            break;
  357. X        }
  358. X        if (++p >= ebuf) {
  359. X            *p = '\0';
  360. X            if (tbufsize == 0) {
  361. X                tbufsize = 1024;
  362. X            }
  363. X            tbuf = (char *) malloc(tbufsize *= 2);
  364. X            strcpy(tbuf, bb);
  365. X            p = tbuf + (p - bb);
  366. X            if (bb != buf) {
  367. X                free(bb);
  368. X            }
  369. X            bb = tbuf;
  370. X            ebuf = bb + tbufsize;
  371. X        }
  372. X    }
  373. X    end:
  374. X    *++p = '\0';
  375. X    p++;
  376. X    if (tbufsize == 0) {
  377. X        tbuf = (char *) malloc(p-bb);
  378. X        strcpy(tbuf, bb);
  379. X        bb = tbuf;
  380. X    }
  381. X    return(bb);
  382. X}
  383. X
  384. X#ifdef COUNTCOLUMN
  385. Xvoid
  386. Xcount()
  387. X{
  388. X    int i;
  389. X
  390. X    for (i = 0; yytext[i] != '\0'; i++)
  391. X        if (yytext[i] == '\n') {
  392. X            column = 0;
  393. X            line++;
  394. X        }
  395. X        else if (yytext[i] == '\t')
  396. X            column += 8 - (column % 8);
  397. X        else
  398. X            column++;
  399. X}
  400. X#endif
  401. X
  402. X#ifndef TEST
  403. X
  404. Xcheck_type(tok)
  405. Xregister struct token *tok;
  406. X{
  407. X    register int i;
  408. X    register char **p;
  409. X
  410. X    for (i = 0; (i < NSCOPE) && (typeid[i] != NIL); i++) {
  411. X        for (p = typeid[i]->type_id; *p != NIL; p++) {
  412. X            if (strcmp(tok->t_id,*p) == 0) {
  413. X                tok->t_tok = T_TYPE_ID;
  414. X                return;
  415. X            }
  416. X        }
  417. X    }
  418. X}
  419. X
  420. Xstruct token *
  421. Xgettok(mem)
  422. Xregister int mem;
  423. X{
  424. X    register int t;
  425. X    struct token *tok;
  426. X
  427. X    if ((t = yylex()) == 0)
  428. X        return((struct token *) 0);
  429. X    tok = newtok(mem, t, yylval);
  430. X    tok->t_line = yylineno;
  431. X    switch(t) {
  432. X    case T_COMMENT:
  433. X    case T_CPP:
  434. X        tok->t_tok = T_WS;
  435. X        /*FALLTHROUGH*/
  436. X    case T_STR:
  437. X        free(yylval);
  438. X        break;
  439. X
  440. X    case T_LBRACE:
  441. X        tok->t_level = bracelev-1;
  442. X        tok->t_paren = parenlev;
  443. X        pushscope(bracelev);
  444. X        break;
  445. X    case T_LPAREN:
  446. X        tok->t_paren = parenlev-1;
  447. X        tok->t_level = bracelev;
  448. X        break;
  449. X    case T_RBRACE:
  450. X        popscope(bracelev+1);
  451. X        /*FALLTHROUGH*/
  452. X    default:
  453. X        tok->t_level = bracelev;
  454. X        tok->t_paren = parenlev;
  455. X        break;
  456. X    }
  457. X    if (t == T_IDENT) {
  458. X        check_type(tok);
  459. X    }
  460. X    return(tok);
  461. X}
  462. X#endif
  463. X
  464. X#ifdef TEST
  465. Xmain() {
  466. X    int tok;
  467. X    extern char *tokens[];
  468. X
  469. X    while(tok = yylex()) {
  470. X        switch (tok) {
  471. X        case T_COMMENT:
  472. X        case T_STR:
  473. X        case T_CPP:
  474. X            free(yylval);
  475. X
  476. X        case T_IDENT:
  477. X        case T_WS:
  478. X        case T_NUM:
  479. X        case T_CHARCONST:
  480. X        case T_TYPE_ID:
  481. X            fputs(yylval,stdout);
  482. X            break;
  483. X        case T_ACTUAL:
  484. X            fputs("<ACTUAL>",stdout);
  485. X            break;
  486. X        case T_RETVAL:
  487. X            fputs("<RETVAL>",stdout);
  488. X            break;
  489. X        case T_ARGLIST:
  490. X            fprintf(stdout,"%s(ARGLIST)", yylval);
  491. X            break;
  492. X        case T_RETLAB:
  493. X            fputs("<RETLAB>",stdout);
  494. X            break;
  495. X        case T_FORMAL:
  496. X            fprintf(stdout,"<FORMAL '%s'>",yylval);
  497. X            break;
  498. X        default:
  499. X            if (tok <= T_INLINE)
  500. X                fputs(tokens[tok],stdout);
  501. X            else
  502. X                fputs("???",stdout);
  503. X
  504. X            break;
  505. X        }
  506. X    }
  507. X}
  508. X#endif
  509. \Rogue\Monster\
  510. else
  511.   echo "will not over write ./scan.l"
  512. fi
  513. chmod 444 ./scan.l
  514. if [ `wc -c ./scan.l | awk '{printf $1}'` -ne 8829 ]
  515. then
  516. echo `wc -c ./scan.l | awk '{print "Got " $1 ", Expected " 8829}'`
  517. fi
  518. if `test ! -s ./BUGS`
  519. then
  520. echo "writing ./BUGS"
  521. sed 's/^X//' > ./BUGS << '\Rogue\Monster\'
  522. XFri May  8 17:13:05 PDT 1987
  523. X
  524. XCurrent bugs:
  525. X    - multi-line comments that begin on pre-processor lines are not
  526. X      handled correctly
  527. X
  528. X    - comma operators don't work correctly, e.g.
  529. X        x = (cond, inline_func());
  530. X      (inline_func() gets called too soon) 
  531. X
  532. XImportant enhancements to be added:
  533. X
  534. X    -
  535. X
  536. XMiscellaneous features to be added:
  537. X
  538. X    -
  539. \Rogue\Monster\
  540. else
  541.   echo "will not over write ./BUGS"
  542. fi
  543. chmod 444 ./BUGS
  544. if [ `wc -c ./BUGS | awk '{printf $1}'` -ne 329 ]
  545. then
  546. echo `wc -c ./BUGS | awk '{print "Got " $1 ", Expected " 329}'`
  547. fi
  548. if `test ! -s ./MINVERS`
  549. then
  550. echo "writing ./MINVERS"
  551. sed 's/^X//' > ./MINVERS << '\Rogue\Monster\'
  552. X0
  553. \Rogue\Monster\
  554. else
  555.   echo "will not over write ./MINVERS"
  556. fi
  557. chmod 444 ./MINVERS
  558. if [ `wc -c ./MINVERS | awk '{printf $1}'` -ne 2 ]
  559. then
  560. echo `wc -c ./MINVERS | awk '{print "Got " $1 ", Expected " 2}'`
  561. fi
  562. if `test ! -s ./test.c`
  563. then
  564. echo "writing ./test.c"
  565. sed 's/^X//' > ./test.c << '\Rogue\Monster\'
  566. X
  567. X/* test cases for 'inline' */
  568. X
  569. X/* $Header: test.c,v 1.6 87/06/24 13:06:22 mcg Rel $ */
  570. X
  571. X
  572. X/* simple inline */
  573. Xinline int foo(a,b) {
  574. X    register int x = 0;
  575. X
  576. X    printf("foo(%d, %d)\n", a,b);
  577. X    return(a+b);
  578. X}
  579. Xinline int bar(x,y) {
  580. X    register int a;
  581. X
  582. X    a = 0;
  583. X    printf("bar(%d, %d)\n", x,y);
  584. X    return(x-y);
  585. X}
  586. X/* inline with some control flow */
  587. Xinline biff(a) {
  588. X    while(1) return a;
  589. X}
  590. X
  591. X/* inline with a switch */
  592. Xinline insw(i)
  593. Xint i;
  594. X{
  595. X    switch(i) {
  596. X    case 0:    return('0');
  597. X    case 1: return('1');
  598. X    case 2: return('2');
  599. X    case 3: return('3');
  600. X    case 4: return(foo(i,'0'));
  601. X    case 5: return('5');
  602. X    case 6: return('6');
  603. X    case 7: return(foo(i,'0'));
  604. X    case 8: return('8');
  605. X    case 9: return('9');
  606. X    }
  607. X    return(0);
  608. X}
  609. X
  610. Xtypedef char *cptr;
  611. X
  612. Xinline barf() {
  613. X    printf("!!!\n");
  614. X}
  615. X
  616. X/* inline returning a typedef */
  617. Xinline cptr
  618. Xboff(c,s)
  619. Xchar c;
  620. Xcptr s;
  621. X{
  622. X    s[0] = c;
  623. X    return(&s[1]);
  624. X}
  625. X
  626. X/* inline returning a pointer type */
  627. Xinline char *
  628. Xboff2(c,s)
  629. Xchar c;
  630. Xcptr s;
  631. X{
  632. X    s[0] = c;
  633. X    return(&s[1]);
  634. X}
  635. X
  636. Xstruct str {
  637. X    int a;
  638. X    int b;
  639. X    int c;
  640. X};
  641. X
  642. X/* inline returning a structure */
  643. Xinline struct str bipp(a,b,c)
  644. Xint a, b, c;
  645. X{
  646. X    struct str x;
  647. X
  648. X    x.a = a;
  649. X    x.b = b;
  650. X    x.c = c;
  651. X    return(x);
  652. X}
  653. X
  654. X/* inline returning a structure pointer */
  655. Xinline struct str *bupp(z,a,b,c)
  656. Xregister struct str *z;
  657. Xregister int a,b,c;
  658. X{
  659. X    z->a = a;
  660. X    z->b = b;
  661. X    z->c = c;
  662. X    return(z);
  663. X}
  664. X
  665. Xnil(){}
  666. X
  667. X/* inline returning function pointer */
  668. Xinline int (*fp())()
  669. X{
  670. X    return(nil);
  671. X}
  672. X
  673. Xint effect = 0;
  674. X
  675. Xinline int side_effect(a)
  676. Xint a;
  677. X{
  678. X    int old;
  679. X
  680. X    old = effect;
  681. X    effect = a;
  682. X
  683. X    return(old);
  684. X}
  685. X
  686. X/* should have no effect on arguments */
  687. Xinline int swaparg(a,b)
  688. X{
  689. X    int tmp;
  690. X
  691. X    tmp = a;
  692. X    a = b;
  693. X    b = tmp;
  694. X
  695. X    return(a+b);
  696. X}
  697. X
  698. Xinline struct str modarg(a,b)
  699. Xint a;
  700. Xstruct str b;    /* struct arg */
  701. X{
  702. X    switch(a) {
  703. X    case 0:
  704. X        a = 1;
  705. X        b.a = 1;
  706. X        break;
  707. X    case 1:
  708. X        a >>= 1;
  709. X        a <<= 1;
  710. X        b.a = a;
  711. X        break;
  712. X    case 2:
  713. X        a *= 3;
  714. X        b.a = a;
  715. X        break;
  716. X    }
  717. X    return(b);
  718. X}
  719. X
  720. Xinline hardcase1(a,b)
  721. Xint a,b;
  722. X{
  723. X    { ; }
  724. X    if (a);
  725. X    {{}}
  726. X    if (a) { } else ;
  727. X    return(b);
  728. X}
  729. Xinline char *
  730. Xhardcase2(a,b,c)
  731. Xchar *a;
  732. Xint b,c;
  733. X{
  734. X    char *s = "foo", c = 'c';
  735. X    int x = b;
  736. X
  737. X    if (a) return(s);
  738. X    else {
  739. X        if (b) return(a+c);
  740. X    }
  741. X    return(a+c);
  742. X}
  743. X
  744. Xinline expr1(a,b)
  745. Xint a,b;
  746. X{
  747. X    int x = 0;
  748. X
  749. X    if (foo(0,a+b) == 100) return x+2;    /* a+b == 100, ret = 2 */
  750. X    if (foo(50,50) == 100 && a) return x;    /* a != 0, return = 0 */
  751. X    if (foo(100,0) == 100 && b) return x+1;    /* a == 0 && b != 0, ret = 1 */
  752. X    return x+3;                /* ret = 3 */
  753. X}
  754. X
  755. Xinline expr2(a,b)
  756. Xint a,b;
  757. X{
  758. X    register int x = 0, y = 1;
  759. X
  760. X    if (a) {
  761. X        return(x+y);    /* a != 0, return = 1 */
  762. X    } else {
  763. X        register int x = 100, y = 101;
  764. X
  765. X        if (b) {
  766. X            return(x+y);    /* a == 0 && b != 0, return = 201 */
  767. X        } else {
  768. X            register int x = 200, y = 300;
  769. X
  770. X            return(x+y);    /* a == 0 && b == 0, return = 500 */
  771. X        }
  772. X    }
  773. X}
  774. X
  775. Xinline labs(i)
  776. Xint i;
  777. X{
  778. X    if (i == 1) goto L1;
  779. X    if (i == 2) goto L2;
  780. X    if (i == 3) goto L3;
  781. X    if (i == 4) goto L4;
  782. X    goto L5;
  783. XL6:
  784. X    return(i);
  785. X
  786. XL1:    i++; return(1);
  787. XL2:    if (i == 2) return(2);
  788. XL3:    return(3);
  789. XL4:    {
  790. X    return(4);
  791. X    }
  792. XL5:    goto L6;
  793. X}
  794. X
  795. Xm() {
  796. X    register int x,y,z;
  797. X
  798. X    x = foo(x++,y++);
  799. X}
  800. X
  801. Xmain() {
  802. X    t1(1);
  803. X    t2(2);
  804. X    t3(3);
  805. X    t4(4);
  806. X    t5(5);
  807. X    t6(6);
  808. X    t7(7);
  809. X    t8(8);
  810. X    t9(9);
  811. X    t10(10);
  812. X    t11(11);
  813. X    t12(12);
  814. X    t13(13);
  815. X    t14(14);
  816. X    t15(15,50);
  817. X    t16(16);
  818. X    t17(17);
  819. X    t18(18);
  820. X    return(0);
  821. X}
  822. X
  823. X/*
  824. X * basic expansion of single inline
  825. X */
  826. X
  827. Xt1(i)
  828. Xint i;
  829. X{
  830. X    int a;
  831. X
  832. X    printf("test%d:\n",i);
  833. X    a = foo(1,2);
  834. X    if (a == 3) {
  835. X        printf("test%d ok\n",i);
  836. X    } else {
  837. X        printf("test%d FAIL\n",i);
  838. X    }
  839. X}
  840. X
  841. X/*
  842. X * expansion of multiple inlines in single expression
  843. X */
  844. X
  845. Xt2(i)
  846. Xint i;
  847. X{
  848. X    int a;
  849. X
  850. X    printf("test%d:\n",i);
  851. X    a = foo(1,2) + foo(3,4);
  852. X    if (a == 10) {
  853. X        printf("test%d ok\n",i);
  854. X    } else {
  855. X        printf("test%d FAIL\n",i);
  856. X    }
  857. X}
  858. X
  859. X/*
  860. X * expansion of inlines in various styles of if() statement
  861. X * - check parsing of if compound statement
  862. X */
  863. X
  864. Xt3(i)
  865. Xint i;
  866. X{
  867. X    printf("test%d:\n",i);
  868. X    if (foo(1,2) != 3) {
  869. X        printf("test%d FAIL\n",i); 
  870. X        return;
  871. X    }
  872. X
  873. X    if (foo(1,2) == 3) {
  874. X        ;
  875. X    } else {
  876. X        printf("test%d FAIL\n"); 
  877. X        return;
  878. X    }
  879. X
  880. X    if (!foo(1,2)) printf("test%d FAIL\n",i);
  881. X
  882. X    if (foo(1,2) == 3) nil(); else printf("test%d FAIL\n",i);
  883. X
  884. X    if (foo(1,2) == 3) nil(); else {
  885. X        printf("test%d FAIL\n",i);
  886. X    }
  887. X
  888. X    if (foo(1,2) == 3) {
  889. X        printf("test%d ok\n",i);
  890. X    } else
  891. X        printf("test%d FAIL\n",i);
  892. X}
  893. X
  894. X/*
  895. X * inlines as arguments to other inlines
  896. X */
  897. X
  898. Xt4(i)
  899. Xint i;
  900. X{
  901. X    register int a;
  902. X
  903. X    printf("test%d:\n",i);
  904. X    a = foo(foo(1,2),2);
  905. X    if (a != 5) {
  906. X        printf("test%d FAIL\n",i);
  907. X    }
  908. X
  909. X    a = foo(100,bar(5,4));
  910. X    if (a != 101) {
  911. X        printf("test%d FAIL\n",i);
  912. X    }
  913. X    printf("test%d ok\n",i);
  914. X}
  915. X
  916. X/*
  917. X */
  918. X
  919. Xt5(j)
  920. Xint j;
  921. X{
  922. X    register int i;
  923. X    for(i=0; i < 10; i++) {
  924. X        switch(insw(i)) {
  925. X        case '0':
  926. X            if (foo(i,i) != 0) break;
  927. X            if (i != 0) break;
  928. X            continue;
  929. X        case '1':
  930. X            if (i != 1) break;
  931. X            if (foo(i,i) != 2) break;
  932. X            continue;
  933. X        case '2':
  934. X            if (foo(i,i) != 4) break;
  935. X            if (i != 2) break;
  936. X            continue;
  937. X        case '3':
  938. X            if (foo(i,i) != 6) break;
  939. X            if (i != 3) break;
  940. X            continue;
  941. X        case '4':
  942. X            if (i != 4) break;
  943. X            if (foo(i,i) != 8) break;
  944. X            continue;
  945. X        case '5':
  946. X            if (foo(i,i) != 10) break;
  947. X            if (i != 5) break;
  948. X            continue;
  949. X        case '6':
  950. X            if (foo(i,i) != 12) break;
  951. X            if (i != 6) break;
  952. X            continue;
  953. X        case '7':
  954. X            if (i != 7) break;
  955. X            if (foo(i,i) != 14) break;
  956. X            continue;
  957. X        case '8':
  958. X            if (foo(i,i) != 16) break;
  959. X            if (i != 8) break;
  960. X            continue;
  961. X        case '9':
  962. X            if (i != 9) break;
  963. X            continue;
  964. X        }
  965. X        printf("test5 FAIL\n");
  966. X        return;
  967. X    }
  968. X    printf("test5 ok\n");
  969. X}
  970. X
  971. X/*
  972. X * inlines with typedefs and pointer return types
  973. X */
  974. X
  975. Xt6(i)
  976. Xint i;
  977. X{
  978. X    char buf[20];
  979. X    cptr p;
  980. X
  981. X    p = boff('c',buf);
  982. X    if (p != &buf[1] || buf[0] != 'c') {
  983. X        printf("test6 FAIL\n");
  984. X    }
  985. X    p = boff('b',p);
  986. X    if (p != &buf[2] || buf[1] != 'b') {
  987. X        printf("test6 FAIL\n");
  988. X    }
  989. X    p = boff2('d',buf);
  990. X    if (p != &buf[1] || buf[0] != 'd') {
  991. X        printf("test6 FAIL\n");
  992. X    }
  993. X    p = boff2('e',p);
  994. X    if (p != &buf[2] || buf[1] != 'e') {
  995. X        printf("test6 FAIL\n");
  996. X    }
  997. X    printf("test6 ok\n");
  998. X}
  999. X
  1000. X/*
  1001. X * inlines with looping structures inside
  1002. X */
  1003. X
  1004. Xt7(i)
  1005. Xint i;
  1006. X{
  1007. X    if (biff(1) != 1) {
  1008. X        printf("test7 FAIL\n");
  1009. X    }
  1010. X    if (1) biff(1);
  1011. X    if (1) nil();
  1012. X    else printf("test7 FAIL\n");
  1013. X    printf("test7 ok\n");
  1014. X}
  1015. X
  1016. Xt8(i)
  1017. Xint i;
  1018. X{
  1019. X    if (fp() != nil) {
  1020. X        printf("test8 FAIL\n");
  1021. X        return;
  1022. X    }
  1023. X    printf("test8 ok\n");
  1024. X}
  1025. X
  1026. X/*
  1027. X * inlines with structure and structure pointer returns
  1028. X */
  1029. X
  1030. Xt9(j)
  1031. Xint j;
  1032. X{
  1033. X    struct str z;
  1034. X    struct str *zp, *zp2;
  1035. X    int i;
  1036. X
  1037. X    z = bipp(1,100,3000);
  1038. X    if ((z.a != 1) || (z.b != 100) || (z.c != 3000)) {
  1039. X        printf("test9 FAIL\n");
  1040. X        return;
  1041. X    }
  1042. X    z = bipp(foo(100,bar(5,4)), z.c, z.b);
  1043. X    if ((z.a != 101) || (z.b != 3000) || (z.c != 100)) {
  1044. X        printf("test9 FAIL\n");
  1045. X        return;
  1046. X    }
  1047. X/****************
  1048. X    i = bipp(1,2,3).a;
  1049. X    if (i != 1) {
  1050. X        printf("test9 FAIL\n");
  1051. X        return;
  1052. X    }
  1053. X*************/
  1054. X    zp = &z;
  1055. X    i = bupp(&z,1,2,3)->a;
  1056. X    if (i != 1) {
  1057. X        printf("test9 FAIL\n");
  1058. X        return;
  1059. X    }
  1060. X    if (zp != bupp(zp,1,2,3)) {
  1061. X        printf("test9 FAIL\n");
  1062. X        return;
  1063. X    }
  1064. X    printf("test 9 ok\n");
  1065. X}
  1066. X
  1067. X
  1068. X/* special syntax check for function pointer returns */
  1069. X
  1070. X/* declare fp as function returning pointer to function returning int */
  1071. Xint (*fp3())() { return nil; }
  1072. X
  1073. X/* declare fp as function returning pointer to function returning int */
  1074. Xinline int (*fp2())() { return nil; }
  1075. X
  1076. X/* declare fp as function returning pointer to function returning pointer
  1077. X * to function returning int */
  1078. Xinline int (*(*fp1())())() { return fp3; }
  1079. X
  1080. X
  1081. Xfpt1() {
  1082. X
  1083. X/* declare fp as pointer to function returning pointer to function
  1084. X * returning int
  1085. X */
  1086. X    int (*(*fx)())();
  1087. X    fx = fp1();
  1088. X}
  1089. X
  1090. X/***/
  1091. X
  1092. X/* declare fp as pointer to function returning int */
  1093. Xfpt2() {
  1094. X
  1095. X    int (*fx)();
  1096. X
  1097. X    fx = fp2();
  1098. X}
  1099. X
  1100. X/* check expression rewriting cases */
  1101. X
  1102. Xt10(n)
  1103. Xint n;
  1104. X{
  1105. X    int i = 0;
  1106. X    int j;
  1107. X
  1108. X    while (i < foo(5,5)) {
  1109. X        if (i < 0 || i > 10) {
  1110. X            printf("test10 FAIL\n");
  1111. X            return;
  1112. X        }
  1113. X        i = foo(i,1);
  1114. X        j = foo(1,2);
  1115. X        if (j != 3) {
  1116. X            printf("test10 FAIL\n");
  1117. X            return;
  1118. X        }
  1119. X    }
  1120. X
  1121. X    for (i = foo(5,5); i > 0; i--) {
  1122. X        if (i < 0 || i > 10) {
  1123. X            printf("test10 FAIL\n");
  1124. X            return;
  1125. X        }
  1126. X        j = foo(1,2);
  1127. X        if (j != 3) {
  1128. X            printf("test10 FAIL\n");
  1129. X            return;
  1130. X        }
  1131. X    }
  1132. X    printf("test10 ok\n");
  1133. X}
  1134. X
  1135. X/*
  1136. X * side-effect tests
  1137. X */
  1138. X
  1139. Xt11(n)
  1140. Xint n;
  1141. X{
  1142. X    register int i;
  1143. X
  1144. X    effect = 0;
  1145. X
  1146. X    if (effect == 1 && (side_effect(1) == 0)) {
  1147. X        printf("test11 FAIL\n");
  1148. X        return;
  1149. X    }
  1150. X
  1151. X    /* effect should still be 0 */
  1152. X
  1153. X    if (effect == 0 || (side_effect(1) == 1)) {
  1154. X        nil();
  1155. X    }
  1156. X
  1157. X    /* effect should still be 0 */
  1158. X
  1159. X    if (effect != 0) {
  1160. X        printf("test11 FAIL\n");
  1161. X        return;
  1162. X    }
  1163. X
  1164. X    i = (side_effect(1) ? 100 : 200);    /* assert i == 200 */
  1165. X                        /* assert effect == 1 */
  1166. X
  1167. X    if (i != 200) {
  1168. X        printf("test11 FAIL\n");
  1169. X        return;
  1170. X    }
  1171. X
  1172. X    /* a non-expansion case */
  1173. X    i = (effect ? side_effect(100) : side_effect(200));
  1174. X                        /* assert i == 1 */
  1175. X
  1176. X    if (i != 1) {
  1177. X        printf("test11 FAIL\n");
  1178. X        return;
  1179. X    }
  1180. X
  1181. X    if (effect != 100) {
  1182. X        printf("test11 FAIL\n");
  1183. X        return;
  1184. X    }
  1185. X
  1186. X    /* should have a comma-operator test, but it breaks now */
  1187. X
  1188. X    printf("test11 ok\n");
  1189. X}
  1190. X
  1191. X/*
  1192. X * more side-effect tests
  1193. X */
  1194. X
  1195. Xt12(n)
  1196. Xint n;
  1197. X{
  1198. X    int i,j,k,l;
  1199. X    struct str b;
  1200. X
  1201. X    /* might cause syntax errors, might return wrong value */
  1202. X    i = swaparg(1,2);
  1203. X    if (i != 3) {
  1204. X        printf("test12 FAIL\n");
  1205. X        return;
  1206. X    }
  1207. X    i = 100;
  1208. X    j = 200;
  1209. X    if (swaparg(i,j) != 300 || i != 100 || j != 200) {
  1210. X        printf("test12 FAIL\n");
  1211. X        return;
  1212. X    }
  1213. X    for (i = 0;  i < 3; i++) {
  1214. X        j = i;
  1215. X        b = modarg(i,b);
  1216. X        if (i != j) {
  1217. X            printf("test12 FAIL\n");
  1218. X            return;
  1219. X        }
  1220. X        if (i == 2) {
  1221. X            if (b.a != 6 || j != 2) {
  1222. X                printf("test12 FAIL\n");
  1223. X                return;
  1224. X            } 
  1225. X        }
  1226. X    }
  1227. X    printf("test12 ok\n");
  1228. X}
  1229. X
  1230. Xt13(n)
  1231. Xint n;
  1232. X{
  1233. X    register int i,j,k;
  1234. X
  1235. X    for (i = 0; i < 5; i++) {
  1236. X        if (i == 1) goto i2;
  1237. X         i1:
  1238. X        j = foo(i,100);
  1239. X        if (i == 2) {
  1240. X         i2:    k = foo(i,200);
  1241. X            if (i > 1 && j != i+100) { printf("test 13 FAIL\n"); return;}
  1242. X            goto i4;
  1243. X        }
  1244. X        if (i == 3) {
  1245. X            foo(i,300);
  1246. X         i3 /* comment */ :
  1247. X            if (j != i+100) { printf("test 13 FAIL\n"); return;}
  1248. X            continue;
  1249. X        }
  1250. X        if (i == 4) {
  1251. X            if (j != i+100) { printf("test 13 FAIL\n"); return;}
  1252. X            k = foo(i,400);
  1253. X         i4:
  1254. X            if (i == 2 && k != 202) { printf("test 13 FAIL\n"); return; }
  1255. X            if (i == 4 && k != 404) { printf("test 13 FAIL\n"); return; }
  1256. X            k = foo(i,500);
  1257. X            continue;
  1258. X        }
  1259. X        k = foo(i,600);
  1260. X        j = 0;
  1261. X    }
  1262. X    printf("test13 ok\n");
  1263. X}
  1264. X
  1265. Xint var = 0;
  1266. X
  1267. Xinline evar() {
  1268. X    return(var);
  1269. X}
  1270. X
  1271. Xinline mvar(x) {
  1272. X    var = x;
  1273. X}
  1274. Xt14(n)
  1275. Xint n;
  1276. X{
  1277. X    int var = 1;    /* hide outer def'n */
  1278. X
  1279. X    if (evar() != 0) { printf("test14 FAIL\n"); return;}
  1280. X    if (var != 1) { printf("test14 FAIL\n"); return;}
  1281. X    mvar(100);
  1282. X    if (var != 1) { printf("test14 FAIL\n"); return;}
  1283. X    if (evar() != 100) { printf("test14 FAIL\n"); return;}
  1284. X    printf("test14 ok\n");
  1285. X}
  1286. X
  1287. Xt15(i,var)
  1288. Xint i;
  1289. Xint var;
  1290. X{
  1291. X    int a,b,c;
  1292. X
  1293. X    mvar(-100);
  1294. X
  1295. X    a = 1;
  1296. X    b = 2;
  1297. X    c = 3;
  1298. X
  1299. X    {
  1300. X        int a,b;
  1301. X
  1302. X        a = 100;
  1303. X        b = 200;
  1304. X
  1305. X        c = foo(a,b);
  1306. X    }
  1307. X
  1308. X    if (a != 1 || b != 2 || c != 300) { printf("test15 FAIL\n"); return; }
  1309. X
  1310. X    c = var;
  1311. X    {
  1312. X        int var;
  1313. X
  1314. X        var = 1000;
  1315. X
  1316. X        {
  1317. X            cptr var, a, b, c;
  1318. X    
  1319. X            a = "-1";
  1320. X            b = "-2";
  1321. X            c = "-3";
  1322. X            var = "-4";
  1323. X            if (evar() != -100) { printf("test15 FAIL\n"); return;}
  1324. X        }
  1325. X
  1326. X        if (evar() != -100) { printf("test15 FAIL\n"); return;}
  1327. X    }
  1328. X    if (var != c) { printf("test15 FAIL\n"); return; }
  1329. X    if (evar() != -100) { printf("test15 FAIL\n"); return;}
  1330. X    printf("test15 ok\n");
  1331. X}
  1332. X
  1333. Xt16(n)
  1334. Xint n;
  1335. X{
  1336. X    char *s = "foo";
  1337. X
  1338. X    if (hardcase1(0,1) != 1) { printf("test16 FAIL\n"); return;}
  1339. X    while (1 && (hardcase1(0,1) != 1)) printf("test16 FAIL\n");
  1340. X    s = hardcase2("foo",1,0);
  1341. X    printf("test16 ok\n");
  1342. X}
  1343. X
  1344. Xt17(n)
  1345. Xint n;
  1346. X{
  1347. X    int x = 1;
  1348. X
  1349. X    if (x && expr1(1,0) != 0) {printf("test17 FAIL(1)\n"); return;}
  1350. X    if (x && expr1(0,1) != 1) {printf("test17 FAIL(2)\n"); return;}
  1351. X    if (x && expr1(0,100) != 2) {printf("test17 FAIL(3)\n"); return;}
  1352. X    if (x && expr1(0,0) != 3) {printf("test17 FAIL(4)\n"); return;}
  1353. X    if (x && expr2(1,0) != 1) {printf("test17 FAIL(5)\n"); return;}
  1354. X    if (x && expr2(0,1) != 201) {printf("test17 FAIL(6)\n"); return;}
  1355. X    if (x && expr2(0,0) != 500) {printf("test17 FAIL(7)\n"); return;}
  1356. X    printf("test17 ok\n");
  1357. X}
  1358. X
  1359. Xt18(n)
  1360. Xint n;
  1361. X{
  1362. X    int i,j;
  1363. X
  1364. X    i = 0;
  1365. XL1:
  1366. X    j = labs(i);
  1367. X    if (j != i) {printf("test18 FAIL\n"); return; }
  1368. X    i++;
  1369. X    if (i > 10) goto L2;
  1370. X    goto L1;
  1371. XL2:
  1372. X    printf("test18 ok\n");
  1373. X}
  1374. X
  1375. \Rogue\Monster\
  1376. else
  1377.   echo "will not over write ./test.c"
  1378. fi
  1379. chmod 444 ./test.c
  1380. if [ `wc -c ./test.c | awk '{printf $1}'` -ne 11843 ]
  1381. then
  1382. echo `wc -c ./test.c | awk '{print "Got " $1 ", Expected " 11843}'`
  1383. fi
  1384. if `test ! -s ./test2.c`
  1385. then
  1386. echo "writing ./test2.c"
  1387. sed 's/^X//' > ./test2.c << '\Rogue\Monster\'
  1388. X
  1389. X/* test cases for 'inline' */
  1390. X
  1391. X/* $Header: test2.c,v 1.2 87/06/24 13:06:48 mcg Rel $ */
  1392. X
  1393. X
  1394. Xm() {
  1395. X    register int x,y,z;
  1396. X
  1397. X    x = foo(x++,y++);
  1398. X}
  1399. X
  1400. Xmain() {
  1401. X    t1(1);
  1402. X    t2(2);
  1403. X    t3(3);
  1404. X    t4(4);
  1405. X    t5(5);
  1406. X    t6(6);
  1407. X    t7(7);
  1408. X    t8(8);
  1409. X    t9(9);
  1410. X    t10(10);
  1411. X    t11(11);
  1412. X    t12(12);
  1413. X    t13(13);
  1414. X    t14(14);
  1415. X    t15(15,50);
  1416. X    t16(16);
  1417. X    t17(17);
  1418. X    t18(18);
  1419. X    return(0);
  1420. X}
  1421. X
  1422. X/*
  1423. X * basic expansion of single inline
  1424. X */
  1425. X
  1426. Xt1(i)
  1427. Xint i;
  1428. X{
  1429. X    int a;
  1430. X
  1431. X    printf("test%d:\n",i);
  1432. X    a = foo(1,2);
  1433. X    if (a == 3) {
  1434. X        printf("test%d ok\n",i);
  1435. X    } else {
  1436. X        printf("test%d FAIL\n",i);
  1437. X    }
  1438. X}
  1439. X
  1440. X/*
  1441. X * expansion of multiple inlines in single expression
  1442. X */
  1443. X
  1444. Xt2(i)
  1445. Xint i;
  1446. X{
  1447. X    int a;
  1448. X
  1449. X    printf("test%d:\n",i);
  1450. X    a = foo(1,2) + foo(3,4);
  1451. X    if (a == 10) {
  1452. X        printf("test%d ok\n",i);
  1453. X    } else {
  1454. X        printf("test%d FAIL\n",i);
  1455. X    }
  1456. X}
  1457. X
  1458. X/*
  1459. X * expansion of inlines in various styles of if() statement
  1460. X * - check parsing of if compound statement
  1461. X */
  1462. X
  1463. Xt3(i)
  1464. Xint i;
  1465. X{
  1466. X    printf("test%d:\n",i);
  1467. X    if (foo(1,2) != 3) {
  1468. X        printf("test%d FAIL\n",i); 
  1469. X        return;
  1470. X    }
  1471. X
  1472. X    if (foo(1,2) == 3) {
  1473. X        ;
  1474. X    } else {
  1475. X        printf("test%d FAIL\n"); 
  1476. X        return;
  1477. X    }
  1478. X
  1479. X    if (!foo(1,2)) printf("test%d FAIL\n",i);
  1480. X
  1481. X    if (foo(1,2) == 3) nil(); else printf("test%d FAIL\n",i);
  1482. X
  1483. X    if (foo(1,2) == 3) nil(); else {
  1484. X        printf("test%d FAIL\n",i);
  1485. X    }
  1486. X
  1487. X    if (foo(1,2) == 3) {
  1488. X        printf("test%d ok\n",i);
  1489. X    } else
  1490. X        printf("test%d FAIL\n",i);
  1491. X}
  1492. X
  1493. X/*
  1494. X * inlines as arguments to other inlines
  1495. X */
  1496. X
  1497. Xt4(i)
  1498. Xint i;
  1499. X{
  1500. X    register int a;
  1501. X
  1502. X    printf("test%d:\n",i);
  1503. X    a = foo(foo(1,2),2);
  1504. X    if (a != 5) {
  1505. X        printf("test%d FAIL\n",i);
  1506. X    }
  1507. X
  1508. X    a = foo(100,bar(5,4));
  1509. X    if (a != 101) {
  1510. X        printf("test%d FAIL\n",i);
  1511. X    }
  1512. X    printf("test%d ok\n",i);
  1513. X}
  1514. X
  1515. X/*
  1516. X */
  1517. X
  1518. Xt5(j)
  1519. Xint j;
  1520. X{
  1521. X    register int i;
  1522. X    for(i=0; i < 10; i++) {
  1523. X        switch(insw(i)) {
  1524. X        case '0':
  1525. X            if (foo(i,i) != 0) break;
  1526. X            if (i != 0) break;
  1527. X            continue;
  1528. X        case '1':
  1529. X            if (i != 1) break;
  1530. X            if (foo(i,i) != 2) break;
  1531. X            continue;
  1532. X        case '2':
  1533. X            if (foo(i,i) != 4) break;
  1534. X            if (i != 2) break;
  1535. X            continue;
  1536. X        case '3':
  1537. X            if (foo(i,i) != 6) break;
  1538. X            if (i != 3) break;
  1539. X            continue;
  1540. X        case '4':
  1541. X            if (i != 4) break;
  1542. X            if (foo(i,i) != 8) break;
  1543. X            continue;
  1544. X        case '5':
  1545. X            if (foo(i,i) != 10) break;
  1546. X            if (i != 5) break;
  1547. X            continue;
  1548. X        case '6':
  1549. X            if (foo(i,i) != 12) break;
  1550. X            if (i != 6) break;
  1551. X            continue;
  1552. X        case '7':
  1553. X            if (i != 7) break;
  1554. X            if (foo(i,i) != 14) break;
  1555. X            continue;
  1556. X        case '8':
  1557. X            if (foo(i,i) != 16) break;
  1558. X            if (i != 8) break;
  1559. X            continue;
  1560. X        case '9':
  1561. X            if (i != 9) break;
  1562. X            continue;
  1563. X        }
  1564. X        printf("test5 FAIL\n");
  1565. X        return;
  1566. X    }
  1567. X    printf("test5 ok\n");
  1568. X}
  1569. X
  1570. X/*
  1571. X * inlines with typedefs and pointer return types
  1572. X */
  1573. X
  1574. Xt6(i)
  1575. Xint i;
  1576. X{
  1577. X    char buf[20];
  1578. X    cptr p;
  1579. X
  1580. X    p = boff('c',buf);
  1581. X    if (p != &buf[1] || buf[0] != 'c') {
  1582. X        printf("test6 FAIL\n");
  1583. X    }
  1584. X    p = boff('b',p);
  1585. X    if (p != &buf[2] || buf[1] != 'b') {
  1586. X        printf("test6 FAIL\n");
  1587. X    }
  1588. X    p = boff2('d',buf);
  1589. X    if (p != &buf[1] || buf[0] != 'd') {
  1590. X        printf("test6 FAIL\n");
  1591. X    }
  1592. X    p = boff2('e',p);
  1593. X    if (p != &buf[2] || buf[1] != 'e') {
  1594. X        printf("test6 FAIL\n");
  1595. X    }
  1596. X    printf("test6 ok\n");
  1597. X}
  1598. X
  1599. X/*
  1600. X * inlines with looping structures inside
  1601. X */
  1602. X
  1603. Xt7(i)
  1604. Xint i;
  1605. X{
  1606. X    if (biff(1) != 1) {
  1607. X        printf("test7 FAIL\n");
  1608. X    }
  1609. X    if (1) biff(1);
  1610. X    if (1) nil();
  1611. X    else printf("test7 FAIL\n");
  1612. X    printf("test7 ok\n");
  1613. X}
  1614. X
  1615. Xt8(i)
  1616. Xint i;
  1617. X{
  1618. X    if (fp() != nil) {
  1619. X        printf("test8 FAIL\n");
  1620. X        return;
  1621. X    }
  1622. X    printf("test8 ok\n");
  1623. X}
  1624. X
  1625. X/*
  1626. X * inlines with structure and structure pointer returns
  1627. X */
  1628. X
  1629. Xt9(j)
  1630. Xint j;
  1631. X{
  1632. X    struct str z;
  1633. X    struct str *zp, *zp2;
  1634. X    int i;
  1635. X
  1636. X    z = bipp(1,100,3000);
  1637. X    if ((z.a != 1) || (z.b != 100) || (z.c != 3000)) {
  1638. X        printf("test9 FAIL\n");
  1639. X        return;
  1640. X    }
  1641. X    z = bipp(foo(100,bar(5,4)), z.c, z.b);
  1642. X    if ((z.a != 101) || (z.b != 3000) || (z.c != 100)) {
  1643. X        printf("test9 FAIL\n");
  1644. X        return;
  1645. X    }
  1646. X/****************
  1647. X    i = bipp(1,2,3).a;
  1648. X    if (i != 1) {
  1649. X        printf("test9 FAIL\n");
  1650. X        return;
  1651. X    }
  1652. X*************/
  1653. X    zp = &z;
  1654. X    i = bupp(&z,1,2,3)->a;
  1655. X    if (i != 1) {
  1656. X        printf("test9 FAIL\n");
  1657. X        return;
  1658. X    }
  1659. X    if (zp != bupp(zp,1,2,3)) {
  1660. X        printf("test9 FAIL\n");
  1661. X        return;
  1662. X    }
  1663. X    printf("test 9 ok\n");
  1664. X}
  1665. X
  1666. X
  1667. X/* special syntax check for function pointer returns */
  1668. X
  1669. X/* declare fp as function returning pointer to function returning int */
  1670. Xint (*fp3())() { return nil; }
  1671. X
  1672. X/* declare fp as function returning pointer to function returning int */
  1673. Xinline int (*fp2())() { return nil; }
  1674. X
  1675. X/* declare fp as function returning pointer to function returning pointer
  1676. X * to function returning int */
  1677. Xinline int (*(*fp1())())() { return fp3; }
  1678. X
  1679. X
  1680. Xfpt1() {
  1681. X
  1682. X/* declare fp as pointer to function returning pointer to function
  1683. X * returning int
  1684. X */
  1685. X    int (*(*fx)())();
  1686. X    fx = fp1();
  1687. X}
  1688. X
  1689. X/***/
  1690. X
  1691. X/* declare fp as pointer to function returning int */
  1692. Xfpt2() {
  1693. X
  1694. X    int (*fx)();
  1695. X
  1696. X    fx = fp2();
  1697. X}
  1698. X
  1699. X/* check expression rewriting cases */
  1700. X
  1701. Xt10(n)
  1702. Xint n;
  1703. X{
  1704. X    int i = 0;
  1705. X    int j;
  1706. X
  1707. X    while (i < foo(5,5)) {
  1708. X        if (i < 0 || i > 10) {
  1709. X            printf("test10 FAIL\n");
  1710. X            return;
  1711. X        }
  1712. X        i = foo(i,1);
  1713. X        j = foo(1,2);
  1714. X        if (j != 3) {
  1715. X            printf("test10 FAIL\n");
  1716. X            return;
  1717. X        }
  1718. X    }
  1719. X
  1720. X    for (i = foo(5,5); i > 0; i--) {
  1721. X        if (i < 0 || i > 10) {
  1722. X            printf("test10 FAIL\n");
  1723. X            return;
  1724. X        }
  1725. X        j = foo(1,2);
  1726. X        if (j != 3) {
  1727. X            printf("test10 FAIL\n");
  1728. X            return;
  1729. X        }
  1730. X    }
  1731. X    printf("test10 ok\n");
  1732. X}
  1733. X
  1734. X/*
  1735. X * side-effect tests
  1736. X */
  1737. X
  1738. Xt11(n)
  1739. Xint n;
  1740. X{
  1741. X    register int i;
  1742. X
  1743. X    effect = 0;
  1744. X
  1745. X    if (effect == 1 && (side_effect(1) == 0)) {
  1746. X        printf("test11 FAIL\n");
  1747. X        return;
  1748. X    }
  1749. X
  1750. X    /* effect should still be 0 */
  1751. X
  1752. X    if (effect == 0 || (side_effect(1) == 1)) {
  1753. X        nil();
  1754. X    }
  1755. X
  1756. X    /* effect should still be 0 */
  1757. X
  1758. X    if (effect != 0) {
  1759. X        printf("test11 FAIL\n");
  1760. X        return;
  1761. X    }
  1762. X
  1763. X    i = (side_effect(1) ? 100 : 200);    /* assert i == 200 */
  1764. X                        /* assert effect == 1 */
  1765. X
  1766. X    if (i != 200) {
  1767. X        printf("test11 FAIL\n");
  1768. X        return;
  1769. X    }
  1770. X
  1771. X    /* a non-expansion case */
  1772. X    i = (effect ? side_effect(100) : side_effect(200));
  1773. X                        /* assert i == 1 */
  1774. X
  1775. X    if (i != 1) {
  1776. X        printf("test11 FAIL\n");
  1777. X        return;
  1778. X    }
  1779. X
  1780. X    if (effect != 100) {
  1781. X        printf("test11 FAIL\n");
  1782. X        return;
  1783. X    }
  1784. X
  1785. X    /* should have a comma-operator test, but it breaks now */
  1786. X
  1787. X    printf("test11 ok\n");
  1788. X}
  1789. X
  1790. X/*
  1791. X * more side-effect tests
  1792. X */
  1793. X
  1794. Xt12(n)
  1795. Xint n;
  1796. X{
  1797. X    int i,j,k,l;
  1798. X    struct str b;
  1799. X
  1800. X    /* might cause syntax errors, might return wrong value */
  1801. X    i = swaparg(1,2);
  1802. X    if (i != 3) {
  1803. X        printf("test12 FAIL\n");
  1804. X        return;
  1805. X    }
  1806. X    i = 100;
  1807. X    j = 200;
  1808. X    if (swaparg(i,j) != 300 || i != 100 || j != 200) {
  1809. X        printf("test12 FAIL\n");
  1810. X        return;
  1811. X    }
  1812. X    for (i = 0;  i < 3; i++) {
  1813. X        j = i;
  1814. X        b = modarg(i,b);
  1815. X        if (i != j) {
  1816. X            printf("test12 FAIL\n");
  1817. X            return;
  1818. X        }
  1819. X        if (i == 2) {
  1820. X            if (b.a != 6 || j != 2) {
  1821. X                printf("test12 FAIL\n");
  1822. X                return;
  1823. X            } 
  1824. X        }
  1825. X    }
  1826. X    printf("test12 ok\n");
  1827. X}
  1828. X
  1829. Xt13(n)
  1830. Xint n;
  1831. X{
  1832. X    register int i,j,k;
  1833. X
  1834. X    for (i = 0; i < 5; i++) {
  1835. X        if (i == 1) goto i2;
  1836. X         i1:
  1837. X        j = foo(i,100);
  1838. X        if (i == 2) {
  1839. X         i2:    k = foo(i,200);
  1840. X            if (i > 1 && j != i+100) { printf("test 13 FAIL\n"); return;}
  1841. X            goto i4;
  1842. X        }
  1843. X        if (i == 3) {
  1844. X            foo(i,300);
  1845. X         i3 /* comment */ :
  1846. X            if (j != i+100) { printf("test 13 FAIL\n"); return;}
  1847. X            continue;
  1848. X        }
  1849. X        if (i == 4) {
  1850. X            if (j != i+100) { printf("test 13 FAIL\n"); return;}
  1851. X            k = foo(i,400);
  1852. X         i4:
  1853. X            if (i == 2 && k != 202) { printf("test 13 FAIL\n"); return; }
  1854. X            if (i == 4 && k != 404) { printf("test 13 FAIL\n"); return; }
  1855. X            k = foo(i,500);
  1856. X            continue;
  1857. X        }
  1858. X        k = foo(i,600);
  1859. X        j = 0;
  1860. X    }
  1861. X    printf("test13 ok\n");
  1862. X}
  1863. X
  1864. Xint var = 0;
  1865. X
  1866. Xinline evar() {
  1867. X    return(var);
  1868. X}
  1869. X
  1870. Xinline mvar(x) {
  1871. X    var = x;
  1872. X}
  1873. Xt14(n)
  1874. Xint n;
  1875. X{
  1876. X    int var = 1;    /* hide outer def'n */
  1877. X
  1878. X    if (evar() != 0) { printf("test14 FAIL\n"); return;}
  1879. X    if (var != 1) { printf("test14 FAIL\n"); return;}
  1880. X    mvar(100);
  1881. X    if (var != 1) { printf("test14 FAIL\n"); return;}
  1882. X    if (evar() != 100) { printf("test14 FAIL\n"); return;}
  1883. X    printf("test14 ok\n");
  1884. X}
  1885. X
  1886. Xt15(i,var)
  1887. Xint i;
  1888. Xint var;
  1889. X{
  1890. X    int a,b,c;
  1891. X
  1892. X    mvar(-100);
  1893. X
  1894. X    a = 1;
  1895. X    b = 2;
  1896. X    c = 3;
  1897. X
  1898. X    {
  1899. X        int a,b;
  1900. X
  1901. X        a = 100;
  1902. X        b = 200;
  1903. X
  1904. X        c = foo(a,b);
  1905. X    }
  1906. X
  1907. X    if (a != 1 || b != 2 || c != 300) { printf("test15 FAIL\n"); return; }
  1908. X
  1909. X    c = var;
  1910. X    {
  1911. X        int var;
  1912. X
  1913. X        var = 1000;
  1914. X
  1915. X        {
  1916. X            cptr var, a, b, c;
  1917. X    
  1918. X            a = "-1";
  1919. X            b = "-2";
  1920. X            c = "-3";
  1921. X            var = "-4";
  1922. X            if (evar() != -100) { printf("test15 FAIL\n"); return;}
  1923. X        }
  1924. X
  1925. X        if (evar() != -100) { printf("test15 FAIL\n"); return;}
  1926. X    }
  1927. X    if (var != c) { printf("test15 FAIL\n"); return; }
  1928. X    if (evar() != -100) { printf("test15 FAIL\n"); return;}
  1929. X    printf("test15 ok\n");
  1930. X}
  1931. X
  1932. Xt16(n)
  1933. Xint n;
  1934. X{
  1935. X    char *s = "foo";
  1936. X
  1937. X    if (hardcase1(0,1) != 1) { printf("test16 FAIL\n"); return;}
  1938. X    while (1 && (hardcase1(0,1) != 1)) printf("test16 FAIL\n");
  1939. X    s = hardcase2("foo",1,0);
  1940. X    printf("test16 ok\n");
  1941. X}
  1942. X
  1943. Xt17(n)
  1944. Xint n;
  1945. X{
  1946. X    int x = 1;
  1947. X
  1948. X    if (x && expr1(1,0) != 0) {printf("test17 FAIL(1)\n"); return;}
  1949. X    if (x && expr1(0,1) != 1) {printf("test17 FAIL(2)\n"); return;}
  1950. X    if (x && expr1(0,100) != 2) {printf("test17 FAIL(3)\n"); return;}
  1951. X    if (x && expr1(0,0) != 3) {printf("test17 FAIL(4)\n"); return;}
  1952. X    if (x && expr2(1,0) != 1) {printf("test17 FAIL(5)\n"); return;}
  1953. X    if (x && expr2(0,1) != 201) {printf("test17 FAIL(6)\n"); return;}
  1954. X    if (x && expr2(0,0) != 500) {printf("test17 FAIL(7)\n"); return;}
  1955. X    printf("test17 ok\n");
  1956. X}
  1957. X
  1958. Xt18(n)
  1959. Xint n;
  1960. X{
  1961. X    int i,j;
  1962. X
  1963. X    i = 0;
  1964. XL1:
  1965. X    j = labs(i);
  1966. X    if (j != i) {printf("test18 FAIL\n"); return; }
  1967. X    i++;
  1968. X    if (i > 10) goto L2;
  1969. X    goto L1;
  1970. XL2:
  1971. X    printf("test18 ok\n");
  1972. X}
  1973. X
  1974. X/* simple inline */
  1975. Xinline int foo(a,b) {
  1976. X    register int x = 0;
  1977. X
  1978. X    printf("foo(%d, %d)\n", a,b);
  1979. X    return(a+b);
  1980. X}
  1981. Xinline int bar(x,y) {
  1982. X    register int a;
  1983. X
  1984. X    a = 0;
  1985. X    printf("bar(%d, %d)\n", x,y);
  1986. X    return(x-y);
  1987. X}
  1988. X/* inline with some control flow */
  1989. Xinline biff(a) {
  1990. X    while(1) return a;
  1991. X}
  1992. X
  1993. X/* inline with a switch */
  1994. Xinline insw(i)
  1995. Xint i;
  1996. X{
  1997. X    switch(i) {
  1998. X    case 0:    return('0');
  1999. X    case 1: return('1');
  2000. X    case 2: return('2');
  2001. X    case 3: return('3');
  2002. X    case 4: return(foo(i,'0'));
  2003. X    case 5: return('5');
  2004. X    case 6: return('6');
  2005. X    case 7: return(foo(i,'0'));
  2006. X    case 8: return('8');
  2007. X    case 9: return('9');
  2008. X    }
  2009. X    return(0);
  2010. X}
  2011. X
  2012. Xtypedef char *cptr;
  2013. X
  2014. Xinline barf() {
  2015. X    printf("!!!\n");
  2016. X}
  2017. X
  2018. X/* inline returning a typedef */
  2019. Xinline cptr
  2020. Xboff(c,s)
  2021. Xchar c;
  2022. Xcptr s;
  2023. X{
  2024. X    s[0] = c;
  2025. X    return(&s[1]);
  2026. X}
  2027. X
  2028. X/* inline returning a pointer type */
  2029. Xinline char *
  2030. Xboff2(c,s)
  2031. Xchar c;
  2032. Xcptr s;
  2033. X{
  2034. X    s[0] = c;
  2035. X    return(&s[1]);
  2036. X}
  2037. X
  2038. Xstruct str {
  2039. X    int a;
  2040. X    int b;
  2041. X    int c;
  2042. X};
  2043. X
  2044. X/* inline returning a structure */
  2045. Xinline struct str bipp(a,b,c)
  2046. Xint a, b, c;
  2047. X{
  2048. X    struct str x;
  2049. X
  2050. X    x.a = a;
  2051. X    x.b = b;
  2052. X    x.c = c;
  2053. X    return(x);
  2054. X}
  2055. X
  2056. X/* inline returning a structure pointer */
  2057. Xinline struct str *bupp(z,a,b,c)
  2058. Xregister struct str *z;
  2059. Xregister int a,b,c;
  2060. X{
  2061. X    z->a = a;
  2062. X    z->b = b;
  2063. X    z->c = c;
  2064. X    return(z);
  2065. X}
  2066. X
  2067. Xnil(){}
  2068. X
  2069. X/* inline returning function pointer */
  2070. Xinline int (*fp())()
  2071. X{
  2072. X    return(nil);
  2073. X}
  2074. X
  2075. Xint effect = 0;
  2076. X
  2077. Xinline int side_effect(a)
  2078. Xint a;
  2079. X{
  2080. X    int old;
  2081. X
  2082. X    old = effect;
  2083. X    effect = a;
  2084. X
  2085. X    return(old);
  2086. X}
  2087. X
  2088. X/* should have no effect on arguments */
  2089. Xinline int swaparg(a,b)
  2090. X{
  2091. X    int tmp;
  2092. X
  2093. X    tmp = a;
  2094. X    a = b;
  2095. X    b = tmp;
  2096. X
  2097. X    return(a+b);
  2098. X}
  2099. X
  2100. Xinline struct str modarg(a,b)
  2101. Xint a;
  2102. Xstruct str b;    /* struct arg */
  2103. X{
  2104. X    switch(a) {
  2105. X    case 0:
  2106. X        a = 1;
  2107. X        b.a = 1;
  2108. X        break;
  2109. X    case 1:
  2110. X        a >>= 1;
  2111. X        a <<= 1;
  2112. X        b.a = a;
  2113. X        break;
  2114. X    case 2:
  2115. X        a *= 3;
  2116. X        b.a = a;
  2117. X        break;
  2118. X    }
  2119. X    return(b);
  2120. X}
  2121. X
  2122. Xinline hardcase1(a,b)
  2123. Xint a,b;
  2124. X{
  2125. X    { ; }
  2126. X    if (a);
  2127. X    {{}}
  2128. X    if (a) { } else ;
  2129. X    return(b);
  2130. X}
  2131. Xinline char *
  2132. Xhardcase2(a,b,c)
  2133. Xchar *a;
  2134. Xint b,c;
  2135. X{
  2136. X    char *s = "foo", c = 'c';
  2137. X    int x = b;
  2138. X
  2139. X    if (a) return(s);
  2140. X    else {
  2141. X        if (b) return(a+c);
  2142. X    }
  2143. X    return(a+c);
  2144. X}
  2145. X
  2146. Xinline expr1(a,b)
  2147. Xint a,b;
  2148. X{
  2149. X    int x = 0;
  2150. X
  2151. X    if (foo(0,a+b) == 100) return x+2;    /* a+b == 100, ret = 2 */
  2152. X    if (foo(50,50) == 100 && a) return x;    /* a != 0, return = 0 */
  2153. X    if (foo(100,0) == 100 && b) return x+1;    /* a == 0 && b != 0, ret = 1 */
  2154. X    return x+3;                /* ret = 3 */
  2155. X}
  2156. X
  2157. Xinline expr2(a,b)
  2158. Xint a,b;
  2159. X{
  2160. X    register int x = 0, y = 1;
  2161. X
  2162. X    if (a) {
  2163. X        return(x+y);    /* a != 0, return = 1 */
  2164. X    } else {
  2165. X        register int x = 100, y = 101;
  2166. X
  2167. X        if (b) {
  2168. X            return(x+y);    /* a == 0 && b != 0, return = 201 */
  2169. X        } else {
  2170. X            register int x = 200, y = 300;
  2171. X
  2172. X            return(x+y);    /* a == 0 && b == 0, return = 500 */
  2173. X        }
  2174. X    }
  2175. X}
  2176. X
  2177. X
  2178. Xinline labs(i)
  2179. Xint i;
  2180. X{
  2181. X    if (i == 1) goto L1;
  2182. X    if (i == 2) goto L2;
  2183. X    if (i == 3) goto L3;
  2184. X    if (i == 4) goto L4;
  2185. X    goto L5;
  2186. XL6:
  2187. X    return(i);
  2188. X
  2189. XL1:    i++; return(1);
  2190. XL2:    if (i == 2) return(2);
  2191. XL3:    return(3);
  2192. XL4:    {
  2193. X    return(4);
  2194. X    }
  2195. XL5:    goto L6;
  2196. X}
  2197. \Rogue\Monster\
  2198. else
  2199.   echo "will not over write ./test2.c"
  2200. fi
  2201. chmod 444 ./test2.c
  2202. if [ `wc -c ./test2.c | awk '{printf $1}'` -ne 11844 ]
  2203. then
  2204. echo `wc -c ./test2.c | awk '{print "Got " $1 ", Expected " 11844}'`
  2205. fi
  2206. echo "Finished archive 1 of 3"
  2207. # if you want to concatenate archives, remove anything after this line
  2208. exit
  2209.