BSD 4_3 release
[unix-history] / usr / src / ucb / pascal / src / const.c
index 4f5f980..23bc14e 100644 (file)
@@ -1,10 +1,17 @@
-/* Copyright (c) 1979 Regents of the University of California */
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
 
 
-static char sccsid[] = "@(#)const.c 1.5 8/29/82";
+#ifndef lint
+static char sccsid[] = "@(#)const.c    5.2 (Berkeley) 6/21/85";
+#endif not lint
 
 #include "whoami.h"
 #include "0.h"
 #include "tree.h"
 
 #include "whoami.h"
 #include "0.h"
 #include "tree.h"
+#include "tree_ty.h"
 
 /*
  * Const enters the definitions
 
 /*
  * Const enters the definitions
@@ -12,7 +19,7 @@ static        char sccsid[] = "@(#)const.c 1.5 8/29/82";
  * part into the namelist.
  */
 #ifndef PI1
  * part into the namelist.
  */
 #ifndef PI1
-constbeg( lineofyconst , r )
+constbeg( lineofyconst )
     int        lineofyconst;
 {
     static bool        const_order = FALSE;
     int        lineofyconst;
 {
     static bool        const_order = FALSE;
@@ -60,7 +67,7 @@ constbeg( lineofyconst , r )
 const(cline, cid, cdecl)
        int cline;
        register char *cid;
 const(cline, cid, cdecl)
        int cline;
        register char *cid;
-       register int *cdecl;
+       register struct tnode *cdecl;
 {
        register struct nl *np;
 
 {
        register struct nl *np;
 
@@ -94,11 +101,16 @@ const(cline, cid, cdecl)
        if (con.ctype == NIL)
                return;
        if ( con.ctype == nl + TSTR )
        if (con.ctype == NIL)
                return;
        if ( con.ctype == nl + TSTR )
-               np->ptr[0] = con.cpval;
+               np->ptr[0] = (struct nl *) con.cpval;
        if (isa(con.ctype, "i"))
                np->range[0] = con.crval;
        else if (isa(con.ctype, "d"))
                np->real = con.crval;
        if (isa(con.ctype, "i"))
                np->range[0] = con.crval;
        else if (isa(con.ctype, "d"))
                np->real = con.crval;
+#       ifdef PC
+           if (cbn == 1 && con.ctype != NIL) {
+                   stabconst(np);
+           }
+#       endif
 }
 
 #ifndef PI0
 }
 
 #ifndef PI0
@@ -119,36 +131,36 @@ constend()
  * and scalars, the first two
  * being possibly signed.
  */
  * and scalars, the first two
  * being possibly signed.
  */
-gconst(r)
-       int *r;
+gconst(c_node)
+       struct tnode *c_node;
 {
        register struct nl *np;
 {
        register struct nl *np;
-       register *cn;
+       register struct tnode *cn;
        char *cp;
        int negd, sgnd;
        long ci;
 
        con.ctype = NIL;
        char *cp;
        int negd, sgnd;
        long ci;
 
        con.ctype = NIL;
-       cn = r;
+       cn = c_node;
        negd = sgnd = 0;
 loop:
        negd = sgnd = 0;
 loop:
-       if (cn == NIL || cn[1] == NIL)
-               return (NIL);
-       switch (cn[0]) {
+       if (cn == TR_NIL || cn->sign_const.number == TR_NIL)
+               return;
+       switch (cn->tag) {
                default:
                        panic("gconst");
                case T_MINUSC:
                        negd = 1 - negd;
                case T_PLUSC:
                        sgnd++;
                default:
                        panic("gconst");
                case T_MINUSC:
                        negd = 1 - negd;
                case T_PLUSC:
                        sgnd++;
-                       cn = cn[1];
+                       cn = cn->sign_const.number;
                        goto loop;
                case T_ID:
                        goto loop;
                case T_ID:
-                       np = lookup(cn[1]);
-                       if (np == NIL)
+                       np = lookup(cn->char_const.cptr);
+                       if (np == NLNIL)
                                return;
                        if (np->class != CONST) {
                                return;
                        if (np->class != CONST) {
-                               derror("%s is a %s, not a constant as required", cn[1], classes[np->class]);
+                               derror("%s is a %s, not a constant as required", cn->char_const.cptr, classes[np->class]);
                                return;
                        }
                        con.ctype = np->type;
                                return;
                        }
                        con.ctype = np->type;
@@ -166,7 +178,7 @@ loop:
                                        con.crval = con.cival;
                                        break;
                                case TSTR:
                                        con.crval = con.cival;
                                        break;
                                case TSTR:
-                                       con.cpval = np->ptr[0];
+                                       con.cpval = (char *) np->ptr[0];
                                        break;
                                case NIL:
                                        con.ctype = NIL;
                                        break;
                                case NIL:
                                        con.ctype = NIL;
@@ -176,10 +188,10 @@ loop:
                        }
                        break;
                case T_CBINT:
                        }
                        break;
                case T_CBINT:
-                       con.crval = a8tol(cn[1]);
+                       con.crval = a8tol(cn->char_const.cptr);
                        goto restcon;
                case T_CINT:
                        goto restcon;
                case T_CINT:
-                       con.crval = atof(cn[1]);
+                       con.crval = atof(cn->char_const.cptr);
                        if (con.crval > MAXINT || con.crval < MININT) {
                                derror("Constant too large for this implementation");
                                con.crval = 0;
                        if (con.crval > MAXINT || con.crval < MININT) {
                                derror("Constant too large for this implementation");
                                con.crval = 0;
@@ -195,10 +207,10 @@ restcon:
                        break;
                case T_CFINT:
                        con.ctype = nl+TDOUBLE;
                        break;
                case T_CFINT:
                        con.ctype = nl+TDOUBLE;
-                       con.crval = atof(cn[1]);
+                       con.crval = atof(cn->char_const.cptr);
                        break;
                case T_CSTRNG:
                        break;
                case T_CSTRNG:
-                       cp = cn[1];
+                       cp = cn->char_const.cptr;
                        if (cp[1] == 0) {
                                con.ctype = nl+T1CHAR;
                                con.cival = cp[0];
                        if (cp[1] == 0) {
                                con.ctype = nl+T1CHAR;
                                con.cival = cp[0];
@@ -210,8 +222,9 @@ restcon:
                        break;
        }
        if (sgnd) {
                        break;
        }
        if (sgnd) {
-               if (isnta(con.ctype, "id"))
-                       derror("%s constants cannot be signed", nameof(con.ctype));
+               if (isnta((struct nl *) con.ctype, "id"))
+                       derror("%s constants cannot be signed",
+                               nameof((struct nl *) con.ctype));
                else {
                        if (negd)
                                con.crval = -con.crval;
                else {
                        if (negd)
                                con.crval = -con.crval;
@@ -221,42 +234,49 @@ restcon:
 }
 
 #ifndef PI0
 }
 
 #ifndef PI0
-isconst(r)
-       register int *r;
+isconst(cn)
+       register struct tnode *cn;
 {
 
 {
 
-       if (r == NIL)
+       if (cn == TR_NIL)
                return (1);
                return (1);
-       switch (r[0]) {
+       switch (cn->tag) {
                case T_MINUS:
                case T_MINUS:
-                       r[0] = T_MINUSC;
-                       r[1] = r[2];
-                       return (isconst(r[1]));
+                       cn->tag = T_MINUSC;
+                       cn->sign_const.number = 
+                                        cn->un_expr.expr;
+                       return (isconst(cn->sign_const.number));
                case T_PLUS:
                case T_PLUS:
-                       r[0] = T_PLUSC;
-                       r[1] = r[2];
-                       return (isconst(r[1]));
+                       cn->tag = T_PLUSC;
+                       cn->sign_const.number = 
+                                        cn->un_expr.expr;
+                       return (isconst(cn->sign_const.number));
                case T_VAR:
                case T_VAR:
-                       if (r[3] != NIL)
+                       if (cn->var_node.qual != TR_NIL)
                                return (0);
                                return (0);
-                       r[0] = T_ID;
-                       r[1] = r[2];
+                       cn->tag = T_ID;
+                       cn->char_const.cptr = 
+                                       cn->var_node.cptr;
                        return (1);
                case T_BINT:
                        return (1);
                case T_BINT:
-                       r[0] = T_CBINT;
-                       r[1] = r[2];
+                       cn->tag = T_CBINT;
+                       cn->char_const.cptr = 
+                               cn->const_node.cptr;
                        return (1);
                case T_INT:
                        return (1);
                case T_INT:
-                       r[0] = T_CINT;
-                       r[1] = r[2];
+                       cn->tag = T_CINT;
+                       cn->char_const.cptr = 
+                               cn->const_node.cptr;
                        return (1);
                case T_FINT:
                        return (1);
                case T_FINT:
-                       r[0] = T_CFINT;
-                       r[1] = r[2];
+                       cn->tag = T_CFINT;
+                       cn->char_const.cptr = 
+                               cn->const_node.cptr;
                        return (1);
                case T_STRNG:
                        return (1);
                case T_STRNG:
-                       r[0] = T_CSTRNG;
-                       r[1] = r[2];
+                       cn->tag = T_CSTRNG;
+                       cn->char_const.cptr = 
+                               cn->const_node.cptr;
                        return (1);
        }
        return (0);
                        return (1);
        }
        return (0);