Annotation of researchv10no/cmd/dag/dag_edge.c, revision 1.1

1.1     ! root        1: #include       "draw_dag.h"
        !             2: 
        !             3: 
        !             4: /*
        !             5:        Turn long edges into sequences of length-1 edges
        !             6: */
        !             7: 
        !             8: void dag_unitedges()
        !             9: {
        !            10:        // compute the thickness for each level
        !            11:        Levelheight = new int[Maxlevel+1];
        !            12:        for(int v = 0; v < N_real_nodes; ++v)
        !            13:                if(Height[v] > Levelheight[Level[v]])
        !            14:                        Levelheight[Level[v]] = Height[v];
        !            15: 
        !            16:        // count the number of new edges, and nodes
        !            17:        int n_dummies = 0;
        !            18:        for(v = 0; v < N_real_nodes; v++)
        !            19:        for(edge_t *e = Outedges[v]; e; e = e->next)
        !            20:        {
        !            21:                if(Level[e->node] <= Level[v])
        !            22:                        panic("Bad level assignment");
        !            23:                n_dummies += (Level[e->node] - Level[v]) - 1;
        !            24:        }
        !            25: 
        !            26:        // reset N_nodes
        !            27:        N_nodes += n_dummies;
        !            28: 
        !            29: #ifndef TIMING
        !            30:        if(Verbose)
        !            31:                fprintf(stderr,"Dummy nodes = %d\n",n_dummies);
        !            32: #endif
        !            33: 
        !            34:        // get more space for Level[], Outedges[] and Inedges[]
        !            35:        Width = (int *) realloc((char *)Width,N_nodes*sizeof(Width[0]));
        !            36:        Height = (int *) realloc((char *)Height,N_nodes*sizeof(Height[0]));
        !            37:        Level = (int *) realloc((char *)Level,N_nodes*sizeof(Level[0]));
        !            38:        Inedges = (edge_t **) realloc((char *)Inedges,N_nodes*sizeof(Inedges[0]));
        !            39:        Outedges = (edge_t **) realloc((char *)Outedges,N_nodes*sizeof(Outedges[0]));
        !            40:        if(!Width || !Height || !Level || !Inedges || !Outedges)
        !            41:                panic("out of memory");
        !            42:        for(v = N_real_nodes; v < N_nodes; v++)
        !            43:        {
        !            44:                Inedges[v] = Outedges[v] = (edge_t *)(NULL);
        !            45:                Level[v] = Width[v] = Height[v] = 0;
        !            46:        }
        !            47: 
        !            48:        // create new dummy nodes and edges
        !            49:        int dummy = N_real_nodes;
        !            50:        for(v = 0; v < N_real_nodes; v++)
        !            51:        for(e = Outedges[v]; e; e = e->next)
        !            52:        {
        !            53:                if(Level[v]+1 == Level[e->node])
        !            54:                        continue;
        !            55: 
        !            56:                // attributes of new edges
        !            57:                int     node = e->node;
        !            58:                int     weight = e->weight;
        !            59:                int     count = e->count;
        !            60:                int     width = e->width;
        !            61: 
        !            62:                // delete corresponding Inedge 
        !            63:                edge_t *lastf = (edge_t*)0;
        !            64:                for(edge_t *f = Inedges[node]; f; lastf = f, f = f->next)
        !            65:                        if(f->node == v)
        !            66:                                break;
        !            67:                if(lastf)
        !            68:                        lastf->next = f->next;
        !            69:                else    Inedges[node] = f->next;
        !            70: 
        !            71:                // make these edges short
        !            72:                f->next = NULL;
        !            73:                Inedges[dummy] = f;
        !            74:                e->node = dummy++;
        !            75: 
        !            76:                // make the rest of the short edges
        !            77:                int     lev = Level[v]+1;
        !            78:                int     maxlev = Level[node];
        !            79:                int     tail = e->node;
        !            80:                int     head = lev == maxlev-1 ? node : dummy++;
        !            81:                edge_t  *ochain = e, *ichain = f;
        !            82:                while(lev < maxlev)
        !            83:                {
        !            84:                        Level[tail] = lev;
        !            85:                        Width[tail] = width;
        !            86:                        Height[tail] = Levelheight[lev];
        !            87: 
        !            88:                        N_edges++;
        !            89:                        Outedges[tail] =
        !            90:                                new edge_t(head,weight,width,1,Outedges[tail]);
        !            91:                        Outedges[tail]->count = count;
        !            92:                        Inedges[head] =
        !            93:                                new edge_t(tail,weight,width,1,Inedges[head]);
        !            94:                        Inedges[head]->count = count;
        !            95:                        Outedges[tail]->link = Inedges[head];
        !            96:                        Inedges[head]->link = Outedges[tail];
        !            97: 
        !            98:                        // chain the broken edges
        !            99:                        ochain->chain = Outedges[tail];
        !           100:                        Inedges[head]->chain = ichain;
        !           101:                        ochain = Outedges[tail];
        !           102:                        ichain = Inedges[head];
        !           103: 
        !           104:                        if(++lev < maxlev)
        !           105:                        {
        !           106:                                tail = head;
        !           107:                                head = lev == maxlev-1 ? node : dummy++;
        !           108:                        }
        !           109:                }
        !           110:        }
        !           111: }
        !           112: 
        !           113: 
        !           114: #ifdef DEBUG
        !           115: static void d_chk_level()
        !           116: {
        !           117:        for(int i = 0; i < N_nodes; ++i)
        !           118:                if(Level[i] > Maxlevel || Level[i] < 0)
        !           119:                        (void) abort();
        !           120: }
        !           121: #endif

unix.superglobalmegacorp.com

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