1 /* VCG description handler for Bison. 
   3    Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. 
   5    This file is part of Bison, the GNU Compiler Compiler. 
   7    Bison is free software; you can redistribute it and/or modify 
   8    it under the terms of the GNU General Public License as published by 
   9    the Free Software Foundation; either version 2, or (at your option) 
  12    Bison is distributed in the hope that it will be useful, 
  13    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  15    GNU General Public License for more details. 
  17    You should have received a copy of the GNU General Public License 
  18    along with Bison; see the file COPYING.  If not, write to 
  19    the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
  20    Boston, MA 02111-1307, USA.  */ 
  27 #include "vcg_defaults.h" 
  29 /* Return an unambiguous printable representated, for NAME, suitable 
  30    for C strings.  Use slot 2 since the user may use slots 0 and 1. 
  34 quote (char const *name
) 
  36   return quotearg_n_style (2, c_quoting_style
, name
); 
  40 /* Initialize a graph with the default values. */ 
  47   g
->infos
[0] = G_INFOS1
; 
  48   g
->infos
[1] = G_INFOS2
; 
  49   g
->infos
[2] = G_INFOS3
; 
  52   g
->textcolor 
= G_TEXTCOLOR
; 
  53   g
->bordercolor 
= G_BORDERCOLOR
; 
  57   g
->borderwidth 
= G_BORDERWIDTH
; 
  60   g
->folding 
= G_FOLDING
; 
  64   g
->textmode 
= G_TEXTMODE
; 
  67   g
->vertical_order 
= G_VERTICAL_ORDER
; 
  68   g
->horizontal_order 
= G_HORIZONTAL_ORDER
; 
  70   g
->xmax 
= G_XMAX
; /* Not output. */ 
  71   g
->ymax 
= G_YMAX
; /* Not output. */ 
  78   g
->xlspace 
= G_XLSPACE
; /* Not output. */ 
  80   g
->xraster 
= G_XRASTER
; 
  81   g
->yraster 
= G_YRASTER
; 
  82   g
->xlraster 
= G_XLRASTER
; 
  84   g
->hidden 
= G_HIDDEN
; /* No default value. */ 
  86   g
->classname 
= G_CLASSNAME
; /* No class name association. */ 
  88   g
->layoutalgorithm 
= G_LAYOUTALGORITHM
; 
  89   g
->layout_downfactor 
= G_LAYOUT_DOWNFACTOR
; 
  90   g
->layout_upfactor 
= G_LAYOUT_UPFACTOR
; 
  91   g
->layout_nearfactor 
= G_LAYOUT_NEARFACTOR
; 
  92   g
->layout_splinefactor 
= G_LAYOUT_SPLINEFACTOR
; 
  94   g
->late_edge_labels 
= G_LATE_EDGE_LABELS
; 
  95   g
->display_edge_labels 
= G_DISPLAY_EDGE_LABELS
; 
  96   g
->dirty_edge_labels 
= G_DIRTY_EDGE_LABELS
; 
  97   g
->finetuning 
= G_FINETUNING
; 
  98   g
->ignore_singles 
= G_IGNORE_SINGLES
; 
  99   g
->priority_phase 
= G_PRIORITY_PHASE
; 
 100   g
->manhattan_edges 
= G_MANHATTAN_EDGES
; 
 101   g
->smanhattan_edges 
= G_SMANHATTAN_EDGES
; 
 102   g
->near_edges 
= G_NEAR_EDGES
; 
 104   g
->orientation 
= G_ORIENTATION
; 
 105   g
->node_alignment 
= G_NODE_ALIGNMENT
; 
 106   g
->port_sharing 
= G_PORT_SHARING
; 
 107   g
->arrow_mode 
= G_ARROW_MODE
; 
 108   g
->treefactor 
= G_TREEFACTOR
; 
 109   g
->spreadlevel 
= G_SPREADLEVEL
; 
 110   g
->crossing_weight 
= G_CROSSING_WEIGHT
; 
 111   g
->crossing_phase2 
= G_CROSSING_PHASE2
; 
 112   g
->crossing_optimization 
= G_CROSSING_OPTIMIZATION
; 
 117   g
->splines 
= G_SPLINES
; 
 128   g
->node_list 
= G_NODE_LIST
; 
 129   g
