112554Scsvaf /* Copyright (c) 1982 Regents of the University of California */ 212554Scsvaf 3*18219Slinton static char sccsid[] = "@(#)fortran.c 1.6 (Berkeley) 03/01/85"; 412554Scsvaf 5*18219Slinton static char rcsid[] = "$Header: fortran.c,v 1.5 84/12/26 10:39:37 linton Exp $"; 6*18219Slinton 712549Scsvaf /* 812549Scsvaf * FORTRAN dependent symbol routines. 912549Scsvaf */ 1012549Scsvaf 1112549Scsvaf #include "defs.h" 1212549Scsvaf #include "symbols.h" 1312549Scsvaf #include "printsym.h" 1412549Scsvaf #include "languages.h" 1512549Scsvaf #include "fortran.h" 1612549Scsvaf #include "tree.h" 1712549Scsvaf #include "eval.h" 1812549Scsvaf #include "operators.h" 1912549Scsvaf #include "mappings.h" 2012549Scsvaf #include "process.h" 2112549Scsvaf #include "runtime.h" 2212549Scsvaf #include "machine.h" 2312549Scsvaf 2412549Scsvaf #define isfloat(range) ( \ 2512549Scsvaf range->symvalue.rangev.upper == 0 and range->symvalue.rangev.lower > 0 \ 2612549Scsvaf ) 2712549Scsvaf 2812549Scsvaf #define isrange(t, name) (t->class == RANGE and istypename(t->type, name)) 2912549Scsvaf 3012549Scsvaf #define MAXDIM 20 3116610Ssam 3216610Ssam private Language fort; 3316610Ssam 3412549Scsvaf /* 3512549Scsvaf * Initialize FORTRAN language information. 3612549Scsvaf */ 3712549Scsvaf 3812549Scsvaf public fortran_init() 3912549Scsvaf { 4016610Ssam fort = language_define("fortran", ".f"); 4116610Ssam language_setop(fort, L_PRINTDECL, fortran_printdecl); 4216610Ssam language_setop(fort, L_PRINTVAL, fortran_printval); 4316610Ssam language_setop(fort, L_TYPEMATCH, fortran_typematch); 4416610Ssam language_setop(fort, L_BUILDAREF, fortran_buildaref); 4516610Ssam language_setop(fort, L_EVALAREF, fortran_evalaref); 4616610Ssam language_setop(fort, L_MODINIT, fortran_modinit); 4716610Ssam language_setop(fort, L_HASMODULES, fortran_hasmodules); 4816610Ssam language_setop(fort, L_PASSADDR, fortran_passaddr); 4912549Scsvaf } 5012549Scsvaf 5112549Scsvaf /* 5212549Scsvaf * Test if two types are compatible. 5312549Scsvaf * 5412549Scsvaf * Integers and reals are not compatible since they cannot always be mixed. 5512549Scsvaf */ 5612549Scsvaf 5712549Scsvaf public Boolean fortran_typematch(type1, type2) 5812549Scsvaf Symbol type1, type2; 5912549Scsvaf { 6012549Scsvaf 6112549Scsvaf /* only does integer for now; may need to add others 6212549Scsvaf */ 6312549Scsvaf 6412549Scsvaf Boolean b; 6512549Scsvaf register Symbol t1, t2, tmp; 6612549Scsvaf 6712549Scsvaf t1 = rtype(type1); 6812549Scsvaf t2 = rtype(type2); 6912549Scsvaf if(t1 == nil or t1->type == nil or t2 == nil or t2->type == nil ) b = false; 7012549Scsvaf else { b = (Boolean) ( 7112549Scsvaf (t1 == t2) or 7212549Scsvaf (t1->type == t_int and (istypename(t2->type, "integer") or 7312549Scsvaf istypename(t2->type, "integer*2")) ) or 7412549Scsvaf (t2->type == t_int and (istypename(t1->type, "integer") or 7512549Scsvaf istypename(t1->type, "integer*2")) ) 7612549Scsvaf ); 7712549Scsvaf } 7812549Scsvaf /*OUT fprintf(stderr," %d compat %s %s \n", b, 7912549Scsvaf (t1 == nil or t1->type == nil ) ? "nil" : symname(t1->type), 8012549Scsvaf (t2 == nil or t2->type == nil ) ? "nil" : symname(t2->type) );*/ 8112549Scsvaf return b; 8212549Scsvaf } 8312549Scsvaf 8412549Scsvaf private String typename(s) 8512549Scsvaf Symbol s; 8612549Scsvaf { 8712549Scsvaf int ub; 8812549Scsvaf static char buf[20]; 8912549Scsvaf char *pbuf; 9012549Scsvaf Symbol st,sc; 9112549Scsvaf 9212549Scsvaf if(s->type->class == TYPE) return(symname(s->type)); 9312549Scsvaf 9412549Scsvaf for(st = s->type; st->type->class != TYPE; st = st->type); 9512549Scsvaf 9612549Scsvaf pbuf=buf; 9712549Scsvaf 9812549Scsvaf if(istypename(st->type,"char")) { 9912549Scsvaf sprintf(pbuf,"character*"); 10012549Scsvaf pbuf += strlen(pbuf); 10112549Scsvaf sc = st->chain; 10212549Scsvaf if(sc->symvalue.rangev.uppertype == R_ARG or 10312549Scsvaf sc->symvalue.rangev.uppertype == R_TEMP) { 10412549Scsvaf if( ! getbound(s,sc->symvalue.rangev.upper, 10512549Scsvaf sc->symvalue.rangev.uppertype, &ub) ) 10612549Scsvaf sprintf(pbuf,"(*)"); 10712549Scsvaf else 10812549Scsvaf sprintf(pbuf,"%d",ub); 10912549Scsvaf } 11012549Scsvaf else sprintf(pbuf,"%d",sc->symvalue.rangev.upper); 11112549Scsvaf } 11212549Scsvaf else { 11312549Scsvaf sprintf(pbuf,"%s ",symname(st->type)); 11412549Scsvaf } 11512549Scsvaf return(buf); 11612549Scsvaf } 11712549Scsvaf 11812549Scsvaf private Symbol mksubs(pbuf,st) 11912549Scsvaf Symbol st; 12012549Scsvaf char **pbuf; 12112549Scsvaf { 12212549Scsvaf int lb, ub; 12312549Scsvaf Symbol r, eltype; 12412549Scsvaf 12512549Scsvaf if(st->class != ARRAY or (istypename(st->type, "char")) ) return; 12612549Scsvaf else { 12712549Scsvaf mksubs(pbuf,st->type); 12812549Scsvaf assert( (r = st->chain)->class == RANGE); 12912549Scsvaf 13012549Scsvaf if(r->symvalue.rangev.lowertype == R_ARG or 13112549Scsvaf r->symvalue.rangev.lowertype == R_TEMP) { 13212549Scsvaf if( ! getbound(st,r->symvalue.rangev.lower, 13312549Scsvaf r->symvalue.rangev.lowertype, &lb) ) 13412549Scsvaf sprintf(*pbuf,"?:"); 13512549Scsvaf else 13612549Scsvaf sprintf(*pbuf,"%d:",lb); 13712549Scsvaf } 13812549Scsvaf else { 13912549Scsvaf lb = r->symvalue.rangev.lower; 14012549Scsvaf sprintf(*pbuf,"%d:",lb); 14112549Scsvaf } 14212549Scsvaf *pbuf += strlen(*pbuf); 14312549Scsvaf 14412549Scsvaf if(r->symvalue.rangev.uppertype == R_ARG or 14512549Scsvaf r->symvalue.rangev.uppertype == R_TEMP) { 14612549Scsvaf if( ! getbound(st,r->symvalue.rangev.upper, 14712549Scsvaf r->symvalue.rangev.uppertype, &ub) ) 14812549Scsvaf sprintf(*pbuf,"?,"); 14912549Scsvaf else 15012549Scsvaf sprintf(*pbuf,"%d,",ub); 15112549Scsvaf } 15212549Scsvaf else { 15312549Scsvaf ub = r->symvalue.rangev.upper; 15412549Scsvaf sprintf(*pbuf,"%d,",ub); 15512549Scsvaf } 15612549Scsvaf *pbuf += strlen(*pbuf); 15712549Scsvaf 15812549Scsvaf } 15912549Scsvaf } 16012549Scsvaf 16112549Scsvaf /* 16212549Scsvaf * Print out the declaration of a FORTRAN variable. 16312549Scsvaf */ 16412549Scsvaf 16512549Scsvaf public fortran_printdecl(s) 16612549Scsvaf Symbol s; 16712549Scsvaf { 16812549Scsvaf 16912549Scsvaf 17012549Scsvaf Symbol eltype; 17112549Scsvaf 17212549Scsvaf switch (s->class) { 17316610Ssam 17412549Scsvaf case CONST: 17516610Ssam 17612549Scsvaf printf("parameter %s = ", symname(s)); 17712549Scsvaf printval(s); 17812549Scsvaf break; 17912549Scsvaf 18012549Scsvaf case REF: 18112549Scsvaf printf(" (dummy argument) "); 18216610Ssam 18314652Slinton case VAR: 18416610Ssam if (s->type->class == ARRAY && 18516610Ssam (not istypename(s->type->type,"char")) ) { 18616610Ssam char bounds[130], *p1, **p; 18712549Scsvaf p1 = bounds; 18812549Scsvaf p = &p1; 18916610Ssam mksubs(p,s->type); 19012549Scsvaf *p -= 1; 19112549Scsvaf **p = '\0'; /* get rid of trailing ',' */ 19216610Ssam printf(" %s %s[%s] ",typename(s), symname(s), bounds); 19312549Scsvaf } else { 19412549Scsvaf printf("%s %s", typename(s), symname(s)); 19512549Scsvaf } 19612549Scsvaf break; 19712549Scsvaf 19812549Scsvaf case FUNC: 19912627Scsvaf if (not istypename(s->type, "void")) { 20012549Scsvaf printf(" %s function ", typename(s) ); 20112549Scsvaf } 20216610Ssam else printf(" subroutine"); 20312549Scsvaf printf(" %s ", symname(s)); 20412549Scsvaf fortran_listparams(s); 20512549Scsvaf break; 20612549Scsvaf 20712549Scsvaf case MODULE: 20816610Ssam printf("source file \"%s.c\"", symname(s)); 20912549Scsvaf break; 21012549Scsvaf 21112549Scsvaf case PROG: 21212549Scsvaf printf("executable file \"%s\"", symname(s)); 21312549Scsvaf break; 21412549Scsvaf 21512549Scsvaf default: 21612549Scsvaf error("class %s in fortran_printdecl", classname(s)); 21712549Scsvaf } 21812549Scsvaf putchar('\n'); 21912549Scsvaf } 22012549Scsvaf 22112549Scsvaf /* 22212549Scsvaf * List the parameters of a procedure or function. 22312549Scsvaf * No attempt is made to combine like types. 22412549Scsvaf */ 22512549Scsvaf 22612549Scsvaf public fortran_listparams(s) 22712549Scsvaf Symbol s; 22812549Scsvaf { 22912549Scsvaf register Symbol t; 23012549Scsvaf 23112549Scsvaf putchar('('); 23212549Scsvaf for (t = s->chain; t != nil; t = t->chain) { 23312549Scsvaf printf("%s", symname(t)); 23412549Scsvaf if (t->chain != nil) { 23512549Scsvaf printf(", "); 23612549Scsvaf } 23712549Scsvaf } 23812549Scsvaf putchar(')'); 23912549Scsvaf if (s->chain != nil) { 24012549Scsvaf printf("\n"); 24112549Scsvaf for (t = s->chain; t != nil; t = t->chain) { 24212549Scsvaf if (t->class != REF) { 24312549Scsvaf panic("unexpected class %d for parameter", t->class); 24412549Scsvaf } 24512549Scsvaf printdecl(t, 0); 24612549Scsvaf } 24712549Scsvaf } else { 24812549Scsvaf putchar('\n'); 24912549Scsvaf } 25012549Scsvaf } 25112549Scsvaf 25212549Scsvaf /* 25312549Scsvaf * Print out the value on the top of the expression stack 25412549Scsvaf * in the format for the type of the given symbol. 25512549Scsvaf */ 25612549Scsvaf 25712549Scsvaf public fortran_printval(s) 25812549Scsvaf Symbol s; 25912549Scsvaf { 26012549Scsvaf register Symbol t; 26112549Scsvaf register Address a; 26212549Scsvaf register int i, len; 263*18219Slinton double d1, d2; 26412549Scsvaf 26512549Scsvaf switch (s->class) { 26612549Scsvaf case CONST: 26712549Scsvaf case TYPE: 26812549Scsvaf case VAR: 26912549Scsvaf case REF: 27012549Scsvaf case FVAR: 27112549Scsvaf case TAG: 27212549Scsvaf fortran_printval(s->type); 27312549Scsvaf break; 27412549Scsvaf 27512549Scsvaf case ARRAY: 27612549Scsvaf t = rtype(s->type); 27712549Scsvaf if (t->class == RANGE and istypename(t->type, "char")) { 27812549Scsvaf len = size(s); 27912549Scsvaf sp -= len; 28012549Scsvaf printf("\"%.*s\"", len, sp); 28112549Scsvaf } else { 28212549Scsvaf fortran_printarray(s); 28312549Scsvaf } 28412549Scsvaf break; 28512549Scsvaf 28612549Scsvaf case RANGE: 28712549Scsvaf if (isfloat(s)) { 28812549Scsvaf switch (s->symvalue.rangev.lower) { 28912549Scsvaf case sizeof(float): 29012549Scsvaf prtreal(pop(float)); 29112549Scsvaf break; 29212549Scsvaf 29312549Scsvaf case sizeof(double): 294*18219Slinton if (istypename(s->type,"complex")) { 295*18219Slinton d2 = pop(float); 296*18219Slinton d1 = pop(float); 297*18219Slinton printf("("); 298*18219Slinton prtreal(d1); 299*18219Slinton printf(","); 300*18219Slinton prtreal(d2); 301*18219Slinton printf(")"); 302*18219Slinton } else { 303*18219Slinton prtreal(pop(double)); 30412549Scsvaf } 30512549Scsvaf break; 30612549Scsvaf 30712549Scsvaf default: 30812549Scsvaf panic("bad size \"%d\" for real", 30912549Scsvaf t->symvalue.rangev.lower); 31012549Scsvaf break; 31112549Scsvaf } 31212549Scsvaf } else { 31312549Scsvaf printint(popsmall(s), s); 31412549Scsvaf } 31512549Scsvaf break; 31612549Scsvaf 31712549Scsvaf default: 31812549Scsvaf if (ord(s->class) > ord(TYPEREF)) { 31912549Scsvaf panic("printval: bad class %d", ord(s->class)); 32012549Scsvaf } 32112549Scsvaf error("don't know how to print a %s", fortran_classname(s)); 32212549Scsvaf /* NOTREACHED */ 32312549Scsvaf } 32412549Scsvaf } 32512549Scsvaf 32612549Scsvaf /* 32712549Scsvaf * Print out an int 32812549Scsvaf */ 32912549Scsvaf 33012549Scsvaf private printint(i, t) 33112549Scsvaf Integer i; 33212549Scsvaf register Symbol t; 33312549Scsvaf { 33412549Scsvaf if (istypename(t->type, "logical")) { 33512549Scsvaf printf(((Boolean) i) == true ? "true" : "false"); 33612549Scsvaf } 33712549Scsvaf else if ( (t->type == t_int) or istypename(t->type, "integer") or 33812549Scsvaf istypename(t->type,"integer*2") ) { 33912549Scsvaf printf("%ld", i); 34012549Scsvaf } else { 34112549Scsvaf error("unkown type in fortran printint"); 34212549Scsvaf } 34312549Scsvaf } 34412549Scsvaf 34512549Scsvaf /* 34612549Scsvaf * Print out a null-terminated string (pointer to char) 34712549Scsvaf * starting at the given address. 34812549Scsvaf */ 34912549Scsvaf 35012549Scsvaf private printstring(addr) 35112549Scsvaf Address addr; 35212549Scsvaf { 35312549Scsvaf register Address a; 35412549Scsvaf register Integer i, len; 35512549Scsvaf register Boolean endofstring; 35612549Scsvaf union { 35712549Scsvaf char ch[sizeof(Word)]; 35812549Scsvaf int word; 35912549Scsvaf } u; 36012549Scsvaf 36112549Scsvaf putchar('"'); 36212549Scsvaf a = addr; 36312549Scsvaf endofstring = false; 36412549Scsvaf while (not endofstring) { 36512549Scsvaf dread(&u, a, sizeof(u)); 36612549Scsvaf i = 0; 36712549Scsvaf do { 36812549Scsvaf if (u.ch[i] == '\0') { 36912549Scsvaf endofstring = true; 37012549Scsvaf } else { 37112549Scsvaf printchar(u.ch[i]); 37212549Scsvaf } 37312549Scsvaf ++i; 37412549Scsvaf } while (i < sizeof(Word) and not endofstring); 37512549Scsvaf a += sizeof(Word); 37612549Scsvaf } 37712549Scsvaf putchar('"'); 37812549Scsvaf } 37912549Scsvaf /* 38012549Scsvaf * Return the FORTRAN name for the particular class of a symbol. 38112549Scsvaf */ 38212549Scsvaf 38312549Scsvaf public String fortran_classname(s) 38412549Scsvaf Symbol s; 38512549Scsvaf { 38612549Scsvaf String str; 38712549Scsvaf 38812549Scsvaf switch (s->class) { 38912549Scsvaf case REF: 39012549Scsvaf str = "dummy argument"; 39112549Scsvaf break; 39212549Scsvaf 39312549Scsvaf case CONST: 39412549Scsvaf str = "parameter"; 39512549Scsvaf break; 39612549Scsvaf 39712549Scsvaf default: 39812549Scsvaf str = classname(s); 39912549Scsvaf } 40012549Scsvaf return str; 40112549Scsvaf } 40212549Scsvaf 40312549Scsvaf /* reverses the indices from the expr_list; should be folded into buildaref 40412549Scsvaf * and done as one recursive routine 40512549Scsvaf */ 40612549Scsvaf Node private rev_index(here,n) 40712549Scsvaf register Node here,n; 40812549Scsvaf { 40912549Scsvaf 41012549Scsvaf register Node i; 41112549Scsvaf 41212549Scsvaf if( here == nil or here == n) i=nil; 41312549Scsvaf else if( here->value.arg[1] == n) i = here; 41412549Scsvaf else i=rev_index(here->value.arg[1],n); 41512549Scsvaf return i; 41612549Scsvaf } 41712549Scsvaf 41812549Scsvaf public Node fortran_buildaref(a, slist) 41912549Scsvaf Node a, slist; 42012549Scsvaf { 42112549Scsvaf register Symbol as; /* array of array of .. cursor */ 42212549Scsvaf register Node en; /* Expr list cursor */ 42312549Scsvaf Symbol etype; /* Type of subscript expr */ 42412549Scsvaf Node esub, tree; /* Subscript expression ptr and tree to be built*/ 42512549Scsvaf 42612549Scsvaf tree=a; 42712549Scsvaf 42812549Scsvaf as = rtype(tree->nodetype); /* node->sym.type->array*/ 42912549Scsvaf if ( not ( 43012549Scsvaf (tree->nodetype->class == VAR or tree->nodetype->class == REF) 43112549Scsvaf and as->class == ARRAY 43212549Scsvaf ) ) { 43312549Scsvaf beginerrmsg(); 43412549Scsvaf prtree(stderr, a); 43512549Scsvaf fprintf(stderr, " is not an array"); 43612549Scsvaf /*fprintf(stderr, " a-> %x as %x ", tree->nodetype, as ); OUT*/ 43712549Scsvaf enderrmsg(); 43812549Scsvaf } else { 43912549Scsvaf for (en = rev_index(slist,nil); en != nil and as->class == ARRAY; 44012549Scsvaf en = rev_index(slist,en), as = as->type) { 44112549Scsvaf esub = en->value.arg[0]; 44212549Scsvaf etype = rtype(esub->nodetype); 44312549Scsvaf assert(as->chain->class == RANGE); 44412549Scsvaf if ( not compatible( t_int, etype) ) { 44512549Scsvaf beginerrmsg(); 44612549Scsvaf fprintf(stderr, "subscript "); 44712549Scsvaf prtree(stderr, esub); 44812549Scsvaf fprintf(stderr, " is type %s ",symname(etype->type) ); 44912549Scsvaf enderrmsg(); 45012549Scsvaf } 45112549Scsvaf tree = build(O_INDEX, tree, esub); 45212549Scsvaf tree->nodetype = as->type; 45312549Scsvaf } 45412549Scsvaf if (en != nil or 45512549Scsvaf (as->class == ARRAY && (not istypename(as->type,"char"))) ) { 45612549Scsvaf beginerrmsg(); 45712549Scsvaf if (en != nil) { 45812549Scsvaf fprintf(stderr, "too many subscripts for "); 45912549Scsvaf } else { 46012549Scsvaf fprintf(stderr, "not enough subscripts for "); 46112549Scsvaf } 46212549Scsvaf prtree(stderr, tree); 46312549Scsvaf enderrmsg(); 46412549Scsvaf } 46512549Scsvaf } 46612549Scsvaf return tree; 46712549Scsvaf } 46812549Scsvaf 46912549Scsvaf /* 47012549Scsvaf * Evaluate a subscript index. 47112549Scsvaf */ 47212549Scsvaf 473*18219Slinton public fortran_evalaref(s, base, i) 47412549Scsvaf Symbol s; 475*18219Slinton Address base; 47612549Scsvaf long i; 47712549Scsvaf { 478*18219Slinton Symbol r, t; 47912549Scsvaf long lb, ub; 48012549Scsvaf 481*18219Slinton t = rtype(s); 482*18219Slinton r = t->chain; 483*18219Slinton if ( 484*18219Slinton r->symvalue.rangev.lowertype == R_ARG or 485*18219Slinton r->symvalue.rangev.lowertype == R_TEMP 486*18219Slinton ) { 487*18219Slinton if (not getbound( 488*18219Slinton s, r->symvalue.rangev.lower, r->symvalue.rangev.lowertype, &lb 489*18219Slinton )) { 49012549Scsvaf error("dynamic bounds not currently available"); 491*18219Slinton } 492*18219Slinton } else { 493*18219Slinton lb = r->symvalue.rangev.lower; 49412549Scsvaf } 495*18219Slinton if ( 496*18219Slinton r->symvalue.rangev.uppertype == R_ARG or 497*18219Slinton r->symvalue.rangev.uppertype == R_TEMP 498*18219Slinton ) { 499*18219Slinton if (not getbound( 500*18219Slinton s, r->symvalue.rangev.upper, r->symvalue.rangev.uppertype, &ub 501*18219Slinton )) { 50212549Scsvaf error("dynamic bounds not currently available"); 503*18219Slinton } 504*18219Slinton } else { 505*18219Slinton ub = r->symvalue.rangev.upper; 50612549Scsvaf } 50712549Scsvaf 50812549Scsvaf if (i < lb or i > ub) { 50912549Scsvaf error("subscript out of range"); 51012549Scsvaf } 511*18219Slinton push(long, base + (i - lb) * size(t->type)); 51212549Scsvaf } 51312549Scsvaf 51412549Scsvaf private fortran_printarray(a) 51512549Scsvaf Symbol a; 51612549Scsvaf { 51712549Scsvaf struct Bounds { int lb, val, ub} dim[MAXDIM]; 51812549Scsvaf 51912549Scsvaf Symbol sc,st,eltype; 52012549Scsvaf char buf[50]; 52112549Scsvaf char *subscr; 52212549Scsvaf int i,ndim,elsize; 52312549Scsvaf Stack *savesp; 52412549Scsvaf Boolean done; 52512549Scsvaf 52612549Scsvaf st = a; 52712549Scsvaf 52812549Scsvaf savesp = sp; 52912549Scsvaf sp -= size(a); 53012549Scsvaf ndim=0; 53112549Scsvaf 53212549Scsvaf for(;;){ 53312549Scsvaf sc = st->chain; 53412549Scsvaf if(sc->symvalue.rangev.lowertype == R_ARG or 53512549Scsvaf sc->symvalue.rangev.lowertype == R_TEMP) { 53612549Scsvaf if( ! getbound(a,sc->symvalue.rangev.lower, 53712627Scsvaf sc->symvalue.rangev.lowertype, &dim[ndim].lb) ) 53812549Scsvaf error(" dynamic bounds not currently available"); 53912549Scsvaf } 54012549Scsvaf else dim[ndim].lb = sc->symvalue.rangev.lower; 54112549Scsvaf 54212549Scsvaf if(sc->symvalue.rangev.uppertype == R_ARG or 54312549Scsvaf sc->symvalue.rangev.uppertype == R_TEMP) { 54412549Scsvaf if( ! getbound(a,sc->symvalue.rangev.upper, 54512549Scsvaf sc->symvalue.rangev.uppertype, &dim[ndim].ub) ) 54612549Scsvaf error(" dynamic bounds not currently available"); 54712549Scsvaf } 54812549Scsvaf else dim[ndim].ub = sc->symvalue.rangev.upper; 54912549Scsvaf 55012549Scsvaf ndim ++; 55112549Scsvaf if (st->type->class == ARRAY) st=st->type; 55212549Scsvaf else break; 55312549Scsvaf } 55412549Scsvaf 55512549Scsvaf if(istypename(st->type,"char")) { 55612549Scsvaf eltype = st; 55712549Scsvaf ndim--; 55812549Scsvaf } 55912549Scsvaf else eltype=st->type; 56012549Scsvaf elsize=size(eltype); 56112549Scsvaf sp += elsize; 56212549Scsvaf /*printf("ndim %d elsize %lx in fortran_printarray\n",ndim,elsize);OUT*/ 56312549Scsvaf 56412549Scsvaf ndim--; 56512549Scsvaf for (i=0;i<=ndim;i++){ 56612549Scsvaf dim[i].val=dim[i].lb; 56712549Scsvaf /*OUT printf(" %d %d %d \n",i,dim[i].lb,dim[i].ub); 56812549Scsvaf fflush(stdout); OUT*/ 56912549Scsvaf } 57012549Scsvaf 57112549Scsvaf 57212549Scsvaf for(;;) { 57312549Scsvaf buf[0]=','; 57412549Scsvaf subscr = buf+1; 57512549Scsvaf 57612549Scsvaf for (i=ndim-1;i>=0;i--) { 57712549Scsvaf 57812549Scsvaf sprintf(subscr,"%d,",dim[i].val); 57912549Scsvaf subscr += strlen(subscr); 58012549Scsvaf } 58112549Scsvaf *--subscr = '\0'; 58212549Scsvaf 58312549Scsvaf for(i=dim[ndim].lb;i<=dim[ndim].ub;i++) { 58412549Scsvaf printf("[%d%s]\t",i,buf); 58512549Scsvaf printval(eltype); 58612549Scsvaf printf("\n"); 58712549Scsvaf sp += 2*elsize; 58812549Scsvaf } 58912549Scsvaf dim[ndim].val=dim[ndim].ub; 59012549Scsvaf 59112549Scsvaf i=ndim-1; 59212549Scsvaf if (i<0) break; 59312549Scsvaf 59412549Scsvaf done=false; 59512549Scsvaf do { 59612549Scsvaf dim[i].val++; 59712549Scsvaf if(dim[i].val > dim[i].ub) { 59812549Scsvaf dim[i].val = dim[i].lb; 59912549Scsvaf if(--i<0) done=true; 60012549Scsvaf } 60112549Scsvaf else done=true; 60212549Scsvaf } 60312549Scsvaf while (not done); 60412549Scsvaf if (i<0) break; 60512549Scsvaf } 60612549Scsvaf } 60716610Ssam 60816610Ssam /* 60916610Ssam * Initialize typetable at beginning of a module. 61016610Ssam */ 61116610Ssam 61216610Ssam public fortran_modinit (typetable) 61316610Ssam Symbol typetable[]; 61416610Ssam { 61516610Ssam /* nothing for now */ 61616610Ssam } 61716610Ssam 61816610Ssam public boolean fortran_hasmodules () 61916610Ssam { 62016610Ssam return false; 62116610Ssam } 62216610Ssam 62316610Ssam public boolean fortran_passaddr (param, exprtype) 62416610Ssam Symbol param, exprtype; 62516610Ssam { 62616610Ssam return false; 62716610Ssam } 628