rsalz@uunet.uu.net (Rich Salz) (05/08/90)
Submitted-by: David Gillespie <daveg@csvax.caltech.edu> Posting-number: Volume 22, Issue 35 Archive-name: p2cpatches/part02 The following patches convert p2c version 1.15 into p2c version 1.16. To apply them automatically with Patch v2.0, first cd into your p2c distribution directory (with subdirectories src, examples, etc.), then execute "patch -p0 <p2c.patch", where "p2c.patch" is name of this file, then "cd src" and execute "make install". These patches do not cover the example files, nor reproducible files such as "p2c.hdrs" and "p2c.cat". Those files will be rebuilt by "make install". Enjoy! -- Dave Dave Gillespie 256-80 Caltech, Pasadena CA 91125 daveg@csvax.caltech.edu, ...!cit-vax!daveg *** README Fri Apr 13 21:05:13 1990 --- ../dist/README Tue May 1 00:10:04 1990 *************** *** 1,5 **** ! This directory contains "p2c" version 1.15, a Pascal to C translator. "p2c" Copyright 1989 Dave Gillespie 256-80 Caltech --- 1,5 ---- ! This directory contains "p2c" version 1.16, a Pascal to C translator. "p2c" Copyright 1989 Dave Gillespie 256-80 Caltech Files Makefile and ../dist/Makefile are identical Files src/COPYING and ../dist/src/COPYING are identical diff -c -N -r -s src/HISTORY ../dist/src/HISTORY *** src/HISTORY Fri Apr 13 21:04:41 1990 --- ../dist/src/HISTORY Tue May 1 00:09:28 1990 *************** *** 4,9 **** --- 4,28 ---- ------- -- ------- -- --- + Version 1.16: + + * Reduced wasteful proliferation of identical-looking temporary variables. + + * Improved heuristic for determining allocation size for set constructors. + + * Corrected handling for EOF applied to buffered binary files. + + * Bug fix in decl.c: Handled a rare case involving forward-declared pointers. + + * Bug fix in p2clib.c:P_remset: Forgot to fix s[0] if highest bit was cleared. + + * Bug fix in p2clib.c:P_setxor: Forgot to fix s[0] if highest bits cancelled. + + * Added to sys.p2crc/trans.h the following configuration parameters: + + EofBufName Macro to use for EOF of a bufffered file. + FilePosBufName Macro to use for FILEPOS or POSITION of a buffered file. + Version 1.15: * Taught the line breaker to handle logical/relational operators specially. Files src/Makefile and ../dist/src/Makefile are identical Files src/NOTES and ../dist/src/NOTES are identical Files src/README and ../dist/src/README are identical Files src/citmods.c and ../dist/src/citmods.c are identical Files src/comment.c and ../dist/src/comment.c are identical diff -c -N -r -s src/decl.c ../dist/src/decl.c *** src/decl.c Fri Apr 13 21:04:49 1990 --- ../dist/src/decl.c Tue May 1 00:09:41 1990 *************** *** 1250,1255 **** --- 1250,1257 ---- switch (type->kind) { case TK_POINTER: + if (type->smin) /* unresolved forward */ + return type; if (type->basetype == tp_void) { /* ANYPTR */ if (tp_special_anyptr) return tp_special_anyptr; /* write "Anyptr" */ *************** *** 1774,1782 **** if (type == tp_char) return tp_ubyte; if (type->kind == TK_POINTER) { ! if (type->basetype->kind == TK_ARRAY || ! type->basetype->kind == TK_STRING || ! type->basetype->kind == TK_SET) return makepointertype(canonicaltype(type->basetype->basetype)); else if (type->basetype == tp_void) return (voidstar) ? tp_anyptr : makepointertype(tp_abyte); --- 1776,1786 ---- if (type == tp_char) return tp_ubyte; if (type->kind == TK_POINTER) { ! if (type->smin) ! return type; ! else if (type->basetype->kind == TK_ARRAY || ! type->basetype->kind == TK_STRING || ! type->basetype->kind == TK_SET) return makepointertype(canonicaltype(type->basetype->basetype)); else if (type->basetype == tp_void) return (voidstar) ? tp_anyptr : makepointertype(tp_abyte); *************** *** 1789,1797 **** --- 1793,1837 ---- } + int identicaltypes(t1, t2) + Type *t1, *t2; + { + if (t1 == t2) + return 1; + if (t1->kind == t2->kind) { + if (t1->kind == TK_SUBR) + return (identicaltypes(t1->basetype, t2->basetype) && + exprsame(t1->smin, t2->smin, 2) && + exprsame(t1->smax, t2->smax, 2)); + if (t1->kind == TK_SET || + t1->kind == TK_SMALLSET) + return (exprsame(t1->indextype->smax, + t2->indextype->smax, 2)); + if (t1->kind == TK_ARRAY || + t1->kind == TK_STRING || + t1->kind == TK_SMALLARRAY) + return (identicaltypes(t1->basetype, t2->basetype) && + identicaltypes(t1->indextype, t2->indextype) && + t1->structdefd == t2->structdefd && + ((!t1->smin && !t2->smin) || + (t1->smin && t2->smin && + exprsame(t1->smin, t2->smin, 2))) && + ((!t1->smax && !t2->smax) || + (t1->smax && t2->smax && + exprsame(t1->smax, t2->smax, 2) && + t1->escale == t2->escale && + t1->issigned == t2->issigned))); + } + return 0; + } + + int similartypes(t1, t2) Type *t1, *t2; { + if (debug > 3) { fprintf(outf, "identicaltypes("); dumptypename(t1,1); fprintf(outf, ","); dumptypename(t2,1); fprintf(outf, ") = %d\n", identicaltypes(t1, t2)); } + if (identicaltypes(t1, t2)) + return 1; t1 = canonicaltype(t1); t2 = canonicaltype(t2); return (t1 == t2); *************** *** 1857,1865 **** default: if (findbasetype(tp1, flags) != findbasetype(tp2, flags)) return 0; ! while (tp1->kind == TK_POINTER && tp1->basetype) tp1 = tp1->basetype; ! while (tp2->kind == TK_POINTER && tp2->basetype) tp2 = tp2->basetype; return (tp1 == tp2); } --- 1897,1905 ---- default: if (findbasetype(tp1, flags) != findbasetype(tp2, flags)) return 0; ! while (tp1->kind == TK_POINTER && !tp1->smin && tp1->basetype) tp1 = tp1->basetype; ! while (tp2->kind == TK_POINTER && !tp2->smin && tp2->basetype) tp2 = tp2->basetype; return (tp1 == tp2); } *************** *** 2103,2109 **** break; default: ! if (type->meaning && type->meaning->kind == MK_TYPE && type->meaning->wasdeclared) { output(type->meaning->name); } else { --- 2143,2153 ---- break; default: ! if (type->kind == TK_POINTER && type->smin) { ! note("Forward pointer reference assumes struct type [323]"); ! output("struct "); ! output(format_s(name_STRUCT, type->smin->val.s)); ! } else if (type->meaning && type->meaning->kind == MK_TYPE && type->meaning->wasdeclared) { output(type->meaning->name); } else { *************** *** 3582,3587 **** --- 3626,3632 ---- pd->next = ptrbase; ptrbase = pd; tp->basetype = tp_abyte; + tp->smin = makeexpr_name(curtokcase, tp_integer); anydeferredptrs = 1; gettok(); } else { *************** *** 4331,4337 **** case TK_SMALLSET: case TK_SET: if (curtok == TOK_LBR) ! return p_setfactor(type); break; default: --- 4376,4382 ---- case TK_SMALLSET: case TK_SET: if (curtok == TOK_LBR) ! return p_setfactor(type, 1); break; default: *************** *** 4548,4554 **** tp->meaning->ctx && tp->meaning->ctx != nullctx) { pd = ptrbase; /* Do this now, just in case */ while (pd) { ! if (pd->tp->basetype == tp_abyte) { mp2 = pd->sym->mbase; while (mp2 && !mp2->isactive) mp2 = mp2->snext; --- 4593,4600 ---- tp->meaning->ctx && tp->meaning->ctx != nullctx) { pd = ptrbase; /* Do this now, just in case */ while (pd) { ! if (pd->tp->smin && pd->tp->basetype == tp_abyte) { ! pd->tp->smin = NULL; mp2 = pd->sym->mbase; while (mp2 && !mp2->isactive) mp2 = mp2->snext; *************** *** 4701,4707 **** deferallptrs = 0; while (ptrbase) { pd = ptrbase; ! if (pd->tp->basetype == tp_abyte) { mp = pd->sym->mbase; while (mp && !mp->isactive) mp = mp->snext; --- 4747,4754 ---- deferallptrs = 0; while (ptrbase) { pd = ptrbase; ! if (pd->tp->smin && pd->tp->basetype == tp_abyte) { ! pd->tp->smin = NULL; mp = pd->sym->mbase; while (mp && !mp->isactive) mp = mp->snext; Files src/dir.c and ../dist/src/dir.c are identical Files src/expr.c and ../dist/src/expr.c are identical diff -c -N -r -s src/funcs.c ../dist/src/funcs.c *** src/funcs.c Fri Apr 13 21:04:53 1990 --- ../dist/src/funcs.c Tue May 1 00:09:45 1990 *************** *** 1635,1641 **** int code; { Expr *ex2 = NULL, *ex3 = NULL; ! Meaning *tvar = NULL; if (FCheck(checkfileisopen) && !is_std_file(ex)) { if (exprspeed(ex) < 5 && nosideeffects(ex, 0)) { --- 1635,1641 ---- int code; { Expr *ex2 = NULL, *ex3 = NULL; ! Meaning *tvar = NULL, *mp; if (FCheck(checkfileisopen) && !is_std_file(ex)) { if (exprspeed(ex) < 5 && nosideeffects(ex, 0)) { *************** *** 1650,1656 **** switch (code) { case 0: /* eof */ ! if (*eofname) ex = makeexpr_bicall_1(eofname, tp_boolean, ex); else ex = makeexpr_rel(EK_NE, makeexpr_bicall_1("feof", tp_int, ex), --- 1650,1660 ---- switch (code) { case 0: /* eof */ ! if ((mp = isfilevar(ex)) != NULL && ! mp->bufferedfile && ! *eofbufname) ! ex = makeexpr_bicall_1(eofbufname, tp_boolean, ex); ! else if (*eofname) ex = makeexpr_bicall_1(eofname, tp_boolean, ex); else ex = makeexpr_rel(EK_NE, makeexpr_bicall_1("feof", tp_int, ex), *************** *** 1662,1668 **** break; case 2: /* position or filepos */ ! ex = makeexpr_bicall_1(fileposname, tp_integer, ex); break; case 3: /* maxpos or filesize */ --- 1666,1677 ---- break; case 2: /* position or filepos */ ! if ((mp = isfilevar(ex)) != NULL && ! mp->bufferedfile && ! *fileposbufname) ! ex = makeexpr_bicall_1(fileposbufname, tp_boolean, ex); ! else ! ex = makeexpr_bicall_1(fileposname, tp_integer, ex); break; case 3: /* maxpos or filesize */ Files src/hpmods.c and ../dist/src/hpmods.c are identical Files src/lex.c and ../dist/src/lex.c are identical Files src/loc.p2clib.c and ../dist/src/loc.p2clib.c are identical Files src/loc.p2crc and ../dist/src/loc.p2crc are identical Files src/makeproto.c and ../dist/src/makeproto.c are identical Files src/out.c and ../dist/src/out.c are identical diff -c -N -r -s src/p2c.h ../dist/src/p2c.h *** src/p2c.h Fri Apr 13 21:04:56 1990 --- ../dist/src/p2c.h Tue May 1 00:09:51 1990 *************** *** 4,10 **** /* Header file for code generated by "p2c", the Pascal-to-C translator */ ! /* "p2c" Copyright (C) 1989 Dave Gillespie, version 1.15. * This file may be copied, modified, etc. in any way. It is not restricted * by the licence agreement accompanying p2c itself. */ --- 4,10 ---- /* Header file for code generated by "p2c", the Pascal-to-C translator */ ! /* "p2c" Copyright (C) 1989 Dave Gillespie, version 1.16. * This file may be copied, modified, etc. in any way. It is not restricted * by the licence agreement accompanying p2c itself. */ *************** *** 317,322 **** --- 317,325 ---- #define PUT(f,type) (fwrite(&__CAT__(f,_BUFFER),sizeof(type),1,(f)), \ (__CAT__(f,_BFLAGS) = 0)) #define CPUT(f) (PUT(f,char)) + + #define BUFEOF(f) (__CAT__(f,_BFLAGS) != 2 && P_eof(f)) + #define BUFFPOS(f) (ftell(f) - (__CAT__(f,_BFLAGS) == 2)) /* Memory allocation */ #ifdef __GCC__ diff -c -N -r -s src/p2c.man ../dist/src/p2c.man *** src/p2c.man Fri Apr 13 21:04:42 1990 --- ../dist/src/p2c.man Tue May 1 00:09:31 1990 *************** *** 1,7 **** .\" p2c Copyright 1989 Dave Gillespie .TH P2C 1 "local" .SH NAME ! p2c \- Pascal to C translator, version 1.15 .SH SYNOPSIS .B p2c [ options ] [ file [ module ] ] --- 1,7 ---- .\" p2c Copyright 1989 Dave Gillespie .TH P2C 1 "local" .SH NAME ! p2c \- Pascal to C translator, version 1.16 .SH SYNOPSIS .B p2c [ options ] [ file [ module ] ] *************** *** 1493,1500 **** .SH AUTHOR Dave Gillespie, daveg@csvax.caltech.edu. .PP ! Many thanks to William Bader, Rick Koshi, Eric Raymond, Magne Haveraaen, ! Dirk Grunwald, David Barto, Paul Fisher, and others whose suggestions and ! bug reports have helped improve .I p2c in countless ways. --- 1493,1500 ---- .SH AUTHOR Dave Gillespie, daveg@csvax.caltech.edu. .PP ! Many thanks to William Bader, Steven Levi, Rick Koshi, Eric Raymond, ! Magne Haveraaen, Dirk Grunwald, David Barto, Paul Fisher, and others whose ! suggestions and bug reports have helped improve .I p2c in countless ways. diff -c -N -r -s src/p2clib.c ../dist/src/p2clib.c *** src/p2clib.c Fri Apr 13 21:04:55 1990 --- ../dist/src/p2clib.c Tue May 1 00:09:47 1990 *************** *** 577,583 **** *d++ = *s1++; while (--sz2 >= 0) *d++ = *s2++; ! *dbase = d - dbase - 1; return dbase; } --- 577,584 ---- *d++ = *s1++; while (--sz2 >= 0) *d++ = *s2++; ! while (--d > dbase && !*d) ; ! *dbase = d - dbase; return dbase; } *************** *** 656,663 **** register int bit; bit = val % SETBITS; val /= SETBITS; ! if (++val <= *s) ! s[val] &= ~(1<<bit); return s; } --- 657,667 ---- register int bit; bit = val % SETBITS; val /= SETBITS; ! if (++val <= *s) { ! if (!(s[val] &= ~(1<<bit))) ! while (*s && !s[*s]) ! (*s)--; ! } return s; } Files src/parse.c and ../dist/src/parse.c are identical diff -c -N -r -s src/pexpr.c ../dist/src/pexpr.c *** src/pexpr.c Fri Apr 13 21:04:52 1990 --- ../dist/src/pexpr.c Tue May 1 00:09:44 1990 *************** *** 469,485 **** #define MAXSETLIT 400 ! Expr *p_setfactor(type) ! Type *type; { Expr *ex, *exmax = NULL, *ex2; Expr *first[MAXSETLIT], *last[MAXSETLIT]; char doneflag[MAXSETLIT]; int i, j, num, donecount; ! int isconst, guesstype = 0; long maxv, max2; Value val; ! Type *tp; Meaning *tvar; if (curtok == TOK_LBRACE) --- 469,486 ---- #define MAXSETLIT 400 ! Expr *p_setfactor(target, sure) ! Type *target; ! int sure; { Expr *ex, *exmax = NULL, *ex2; Expr *first[MAXSETLIT], *last[MAXSETLIT]; char doneflag[MAXSETLIT]; int i, j, num, donecount; ! int isconst, guesstype; long maxv, max2; Value val; ! Type *tp, *type; Meaning *tvar; if (curtok == TOK_LBRACE) *************** *** 493,500 **** val.s = NULL; return makeexpr_val(val); } ! if (!type) ! guesstype = 1; maxv = -1; isconst = 1; num = 0; --- 494,501 ---- val.s = NULL; return makeexpr_val(val); } ! type = target; ! guesstype = !sure; maxv = -1; isconst = 1; num = 0; *************** *** 510,516 **** } if (guesstype && num == 0) { ex = p_ord_expr(); ! type = ord_type(ex->val.type); } else { ex = p_expr(type); } --- 511,517 ---- } if (guesstype && num == 0) { ex = p_ord_expr(); ! type = ex->val.type; } else { ex = p_expr(type); } *************** *** 550,561 **** gettok(); else if (!wneedtok(TOK_RBR)) skippasttotoken(TOK_RBR, TOK_SEMI); ! tp = ord_type(first[0]->val.type); if (guesstype) { /* must determine type */ ! if (!exmax || maxv == LONG_MAX) { ! maxv = defaultsetsize-1; ! if (ord_range(tp, NULL, &max2) && maxv > max2) maxv = max2; exmax = makeexpr_long(maxv); } else exmax = copyexpr(exmax); --- 551,566 ---- gettok(); else if (!wneedtok(TOK_RBR)) skippasttotoken(TOK_RBR, TOK_SEMI); ! tp = first[0]->val.type; if (guesstype) { /* must determine type */ ! if (maxv == LONG_MAX) { ! if (target && ord_range(target, NULL, &max2)) ! maxv = max2; ! else if (ord_range(tp, NULL, &max2) && max2 < 1000000 && ! (max2 >= defaultsetsize || num == 1)) maxv = max2; + else + maxv = defaultsetsize-1; exmax = makeexpr_long(maxv); } else exmax = copyexpr(exmax); *************** *** 1122,1128 **** case TOK_LBR: case TOK_LBRACE: ! return p_setfactor(NULL); case TOK_NIL: gettok(); --- 1127,1134 ---- case TOK_LBR: case TOK_LBRACE: ! return p_setfactor(target && target->kind == TK_SET ! ? target->indextype : NULL, 0); case TOK_NIL: gettok(); *************** *** 1160,1166 **** case TK_SET: case TK_SMALLSET: ! return p_setfactor(type->indextype); case TK_RECORD: return p_constrecord(type, 0); --- 1166,1172 ---- case TK_SET: case TK_SMALLSET: ! return p_setfactor(type->indextype, 1); case TK_RECORD: return p_constrecord(type, 0); Files src/string.pas and ../dist/src/string.pas are identical Files src/stuff.c and ../dist/src/stuff.c are identical diff -c -N -r -s src/sys.p2crc ../dist/src/sys.p2crc *** src/sys.p2crc Fri Apr 13 21:04:44 1990 --- ../dist/src/sys.p2crc Tue May 1 00:09:36 1990 *************** *** 1,4 **** ! # Standard configuration file for "p2c" 1.15, the Pascal to C translator # Copyright (C) 1989 David Gillespie. # Author's address: daveg@csvax.caltech.edu; 256-80 Caltech/Pasadena CA 91125. --- 1,4 ---- ! # Standard configuration file for "p2c" 1.16, the Pascal to C translator # Copyright (C) 1989 David Gillespie. # Author's address: daveg@csvax.caltech.edu; 256-80 Caltech/Pasadena CA 91125. *************** *** 1518,1523 **** --- 1518,1527 ---- ArrayPutFBufName APUTFBUF # A special PutFBuf for files of arrays. ArrayPutName # A special Put for files of arrays. + + EofBufName BUFEOF # Name of a macro for "eof" of a buffered file. + + FilePosBufName BUFFPOS # Name of a macro for buffered "filepos". Files src/system.imp and ../dist/src/system.imp are identical Files src/system.m2 and ../dist/src/system.m2 are identical Files src/trans.c and ../dist/src/trans.c are identical diff -c -N -r -s src/trans.h ../dist/src/trans.h *** src/trans.h Fri Apr 13 21:04:57 1990 --- ../dist/src/trans.h Tue May 1 00:09:54 1990 *************** *** 1,4 **** ! /* "p2c", a Pascal to C translator, version 1.15. Copyright (C) 1989 David Gillespie. Author's address: daveg@csvax.caltech.edu; 256-80 Caltech/Pasadena CA 91125. --- 1,4 ---- ! /* "p2c", a Pascal to C translator, version 1.16. Copyright (C) 1989 David Gillespie. Author's address: daveg@csvax.caltech.edu; 256-80 Caltech/Pasadena CA 91125. *************** *** 134,140 **** extern char *p2c_home; #endif ! #define P2C_VERSION "1.15" --- 134,140 ---- extern char *p2c_home; #endif ! #define P2C_VERSION "1.16" *************** *** 530,535 **** --- 530,536 ---- * * TK_POINTER: Pointer type. * tp->basetype => Base type of pointer. + * tp->smin => EK_NAME for type if not-yet-resolved forward; else NULL. * Only one pointer type is ever generated for a given other type; * each tp->pointertype points back to that type if it has been generated. * *************** *** 1030,1035 **** --- 1031,1037 ---- extern char putfbufname[40], charputfbufname[40], arrayputfbufname[40]; extern char getname[40], chargetname[40], arraygetname[40]; extern char putname[40], charputname[40], arrayputname[40]; + extern char eofbufname[40], fileposbufname[40]; extern char storebitsname[40], signextname[40]; extern char filenotfoundname[40], filenotopenname[40]; extern char filewriteerrorname[40], badinputformatname[40], endoffilename[40]; *************** *** 1592,1597 **** --- 1594,1601 ---- 'C', 'V', "PUTNAME", (anyptr) putname, 40, 'C', 'V', "CHARPUTNAME", (anyptr) charputname, 40, 'C', 'V', "ARRAYPUTNAME", (anyptr) arrayputname, 40, + 'C', 'V', "EOFBUFNAME", (anyptr) eofbufname, 40, + 'C', 'V', "FILEPOSBUFNAME", (anyptr) fileposbufname, 40, /* RANGE CHECKING */ 'S', 'V', "CASECHECK", (anyptr) &casecheck, 0, Files src/turbo.imp and ../dist/src/turbo.imp are identical exit 0 # Just in case... -- Please send comp.sources.unix-related mail to rsalz@uunet.uu.net. Use a domain-based address or give alternate paths, or you may lose out.