->edge_list 
= G_EDGE_LIST
; 
 135 /* Initialize a node with the default values. */ 
 142   n
->locx 
= N_LOCX
; /* Default unspcified. */ 
 143   n
->locy 
= N_LOCY
; /* Default unspcified. */ 
 145   n
->vertical_order 
= N_VERTICAL_ORDER
; /* Default unspcified. */ 
 146   n
->horizontal_order 
= N_HORIZONTAL_ORDER
;     /* Default unspcified. */ 
 148   n
->width 
= N_WIDTH
; /* We assume that we can't define it now. */ 
 149   n
->height 
= N_HEIGHT
; /* Also. */ 
 151   n
->shrink 
= N_SHRINK
; 
 152   n
->expand 
= N_EXPAND
; 
 154   n
->folding 
= N_FOLDING
; /* No explicit default value. */ 
 157   n
->textmode 
= N_TEXTMODE
; 
 158   n
->borderwidth 
= N_BORDERWIDTH
; 
 161   n
->textcolor 
= N_TEXTCOLOR
; 
 162   n
->bordercolor 
= N_BORDERCOLOR
; 
 164   n
->infos
[0] = N_INFOS1
; 
 165   n
->infos
[1] = N_INFOS2
; 
 166   n
->infos
[2] = N_INFOS3
; 
 171 /* Initialize an edge with the default values. */ 
 175   e
->type 
= E_EDGE_TYPE
; 
 177   e
->sourcename 
= E_SOURCENAME
; 
 178   e
->targetname 
= E_TARGETNAME
; 
 181   e
->linestyle 
= E_LINESTYLE
; 
 182   e
->thickness 
= E_THICKNESS
; 
 187   e
->textcolor 
= E_TEXTCOLOR
; 
 188   e
->arrowcolor 
= E_ARROWCOLOR
; 
 189   e
->backarrowcolor 
= E_BACKARROWCOLOR
; 
 191   e
->arrowsize 
= E_ARROWSIZE
; 
 192   e
->backarrowsize 
= E_BACKARROWSIZE
; 
 193   e
->arrowstyle 
= E_ARROWSTYLE
; 
 195   e
->backarrowstyle 
= E_BACKARROWSTYLE
; 
 197   e
->priority 
= E_PRIORITY
; 
 199   e
->anchor 
= E_ANCHOR
; 
 201   e
->horizontal_order 
= E_HORIZONTAL_ORDER
; 
 206 /*----------------------------------------------. 
 208 | Return string corresponding to an enum value. | 
 209 `----------------------------------------------*/ 
 212 get_color_str (enum color color
) 
 216     case white
:         return "white"; 
 217     case blue
:          return "blue"; 
 218     case red
:           return "red"; 
 219     case green
:         return "green"; 
 220     case yellow
:        return "yellow"; 
 221     case magenta
:       return "magenta"; 
 222     case cyan
:          return "cyan"; 
 223     case darkgrey
:      return "darkgrey"; 
 224     case darkblue
:      return "darkblue"; 
 225     case darkred
:       return "darkred"; 
 226     case darkgreen
:     return "darkgreen"; 
 227     case darkyellow
:    return "darkyellow"; 
 228     case darkmagenta
:   return "darkmagenta"; 
 229     case darkcyan
:      return "darkcyan"; 
 230     case gold
:          return "gold"; 
 231     case lightgrey
:     return "lightgrey"; 
 232     case lightblue
:     return "lightblue"; 
 233     case lightred
:      return "lightred"; 
 234     case lightgreen
:    return "lightgreen"; 
 235     case lightyellow
:   return "lightyellow"; 
 236     case lightmagenta
:  return "lightmagenta"; 
 237     case lightcyan
:     return "lightcyan"; 
 238     case lilac
:         return "lilac"; 
 239     case turquoise
:     return "turquoise"; 
 240     case aquamarine
:    return "aquamarine"; 
 241     case khaki
:         return "khaki"; 
 242     case purple
:        return "purple"; 
 243     case yellowgreen
:   return "yellowgreen"; 
 244     case pink
:          return "pink"; 
 245     case orange
:        return "orange"; 
 246     case orchid
:        return "orchid"; 
 247     case black
:         return "black"; 
 248     default:            abort (); return NULL
; 
 253 get_textmode_str (enum textmode textmode
) 
 257     case centered
