|
|
1.1 root 1: #include <stdio.h>
2: #include <string.h>
3: #include <ctype.h>
4: #include <math.h>
5: #include <libc.h>
6: #include <memory.h>
7:
8: #define Maxint (((unsigned) 1 << 31) - 1)
9:
10: typedef int (*qsortcmpfun)(void*,void*);
11: #ifndef QSORTDCL
12: #ifdef MICC
13: extern "C" {
14: extern void qsort(char*,int, int, qsortcmpfun);
15: }
16: #else
17: extern void qsort(char*,int, int, qsortcmpfun);
18: #endif MICC
19: #endif QSORTDCL
20:
21: struct Point {
22: int x;
23: int y;
24: };
25:
26: // edge structure for input graphs
27: struct edge_t {
28: int node; // head or tail node
29: int weight; // cost of stretching this edge
30: int width; // the width of the edge. 0 = invis.
31: int minlen; // minimum length of the edge
32: union {
33: int count; // # of multiple edges in a class
34: // 'count' is used in our Outedges and Inedges
35: int place; // where it should be placed in its class
36: // of multiple edges
37: };
38: union {
39: Point *splinept; // spline control pts (last is (-1,-1))
40: edge_t *chain; // chaining of broken edges
41: };
42: edge_t *link; // to link inedges and outedges
43: edge_t *next;
44: Point top; // points from which the end-points can be
45: Point bottom; // stretched to intersect weird node shapes
46:
47: edge_t(int innode, edge_t *innext) // for boring linked lists
48: {
49: node = innode;
50: next = innext;
51: }
52: edge_t(int innode, int inweight, int inwidth, int inminlen, edge_t* innext) {
53: node = innode;
54: weight = inweight;
55: width = inwidth;
56: minlen = inminlen;
57: next = innext;
58: count = 1;
59: }
60: edge_t() {
61: /* this establishes the defaults for edges */
62: node = -1;
63: weight = 1;
64: width = 1;
65: minlen = 1;
66: count = 1;
67: /* others are zero by operator new */
68: }
69: };
70:
71: struct node_t {
72: char* name;
73: Point pos;
74: int width; // across the rank
75: int height; // above&below the rank
76: };
77:
78: struct options_t {
79: int quick; // optimize for speed not drawing quality.
80: int verbose; // say lots of things.
81: int rankadjust; // 0 = uneven OK, 1 = all equal, 2 = exact
82: int ranksep; // default separation between adjacent ranks
83: int nodesep; // minimum separation between adjacent nodes
84: int xbound; // if "fill" x limit of drawing area else 0
85: int ybound; // if "fill" y limit of drawing area else 0
86:
87: int **same_nodes,n_same_nodes;
88: int *source_nodes;
89: int *sink_nodes;
90: };
91:
92: overload max;
93: static inline double max(double a, double b) { return a > b ? a : b; }
94: static inline int max(int a, int b) { return a > b ? a : b; }
95:
96: overload min;
97: static inline double min(double a, double b) { return a < b ? a : b; }
98: static inline int min(int a, int b) { return a < b ? a : b; }
99:
100: static inline void swap(int& a, int& b) { int t; t = a; a = b; b = t;}
101:
102: static inline int iabs(int a) { return a < 0 ? -a : a; }
103:
104: extern void draw_dag(int,node_t**,edge_t**,options_t);
105: extern void dag_start(int,node_t**,edge_t**,options_t);
106: extern void dag_delstem();
107: extern void dag_insstem();
108: extern void dag_levels(int,int,int);
109: extern void dag_positions(int,int);
110: extern void dag_ranks();
111: extern void dag_unitedges();
112: extern void dag_end(node_t**,edge_t**);
113: extern void dag_simplex(int,int,long**,long*,long*,int,int*);
114: extern void dag_spline();
115: extern void deledges(int,edge_t**);
116: extern int longedge(int,int);
117: extern void panic(char*);
118:
119: // The following variables and storage space are available to users
120: // after a call to draw_dag(). In particular, Nodepos and Levelpos
121: // define the virtual locations assigned to nodes and levels.
122:
123: extern int N_real_nodes, // actual number of input nodes
124: N_nodes, // number of nodes at various phases
125: N_edges, // total number of edges
126: N_self_edges, // # of loops detected
127: N_flat_edges, // # of edges whose ends are at the same level
128: N_repeat_edges, // # of multi-edges deleted
129: N_revert_edges; // # of edges whose direction is reverted
130: extern edge_t **Inedges, // in-edges for each node
131: **Outedges, // out-edges
132: **Noedges, // self-edges and flat edges
133: **Istems, // in stem-edges
134: **Ostems; // out stem edges
135: extern int *Stems; // stem nodes
136: extern int *Trueheight; // save heights for when stem nodes are removed
137:
138: extern int *Root; // union trees of vertices at same ranks
139:
140: extern int N_component; // number of connected components
141: extern int *Component; // connected component numbers of nodes
142:
143: extern int *Level, // levels assigned to nodes
144: Maxlevel, // maximum level assigned to any node
145: *N_level, // number of nodes at each level
146: *Invert, // indices of nodes in their ranks
147: **Rank, // array of ordered lists of nodes
148: Levelsep, // separation between levels
149: *Levelheight, // thickness of layers
150: *Levelpos; // position of levels
151:
152: extern int *Nodepos, // node positions
153: *Deleted, // virtual nodes that were deleted
154: *Width, // widths of nodes
155: Nodesep, // minimum separation between nodes
156: *Height; // heights of nodes
157:
158: extern int Xbound,Ybound; // if "fill" then size of box to fill, else 0
159:
160: extern int Verbose; // say lots of things
161:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.