|
|
1.1 root 1: typedef int boolean;
2: const boolean true = 1;
3: const boolean false = 0;
4:
5: struct dag_label_t {
6: int type; // STRING or DESC or 0 (no label)
7: char* value; // macro name or drawing code
8:
9: dag_label_t(int intype,char *invalue) {
10: type = intype;
11: value = invalue;
12: }
13: dag_label_t() {
14: type = 0;
15: value = 0;
16: }
17: };
18:
19: enum shape_id_t {Box,Square,Diamond,Circle,Doublecircle,Ellipse,Plaintext,User_defined};
20:
21: struct shape_t {
22: int type; // STRING or DESC
23: char* value; // ascii name
24: boolean predefined; // built-in type
25: shape_id_t shape_id; // if predefined, else is clipping shape_id
26:
27: shape_t(int intype, char* invalue);
28: boolean is_fixed_aspect_ratio();
29: };
30:
31: enum dag_ink_t {solid_ink,dashed_ink,dotted_ink,invis_ink};
32:
33: struct DAG_edge_t : public edge_t {
34: char* color;
35: dag_label_t label; // label to put on the edge
36: int pointsize;
37: int flipped; // true means backedge
38: dag_ink_t ink; // solid_ink, ...
39:
40: DAG_edge_t();
41: DAG_edge_t* nextof() {return (DAG_edge_t*) next;}
42: void setlabel(int intype, char *invalue);
43: void setcolor(char* color);
44: void setweight(int inweight);
45: void setink(dag_ink_t inink);
46: void setpointsize(int inpointsize);
47: };
48:
49: struct DAG_node_t : public node_t {
50: int pointsize;
51: dag_label_t label;
52: shape_t shape;
53: char* color;
54: int xsize; // note: these do not depend on orientation,
55: int ysize; // but the width and height in node_t do.
56:
57: void autosize();
58: void sethw();
59:
60: DAG_node_t();
61: void setname(char *invalue);
62: void setshape(int intype, char* invalue);
63: void setcolor(char *incolor);
64: void setlabel(int intype, char* invalue);
65: void setxsize(int inxsize);
66: void setysize(int inysize);
67: void setpointsize(int inpointsize);
68: };
69:
70: enum output_lang_t {Pic,Postscript,Graphdraw,Cip};
71:
72: struct user_info_t {
73: double height,width;
74: boolean rotated;
75:
76: user_info_t() {
77: height = width = 0.0;
78: rotated = false;
79: }
80: void set_rotate() {rotated = true;}
81: void set_size(double w, double h) {
82: width = w; height = h;
83: }
84: };
85:
86: struct Infile {
87: FILE *fp;
88: int line_number;
89: char *name;
90:
91: Infile() {
92: name = strcpy(new char[2],"-");
93: line_number = 0;
94: fp = stdin;
95: }
96: Infile(char *p) {
97: name = strcpy(new char[strlen(p)+1],p);
98: line_number = 0;
99: fp = fopen(name,"r");
100: }
101: char *gets(char*,int);
102: };
103:
104: struct pair_t {
105: int node;
106: pair_t *next;
107:
108: pair_t (int in_node, pair_t *in_next) {
109: node = in_node;
110: next = in_next;
111: }
112: };
113:
114: /* --- front end --- */
115: extern const int Resolution; // points per virtual inch
116: extern const double IPP; // real inches per point of type (NOT Resolution!)
117: extern const double Pi;
118:
119: class shared_string_t {
120: shared_string_t *next;
121: char data[1]; // dynamic
122: friend char* newstring(char*);
123: friend void freestrings();
124: };
125: extern shared_string_t *shared_string_pool;
126:
127: extern Infile Current_file;
128: extern boolean Uselib; // use standard DAG graphics library
129: extern char* Lib_path; // library directory
130: extern int N;
131: #define Init_extent 256
132: extern int Extent;
133: extern DAG_node_t **Node;
134: extern DAG_edge_t **Edge;
135: extern user_info_t User;
136: extern options_t Options;
137: extern char* Cmd_name;
138: extern output_lang_t Output_type;
139: extern int Xmax,Ymax;
140: extern Point Page_size;
141: extern Point Margin;
142:
143: /* parser */
144: extern int Syntax_error;
145: extern DAG_node_t Reset_node,Default_node;
146: extern DAG_edge_t Reset_edge,Default_edge;
147: int yyparse();
148: int yylex();
149: void yyerror(char*s,char *s1="", char* s2="", char *s3="", char *s4="");
150:
151: /* code generation */
152: void make_drawing();
153: void emit_pic();
154: void emit_ps();
155: void emit_graphdraw();
156: Point find_edge_midpoint(DAG_edge_t *e);
157: Point find_nodeport(int node, Point p0, Point p1);
158: void cat_libfile(char*);
159: void unsquirrel();
160:
161: /* util */
162: Infile nextfile(char** &argv);
163: void reclaim_hashtable();
164: void set_output_type(char*);
165: void set_page_size(char*);
166: options_t reset_options();
167: void set_bounds(double,double);
168: int node_lookup(char*);
169:
170: void dumpgraph();
171:
172: /* useful inline functions */
173: overload sign;
174: static inline int sign (int i) {return (i == 0? 0 : (i > 0 ? 1: - 1));}
175: static inline int sign (double i) {return (i == 0? 0 : (i > 0 ? 1: - 1));}
176: static inline double inchof(int i) { return (double)i / Resolution; }
177: static inline double distance(double x1, double y1, double x2, double y2)
178: {return sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));}
179: static inline int between (int i1, int i2, int i3) {
180: return ((i1 <= i2) && (i2 <= i3)) || ((i1 >= i2) && (i2 >= i3));
181: }
182: static inline int round(double d) { return( d > 0 ? (int)(d + .5) : (int)(d - .5)); }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.