Implement formal functions and procedures
authorPeter B. Kessler <peter@ucbvax.Berkeley.EDU>
Fri, 3 Oct 1980 17:10:10 +0000 (09:10 -0800)
committerPeter B. Kessler <peter@ucbvax.Berkeley.EDU>
Fri, 3 Oct 1980 17:10:10 +0000 (09:10 -0800)
SCCS-vsn: usr.bin/pascal/src/0.h 1.3
SCCS-vsn: usr.bin/pascal/src/OPnames.h 1.2
SCCS-vsn: usr.bin/pascal/src/call.c 1.3
SCCS-vsn: usr.bin/pascal/src/fdec.c 1.4
SCCS-vsn: usr.bin/pascal/src/func.c 1.2
SCCS-vsn: usr.bin/pascal/src/nl.c 1.2
SCCS-vsn: usr.bin/pascal/src/p2put.c 1.2
SCCS-vsn: usr.bin/pascal/src/pcfunc.c 1.2
SCCS-vsn: usr.bin/pascal/src/pcproc.c 1.2
SCCS-vsn: usr.bin/pascal/src/proc.c 1.2
SCCS-vsn: usr.bin/pascal/src/put.c 1.3
SCCS-vsn: usr.bin/pascal/src/rval.c 1.2
SCCS-vsn: usr.bin/pascal/src/stkrval.c 1.3
SCCS-vsn: usr.bin/pascal/src/yyid.c 1.2
SCCS-vsn: usr.bin/pascal/pc0/Makefile 1.9
SCCS-vsn: usr.bin/pascal/src/pimakefile 1.9
SCCS-vsn: usr.bin/pascal/src/flvalue.c 1.2

17 files changed:
usr/src/usr.bin/pascal/pc0/Makefile
usr/src/usr.bin/pascal/src/0.h
usr/src/usr.bin/pascal/src/OPnames.h
usr/src/usr.bin/pascal/src/call.c
usr/src/usr.bin/pascal/src/fdec.c
usr/src/usr.bin/pascal/src/flvalue.c
usr/src/usr.bin/pascal/src/func.c
usr/src/usr.bin/pascal/src/nl.c
usr/src/usr.bin/pascal/src/p2put.c
usr/src/usr.bin/pascal/src/pcfunc.c
usr/src/usr.bin/pascal/src/pcproc.c
usr/src/usr.bin/pascal/src/pimakefile
usr/src/usr.bin/pascal/src/proc.c
usr/src/usr.bin/pascal/src/put.c
usr/src/usr.bin/pascal/src/rval.c
usr/src/usr.bin/pascal/src/stkrval.c
usr/src/usr.bin/pascal/src/yyid.c

index 7431107..56ea01d 100644 (file)
@@ -1,22 +1,23 @@
-SCCSID = "@(#)Makefile 1.8 %G%"
+SCCSID = "@(#)Makefile 1.9 %G%"
 
 MKSTR = /usr/ucb/mkstr
 EYACC = /usr/ucb/eyacc
 RM = -rm -f
 
 MKSTR = /usr/ucb/mkstr
 EYACC = /usr/ucb/eyacc
 RM = -rm -f
-GET = sccs get
+GET = sccs -d${SRCDIR} get
 
 CFLAGS = -O -w
 LDFLAGS = -z
 
 
 CFLAGS = -O -w
 LDFLAGS = -z
 
-INSTALLDIR = /usr/lib
+SRCDIR = /usr/src/cmd/pc0
+INSTALLDIR = /usr/ucb
 LIBDIR = /usr/lib
 TMPDIR = tmp
 
 LIBDIR = /usr/lib
 TMPDIR = tmp
 
-ERRORSTRINGS = pc2.0strings
+ERRORSTRINGS = pi2.0strings
 
 SRCS = ato.c \
        call.c case.c clas.c const.c conv.c cset.c \
 
 SRCS = ato.c \
        call.c case.c clas.c const.c conv.c cset.c \
-       error.c fdec.c func.c gen.c hash.c \
+       error.c fdec.c flvalue.c func.c gen.c hash.c \
        lab.c lookup.c lval.c stklval.c \
        main.c nl.c proc.c put.c \
        rec.c rval.c stkrval.c\
        lab.c lookup.c lval.c stklval.c \
        main.c nl.c proc.c put.c \
        rec.c rval.c stkrval.c\
@@ -25,17 +26,16 @@ SRCS =      ato.c \
        TRdata.c \
        treen.c putn.c yycopy.c \
        yycosts.c yyerror.c yyget.c yyid.c yylex.c yymain.c yyoptions.c \
        TRdata.c \
        treen.c putn.c yycopy.c \
        yycosts.c yyerror.c yyget.c yyid.c yylex.c yymain.c yyoptions.c \
-       yypanic.c yyparse.c yyprint.c yyput.c yyrecover.c yyseman.c yytree.c \
-       p2put.c pcforop.c stab.c pcproc.c pcfunc.c pccaseop.c pclval.c
+       yypanic.c yyparse.c yyprint.c yyput.c yyrecover.c yyseman.c yytree.c
 
 
-HDRS = 0.h OPnames.h align.h iorec.h objfmt.h pstab.h pc.h pcops.h \
-       send.h tree.h whoami.h yy.h
+HDRS = 0.h OPnames.h align.h iorec.h objfmt.h send.h tree.h yy.h \
+       pc.h pcops.h
 
 OTHERS = pas.y opc.c version.c gram pic.c
 
 OBJS = ato.o \
        call.o case.o clas.o const.o conv.o cset.o \
 
 OTHERS = pas.y opc.c version.c gram pic.c
 
 OBJS = ato.o \
        call.o case.o clas.o const.o conv.o cset.o \
-       error.o fdec.o func.o gen.o hash.o \
+       error.o fdec.o flvalue.o func.o gen.o hash.o \
        lab.o lookup.o lval.o stklval.o \
        main.o nl.o proc.o put.o \
        rec.o rval.o stkrval.o\
        lab.o lookup.o lval.o stklval.o \
        main.o nl.o proc.o put.o \
        rec.o rval.o stkrval.o\
@@ -45,14 +45,13 @@ OBJS =      ato.o \
        treen.o putn.o yycopy.o \
        y.tab.o \
        yycosts.o yyerror.o yyget.o yyid.o yylex.o yymain.o yyoptions.o \
        treen.o putn.o yycopy.o \
        y.tab.o \
        yycosts.o yyerror.o yyget.o yyid.o yylex.o yymain.o yyoptions.o \
-       yypanic.o yyparse.o yyprint.o yyput.o yyrecover.o yyseman.o yytree.o \
-       p2put.o pcforop.o stab.o pcproc.o pcfunc.o pccaseop.o pclval.o
+       yypanic.o yyparse.o yyprint.o yyput.o yyrecover.o yyseman.o yytree.o
 
 a.out: ${OBJS} version
        ./version > Version.c
        ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} Version.c
 
 
 a.out: ${OBJS} version
        ./version > Version.c
        ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} Version.c
 
-sources: ${SRCS} ${HDRS} ${OTHERS}
+sources: whoami.h ${SRCS} ${HDRS} ${OTHERS}
        
 ${SRCS} ${HDRS} ${OTHERS}:
        ${GET} ${REL} $@
        
 ${SRCS} ${HDRS} ${OTHERS}:
        ${GET} ${REL} $@
@@ -63,6 +62,10 @@ ${SRCS} ${HDRS} ${OTHERS}:
        cd ${TMPDIR} ; ${CC} ${CFLAGS} -I.. -c $*.c ; mv $*.o  ../$*.o
        ${RM} ${TMPDIR}/$*.c
 
        cd ${TMPDIR} ; ${CC} ${CFLAGS} -I.. -c $*.c ; mv $*.o  ../$*.o
        ${RM} ${TMPDIR}/$*.c
 
+whoami.h:
+       ${GET} ${REL} piwhoami.h
+       mv piwhoami.h whoami.h
+
 y.tab.h: pas.y gram
        ${EYACC} pas.y > /dev/null
        ex - y.tab.c <gram
 y.tab.h: pas.y gram
        ${EYACC} pas.y > /dev/null
        ex - y.tab.c <gram
