URI:
       tdot.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tdot.c (2217B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <bio.h>
            4 #include <ctype.h>
            5 #include <mach.h>
            6 #define Extern extern
            7 #include "acid.h"
            8 
            9 Type*
           10 srch(Type *t, char *s)
           11 {
           12         Type *f;
           13 
           14         f = 0;
           15         while(t) {
           16                 if(strcmp(t->tag->name, s) == 0) {
           17                         if(f == 0 || t->depth < f->depth)
           18                                 f = t;
           19                 }
           20                 t = t->next;
           21         }
           22         return f;
           23 }
           24 
           25 void
           26 odot(Node *n, Node *r)
           27 {
           28         char *s;
           29         Type *t;
           30         Node res;
           31         u64int addr;
           32 
           33         s = n->sym->name;
           34         if(s == 0)
           35                 fatal("dodot: no tag");
           36 
           37         expr(n->left, &res);
           38         if(res.store.comt == 0)
           39                 error("no type specified for (expr).%s", s);
           40 
           41         if(res.type != TINT)
           42                 error("pointer must be integer for (expr).%s", s);
           43 
           44         t = srch(res.store.comt, s);
           45         if(t == 0)
           46                 error("no tag for (expr).%s", s);
           47 
           48         /* Propagate types */
           49         if(t->type)
           50                 r->store.comt = t->type->lt;
           51 
           52         addr = res.store.u.ival+t->offset;
           53         if(t->fmt == 'a') {
           54                 r->op = OCONST;
           55                 r->store.fmt = 'a';
           56                 r->type = TINT;
           57                 r->store.u.ival = addr;
           58         }
           59         else
           60                 indir(cormap, addr, t->fmt, r);
           61 
           62 }
           63 
           64 static Type **tail;
           65 static Lsym *base;
           66 
           67 void
           68 buildtype(Node *m, int d)
           69 {
           70         Type *t;
           71 
           72         if(m == ZN)
           73                 return;
           74 
           75         switch(m->op) {
           76         case OLIST:
           77                 buildtype(m->left, d);
           78                 buildtype(m->right, d);
           79                 break;
           80 
           81         case OCTRUCT:
           82                 buildtype(m->left, d+1);
           83                 break;
           84         default:
           85                 t = malloc(sizeof(Type));
           86                 t->next = 0;
           87                 t->depth = d;
           88                 t->tag = m->sym;
           89                 t->base = base;
           90                 t->offset = m->store.u.ival;
           91                 if(m->left) {
           92                         t->type = m->left->sym;
           93                         t->fmt = 'a';
           94                 }
           95                 else {
           96                         t->type = 0;
           97                         if(m->right)
           98                                 t->type = m->right->sym;
           99                         t->fmt = m->store.fmt;
          100                 }
          101 
          102                 *tail = t;
          103                 tail = &t->next;
          104         }
          105 }
          106 
          107 void
          108 defcomplex(Node *tn, Node *m)
          109 {
          110         tail = &tn->sym->lt;
          111         base = tn->sym;
          112         buildtype(m, 0);
          113 }
          114 
          115 void
          116 decl(Node *n)
          117 {
          118         Node *l;
          119         Value *v;
          120         Frtype *f;
          121         Lsym *type;
          122 
          123         type = n->sym;
          124         if(type->lt == 0)
          125                 error("%s is not a complex type", type->name);
          126 
          127         l = n->left;
          128         if(l->op == ONAME) {
          129                 v = l->sym->v;
          130                 v->store.comt = type->lt;
          131                 v->store.fmt = 'a';
          132                 return;
          133         }
          134 
          135         /*
          136          * Frame declaration
          137          */
          138         for(f = l->sym->local; f; f = f->next) {
          139                 if(f->var == l->left->sym) {
          140                         f->type = n->sym->lt;
          141                         return;
          142                 }
          143         }
          144         f = malloc(sizeof(Frtype));
          145         if(f == 0)
          146                 fatal("out of memory");
          147 
          148         f->type = type->lt;
          149 
          150         f->var = l->left->sym;
          151         f->next = l->sym->local;
          152         l->sym->local = f;
          153 }