:      return "center"; 
 258     case left_justify
:  return "left_justify"; 
 259     case right_justify
: return "right_justify"; 
 260     default:            abort (); return NULL
; 
 265 get_shape_str (enum shape shape
) 
 269     case box
:           return "box"; 
 270     case rhomb
:         return "rhomb"; 
 271     case ellipse
:       return "ellipse"; 
 272     case triangle
:      return "triangle"; 
 273     default:            abort (); return NULL
; 
 278 get_layoutalgorithm_str (enum layoutalgorithm layoutalgorithm
) 
 280   switch (layoutalgorithm
) 
 282     case normal
:        return "normal"; 
 283     case maxdepth
:      return "maxdepth"; 
 284     case mindepth
:      return "mindepth"; 
 285     case maxdepthslow
:  return "maxdepthslow"; 
 286     case mindepthslow
:  return "mindepthslow"; 
 287     case maxdegree
:     return "maxdegree"; 
 288     case mindegree
:     return "mindegree"; 
 289     case maxindegree
:   return "maxindegree"; 
 290     case minindegree
:   return "minindegree"; 
 291     case maxoutdegree
:  return "maxoutdegree"; 
 292     case minoutdegree
:  return "minoutdegree"; 
 293     case minbackward
:   return "minbackward"; 
 294     case dfs
:           return "dfs"; 
 295     case tree
:          return "tree"; 
 296     default:            abort (); return NULL
; 
 301 get_decision_str (enum decision decision
) 
 305     case no
:    return "no"; 
 306     case yes
:   return "yes"; 
 307     default:    abort (); return NULL
; 
 312 get_orientation_str (enum orientation orientation
) 
 316     case top_to_bottom
: return "top_to_bottom"; 
 317     case bottom_to_top
: return "bottom_to_top"; 
 318     case left_to_right
: return "left_to_right"; 
 319     case right_to_left
: return "right_to_left"; 
 320     default:            abort (); return NULL
; 
 325 get_node_alignment_str (enum alignment alignment
) 
 329     case center
:        return "center"; 
 330     case top
:           return "top"; 
 331     case bottom
:        return "bottom"; 
 332     default:            abort (); return NULL
; 
 337 get_arrow_mode_str (enum arrow_mode arrow_mode
) 
 341     case fixed
:         return "fixed"; 
 342     case free_a
:        return "free"; 
 343     default:            abort (); return NULL
; 
 348 get_crossing_type_str (enum crossing_type crossing_type
) 
 350   switch (crossing_type
) 
 352     case bary
:          return "bary"; 
 353     case median
:        return "median"; 
 354     case barymedian
:    return "barymedian"; 
 355     case medianbary
:    return "medianbary"; 
 356     default:            abort (); return NULL
; 
 361 get_view_str (enum view view
) 
 365     case normal_view
:   return "normal_view"; 
 366     case cfish
:         return "cfish"; 
 367     case pfish
:         return "pfish"; 
 368     case fcfish
:        return "fcfish"; 
 369     case fpfish
:        return "fpfish"; 
 370     default:            abort (); return NULL
; 
 375 get_linestyle_str (enum linestyle linestyle
) 
 379     case continuous
:    return "continuous"; 
 380     case dashed
:        return "dashed"; 
 381     case dotted
:        return "dotted"; 
 382     case invisible
:     return "invisible"; 
 383     default:            abort (); return NULL
; 
 388 get_arrowstyle_str (enum arrowstyle arrowstyle
) 
 392     case solid
: return "solid"; 
 393     case line
:  return "line"; 
 394     case none
:  return "none"; 
 395     default:    abort (); return NULL
; 
 399 /*------------------------------. 
 401 | Edge and nodes into a graph.  | 
 402 `------------------------------*/ 
 405 add_node (graph 
*g
, node 
*n
) 
 407   n
->next 
= g
->node_list
; 
 412 add_edge (graph 
*g
, edge 
*e
) 
 414   e
->next 
= g
->edge_list
; 
 419 add_classname (graph 
*g
, int val
, const char *name
) 
 421   struct classname 
*classname
; 
 423   MALLOC (classname
, 1); 
 425   classname
->name 
= name
; 
 426   classname
->next 
= g
->classname
; 
 427   g