@@ -81,7 +84,7 @@ version: version.c
 
 clean:
        ${RM} *.o ${TMPDIR}/*.c
 
 clean:
        ${RM} *.o ${TMPDIR}/*.c
-       ${RM} y.tab.h y.tab.c y.tab.out
+       ${RM} whoami.h y.tab.h y.tab.c y.tab.out
        ${RM} ${ERRORSTRINGS}
        ${RM} version Version.c
        ${RM} a.out core *.list *.bak
        ${RM} ${ERRORSTRINGS}
        ${RM} version Version.c
        ${RM} a.out core *.list *.bak
@@ -96,15 +99,14 @@ print:      sources
        @rm pic
        @pr 0.h whoami.h main.c pas.y
        @pr OPnames.h opcode.h tree.h
        @rm pic
        @pr 0.h whoami.h main.c pas.y
        @pr OPnames.h opcode.h tree.h
-       @pr pc.h
        @pr [a-ln-x]*.c
        @pr yy.h yy*.c
 
 install: a.out
        sccs check
        cp ${ERRORSTRINGS} ${LIBDIR}/${ERRORSTRINGS}
        @pr [a-ln-x]*.c
        @pr yy.h yy*.c
 
 install: a.out
        sccs check
        cp ${ERRORSTRINGS} ${LIBDIR}/${ERRORSTRINGS}
-       cp ${INSTALLDIR}/pc0 ${INSTALLDIR}/pc0.bak
-       cp a.out ${INSTALLDIR}/pc0
+       cp ${INSTALLDIR}/pi ${INSTALLDIR}/pi.bak
+       cp a.out ${INSTALLDIR}/pi
 
 depend:        sources
        /bin/grep '^#[  ]*include' *.h \
 
 depend:        sources
        /bin/grep '^#[  ]*include' *.h \
@@ -171,6 +173,13 @@ fdec.o: objfmt.h
 fdec.o: align.h
 fdec.o: pc.h
 fdec.o: pcops.h
 fdec.o: align.h
 fdec.o: pc.h
 fdec.o: pcops.h
+flvalue.o: whoami.h
+flvalue.o: 0.h
+flvalue.o: tree.h
+flvalue.o: opcode.h
+flvalue.o: objfmt.h
+flvalue.o: pc.h
+flvalue.o: pcops.h
 func.o: whoami.h
 func.o: 0.h
 func.o: tree.h
 func.o: whoami.h
 func.o: 0.h
 func.o: tree.h
@@ -208,41 +217,6 @@ nl.o: 0.h
 nl.o: opcode.h
 nl.o: objfmt.h
 opc.o: OPnames.h
 nl.o: opcode.h
 nl.o: objfmt.h
 opc.o: OPnames.h
-p2put.o: whoami.h
-p2put.o: 0.h
-p2put.o: pcops.h
-p2put.o: pc.h
-pccaseop.o: whoami.h
-pccaseop.o: 0.h
-pccaseop.o: tree.h
-pccaseop.o: objfmt.h
-pccaseop.o: pcops.h
-pccaseop.o: pc.h
-pcforop.o: whoami.h
-pcforop.o: 0.h
-pcforop.o: opcode.h
-pcforop.o: tree.h
-pcforop.o: pc.h
-pcforop.o: pcops.h
-pcfunc.o: whoami.h
-pcfunc.o: 0.h
-pcfunc.o: tree.h
-pcfunc.o: opcode.h
-pcfunc.o: pc.h
-pcfunc.o: pcops.h
-pclval.o: whoami.h
-pclval.o: 0.h
-pclval.o: tree.h
-pclval.o: opcode.h
-pclval.o: objfmt.h
-pclval.o: pc.h
-pclval.o: pcops.h
-pcproc.o: whoami.h
-pcproc.o: 0.h
-pcproc.o: tree.h
-pcproc.o: opcode.h
-pcproc.o: pc.h
-pcproc.o: pcops.h
 pic.o: OPnames.h
 proc.o: whoami.h
 proc.o: 0.h
 pic.o: OPnames.h
 proc.o: whoami.h
 proc.o: 0.h
@@ -266,10 +240,6 @@ rval.o: opcode.h
 rval.o: objfmt.h
 rval.o: pc.h
 rval.o: pcops.h
 rval.o: objfmt.h
 rval.o: pc.h
 rval.o: pcops.h
-stab.o: whoami.h
-stab.o: 0.h
-stab.o: pstab.h
-stab.o: pc.h
 stat.o: whoami.h
 stat.o: 0.h
 stat.o: tree.h
 stat.o: whoami.h
 stat.o: 0.h
 stat.o: tree.h
index b5e7990..ba3faef 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-/* static      char sccsid[] = "@(#)0.h 1.2 %G%"; */
+/* static      char sccsid[] = "@(#)0.h 1.3 %G%"; */
 
 #define DEBUG
 #define        CHAR
 
 #define DEBUG
 #define        CHAR
