From bc5322a9c6a12d020a45ee8051349521fa05fbd6 Mon Sep 17 00:00:00 2001 From: Alastair Fyfe Date: Thu, 19 May 1983 01:30:12 -0800 Subject: [PATCH] language specific functions to build and evaluate array reference trees SCCS-vsn: old/dbx/c.c 1.3 --- usr/src/old/dbx/c.c | 80 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/usr/src/old/dbx/c.c b/usr/src/old/dbx/c.c index daaf5a9c99..60e371a6e7 100644 --- a/usr/src/old/dbx/c.c +++ b/usr/src/old/dbx/c.c @@ -1,6 +1,6 @@ /* Copyright (c) 1982 Regents of the University of California */ -static char sccsid[] = "@(#)c.c 1.2 %G%"; +static char sccsid[] = "@(#)c.c 1.3 %G%"; /* * C-dependent symbol routines. @@ -37,6 +37,8 @@ public c_init() language_setop(lang, L_PRINTDECL, c_printdecl); language_setop(lang, L_PRINTVAL, c_printval); language_setop(lang, L_TYPEMATCH, c_typematch); + language_setop(lang, L_BUILDAREF, c_buildaref); + language_setop(lang, L_EVALAREF, c_evalaref); } /* @@ -665,3 +667,79 @@ Symbol s; } return str; } +public Node c_buildaref(a, slist) +Node a, slist; +{ + register Symbol t; + register Node p; + Symbol etype, atype, eltype; + Node esub, r; + + r = a; + t = rtype(a->nodetype); + eltype = t->type; + if (t->class == PTR) { + p = slist->value.arg[0]; + if (not compatible(p->nodetype, t_int)) { + beginerrmsg(); + fprintf(stderr, "bad type for subscript of "); + prtree(stderr, a); + enderrmsg(); + } + r = build(O_MUL, p, build(O_LCON, (long) size(eltype))); + r = build(O_ADD, build(O_RVAL, a), r); + r->nodetype = eltype; + } else if (t->class != ARRAY) { + beginerrmsg(); + prtree(stderr, a); + fprintf(stderr, " is not an array"); + enderrmsg(); + } else { + p = slist; + t = t->chain; + for (; p != nil and t != nil; p = p->value.arg[1], t = t->chain) { + esub = p->value.arg[0]; + etype = rtype(esub->nodetype); + atype = rtype(t); + if (not compatible(atype, etype)) { + beginerrmsg(); + fprintf(stderr, "subscript "); + prtree(stderr, esub); + fprintf(stderr, " is the wrong type"); + enderrmsg(); + } + r = build(O_INDEX, r, esub); + r->nodetype = eltype; + } + if (p != nil or t != nil) { + beginerrmsg(); + if (p != nil) { + fprintf(stderr, "too many subscripts for "); + } else { + fprintf(stderr, "not enough subscripts for "); + } + prtree(stderr, a); + enderrmsg(); + } + } + return r; +} + +/* + * Evaluate a subscript index. + */ + +public int c_evalaref(s, i) +Symbol s; +long i; +{ + long lb, ub; + + s = rtype(s)->chain; + lb = s->symvalue.rangev.lower; + ub = s->symvalue.rangev.upper; + if (i < lb or i > ub) { + error("subscript out of range"); + } + return (i - lb); +} -- 2.20.1