->classname 
= classname
; 
 431 add_infoname (graph 
*g
, int integer
, const char *str
) 
 433   struct infoname 
*infoname
; 
 435   MALLOC (infoname
, 1); 
 436   infoname
->integer 
= integer
; 
 437   infoname
->chars 
= str
; 
 438   infoname
->next 
= g
->infoname
; 
 439   g
->infoname 
= infoname
; 
 442 /* Build a colorentry struct and add it to the list.  */ 
 444 add_colorentry (graph 
*g
, int color_idx
, int red_cp
, 
 445                 int green_cp
, int blue_cp
) 
 447   struct colorentry 
*ce
; 
 450   ce
->color_index 
= color_idx
; 
 452   ce
->green_cp 
= green_cp
; 
 453   ce
->blue_cp 
= blue_cp
; 
 454   ce
->next 
= g
->colorentry
; 
 458 /*-------------------------------------. 
 459 | Open and close functions (formatted) | 
 460 `-------------------------------------*/ 
 463 open_edge (edge 
*e
, FILE *fout
) 
 468       fputs ("\tedge: {\n", fout
); 
 471       fputs ("\tbackedge: {\n", fout
); 
 474       fputs ("\tnearedge: {\n", fout
); 
 477       fputs ("\tbentnearedge: {\n", fout
); 
 480       fputs ("\tedge: {\n", fout
); 
 485 close_edge (FILE *fout
) 
 487   fputs ("\t}\n", fout
); 
 491 open_node (FILE *fout
) 
 493   fputs ("\tnode: {\n", fout
); 
 497 close_node (FILE *fout
) 
 499   fputs ("\t}\n", fout
); 
 503 open_graph (FILE *fout
) 
 505   fputs ("graph: {\n", fout
); 
 509 close_graph (graph 
*g
, FILE *fout
) 
 513   /* FIXME: Unallocate nodes and edges if required.  */ 
 517     for (n 
= g
->node_list
; n
; n 
= n
->next
) 
 520         output_node (n
, fout
); 
 530     for (e 
= g
->edge_list
; e
; e 
= e
->next
) 
 533         output_edge (e
, fout
); 
 541 /*-------------------------------------------. 
 542 | Output functions (formatted) in file FOUT  | 
 543 `-------------------------------------------*/ 
 546 output_node (node 
*n
, FILE *fout
) 
 548   if (n
->title 
!= N_TITLE
) 
 549     fprintf (fout
, "\t\ttitle:\t%s\n", quote (n
->title
)); 
 550   if (n
->label 
!= N_LABEL
) 
 551     fprintf (fout
, "\t\tlabel:\t%s\n", quote (n
->label
)); 
 553   if ((n
->locx 
!= N_LOCX
) && (n
->locy 
!= N_LOCY
)) 
 554     fprintf (fout
, "\t\tloc { x: %d  y: %d }\t\n", n
->locx
, n
->locy
); 
 556   if (n
->vertical_order 
!= N_VERTICAL_ORDER
) 
 557     fprintf (fout
, "\t\tvertical_order:\t%d\n", n
->vertical_order
); 
 558   if (n
->horizontal_order 
!= N_HORIZONTAL_ORDER
) 
 559     fprintf (fout
, "\t\thorizontal_order:\t%d\n", n
->horizontal_order
); 
 561   if (n
->width 
!= N_WIDTH
) 
 562     fprintf (fout
, "\t\twidth:\t%d\n", n
->width
); 
 563   if (n
->height 
!= N_HEIGHT
) 
 564     fprintf (fout
, "\t\theight:\t%d\n", n
->height
); 
 566   if (n
->shrink 
!= N_SHRINK
) 
 567     fprintf (fout
, "\t\tshrink:\t%d\n", n
->shrink
); 
 568   if (n
->expand 
!= N_EXPAND
) 
 569     fprintf (fout
, "\t\texpand:\t%d\n", n
->expand
); 
 571   if (n
->folding 
!= N_FOLDING
) 
 572     fprintf (fout
, "\t\tfolding:\t%d\n", n
->folding
); 
 574   if (n
->textmode 
!= N_TEXTMODE
) 
 575     fprintf (fout
, "\t\ttextmode:\t%s\n", 
 576              get_textmode_str (n
->textmode
)); 
 578   if (n
->shape 
!= N_SHAPE
) 
 579     fprintf (fout
, "\t\tshape:\t%s\n", get_shape_str (n
->shape
)); 
 581   if (n
->borderwidth 
!= N_BORDERWIDTH
) 
 582     fprintf (fout
, "\t\tborderwidth:\t%d\n", n
->borderwidth
); 
 584   if (n
->color 
!= N_COLOR
) 
 585     fprintf (fout
, "\t\tcolor:\t%s\n", get_color_str (n
->color
)); 
 586   if (n
->textcolor 
!= N_TEXTCOLOR
) 
 587     fprintf (fout
, "\t\ttextcolor:\t%s\n", 
 588              get_color_str (n
->textcolor
)); 
 589   if (n
->bordercolor 
!= N_BORDERCOLOR
) 
 590     fprintf (fout
, "\t\tbordercolor:\t%s\n", 
 591              get_color_str (n
->bordercolor
)); 
 595     for (i 
= 0; i 
< 3; ++i
) 
 597         fprintf (fout
, "\t\tinfo%d:\t%s\n", 
 598                  i
, quote (n
->infos
[i
])); 
 603 output_edge (edge 
*e
, FILE *fout
) 
 605   /* FIXME: SOURCENAME and TARGETNAME are mandatory 
 606      so it has to be fatal not to give these informations.  */ 
 607   if (e
->sourcename 
!= E_SOURCENAME
) 
 608     fprintf (fout
, "\t\tsourcename:\t%s\n", quote (e
->sourcename
)); 
 609   if (e
->targetname 
!= E_TARGETNAME
) 
 610     fprintf (fout
, "\t\ttargetname:\t%s\n", quote (e
->targetname
)); 
 612   if (e
->label 
!= E_LABEL
) 
 613     fprintf (fout
, "\t\tlabel:\t%s\n", quote (e
->label
)); 
 615   if (e
->linestyle 
!= E_LINESTYLE
) 
 616     fprintf (fout
, "\t\tlinestyle:\t%s\n", 
 617              quote (get_linestyle_str (e
->linestyle
))); 
 619   if (e
->thickness 
!= E_THICKNESS
) 
 620     fprintf (fout
, "\t\tthickness:\t%d\n", e
->thickness
); 
 621   if (e
->class != E_CLASS
) 
 622     fprintf (fout
, "\t\tclass:\t%d\n", e
->class); 
 624   if (e
->color 
!= E_COLOR
) 
 625     fprintf (fout
, "\t\tcolor:\t%s\n", get_color_str (e
->color
)); 
 626   if (e
->color 
!= E_TEXTCOLOR
) 
 627     fprintf (fout
, "\t\ttextcolor:\t%s\n", 
 628              get_color_str (e
->textcolor
)); 
 629   if (e
->arrowcolor 
!= E_ARROWCOLOR
) 
 630     fprintf (fout
, "\t\tarrowcolor:\t%s\n", 
 631              get_color_str (e
->arrowcolor
)); 
 632   if (e
->backarrowcolor 
!= E_BACKARROWCOLOR
) 
 633     fprintf (fout
, "\t\tbackarrowcolor:\t%s\n", 
 634              get_color_str (e
->backarrowcolor
)); 
 636   if (e
->arrowsize 
!= E_ARROWSIZE
) 
 637     fprintf (fout
, "\t\tarrowsize:\t%d\n", e
->arrowsize
); 
 638   if (e
->backarrowsize 
!= E_BACKARROWSIZE
) 
 639     fprintf (fout
, "\t\tbackarrowsize:\t%d\n", e
->backarrowsize
); 
 641   if (e
->arrowstyle 
!= E_ARROWSTYLE
) 
 642     fprintf (fout
, "\t\tarrowstyle:\t%s\n", 
 643              get_arrowstyle_str (e
->arrowstyle
)); 
 644   if (e
->backarrowstyle 
!= E_BACKARROWSTYLE
) 
 645     fprintf (fout
, "\t\tbackarrowstyle:\t%s\n", 
 646              get_arrowstyle_str (e
->backarrowstyle
)); 
 648   if (e
->priority 
!= E_PRIORITY
) 
 649     fprintf (fout
, "\t\tpriority:\t%d\n", e
->priority
); 
 650   if (e
->anchor 
!= E_ANCHOR
) 
 651     fprintf (fout
, "\t\tanchor:\t%d\n", e
->anchor
); 
 652   if (e
->horizontal_order 
!= E_HORIZONTAL_ORDER
) 
 653     fprintf (fout
, "\t\thorizontal_order:\t%d\n", e
->horizontal_order
); 
 657 output_graph (graph 
*g
, FILE *fout
) 
 660     fprintf (fout
, "\ttitle:\t%s\n", quote (g
->title
)); 
 662     fprintf (fout
, "\tlabel:\t%s\n", quote (g
->label
)); 
 666     for (i 
= 0; i 
< 3; ++i
) 
 668         fprintf (fout
, "\tinfo%d:\t%s\n", i
, quote (g
->infos
[i
])); 
 671   if (g
->color 
!= G_COLOR
) 
 672     fprintf (fout
, "\tcolor:\t%s\n", get_color_str (g
->color
)); 
 673   if (g
->textcolor 
!= G_TEXTCOLOR
) 
 674     fprintf (fout
, "\ttextcolor:\t%s\n", get_color_str (g
->textcolor
)); 
 675   if (g
->bordercolor 
!= G_BORDERCOLOR
) 
 676     fprintf (fout
, "\tbordercolor:\t%s\n", 
 677              get_color_str (g
->bordercolor
)); 
 679   if (g
->width 
!= G_WIDTH
) 
 680     fprintf (fout
, "\twidth:\t%d\n", g
->width
); 
 681   if (g
->height 
!= G_HEIGHT
) 
 682     fprintf (fout
, "\theight:\t%d\n", g
->height
); 
 683   if (g
->borderwidth 
!= G_BORDERWIDTH
) 
 684     fprintf (fout
, "\tborderwidth:\t%d\n", g
->borderwidth
); 
 687     fprintf (fout
, "\tx:\t%d\n", g
->x
); 
 689     fprintf (fout
, "\ty:\t%d\n", g
->y
); 
 691   if (g
->folding 
!= G_FOLDING
) 
 692     fprintf (fout
, "\tfolding:\t%d\n", g
->folding
); 
 694   if (g
->shrink 
!= G_SHRINK
) 
 695     fprintf (fout
, "\tshrink:\t%d\n", g
->shrink
); 
 696   if (g
->expand 
!= G_EXPAND
) 
 697     fprintf (fout
, "\texpand:\t%d\n", g
->expand
); 
 699   if (g
->textmode 
!= G_TEXTMODE
) 
 700     fprintf (fout
, "\ttextmode:\t%s\n", 
 701              get_textmode_str (g
->textmode
)); 
 703   if (g
->shape 
!= G_SHAPE
) 
 704     fprintf (fout
, "\tshape:\t%s\n", get_shape_str (g
->shape
)); 
 706   if (g
->vertical_order 
!= G_VERTICAL_ORDER
) 
 707     fprintf (fout
, "\tvertical_order:\t%d\n", g
->vertical_order
); 
 708   if (g
->horizontal_order 
!= G_HORIZONTAL_ORDER
) 
 709     fprintf (fout
, "\thorizontal_order:\t%d\n", g
->horizontal_order
); 
 711   if (g
->xmax 
!= G_XMAX
) 
 712     fprintf (fout
, "\txmax:\t%d\n", g
->xmax
); 
 713   if (g
->ymax 
!= G_YMAX
) 
 714     fprintf (fout
, "\tymax:\t%d\n", g
->ymax
); 
 716   if (g
->xbase 
!= G_XBASE
) 
 717     fprintf (fout
, "\txbase:\t%d\n", g
->xbase
); 
 718   if (g
->ybase 
!= G_YBASE
) 
 719     fprintf (fout
, "\tybase:\t%d\n", g
->ybase
); 
 721   if (g
->xspace 
!= G_XSPACE
) 
 722     fprintf (fout
, "\txspace:\t%d\n", g
->xspace
); 
 723   if (g
->yspace 
!= G_YSPACE
) 
 724     fprintf (fout
, "\tyspace:\t%d\n", g
->yspace
); 
 725   if (g
->xlspace 
!= G_XLSPACE
) 
 726     fprintf (fout
, "\txlspace:\t%d\n", g
->xlspace
); 
 728   if (g
->xraster 
!= G_XRASTER
) 
 729     fprintf (fout
, "\txraster:\t%d\n", g
->xraster
); 
 730   if (g
->yraster 
!= G_YRASTER
) 
 731     fprintf (fout
, "\tyraster:\t%d\n", g
->yraster
); 
 732   if (g
->xlraster 
!= G_XLRASTER
) 
 733     fprintf (fout
, "\txlraster:\t%d\n", g
->xlraster
); 
 735   if (g
->hidden 
!= G_HIDDEN
) 
 736     fprintf (fout
, "\thidden:\t%d\n", g
->hidden
); 
 738   /* FIXME: Unallocate struct list if required. 
 739      Maybe with a little function.  */ 
 740   if (g
->classname 
!= G_CLASSNAME
) 
 742       struct classname 