@@ -362,6 +362,8 @@ struct {
 #define        PROG    20
 #define        IMPROPER 21
 #define        VARNT   22
 #define        PROG    20
 #define        IMPROPER 21
 #define        VARNT   22
+#define        FPROC   23
+#define        FFUNC   24
 
 /*
  * Clnames points to an array of names for the
 
 /*
  * Clnames points to an array of names for the
index 3177cf2..26b4b12 100644 (file)
@@ -1,22 +1,23 @@
-/* static      char sccsid[] = "@(#)OPnames.h 1.1 %G%"; */
+/* static      char sccsid[] = "@(#)OPnames.h 1.2 %G%"; */
 
 char   *otext[] = {
        0,
 
 char   *otext[] = {
        0,
-       " HALT",
-       " TRA4",
        " NODUMP",
        " BEG",
        " END",
        " CALL",
        " NODUMP",
        " BEG",
        " END",
        " CALL",
-       "*ABORT",
-       " PUSH",
-       " POP",
+       " FCALL",
+       " FRTN",
+       " FSAV",
        " SDUP2",
        " SDUP4",
        " SDUP2",
        " SDUP4",
-       " IF",
        " TRA",
        " TRA",
-       " LINO",
+       " TRA4",
        " GOTO",
        " GOTO",
+       " LINO",
+       " PUSH",
+       0,
+       " IF",
        " REL2",
        " REL4",
        " REL24",
        " REL2",
        " REL4",
        " REL24",
@@ -24,7 +25,6 @@ char  *otext[] = {
        " REL8",
        " RELG",
        " RELT",
        " REL8",
        " RELG",
        " RELT",
-       0,
        " REL28",
        " REL48",
        " REL82",
        " REL28",
        " REL48",
        " REL82",
@@ -148,7 +148,7 @@ char        *otext[] = {
        " STLIM",
        " LLIMIT",
        " BUFF",
        " STLIM",
        " LLIMIT",
        " BUFF",
-       0,
+       " HALT",
        0,
        0,
        0,
        0,
        0,
        0,
@@ -157,9 +157,9 @@ char        *otext[] = {
        "*CONG",
        "*CONC",
        "*CONC4",
        "*CONG",
        "*CONC",
        "*CONC4",
+       "*ABORT",
        " PXPBUF",
        " COUNT",
        " PXPBUF",
        " COUNT",
-       " TRACNT",
        0,
        " CASE1OP",
        " CASE2OP",
        0,
        " CASE1OP",
        " CASE2OP",
index 91e8993..e959d51 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)call.c 1.2 %G%";
+static char sccsid[] = "@(#)call.c 1.3 %G%";
 
 #include "whoami.h"
 #include "0.h"
 
 #include "whoami.h"
 #include "0.h"
@@ -12,6 +12,9 @@ static        char sccsid[] = "@(#)call.c 1.2 %G%";
 #   include "pcops.h"
 #endif PC
 
 #   include "pcops.h"
 #endif PC
 
+bool   slenflag = 0;
+bool   floatflag = 0;
+
 /*
  * Call generates code for calls to
  * user defined procedures and functions
 /*
  * Call generates code for calls to
  * user defined procedures and functions
@@ -29,6 +32,9 @@ call(p, argv, porf, psbn)
        register struct nl *p1, *q;
        int *r;
 
        register struct nl *p1, *q;
        int *r;
 
+#      ifdef OBJ
+           int         cnt;
+#      endif OBJ
 #      ifdef PC
            long        temp;
            int         firsttime;
 #      ifdef PC
            long        temp;
            int         firsttime;
@@ -36,6 +42,8 @@ call(p, argv, porf, psbn)
 #      endif PC
 
 #      ifdef OBJ
 #      endif PC
 
 #      ifdef OBJ
+           if (p->class == FFUNC || p->class == FPROC)
+               put(2, PTR_RV | cbn << 8+INDX, p->value[NL_OFFS]);
            if (porf == FUNC)
                    /*
                     * Push some space
            if (porf == FUNC)
                    /*
                     * Push some space
@@ -59,24 +67,45 @@ call(p, argv, porf, psbn)
                        putRV( 0 , cbn , temp , P2STRTY );
                }
            }
                        putRV( 0 , cbn , temp , P2STRTY );
                }
            }
-           {
-               char    extname[ BUFSIZ ];
-               char    *starthere;
-               int     funcbn;
-               int     i;
+           switch ( p -> class ) {
+               case FUNC:
+               case PROC:
+                   {
+                       char    extname[ BUFSIZ ];
+                       char    *starthere;
+                       int     funcbn;
+                       int     i;
 
 
-               starthere = &extname[0];
-               funcbn = p -> nl_block & 037;
-               for ( i = 1 ; i < funcbn ; i++ ) {
-                   sprintf( starthere , EXTFORMAT , enclosing[ i ] );
-                   starthere += strlen( enclosing[ i ] ) + 1;
-               }
-               sprintf( starthere , EXTFORMAT , p -> symbol );
-               starthere += strlen( p -> symbol ) + 1;
-               if ( starthere >= &extname[ BUFSIZ ] ) {
-                   panic( "call namelength" );
-               }
-               putleaf( P2ICON , 0 , 0 , p2type( p ) , extname );
+                       starthere = &extname[0];
+                       funcbn = p -> nl_block & 037;
+                       for ( i = 1 ; i < funcbn ; i++ ) {
+                           sprintf( starthere , EXTFORMAT , enclosing[ i ] );
+                           starthere += strlen( enclosing[ i ] ) + 1;
+                       }
+                       sprintf( starthere , EXTFORMAT , p -> symbol );
+                       starthere += strlen( p -> symbol ) + 1;
+                       if ( starthere >= &extname[ BUFSIZ ] ) {
+                           panic( "call namelength" );
+                       }
+                       putleaf( P2ICON , 0 , 0 , p2type( p ) , extname );
+                   }
+                   break;
+               case FFUNC:
+               case FPROC:
+                           /*
+                            *  start one of these:
+                            *  FRTN( frtn , ( *FCALL( frtn ) )(...args...) )
+                            */
+                       putleaf( P2ICON , 0 , 0 , p2type( p ) , "_FRTN" );
+                       putRV( 0 , cbn , p -> value[NL_OFFS] , P2PTR|P2STRTY );
+                       putleaf( P2ICON , 0 , 0
+                           , ADDTYPE( P2PTR , ADDTYPE( P2FTN , p2type( p ) ) )
+                           , "_FCALL" );
+                       putRV( 0 , cbn , p -> value[NL_OFFS] , P2PTR|P2STRTY );
+                       putop( P2CALL , p2type( p ) );
+                       break;
+               default:
+                       panic("call class");
            }
            firsttime = TRUE;
 #      endif PC
            }
            firsttime = TRUE;
 #      endif PC
@@ -84,116 +113,224 @@ call(p, argv, porf, psbn)
         * Loop and process each of
         * arguments to the proc/func.
         */
         * Loop and process each of
         * arguments to the proc/func.
         */
-       for (p1 = p->chain; p1 != NIL; p1 = p1->chain) {
-           if (argv == NIL) {
-                   error("Not enough arguments to %s", p->symbol);
-                   return (NIL);
-           }
-           switch (p1->class) {
-               case REF:
-                       /*
-                        * Var parameter
-                        */
-                       r = argv[1];
-                       if (r != NIL && r[0] != T_VAR) {
-                               error("Expression given (variable required) for var parameter %s of %s", p1->symbol, p->symbol);
-                               break;
-                       }
-                       q = lvalue( (int *) argv[1], MOD , LREQ );
-                       if (q == NIL)
-                               break;
-                       if (q != p1->type) {
-                               error("Parameter type not identical to type of var parameter %s of %s", p1->symbol, p->symbol);
-                               break;
-                       }
-                       break;
-               case VAR:
-                       /*
-                        * Value parameter
-                        */
+       if ( p -> class == FUNC || p -> class == PROC ) {
+           for (p1 = p->chain; p1 != NIL; p1 = p1->chain) {
+               if (argv == NIL) {
+                       error("Not enough arguments to %s", p->symbol);
+                       return (NIL);
+               }
+               switch (p1->class) {
+                   case REF:
+                           /*
+                            * Var parameter
+                            */
+                           r = argv[1];
+                           if (r != NIL && r[0] != T_VAR) {
+                                   error("Expression given (variable required) for var parameter %s of %s", p1->symbol, p->symbol);
+                                   break;
+                           }
+                           q = lvalue( (int *) argv[1], MOD , LREQ );
+                           if (q == NIL)
+                                   break;
+                           if (q != p1->type) {
+                                   error("Parameter type not identical to type of var parameter %s of %s", p1->symbol, p->symbol);
+                                   break;
+                           }
+                           break;
+                   case VAR:
+                           /*
+                            * Value parameter
+                            */
 #                      ifdef OBJ
 #                      ifdef OBJ
-                           q = rvalue(argv[1], p1->type , RREQ );
+                               q = rvalue(argv[1], p1->type , RREQ );
 #                      endif OBJ
 #                      ifdef PC
 #                      endif OBJ
 #                      ifdef PC
-                               /*
-                                * structure arguments require lvalues,
-                                * scalars use rvalue.
-                                */
-                           switch( classify( p1 -> type ) ) {
-                               case TFILE:
-                               case TARY:
-                               case TREC:
-                               case TSET:
-                               case TSTR:
-                                   q = rvalue( argv[1] , p1 -> type , LREQ );
-                                   break;
-                               case TINT:
-                               case TSCAL:
-                               case TBOOL:
-                               case TCHAR:
-                                   precheck( p1 -> type , "_RANG4" , "_RSNG4" );
-                                   q = rvalue( argv[1] , p1 -> type , RREQ );
-                                   postcheck( p1 -> type );
+                                   /*
+                                    * structure arguments require lvalues,
+                                    * scalars use rvalue.
+                                    */
+                               switch( classify( p1 -> type ) ) {
+                                   case TFILE:
+                                   case TARY:
+                                   case TREC:
+                                   case TSET:
+                                   case TSTR:
+                                       q = rvalue( argv[1] , p1 -> type , LREQ );
+                                       break;
+                                   case TINT:
+                                   case TSCAL:
+                                   case TBOOL:
+                                   case TCHAR:
+                                       precheck( p1 -> type , "_RANG4" , "_RSNG4" );
+                                       q = rvalue( argv[1] , p1 -> type , RREQ );
+                                       postcheck( p1 -> type );
+                                       break;
+                                   default:
+                                       q = rvalue( argv[1] , p1 -> type , RREQ );
+                                       if (  isa( p1 -> type  , "d" )
+                                          && isa( q , "i" ) ) {
+                                           putop( P2SCONV , P2DOUBLE );
+                                       }
+                                       break;
+                               }
+#                      endif PC
+                           if (q == NIL)
                                    break;
                                    break;
-                               default:
-                                   q = rvalue( argv[1] , p1 -> type , RREQ );
-                                   if (  isa( p1 -> type  , "d" )
-                                      && isa( q , "i" ) ) {
-                                       putop( P2SCONV , P2DOUBLE );
-                                   }
+                           if (incompat(q, p1->type, argv[1])) {
+                                   cerror("Expression type clashed with type of value parameter %s of %s", p1->symbol, p->symbol);
                                    break;
                            }
                                    break;
                            }
-#                      endif PC
-                       if (q == NIL)
-                               break;
-                       if (incompat(q, p1->type, argv[1])) {
-                               cerror("Expression type clashed with type of value parameter %s of %s", p1->symbol, p->symbol);
-                               break;
-                       }
 #                      ifdef OBJ
 #                      ifdef OBJ
-                           if (isa(p1->type, "bcsi"))
-                                   rangechk(p1->type, q);
-                           if (q->class != STR)
-                                   convert(q, p1->type);
+                               if (isa(p1->type, "bcsi"))
+                                       rangechk(p1->type, q);
+                               if (q->class != STR)
+                                       convert(q, p1->type);
 #                      endif OBJ
 #                      ifdef PC
 #                      endif OBJ
 #                      ifdef PC
-                           switch( classify( p1 -> type ) ) {
-                               case TFILE:
-                               case TARY:
-                               case TREC:
-                               case TSET:
-                               case TSTR:
-                                       putstrop( P2STARG
-                                           , p2type( p1 -> type )
-                                           , lwidth( p1 -> type )
-                                           , align( p1 -> type ) );
-                           }
+                               switch( classify( p1 -> type ) ) {
+                                   case TFILE:
+                                   case TARY:
+                                   case TREC:
+                                   case TSET:
+                                   case TSTR:
+                                           putstrop( P2STARG
+                                               , p2type( p1 -> type )
+                                               , lwidth( p1 -> type )
+                                               , align( p1 -> type ) );
+                               }
 #                      endif PC
 #                      endif PC
-                       break;
-               default:
-                       panic("call");
-           }
-#          ifdef PC
-                   /*
-                    *  if this is the nth (>1) argument,
-                    *  hang it on the left linear list of arguments
-                    */
-               if ( firsttime ) {
-                       firsttime = FALSE;
-               } else {
-                       putop( P2LISTOP , P2INT );
+                           break;
+                   case FFUNC:
+                           /*
+                            * function parameter
+                            */
+                           q = flvalue( (int *) argv[1] , FFUNC );
+                           if (q == NIL)
+                                   break;
+                           if (q != p1->type) {
+                                   error("Function type not identical to type of function parameter %s of %s", p1->symbol, p->symbol);
+                                   break;
+                           }
+                           break;
+                   case FPROC:
+                           /*
+                            * procedure parameter
+                            */
+                           q = flvalue( (int *) argv[1] , FPROC );
+                           if (q != NIL) {
+                                   error("Procedure parameter %s of %s cannot have a type", p1->symbol, p->symbol);
+                           }
+                           break;
+                   default:
+                           panic("call");
                }
                }
+#          ifdef PC
+                       /*
+                        *      if this is the nth (>1) argument,
+                        *      hang it on the left linear list of arguments
+                        */
+                   if ( firsttime ) {
+                           firsttime = FALSE;
+                   } else {
+                           putop( P2LISTOP , P2INT );
+                   }
 #          endif PC
 #          endif PC
-           argv = argv[2];
-       }
-       if (argv != NIL) {
-               error("Too many arguments to %s", p->symbol);
-               rvlist(argv);
-               return (NIL);
+               argv = argv[2];
+           }
+           if (argv != NIL) {
+                   error("Too many arguments to %s", p->symbol);
+                   rvlist(argv);
+                   return (NIL);
+           }
+       } else if ( p -> class == FFUNC || p -> class == FPROC ) {
+               /*
+                *      formal routines can only have by-value parameters.
+                *      this will lose for integer actuals passed to real
+                *      formals, and strings which people want blank padded.
+                */
+#          ifdef OBJ
+               cnt = 0;
+#          endif OBJ
+           for ( ; argv != NIL ; argv = argv[2] ) {
+#              ifdef OBJ
+                   q = rvalue(argv[1], NIL, RREQ );
+                   cnt += even(lwidth(q));
+#              endif OBJ
+#              ifdef PC
+                       /*
+                        * structure arguments require lvalues,
+                        * scalars use rvalue.
+                        */
+                   codeoff();
+                   p1 = rvalue( argv[1] , NIL , RREQ );
+                   codeon();
+                   switch( classify( p1 ) ) {
+                       case TSTR:
+                           if ( p1 -> class == STR && slenflag == 0 ) {
+                               if ( opt( 's' ) ) {
+                                   standard();
+                               } else {
+                                   warning();
+                               }
+                               error("Implementation can't construct equal length strings");
+                               slenflag++;
+                           }
+                           /* and fall through */
+                       case TFILE:
+                       case TARY:
+                       case TREC:
+                       case TSET:
+                           q = rvalue( argv[1] , p1 , LREQ );
+                           break;
+                       case TINT:
+                           if ( floatflag == 0 ) {
+                               if ( opt( 's' ) ) {
+                                   standard();
+                               } else {
+                                   warning();
+                               }
+                               error("Implementation can't coerice integer to real");
+                               floatflag++;
+                           }
+                           /* and fall through */
+                       case TSCAL:
+                       case TBOOL:
+                       case TCHAR:
+                       default:
+                           q = rvalue( argv[1] , p1 , RREQ );
+                           break;
+                   }
+                   switch( classify( p1 ) ) {
+                       case TFILE:
+                       case TARY:
+                       case TREC:
+                       case TSET:
+                       case TSTR:
+                               putstrop( P2STARG , p2type( p1 ) ,
+                                   lwidth( p1 ) , align( p1 ) );
+                   }
+                       /*
+                        *      if this is the nth (>1) argument,
+                        *      hang it on the left linear list of arguments
+                        */
+                   if ( firsttime ) {
+                           firsttime = FALSE;
+                   } else {
+                           putop( P2LISTOP , P2INT );
+                   }
+#              endif PC
+           }
+       } else {
+           panic("call class");
        }
 #      ifdef OBJ
        }
 #      ifdef OBJ
-           put2(O_CALL | psbn << 8+INDX, p->entloc);
-           put2(O_POP, p->value[NL_OFFS]-DPOFF2);
+           if ( p -> class == FFUNC || p -> class == FPROC ) {
+               put(2, PTR_RV | cbn << 8+INDX, p->value[NL_OFFS]);
+               put(2, O_FCALL, cnt);
+               put(2, O_FRTN, even(lwidth(p->type)));
+           } else {
+               put2(O_CALL | psbn << 8+INDX, p->entloc);
+           }
 #      endif OBJ
 #      ifdef PC
            if ( porf == FUNC ) {
 #      endif OBJ
 #      ifdef PC
            if ( porf == FUNC ) {
@@ -205,14 +342,18 @@ call(p, argv, porf, psbn)
                    case TSCAL:
                    case TDOUBLE:
                    case TPTR:
                    case TSCAL:
                    case TDOUBLE:
                    case TPTR:
-                       if ( p -> chain == NIL ) {
+                       if ( firsttime ) {
                                putop( P2UNARY P2CALL , rettype );
                        } else {
                                putop( P2CALL , rettype );
                        }
                                putop( P2UNARY P2CALL , rettype );
                        } else {
                                putop( P2CALL , rettype );
                        }
+                       if (p -> class == FFUNC || p -> class == FPROC ) {
+                           putop( P2LISTOP , P2INT );
+                           putop( P2CALL , rettype );
+                       }
                        break;
                    default:
                        break;
                    default:
-                       if ( p -> chain == NIL ) {
+                       if ( firsttime ) {
                                putstrop( P2UNARY P2STCALL
                                        , ADDTYPE( rettype , P2PTR )
                                        , lwidth( p -> type )
                                putstrop( P2UNARY P2STCALL
                                        , ADDTYPE( rettype , P2PTR )
                                        , lwidth( p -> type )
@@ -223,6 +364,10 @@ call(p, argv, porf, psbn)
                                        , lwidth( p -> type )
                                        , align( p -> type ) );
                        }
                                        , lwidth( p -> type )
                                        , align( p -> type ) );
                        }
+                       if (p -> class == FFUNC || p -> class == FPROC ) {
+                           putop( P2LISTOP , P2INT );
+                           putop( P2CALL , ADDTYPE( rettype , P2PTR ) );
+                       }
                        putstrop( P2STASG , rettype , lwidth( p -> type )
                                , align( p -> type ) );
                        putLV( 0 , cbn , temp , rettype );
                        putstrop( P2STASG , rettype , lwidth( p -> type )
                                , align( p -> type ) );
                        putLV( 0 , cbn , temp , rettype );
@@ -230,11 +375,15 @@ call(p, argv, porf, psbn)
                        break;
                }
            } else {
                        break;
                }
            } else {
-               if ( p -> chain == NIL ) {
+               if ( firsttime ) {
                        putop( P2UNARY P2CALL , P2INT );
                } else {
                        putop( P2CALL , P2INT );
                }
                        putop( P2UNARY P2CALL , P2INT );
                } else {
                        putop( P2CALL , P2INT );
                }
+               if (p -> class == FFUNC || p -> class == FPROC ) {
+                   putop( P2LISTOP , P2INT );
+                   putop( P2CALL , P2INT );
+               }
                putdot( filename , line );
            }
 #      endif PC
                putdot( filename , line );
            }
 #      endif PC
index d9579e3..3ba3a1c 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)fdec.c 1.3 %G%";
+static char sccsid[] = "@(#)fdec.c 1.4 %G%";
 
 #include "whoami.h"
 #include "0.h"
 
 #include "whoami.h"
 #include "0.h"
