Annotation of 43BSDTahoe/usr.bin/struct/2.inarc.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)2.inarc.c  4.1     (Berkeley)      2/11/83";
        !             3: #endif not lint
        !             4: 
        !             5: #include <stdio.h>
        !             6: #
        !             7: /* find forward in-arcs for each node, pretending that arcs which jump into a loop 
        !             8:        jump to the head of the largest such loop instead, based on the
        !             9:        depth first search tree */
        !            10: #include "def.h"
        !            11: #include "2.def.h"
        !            12: 
        !            13: getinarc(inarc,head)           /* construct array "inarc" containing in arcs for each node */
        !            14: struct list **inarc;
        !            15: VERT *head;
        !            16:        {
        !            17:        VERT v,adj,x;
        !            18:        int i, j;
        !            19: 
        !            20:        for (v=0; v < nodenum; ++v) inarc[v] = 0;
        !            21: 
        !            22:        /* fill in inarc nodes */
        !            23: 
        !            24:        for (i = 0; i < accessnum; ++i)
        !            25:                {
        !            26:                v = after[i];
        !            27:                for (j = 0; j < ARCNUM(v); ++j)
        !            28:                        {
        !            29:                        adj = ARC(v,j);
        !            30:                        if (!DEFINED(adj))
        !            31:                                continue;
        !            32:                        if (ntoaft[adj] > ntoaft[v])            /* not a back edge */
        !            33:                                /* if edge jumps into loop, pretend jumps to head of
        !            34:                                        largest loop jumped into */
        !            35:                                {
        !            36:                                x = maxentry(v,adj,head);
        !            37:                                if (!DEFINED(x)) x = adj;
        !            38:                                else x = FATH(x);
        !            39: 
        !            40:                                inarc[x] = consls(v,inarc[x]);  /* insert v in list inarc[x] */
        !            41:                                }
        !            42:                        }
        !            43:                }
        !            44:        }
        !            45: 
        !            46: 
        !            47: 
        !            48: maxentry(x,y,head)     /* return z if z is ITERVX of largest loop containing y but not x, UNDEFINED otherwise */
        !            49: VERT x,y, *head;
        !            50:        {
        !            51:        if (head[y] == UNDEFINED)  return(UNDEFINED);
        !            52:        if (loomem(x,head[y], head)) return (UNDEFINED);
        !            53:        y = head[y];
        !            54:        while (head[y] != UNDEFINED)
        !            55:                {
        !            56:                if (loomem(x,head[y],head))  return(y);
        !            57:                y = head[y];
        !            58:                }
        !            59:        return(y);
        !            60:        }
        !            61: 
        !            62: 
        !            63: 
        !            64: loomem(x,y,head)                       /* return TRUE if x is in loop headed by y, FALSE otherwise */
        !            65: VERT x,y, *head;
        !            66:        {
        !            67:        VERT w;
        !            68:        if (!DEFINED(y)) return(TRUE);
        !            69:        ASSERT(NTYPE(y) == ITERVX, loomem);
        !            70:        for (w = (NTYPE(x) == ITERVX) ? x : head[x]; DEFINED(w); w = head[w])
        !            71:                if (w == y)  return (TRUE);
        !            72:        return(FALSE);
        !            73:        }

unix.superglobalmegacorp.com

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