*ite
; 
 744       for (ite 
= g
->classname
; ite
; ite 
= ite
->next
) 
 745         fprintf (fout
, "\tclassname %d :\t%s\n", ite
->no
, ite
->name
); 
 748   if (g
->infoname 
!= G_INFONAME
) 
 750       struct infoname 
*ite
; 
 752       for (ite 
= g
->infoname
; ite
; ite 
= ite
->next
) 
 753         fprintf (fout
, "\tinfoname %d :\t%s\n", ite
->integer
, ite
->chars
); 
 756   if (g
->colorentry 
!= G_COLORENTRY
) 
 758       struct colorentry 
*ite
; 
 760       for (ite 
= g
->colorentry
; ite
; ite 
= ite
->next
) 
 762           fprintf (fout
, "\tcolorentry %d :\t%d %d %d\n", 
 770   if (g
->layoutalgorithm 
!= G_LAYOUTALGORITHM
) 
 771     fprintf (fout
, "\tlayoutalgorithm:\t%s\n", 
 772              get_layoutalgorithm_str (g
->layoutalgorithm
)); 
 774   if (g
->layout_downfactor 
!= G_LAYOUT_DOWNFACTOR
) 
 775     fprintf (fout
, "\tlayout_downfactor:\t%d\n", g
->layout_downfactor
); 
 776   if (g
->layout_upfactor 
!= G_LAYOUT_UPFACTOR
) 
 777     fprintf (fout
, "\tlayout_upfactor:\t%d\n", g
->layout_upfactor
); 
 778   if (g
->layout_nearfactor 
!= G_LAYOUT_NEARFACTOR
) 
 779     fprintf (fout
, "\tlayout_nearfactor:\t%d\n", g
->layout_nearfactor
); 
 780   if (g
->layout_splinefactor 
!= G_LAYOUT_SPLINEFACTOR
) 
 781     fprintf (fout
, "\tlayout_splinefactor:\t%d\n", 
 782              g
->layout_splinefactor
); 
 784   if (g
->late_edge_labels 
!= G_LATE_EDGE_LABELS
) 
 785     fprintf (fout
, "\tlate_edge_labels:\t%s\n", 
 786              get_decision_str (g
->late_edge_labels
)); 
 787   if (g
->display_edge_labels 
!= G_DISPLAY_EDGE_LABELS
) 
 788     fprintf (fout
, "\tdisplay_edge_labels:\t%s\n", 
 789              get_decision_str (g
->display_edge_labels
)); 
 790   if (g
->dirty_edge_labels 
!= G_DIRTY_EDGE_LABELS
) 
 791     fprintf (fout
, "\tdirty_edge_labels:\t%s\n", 
 792              get_decision_str (g
->dirty_edge_labels
)); 
 793   if (g
->finetuning 
!= G_FINETUNING
) 
 794     fprintf (fout
, "\tfinetuning:\t%s\n", 
 795              get_decision_str (g
->finetuning
)); 
 796   if (g
->ignore_singles 
!= G_IGNORE_SINGLES
) 
 797     fprintf (fout
, "\tignore_singles:\t%s\n", 
 798              get_decision_str (g
->ignore_singles
)); 
 799   if (g
->priority_phase 
!= G_PRIORITY_PHASE
) 
 800     fprintf (fout
, "\tpriority_phase:\t%s\n", 
 801              get_decision_str (g
->priority_phase
)); 
 802   if (g
->manhattan_edges 
!= G_MANHATTAN_EDGES
) 
 804              "\tmanhattan_edges:\t%s\n", 
 805              get_decision_str (g
->manhattan_edges
)); 
 806   if (g
->smanhattan_edges 
!= G_SMANHATTAN_EDGES
) 
 808              "\tsmanhattan_edges:\t%s\n", 
 809              get_decision_str (g
->smanhattan_edges
)); 
 810   if (g
->near_edges 
!= G_NEAR_EDGES
) 
 811     fprintf (fout
, "\tnear_edges:\t%s\n", 
 812              get_decision_str (g
->near_edges
)); 
 814   if (g
->orientation 
!= G_ORIENTATION
) 
 815     fprintf (fout
, "\torientation:\t%s\n", 
 816              get_orientation_str (g
->orientation
)); 
 818   if (g
->node_alignment 
!= G_NODE_ALIGNMENT
) 
 819     fprintf (fout
, "\tnode_alignment:\t%s\n", 
 820              get_node_alignment_str (g
->node_alignment
)); 
 822   if (g
->port_sharing 
!= G_PORT_SHARING
) 
 823     fprintf (fout
, "\tport_sharing:\t%s\n", 
 824              get_decision_str (g
->port_sharing
)); 
 826   if (g
->arrow_mode 
!= G_ARROW_MODE
) 
 827     fprintf (fout
, "\tarrow_mode:\t%s\n", 
 828              get_arrow_mode_str (g
->arrow_mode
)); 
 830   if (g
->treefactor 
!= G_TREEFACTOR
) 
 831     fprintf (fout
, "\ttreefactor:\t%f\n", g
->treefactor
); 
 832   if (g
->spreadlevel 
!= G_SPREADLEVEL
) 
 833     fprintf (fout
, "\tspreadlevel:\t%d\n", g
->spreadlevel
); 
 835   if (g
->crossing_weight 
!= G_CROSSING_WEIGHT
) 
 836     fprintf (fout
, "\tcrossing_weight:\t%s\n", 
 837              get_crossing_type_str (g
->crossing_weight
)); 
 838   if (g
->crossing_phase2 
!= G_CROSSING_PHASE2
) 
 839     fprintf (fout
, "\tcrossing_phase2:\t%s\n", 
 840              get_decision_str (g
->crossing_phase2
)); 
 841   if (g
->crossing_optimization 
!= G_CROSSING_OPTIMIZATION
) 
 842     fprintf (fout
, "\tcrossing_optimization:\t%s\n", 
 843              get_decision_str (g
->crossing_optimization
)); 
 845   if (g
->view 
!= G_VIEW
) 
 846     fprintf (fout
, "\tview:\t%s\n", get_view_str (g
->view
)); 
 848   if (g
->edges 
!= G_EDGES
) 
 849     fprintf (fout
, "\tedges:\t%s\n", get_decision_str (g
->edges
)); 
 851   if (g
->nodes 
!= G_NODES
) 
 852     fprintf (fout
,"\tnodes:\t%s\n", get_decision_str (g
->nodes
)); 
 854   if (g
->splines 
!= G_SPLINES
) 
 855     fprintf (fout
, "\tsplines:\t%s\n", get_decision_str (g
->splines
)); 
 857   if (g
->bmax 
!= G_BMAX
) 
 858     fprintf (fout
, "\tbmax:\t%d\n", g
->bmax
); 
 859   if (g
->cmin 
!= G_CMIN
) 
 860     fprintf (fout
, "\tcmin:\t%d\n", g
->cmin
); 
 861   if (g
->cmax 
!= G_CMAX
) 
 862     fprintf (fout
, "\tcmax:\t%d\n", g
->cmax
); 
 863   if (g
->pmin 
!= G_PMIN
) 
 864     fprintf (fout
, "\tpmin:\t%d\n", g
->pmin
); 
 865   if (g
->pmax 
!= G_PMAX
) 
 866     fprintf (fout
, "\tpmax:\t%d\n", g
->pmax
); 
 867   if (g
->rmin 
!= G_RMIN
) 
 868     fprintf (fout
, "\trmin:\t%d\n", g
->rmin
); 
 869   if (g
->rmax 
!= G_RMAX
) 
 870     fprintf (fout
, "\trmax:\t%d\n", g
->rmax
); 
 871   if (g
->smax 
!= G_SMAX
) 
 872     fprintf (fout
, "\tsmax:\t%d\n", g
->smax
);