@@ -138,10 +138,10 @@ funchdr(r)
                            case TREC:
                            case TSET:
                            case TSTR:
                            case TREC:
                            case TSET:
                            case TSTR:
-                                   warning();
-                                   if (opt('s'))
+                                   if (opt('s')) {
                                            standard();
                                            standard();
-                                   error("Functions should not return %ss", clnames[o]);
+                                           error("Functions should not return %ss", clnames[o]);
+                                   }
                    }
 #                  ifdef PC
                        enclosing[ cbn ] = r[2];
                    }
 #                  ifdef PC
                        enclosing[ cbn ] = r[2];
@@ -256,9 +256,27 @@ funchdr(r)
 #                                          endif PC
                                            break;
                                    case T_PFUNC:
 #                                          endif PC
                                            break;
                                    case T_PFUNC:
+#                                          ifdef OBJ
+                                               dp = defnl(il[1], FFUNC, p, o -= sizeof ( int * ) );
+#                                          endif OBJ
+#                                          ifdef PC
+                                               dp = defnl( il[1] , FFUNC , p
+                                                       , o = roundup( o , A_STACK ) );
+                                               o += sizeof(char *);
+#                                          endif PC
+                                           dp -> nl_flags |= NMOD;
+                                           break;
                                    case T_PPROC:
                                    case T_PPROC:
