Annotation of researchv10no/cmd/trace/trace4.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include "trace.h"
                      3: #include "trace.d"
                      4: 
                      5:  extern char lockplus, prefix;
                      6:  extern struct QUEUE *s_last;
                      7:  extern int *processes, *globvars, *state, *qsize;
                      8:  extern int nrprocs, nrrefs, nrvars, nrqs, level, assertbl, nrtbl;
                      9:  extern long loopsf, zapped;
                     10:  extern struct TBL *tbl;
                     11:  extern struct PROCSTACK **procstack;
                     12:  extern struct VARPARS *procpars;
                     13: 
                     14:  short *Factor, maxr = 0;
                     15:  double iseen=0, ireseen=0, painful=0, kurshan=0;
                     16: 
                     17:  struct VISIT *lastvisit;
                     18:  struct STATE *giveme(), *setstate();
                     19:  char *Smalloc(), *emalloc();
                     20: 
                     21: struct STATE *
                     22: inloop()
                     23: { struct STATE *tmp;
                     24:   register struct VISIT *hook;
                     25:   register int x; char aa;
                     26:   int i, nrnonempty=0, nrnon=0;
                     27:   short h, hashvalue();
                     28: 
                     29:        for (i = 0; i < nrqs; i++)
                     30:                if (qsize[i] > 0)
                     31:                {       nrnonempty += (1<<i);
                     32:                        nrnon++;
                     33:                }
                     34:        h = hashvalue(nrnonempty);
                     35:        for (x = member(h); x > 0; x--)
                     36:        {       tmp = giveme(h, x);
                     37:                if (samestate(tmp))
                     38:                {       for (hook = tmp->next; hook != NULL; hook = hook->next)
                     39:                        {
                     40:                                if (hook->howmany != nrnonempty
                     41:                                || !Queuesmatch(hook, nrnon))
                     42:                                        continue;
                     43: 
                     44:                                if (ISANA(hook))
                     45:                                {       if (DEPTH(hook) > level)
                     46:                                        {       painful += 1;
                     47:                                                continue;
                     48:                                        }
                     49:                                        if (prefix)
                     50:                                                output("prefix: ", 0);
                     51:                                        hook->prop.countme += 1;
                     52:                                        kurshan += (double) 1;
                     53:                                        return NULL;
                     54:                                } else
                     55:                                {       loopsf++;
                     56:                                        aa = (assertbl == NONE)? 1 : assertholds();
                     57:                                        if (aa == 0 || lockplus)
                     58:                                                putloop(hook->prop.s, aa);
                     59:                                        return NULL;
                     60:                        }       }
                     61:                        return setstate(tmp, h);
                     62:                }
                     63:        }
                     64:        return setstate((struct STATE *) NULL, h);
                     65: }
                     66: 
                     67: cmplvars(one, two)
                     68:        struct LOCVARS *one;
                     69:        struct VARPARS *two;
                     70: { int i;
                     71: 
                     72:        if (one->nrlvars != two->nrlvars)
                     73:                return 0;
                     74: 
                     75:        for (i = 0; i < one->nrlvars; i++)
                     76:                if (one->lvarvals[i] != two->lvarvals[i])
                     77:                        return 0;
                     78: 
                     79:        return 1;
                     80: }
                     81: 
                     82: cmplocals(one, two)
                     83:        struct VARPARS *one, *two;
                     84: { int i;
                     85: 
                     86:        if (one->nrlvars != two->nrlvars)
                     87:                return 0;
                     88: 
                     89:        for (i = 0; i < one->nrlvars; i++)
                     90:                if (one->lvarvals[i] != two->lvarvals[i])
                     91:                        return 0;
                     92: 
                     93:        return 1;
                     94: }
                     95: 
                     96: cmparams(one, two)
                     97:        struct VARPARS *one, *two;
                     98: { int i;
                     99: 
                    100:        if (one->nrms != two->nrms || one->nrvs != two->nrvs)
                    101:                whoops("cannot happen - cmparams");
                    102: 
                    103:        for (i = 0; i < one->nrms; i++)
                    104:                if (one->ms[i] != two->ms[i])
                    105:                        return 0;
                    106: 
                    107:        for (i = 0; i < one->nrvs; i++)
                    108:                if (one->vs[i] != two->vs[i])
                    109:                        return 0;
                    110: 
                    111:        return 1;
                    112: }
                    113: 
                    114: cmpstacks(older, newer)
                    115:        struct PROCSTACK *older, *newer;
                    116: { struct PROCSTACK *tmp1 = older;
                    117:   struct PROCSTACK *tmp2 = newer;
                    118: 
                    119:        while (tmp2 != NULL)
                    120:        {       
                    121:                if (tmp1->uptable  != tmp2->uptable
                    122:                ||  tmp1->uptransf != tmp2->uptransf)
                    123:                        return 0;
                    124: 
                    125:                if (cmplocals(tmp1->varparsaved, tmp2->varparsaved) == 0
                    126:                ||  cmparams (tmp1->varparsaved, tmp2->varparsaved) == 0)
                    127:                        return 0;
                    128: 
                    129:                tmp1 = tmp1->follow;
                    130:                tmp2 = tmp2->follow;
                    131:        }
                    132:        return 1;
                    133: }
                    134: 
                    135: samestate(at)
                    136:        struct STATE *at;
                    137: {
                    138:        return (sameP(at->pstate) && sametempl(at->pcon));
                    139: }
                    140: 
                    141: cpylvars(into, from)
                    142:        struct LOCVARS  *into;
                    143:        struct VARPARS *from;
                    144: { register int i;
                    145: 
                    146:        into->nrlvars = from->nrlvars;
                    147:        into->lvarvals = (short *)
                    148:                Smalloc(from->nrlvars * sizeof(short));
                    149:        for (i = 0; i < from->nrlvars; i++)
                    150:                into->lvarvals[i] = from->lvarvals[i];
                    151: }
                    152: 
                    153: cpylocals(into, from)
                    154:        struct VARPARS *into, *from;
                    155: { register int i;
                    156: 
                    157:        into->nrlvars = from->nrlvars;
                    158:        into->lvarvals = (short *)
                    159:                Smalloc(from->nrlvars * sizeof(short));
                    160:        for (i = 0; i < from->nrlvars; i++)
                    161:                into->lvarvals[i] = from->lvarvals[i];
                    162: }
                    163: 
                    164: cpyparams(into, from)
                    165:        struct VARPARS *into, *from;
                    166: { int i;
                    167: 
                    168:        into->nrms = from->nrms;
                    169:        into->ms = (short *)
                    170:                Smalloc(from->nrms * sizeof(short));
                    171:        for (i = 0; i < from->nrms; i++)
                    172:                into->ms[i] = from->ms[i];
                    173: 
                    174:        into->nrvs = from->nrvs;
                    175:        into->vs = (short *)
                    176:                Smalloc(from->nrvs * sizeof(short));
                    177:        for (i = 0; i < from->nrvs; i++)
                    178:                into->vs[i] = from->vs[i];
                    179: }
                    180: 
                    181: cpystacks(left, right)
                    182:        struct PROCSTACK *left, *right;
                    183: { struct PROCSTACK *into = left;
                    184:   struct PROCSTACK *from = right;
                    185: 
                    186:        while (from != NULL)
                    187:        {       into->varparsaved = (struct VARPARS *)
                    188:                        Smalloc(sizeof(struct VARPARS));
                    189:                cpylocals(into->varparsaved, from->varparsaved);
                    190:                cpyparams(into->varparsaved, from->varparsaved);
                    191: 
                    192:                into->uptable  = from->uptable;
                    193:                into->uptransf = from->uptransf;
                    194: 
                    195:                if ((from = from->follow) != NULL)
                    196:                {       into->follow = (struct PROCSTACK *)
                    197:                                Smalloc(sizeof(struct PROCSTACK));
                    198:                        into = into->follow;
                    199:        }       }
                    200: }
                    201: 
                    202: struct STATE *
                    203: newstate(pha)
                    204:        int pha;
                    205: { struct STATE *hook;
                    206:   struct VISIT *findastate();
                    207:   struct TEMPLATE *inTtable();
                    208:   unsigned short *inPtable();
                    209: 
                    210:        hook = (struct STATE *) Smalloc(sizeof(struct STATE));
                    211:        hook->pstate = inPtable();
                    212:        hook->pcon   = inTtable();
                    213:        hook->next   = findastate(hook);        /* first visit */
                    214: 
                    215:        insert(pha, hook);
                    216: 
                    217:        return hook;
                    218: }
                    219: 
                    220: struct VISIT *
                    221: oldstate(where)
                    222:        struct STATE *where;
                    223: { register struct VISIT *tmp;
                    224:   struct VISIT *try, *findastate();
                    225: 
                    226:        ireseen += (double)1;
                    227:        try = findastate(where);
                    228:        
                    229:        if (where->next == NULL)
                    230:                where->next = try;
                    231:        else
                    232:        {       for (tmp = where->next; tmp->next != NULL; tmp = tmp->next)
                    233:                        ;
                    234:                tmp->next = try;
                    235:        }
                    236: 
                    237:        return try;
                    238: }
                    239: 
                    240: struct STATE *
                    241: setstate(where, ha)
                    242:        struct STATE *where;
                    243: { struct STATE *tmp;
                    244:   struct VISIT *work;
                    245: 
                    246:        if (where == NULL)
                    247:        {       tmp = newstate(ha);
                    248:                work = tmp->next;
                    249:        } else
                    250:        {       tmp = where;
                    251:                work = oldstate(where);
                    252:        }
                    253: 
                    254:        work->prop.s = s_last;
                    255:        work->depth = (short) level;
                    256: 
                    257:        lastvisit = work;
                    258:        relink(work);
                    259: 
                    260:        return tmp;
                    261: }
                    262: 
                    263: struct VISIT *
                    264: pickstate(at)
                    265:        struct STATE *at;
                    266: { struct VISIT *latter = NULL;
                    267:   register struct VISIT *hook = at->next;
                    268: 
                    269:        for (hook = at->next; hook != NULL; hook = hook->next)
                    270:        {       if (ISANA(hook))
                    271:                {       if (latter == NULL)
                    272:                                at->next = hook->next;
                    273:                        else
                    274:                                latter->next = hook->next;
                    275: 
                    276:                        efree(hook->c);
                    277:                        hook->next = NULL;
                    278:                        zapped++;
                    279: 
                    280:                        return hook;
                    281:                }
                    282:                latter = hook;
                    283:        }
                    284:        return NULL;
                    285: }
                    286: 
                    287: struct VISIT *
                    288: picknown(at, want)
                    289:        struct STATE *at;
                    290:        struct VISIT *want;
                    291: { struct VISIT *latter = NULL;
                    292:   register struct VISIT *hook;
                    293: 
                    294:        for (hook = at->next; hook != NULL; hook = hook->next)
                    295:        {       if (hook == want)
                    296:                        break;
                    297:                latter = hook;
                    298:        }
                    299:        if (hook == NULL)
                    300:                whoops("cannot happen - picknown");
                    301: 
                    302:        if (latter == NULL)
                    303:                at->next = hook->next;
                    304:        else
                    305:                latter->next = hook->next;
                    306: 
                    307:        efree(hook->c);
                    308:        hook->next = NULL;
                    309: 
                    310:        zapped++;
                    311:        return hook;
                    312: }
                    313: 
                    314: inihash()
                    315: { register int i;
                    316:   char *Smalloc();
                    317: 
                    318:        for (i = 0; i < nrtbl; i++)
                    319:                if (tbl[i].nrrows > maxr)
                    320:                        maxr = tbl[i].nrrows;
                    321: 
                    322:        Factor = (short *)
                    323:                Smalloc(maxr * sizeof(short));
                    324: 
                    325:        for (i = 0; i < maxr; i++)
                    326:                Factor[i] = rand()%NOTOOBIG;    /* number between 0 and 16k */
                    327: }
                    328: 
                    329: short
                    330: hashvalue(g)
                    331: { register int i, h;
                    332: 
                    333:        for (i = h = 0; i < nrprocs; i++)
                    334:        {       h = ((h << 2) | (h >> 13));     /* rotate */
                    335:                h ^= Factor[state[i]] ^ Factor[processes[i]];
                    336:        }
                    337:        h += g;
                    338:        return (h & NOTOOBIG);
                    339: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.