-                                           error("Procedure/function parameters not implemented");
-                                           continue;
+#                                          ifdef OBJ
+                                               dp = defnl(il[1], FPROC, p, o -= sizeof ( int * ) );
+#                                          endif OBJ
+#                                          ifdef PC
+                                               dp = defnl( il[1] , FPROC , p
+                                                       , o = roundup( o , A_STACK ) );
+                                               o += sizeof(char *);
+#                                          endif PC
+                                           dp -> nl_flags |= NMOD;
+                                           break;
                                    }
                                if (dp != NIL) {
                                        cp->chain = dp;
                                    }
                                if (dp != NIL) {
                                        cp->chain = dp;
@@ -506,6 +524,11 @@ funcend(fp, bundle, endline)
         */
        var = put(2, (lenstr(fp->symbol,0) << 8)
                        | (cbn == 1 && opt('p') == 0 ? O_NODUMP: O_BEG), 0);
         */
        var = put(2, (lenstr(fp->symbol,0) << 8)
                        | (cbn == 1 && opt('p') == 0 ? O_NODUMP: O_BEG), 0);
+           /*
+            *  output the number of bytes of arguments
+            *  this is only checked on formal calls.
+            */
+       put(2, O_CASE4, cbn == 1 ? 0 : fp->value[NL_OFFS]-DPOFF2);
        put(2, O_CASE2, bundle[1]);
        putstr(fp->symbol, 0);
 #endif OBJ
        put(2, O_CASE2, bundle[1]);
        putstr(fp->symbol, 0);
 #endif OBJ
@@ -597,15 +620,30 @@ funcend(fp, bundle, endline)
             *  and zero them if checking is on
             *  by calling zframe( bytes of locals , highest local address );
             */
             *  and zero them if checking is on
             *  by calling zframe( bytes of locals , highest local address );
             */
-       if ( opt( 't' ) && ( -sizes[ cbn ].om_max ) > DPOFF1 ) {
-           putleaf( P2ICON , 0 , 0 , ADDTYPE( P2FTN | P2INT , P2PTR )
-                   , "_ZFRAME" );
-           putleaf( P2ICON ,  ( -sizes[ cbn ].om_max ) - DPOFF1
-                   , 0 , P2INT , 0 );
-           putLV( 0 , cbn , sizes[ cbn ].om_max , P2CHAR );
-           putop( P2LISTOP , P2INT );
-           putop( P2CALL , P2INT );
-           putdot( filename , line );
+       if ( opt( 't' ) ) {
+           if ( ( -sizes[ cbn ].om_max ) > DPOFF1 ) {
+               putleaf( P2ICON , 0 , 0 , ADDTYPE( P2FTN | P2INT , P2PTR )
+                       , "_ZFRAME" );
+               putleaf( P2ICON ,  ( -sizes[ cbn ].om_max ) - DPOFF1
+                       , 0 , P2INT , 0 );
+               putLV( 0 , cbn , sizes[ cbn ].om_max , P2CHAR );
+               putop( P2LISTOP , P2INT );
+               putop( P2CALL , P2INT );
+               putdot( filename , line );
+           }
+               /*
+                *  check number of longs of arguments
+                *  this can only be wrong for formal calls.
+                */
+           if ( fp -> class != PROG ) {
+                   putleaf( P2ICON , 0 , 0 , ADDTYPE( P2PTR , P2FTN | P2INT ) ,
+                           "_NARGCHK" );
+                   putleaf( P2ICON ,
+                       (fp->value[NL_OFFS] - DPOFF2) / sizeof(long) ,
+                       0 , P2INT , 0 );
+                   putop( P2CALL , P2INT );
+                   putdot( filename , line );
+           }
        }
 #endif PC
        if ( monflg ) {
        }
 #endif PC
        if ( monflg ) {
@@ -857,6 +895,8 @@ funcend(fp, bundle, endline)
            if ( fp -> class == FUNC ) {
                struct nl       *fvar = fp -> ptr[ NL_FVAR ];
                long            fvartype = p2type( fvar -> type );
            if ( fp -> class == FUNC ) {
                struct nl       *fvar = fp -> ptr[ NL_FVAR ];
                long            fvartype = p2type( fvar -> type );
+               long            label;
+               char            labelname[ BUFSIZ ];
 
                switch ( classify( fvar -> type ) ) {
                    case TBOOL:
 
                switch ( classify( fvar -> type ) ) {
                    case TBOOL:
@@ -869,8 +909,19 @@ funcend(fp, bundle, endline)
                                , fvar -> value[ NL_OFFS ] , fvartype );
                        break;
                    default:
                                , fvar -> value[ NL_OFFS ] , fvartype );
                        break;
                    default:
+                       label = getlab();
+                       sprintf( labelname , PREFIXFORMAT ,
+                               LABELPREFIX , label );
+                       putprintf( "    .data" , 0 );
+                       putprintf( "    .lcomm  %s,%d" , 0 ,
+                                   labelname , lwidth( fvar -> type ) );
+                       putprintf( "    .text" , 0 );
+                       putRV( labelname , 0 , 0 , fvartype );
                        putLV( fvar -> symbol , ( fvar -> nl_block ) & 037
                                , fvar -> value[ NL_OFFS ] , fvartype );
                        putLV( fvar -> symbol , ( fvar -> nl_block ) & 037
                                , fvar -> value[ NL_OFFS ] , fvartype );
+                       putstrop( P2STASG , fvartype , lwidth( fvar -> type ) ,
+                               align( fvar -> type ) );
+                       putLV( labelname , 0 , 0 , fvartype );
                        break;
                }
                putop( P2FORCE , fvartype );
                        break;
                }
                putop( P2FORCE , fvartype );
index a2fcd74..2b1e49a 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1980 Regents of the University of California */
 
 /* Copyright (c) 1980 Regents of the University of California */
 
-static char sccsid[] = "@(#)flvalue.c 1.1 %G%";
+static char sccsid[] = "@(#)flvalue.c 1.2 %G%";
 
 #include "whoami.h"
 #include "0.h"
 
 #include "whoami.h"
 #include "0.h"
@@ -11,6 +11,15 @@ static       char sccsid[] = "@(#)flvalue.c 1.1 %G%";
 #   include "pc.h"
 #   include "pcops.h"
 #endif PC
 #   include "pc.h"
 #   include "pcops.h"
 #endif PC
+#ifdef OBJ
+/*
+ * define the display structure for purposes of allocating
+ * a temporary
+ */
+struct dispsave {
+       char    *ptr;
+};
+#endif OBJ
 
     /*
      * flvalue generates the code to either pass on a formal routine,
 
     /*
      * flvalue generates the code to either pass on a formal routine,
@@ -18,34 +27,35 @@ static      char sccsid[] = "@(#)flvalue.c 1.1 %G%";
      * it tells the difference by looking at the tree it's given.
      */
 struct nl *
      * it tells the difference by looking at the tree it's given.
      */
 struct nl *
-flvalue( r )
-    int        *r;
+flvalue( r , formalp )
+    int                *r;
+    struct nl  *formalp;
     {
        struct nl       *p;
        long            tempoff;
     {
        struct nl       *p;
        long            tempoff;
+       char            *typename;
 
        if ( r == NIL ) {
            return NIL;
        }
 
        if ( r == NIL ) {
            return NIL;
        }
+       typename = formalp -> class == FFUNC ? "function":"procedure";
+       if ( r[0] != T_VAR ) {
+           error("Expression given, %s required for %s parameter %s" ,
+                   typename , typename , formalp -> symbol );
+           return NIL;
+       }
        p = lookup(r[2]);
        if (p == NIL) {
        p = lookup(r[2]);
        if (p == NIL) {
-               return NIL;
+           return NIL;
        }
        }
-       switch ( r[0] ) {
-           case T_FFUNC:
-                   if ( r[3] != NIL ) {
-                       error("Formal function %s cannot be qualified" ,
-                               p -> symbol );
-                       return NIL;
-                   }
-                   goto froutine;
-           case T_FPROC:
+       switch ( p -> class ) {
+           case FFUNC:
+           case FPROC:
                    if ( r[3] != NIL ) {
                    if ( r[3] != NIL ) {
-                       error("Formal procedure %s cannot be qualified" ,
-                               p -> symbol );
+                       error("Formal %s %s cannot be qualified" ,
+                               typename , p -> symbol );
                        return NIL;
                    }
                        return NIL;
                    }
-           froutine:
 #                  ifdef OBJ
                        put( 2 , PTR_RV | bn << 8+INDX , p -> value[NL_OFFS] );
 #                  endif OBJ
 #                  ifdef OBJ
                        put( 2 , PTR_RV | bn << 8+INDX , p -> value[NL_OFFS] );
 #                  endif OBJ
@@ -54,18 +64,18 @@ flvalue( r )
                                p2type( p ) );
 #                  endif PC
                    return p -> type;
                                p2type( p ) );
 #                  endif PC
                    return p -> type;
-           case T_FUNC:
+           case FUNC:
+           case PROC:
                    if ( r[3] != NIL ) {
                    if ( r[3] != NIL ) {
-                       error("Function %s cannot be qualified" , p -> symbol );
+                       error("%s %s cannot be qualified" , typename ,
+                               p -> symbol );
                        return NIL;
                    }
                        return NIL;
                    }
-                   goto routine;
-           case T_PROC:
-                   if ( r[3] != NIL ) {
-                       error("Procedure %s cannot be qualified", p -> symbol );
+                   if (bn == 0) {
+                       error("Built-in %s %s cannot be passed as a parameter" ,
+                               typename , p -> symbol );
                        return NIL;
                    }
                        return NIL;
                    }
-           routine:
                        /*
                         *      formal routine structure:
                         *
                        /*
                         *      formal routine structure:
                         *
@@ -75,7 +85,7 @@ flvalue( r )
                         *              struct dispsave disp[2*MAXLVL];
                         *      };
                         */
                         *              struct dispsave disp[2*MAXLVL];
                         *      };
                         */
-                   sizes[ cbn ].om_off -=        sizeof (long (*()))
+                   sizes[ cbn ].om_off -=        sizeof (long (*)())
                                                + sizeof (long)
                                                + 2*bn*sizeof (struct dispsave);
                    tempoff = sizes[ cbn ].om_off;
                                                + sizeof (long)
                                                + 2*bn*sizeof (struct dispsave);
                    tempoff = sizes[ cbn ].om_off;
@@ -83,13 +93,13 @@ flvalue( r )
                        sizes[ cbn ].om_max = tempoff;
                    }
 #                  ifdef OBJ
                        sizes[ cbn ].om_max = tempoff;
                    }
 #                  ifdef OBJ
-                       put( 2 , PTR_LV | cbn << 8 + INDX , tempoff );
+                       put( 2 , O_LV | cbn << 8 + INDX , tempoff );
                        put( 2 , O_FSAV | bn << 8 + INDX , p -> entloc );
 #                  endif OBJ
 #                  ifdef PC
                        putlbracket( ftnno , -tempoff );
                        putleaf( P2ICON , 0 , 0 ,
                        put( 2 , O_FSAV | bn << 8 + INDX , p -> entloc );
 #                  endif OBJ
 #                  ifdef PC
                        putlbracket( ftnno , -tempoff );
                        putleaf( P2ICON , 0 , 0 ,
-                           ADDTYPE( P2PTR , ADDTYPE( P2FTN , P2PTR|P2STR ) ) ,
+                           ADDTYPE( P2PTR , ADDTYPE( P2FTN , P2PTR|P2STRTY ) ) ,
                            "_FSAV" );
                        {
                            char        extname[ BUFSIZ ];
                            "_FSAV" );
                        {
                            char        extname[ BUFSIZ ];
@@ -110,12 +120,14 @@ flvalue( r )
                        }
                        putleaf( P2ICON , bn , 0 , P2INT , 0 );
                        putop( P2LISTOP , P2INT );
                        }
                        putleaf( P2ICON , bn , 0 , P2INT , 0 );
                        putop( P2LISTOP , P2INT );
-                       putLV( 0 , cbn , tempoff , P2STR );
+                       putLV( 0 , cbn , tempoff , P2STRTY );
                        putop( P2LISTOP , P2INT );
                        putop( P2CALL , P2PTR | P2STRTY );
 #                  endif PC
                    return p -> type;
            default:
                        putop( P2LISTOP , P2INT );
                        putop( P2CALL , P2PTR | P2STRTY );
 #                  endif PC
                    return p -> type;
            default:
-                   panic("flvalue");
+                   error("Variable given, %s required for %s parameter %s" ,
+                           typename , typename , formalp -> symbol );
+                   return NIL;
        }
     }
        }
     }
index 13db1a0..4366e56 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)func.c 1.1 %G%";
+static char sccsid[] = "@(#)func.c 1.2 %G%";
 
 #include "whoami.h"
 #ifdef OBJ
 
 #include "whoami.h"
 #ifdef OBJ
@@ -39,7 +39,7 @@ funccod(r)
                rvlist(r[3]);
                return (NIL);
        }
                rvlist(r[3]);
                return (NIL);
        }
-       if (p->class != FUNC) {
+       if (p->class != FUNC && p->class != FFUNC) {
                error("%s is not a function", p->symbol);
                rvlist(r[3]);
                return (NIL);
                error("%s is not a function", p->symbol);
                rvlist(r[3]);
                return (NIL);
index bbe5a6b..380a92c 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)nl.c 1.1 %G%";
+static char sccsid[] = "@(#)nl.c 1.2 %G%";
 
 #include "whoami.h"
 #include "0.h"
 
 #include "whoami.h"
 #include "0.h"
@@ -439,10 +439,10 @@ char      *classes[ ] = {
        "scalar",
        "string",
        "program",
        "scalar",
        "string",
        "program",
-       "improper"
-#ifdef DEBUG
-       ,"variant"
-#endif
+       "improper",
+       "variant",
+       "formal procedure",
+       "formal function"
 };
 
 char   *snark  = "SNARK";
 };
 
 char   *snark  = "SNARK";
@@ -473,7 +473,9 @@ char        *ctext[] =
        "STR",
        "PROG",
        "IMPROPER",
        "STR",
        "PROG",
        "IMPROPER",
-       "VARNT"
+       "VARNT",
+       "FPROC",
+       "FFUNC"
 };
 
 char   *stars  = "\t***";
 };
 
 char   *stars  = "\t***";
@@ -564,6 +566,8 @@ con:
                        case VAR:
                        case REF:
                        case WITHPTR:
                        case VAR:
                        case REF:
                        case WITHPTR:
+                       case FFUNC:
+                       case FPROC:
                                printf("\t%d,%d", cbn, v);
                                break;
                        case SCAL:
                                printf("\t%d,%d", cbn, v);
                                break;
                        case SCAL:
index 5eca62b..bff16f4 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)p2put.c 1.1 %G%";
+static char sccsid[] = "@(#)p2put.c 1.2 %G%";
 
     /*
      * functions to help pi put out
 
     /*
      * functions to help pi put out
@@ -452,6 +452,13 @@ p2type( np )
                     * which return integers (whether you look at them or not)
                     */
                return ADDTYPE( ADDTYPE( P2INT , P2FTN ) , P2PTR );
                     * which return integers (whether you look at them or not)
                     */
                return ADDTYPE( ADDTYPE( P2INT , P2FTN ) , P2PTR );
+           case FFUNC :
+           case FPROC :
+                   /*
+                    *  formal procedures and functions are pointers
+                    *  to structures which describe their environment.
+                    */
+               return ADDTYPE( P2PTR , P2STRTY );
            default :
                fprintf( stderr , "[p2type] np -> class %d\n" , np -> class );
                panic( "p2type" );
            default :
                fprintf( stderr , "[p2type] np -> class %d\n" , np -> class );
                panic( "p2type" );
index c6423a9..3f58732 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)pcfunc.c 1.1 %G%";
+static char sccsid[] = "@(#)pcfunc.c 1.2 %G%";
 
 #include "whoami.h"
 #ifdef PC
 
 #include "whoami.h"
 #ifdef PC
@@ -45,7 +45,7 @@ pcfunccod( r )
                rvlist(r[3]);
                return (NIL);
        }
                rvlist(r[3]);
                return (NIL);
        }
-       if (p->class != FUNC) {
+       if (p->class != FUNC && p->class != FFUNC) {
                error("%s is not a function", p->symbol);
                rvlist(r[3]);
                return (NIL);
                error("%s is not a function", p->symbol);
                rvlist(r[3]);
                return (NIL);
index b8d6c12..4303019 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)pcproc.c 1.1 %G%";
+static char sccsid[] = "@(#)pcproc.c 1.2 %G%";
 
 #include "whoami.h"
 #ifdef PC
 
 #include "whoami.h"
 #ifdef PC
@@ -72,7 +72,7 @@ pcproc(r)
                rvlist(r[3]);
                return;
        }
                rvlist(r[3]);
                return;
        }
-       if (p->class != PROC) {
+       if (p->class != PROC && p->class != FPROC) {
                error("Can't call %s, its %s not a procedure", p->symbol, classes[p->class]);
                rvlist(r[3]);
                return;
                error("Can't call %s, its %s not a procedure", p->symbol, classes[p->class]);
                rvlist(r[3]);
                return;
index 9ce870d..24ce638 100644 (file)
@@ -1,22 +1,23 @@
-SCCSID = "@(#)pimakefile 1.8 %G%"
+SCCSID = "@(#)pimakefile 1.9 %G%"
 
 MKSTR = /usr/ucb/mkstr
 EYACC = /usr/ucb/eyacc
 RM = -rm -f
 
 MKSTR = /usr/ucb/mkstr
 EYACC = /usr/ucb/eyacc
 RM = -rm -f
-GET = sccs get
+GET = sccs -d${SRCDIR} get
 
 CFLAGS = -O -w
 LDFLAGS = -z
 
 
 CFLAGS = -O -w
 LDFLAGS = -z
 
-INSTALLDIR = /usr/lib
+SRCDIR = /usr/src/cmd/pc0
+INSTALLDIR = /usr/ucb
 LIBDIR = /usr/lib
 TMPDIR = tmp
 
 LIBDIR = /usr/lib
 TMPDIR = tmp
 
-ERRORSTRINGS = pc2.0strings
+ERRORSTRINGS = pi2.0strings
 
 SRCS = ato.c \
        call.c case.c clas.c const.c conv.c cset.c \
 
 SRCS = ato.c \
        call.c case.c clas.c const.c conv.c cset.c \
-       error.c fdec.c func.c gen.c hash.c \
+       error.c fdec.c flvalue.c func.c gen.c hash.c \
        lab.c lookup.c lval.c stklval.c \
        main.c nl.c proc.c put.c \
        rec.c rval.c stkrval.c\
        lab.c lookup.c lval.c stklval.c \
        main.c nl.c proc.c put.c \
        rec.c rval.c stkrval.c\
@@ -25,17 +26,16 @@ SRCS =      ato.c \
        TRdata.c \
        treen.c putn.c yycopy.c \
        yycosts.c yyerror.c yyget.c yyid.c yylex.c yymain.c yyoptions.c \
        TRdata.c \
        treen.c putn.c yycopy.c \
        yycosts.c yyerror.c yyget.c yyid.c yylex.c yymain.c yyoptions.c \
-       yypanic.c yyparse.c yyprint.c yyput.c yyrecover.c yyseman.c yytree.c \
-       p2put.c pcforop.c stab.c pcproc.c pcfunc.c pccaseop.c pclval.c
+       yypanic.c yyparse.c yyprint.c yyput.c yyrecover.c yyseman.c yytree.c
 
 
-HDRS = 0.h OPnames.h align.h iorec.h objfmt.h pstab.h pc.h pcops.h \
-       send.h tree.h whoami.h yy.h
+HDRS = 0.h OPnames.h align.h iorec.h objfmt.h send.h tree.h yy.h \
+       pc.h pcops.h
 
 OTHERS = pas.y opc.c version.c gram pic.c
 
 OBJS = ato.o \
        call.o case.o clas.o const.o conv.o cset.o \
 
 OTHERS = pas.y opc.c version.c gram pic.c
 
 OBJS = ato.o \
        call.o case.o clas.o const.o conv.o cset.o \
-       error.o fdec.o func.o gen.o hash.o \
+       error.o fdec.o flvalue.o func.o gen.o hash.o \
        lab.o lookup.o lval.o stklval.o \
        main.o nl.o proc.o put.o \
        rec.o rval.o stkrval.o\
        lab.o lookup.o lval.o stklval.o \
        main.o nl.o proc.o put.o \
        rec.o rval.o stkrval.o\
@@ -45,14 +45,13 @@ OBJS =      ato.o \
        treen.o putn.o yycopy.o \
        y.tab.o \
        yycosts.o yyerror.o yyget.o yyid.o yylex.o yymain.o yyoptions.o \
        treen.o putn.o yycopy.o \
        y.tab.o \
        yycosts.o yyerror.o yyget.o yyid.o yylex.o yymain.o yyoptions.o \
-       yypanic.o yyparse.o yyprint.o yyput.o yyrecover.o yyseman.o yytree.o \
-       p2put.o pcforop.o stab.o pcproc.o pcfunc.o pccaseop.o pclval.o
+       yypanic.o yyparse.o yyprint.o yyput.o yyrecover.o yyseman.o yytree.o
 
 a.out: ${OBJS} version
        ./version > Version.c
        ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} Version.c
 
 
 a.out: ${OBJS} version
        ./version > Version.c
        ${CC} ${CFLAGS} ${LDFLAGS} ${OBJS} Version.c
 
-sources: ${SRCS} ${HDRS} ${OTHERS}
+sources: whoami.h ${SRCS} ${HDRS} ${OTHERS}
        
 ${SRCS} ${HDRS} ${OTHERS}:
        ${GET} ${REL} $@
        
 ${SRCS} ${HDRS} ${OTHERS}:
        ${GET} ${REL} $@
@@ -63,6 +62,10 @@ ${SRCS} ${HDRS} ${OTHERS}:
        cd ${TMPDIR} ; ${CC} ${CFLAGS} -I.. -c $*.c ; mv $*.o  ../$*.o
        ${RM} ${TMPDIR}/$*.c
 
        cd ${TMPDIR} ; ${CC} ${CFLAGS} -I.. -c $*.c ; mv $*.o  ../$*.o
        ${RM} ${TMPDIR}/$*.c
 
+whoami.h:
+       ${GET} ${REL} piwhoami.h
+       mv piwhoami.h whoami.h
+
 y.tab.h: pas.y gram
        ${EYACC} pas.y > /dev/null
        ex - y.tab.c <gram
 y.tab.h: pas.y gram
        ${EYACC} pas.y > /dev/null
        ex - y.tab.c <gram
@@ -81,7 +84,7 @@ version: version.c
 
 clean:
        ${RM} *.o ${TMPDIR}/*.c
 
 clean:
        ${RM} *.o ${TMPDIR}/*.c
-       ${RM} y.tab.h y.tab.c y.tab.out
+       ${RM} whoami.h y.tab.h y.tab.c y.tab.out
        ${RM} ${ERRORSTRINGS}
        ${RM} version Version.c
        ${RM} a.out core *.list *.bak
        ${RM} ${ERRORSTRINGS}
        ${RM} version Version.c
        ${RM} a.out core *.list *.bak
@@ -96,15 +99,14 @@ print:      sources
        @rm pic
        @pr 0.h whoami.h main.c pas.y
        @pr OPnames.h opcode.h tree.h
        @rm pic
        @pr 0.h whoami.h main.c pas.y
        @pr OPnames.h opcode.h tree.h
-       @pr pc.h
        @pr [a-ln-x]*.c
        @pr yy.h yy*.c
 
 install: a.out
        sccs check
        cp ${ERRORSTRINGS} ${LIBDIR}/${ERRORSTRINGS}
        @pr [a-ln-x]*.c
        @pr yy.h yy*.c
 
 install: a.out
        sccs check
        cp ${ERRORSTRINGS} ${LIBDIR}/${ERRORSTRINGS}
-       cp ${INSTALLDIR}/pc0 ${INSTALLDIR}/pc0.bak
-       cp a.out ${INSTALLDIR}/pc0
+       cp ${INSTALLDIR}/pi ${INSTALLDIR}/pi.bak
+       cp a.out ${INSTALLDIR}/pi
 
 depend:        sources
        /bin/grep '^#[  ]*include' *.h \
 
 depend:        sources
        /bin/grep '^#[  ]*include' *.h \
@@ -171,6 +173,13 @@ fdec.o: objfmt.h
 fdec.o: align.h
 fdec.o: pc.h
 fdec.o: pcops.h
 fdec.o: align.h
 fdec.o: pc.h
 fdec.o: pcops.h
+flvalue.o: whoami.h
+flvalue.o: 0.h
+flvalue.o: tree.h
+flvalue.o: opcode.h
+flvalue.o: objfmt.h
+flvalue.o: pc.h
+flvalue.o: pcops.h
 func.o: whoami.h
 func.o: 0.h
 func.o: tree.h
 func.o: whoami.h
 func.o: 0.h
 func.o: tree.h
@@ -208,41 +217,6 @@ nl.o: 0.h
 nl.o: opcode.h
 nl.o: objfmt.h
 opc.o: OPnames.h
 nl.o: opcode.h
 nl.o: objfmt.h
 opc.o: OPnames.h
-p2put.o: whoami.h
-p2put.o: 0.h
-p2put.o: pcops.h
-p2put.o: pc.h
-pccaseop.o: whoami.h
-pccaseop.o: 0.h
-pccaseop.o: tree.h
-pccaseop.o: objfmt.h
-pccaseop.o: pcops.h
-pccaseop.o: pc.h
-pcforop.o: whoami.h
-pcforop.o: 0.h
-pcforop.o: opcode.h
-pcforop.o: tree.h
-pcforop.o: pc.h
-pcforop.o: pcops.h
-pcfunc.o: whoami.h
-pcfunc.o: 0.h
-pcfunc.o: tree.h
-pcfunc.o: opcode.h
-pcfunc.o: pc.h
-pcfunc.o: pcops.h
-pclval.o: whoami.h
-pclval.o: 0.h
-pclval.o: tree.h
-pclval.o: opcode.h
-pclval.o: objfmt.h
-pclval.o: pc.h
-pclval.o: pcops.h
-pcproc.o: whoami.h
-pcproc.o: 0.h
-pcproc.o: tree.h
-pcproc.o: opcode.h
-pcproc.o: pc.h
-pcproc.o: pcops.h
 pic.o: OPnames.h
 proc.o: whoami.h
 proc.o: 0.h
 pic.o: OPnames.h
 proc.o: whoami.h
 proc.o: 0.h
@@ -266,10 +240,6 @@ rval.o: opcode.h
 rval.o: objfmt.h
 rval.o: pc.h
 rval.o: pcops.h
 rval.o: objfmt.h
 rval.o: pc.h
 rval.o: pcops.h
-stab.o: whoami.h
-stab.o: 0.h
-stab.o: pstab.h
-stab.o: pc.h
 stat.o: whoami.h
 stat.o: 0.h
 stat.o: tree.h
 stat.o: whoami.h
 stat.o: 0.h
 stat.o: tree.h
index 5076f8c..61180fe 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)proc.c 1.1 %G%";
+static char sccsid[] = "@(#)proc.c 1.2 %G%";
 
 #include "whoami.h"
 #ifdef OBJ
 
 #include "whoami.h"
 #ifdef OBJ
@@ -68,7 +68,7 @@ proc(r)
                rvlist(r[3]);
                return;
        }
                rvlist(r[3]);
                return;
        }
-       if (p->class != PROC) {
+       if (p->class != PROC && p->class != FPROC) {
                error("Can't call %s, its %s not a procedure", p->symbol, classes[p->class]);
                rvlist(r[3]);
                return;
                error("Can't call %s, its %s not a procedure", p->symbol, classes[p->class]);
                rvlist(r[3]);
                return;
index 6075c76..f8d39fb 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)put.c 1.2 %G%";
+static char sccsid[] = "@(#)put.c 1.3 %G%";
 
 #include "whoami.h"
 #include "opcode.h"
 
 #include "whoami.h"
 #include "opcode.h"
@@ -86,6 +86,7 @@ put(a)
                case O_CASE1OP:
                case O_CASE2OP:
                case O_CASE4OP:
                case O_CASE1OP:
                case O_CASE2OP:
                case O_CASE4OP:
+               case O_FRTN:
                case O_WRITES:
                case O_WRITEF:
                case O_MAX:
                case O_WRITES:
                case O_WRITEF:
                case O_MAX:
@@ -241,7 +242,10 @@ around:
 #endif
                        word( ( short ) *( ( long * ) &p[1] ) );
                        return (oldlc);
 #endif
                        word( ( short ) *( ( long * ) &p[1] ) );
                        return (oldlc);
-               case O_POP:
+               case O_FCALL:
+                       if (p[1] == 0)
+                               goto longgen;
+                       /* and fall through */
                case O_PUSH:
                        if (p[1] == 0)
                                return (oldlc);
                case O_PUSH:
                        if (p[1] == 0)
                                return (oldlc);
@@ -254,8 +258,8 @@ around:
                        goto longgen;
                case O_TRA4:
                case O_CALL:
                        goto longgen;
                case O_TRA4:
                case O_CALL:
+               case O_FSAV:
                case O_GOTO:
                case O_GOTO:
-               case O_TRACNT:
                case O_NAM:
                case O_READE:
                        /* absolute long addressing */
                case O_NAM:
                case O_READE:
                        /* absolute long addressing */
index 8c46f6c..9f481ff 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)rval.c 1.1 %G%";
+static char sccsid[] = "@(#)rval.c 1.2 %G%";
 
 #include "whoami.h"
 #include "0.h"
 
 #include "whoami.h"
 #include "0.h"
@@ -304,6 +304,7 @@ cstrng:
                            return (q);
 
                    case FUNC:
                            return (q);
 
                    case FUNC:
+                   case FFUNC:
                            /*
                             * Function call with no arguments.
                             */
                            /*
                             * Function call with no arguments.
                             */
@@ -323,6 +324,7 @@ cstrng:
                            return (NIL);
 
                    case PROC:
                            return (NIL);
 
                    case PROC:
+                   case FPROC:
                            error("Procedure %s found where expression required", p->symbol);
                            return (NIL);
                    default:
                            error("Procedure %s found where expression required", p->symbol);
                            return (NIL);
                    default:
index 5617bf9..f6dc44d 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)stkrval.c 1.2 %G%";
+static char sccsid[] = "@(#)stkrval.c 1.3 %G%";
 
 #include "whoami.h"
 #include "0.h"
 
 #include "whoami.h"
 #include "0.h"
@@ -232,6 +232,7 @@ cstrng:
 #                      endif PC
 
                case FUNC:
 #                      endif PC
 
                case FUNC:
+               case FFUNC:
                        /*
                         * Function call
                         */
                        /*
                         * Function call
                         */
@@ -271,6 +272,7 @@ cstrng:
                        return (NIL);
 
                case PROC:
                        return (NIL);
 
                case PROC:
+               case FPROC:
                        error("Procedure %s found where expression required", p->symbol);
                        return (NIL);
                default:
                        error("Procedure %s found where expression required", p->symbol);
                        return (NIL);
                default:
index 3a13ac7..efed35d 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)yyid.c 1.1 %G%";
+static char sccsid[] = "@(#)yyid.c 1.2 %G%";
 
 #include "whoami.h"
 #include "0.h"
 
 #include "whoami.h"
 #include "0.h"
@@ -106,7 +106,9 @@ yybadref(p, line)
        p->chain = udp;
 }
 
        p->chain = udp;
 }
 
-#define        varkinds        ((1<<CONST)|(1<<VAR)|(1<<REF)|(1<<ARRAY)|(1<<PTR)|(1<<RECORD)|(1<<FIELD)|(1<<FUNC)|(1<<FVAR))
+#define        varkinds        ((1<<CONST)|(1<<VAR)|(1<<REF)|(1<<ARRAY)|(1<<PTR) \
+                       |(1<<RECORD)|(1<<FIELD)|(1<<FUNC)|(1<<FVAR) \
+                       |(1<<FFUNC)|(1<<PROC)|(1<<FPROC))
 /*
  * Is the symbol in the p entry of the namelist
  * even possibly a kind kind?  If not, update
 /*
  * Is the symbol in the p entry of the namelist
  * even possibly a kind kind?  If not, update
@@ -139,11 +141,13 @@ yyidok1(p, kind)
 
        switch (kind) {
                case FUNC:
 
        switch (kind) {
                case FUNC:
-                       if (p->class == FVAR)
-                               return(1);
+                       return (   p -> class == FUNC
+                               || p -> class == FVAR
+                               || p -> class == FFUNC );
+               case PROC:
+                       return ( p -> class == PROC || p -> class == FPROC );
                case CONST:
                case TYPE:
                case CONST:
                case TYPE:
-               case PROC:
                case FIELD:
                        return (p->class == kind);
                case VAR:
                case FIELD:
                        return (p->class == kind);
                case VAR:
@@ -171,7 +175,11 @@ yyisvar(p, class)
                 * parameterless functions only.
                 */
                case FUNC:
                 * parameterless functions only.
                 */
                case FUNC:
+               case FFUNC:
                        return (class == NIL || (p->type != NIL && p->type->class == class));
                        return (class == NIL || (p->type != NIL && p->type->class == class));
+               case PROC:
+               case FPROC:
+                       return ( class == NIL );
        }
        return (0);
 }
        }
        return (0);
 }