Merge remote branch 'origin/master'
authorFlorian Forster <octo@leeloo.octo.it>
Mon, 20 Dec 2010 08:41:04 +0000 (09:41 +0100)
committerFlorian Forster <octo@leeloo.octo.it>
Mon, 20 Dec 2010 08:41:04 +0000 (09:41 +0100)
Conflicts:
src/sn-svg.c

1  2 
src/sn-svg.c

diff --cc src/sn-svg.c
@@@ -23,7 -23,7 +23,8 @@@
  
  #include <stdlib.h>
  #include <stdio.h>
 +#include <unistd.h>
+ #include <assert.h>
  
  #include "sn_network.h"
  
  #define Y_SPACING 40
  
  static double x_offset = OUTER_SPACING;
- static int next_vertex_number = 0;
 +static _Bool embedded = 0;
 +
 +static void exit_usage (void) /* {{{ */
 +{
 +  printf ("Usage: sn-svg [options] [file]\n"
 +      "\n"
 +      "Valid options are:\n"
 +      "  -e    Create output suitable for embedding into other XML files.\n" 
 +      "\n");
 +  exit (EXIT_FAILURE);
 +} /* }}} void exit_usage */
 +
 +static int read_options (int argc, char **argv) /* {{{ */
 +{
 +  int option;
 +
 +  while ((option = getopt (argc, argv, "eh?")) != -1)
 +  {
 +    switch (option)
 +    {
 +      case 'e':
 +      embedded = 1;
 +      break;
 +
 +      case 'h':
 +      case '?':
 +      default:
 +      exit_usage ();
 +    }
 +  }
 +
 +  return (0);
 +} /* }}} int read_options */
  
- static int tex_show_stage (sn_stage_t *s) /* {{{ */
+ static double determine_stage_width (sn_stage_t *s)
  {
    int lines[s->comparators_num];
    int right[s->comparators_num];
      int j;
      sn_comparator_t *c = SN_STAGE_COMP_GET (s, i);
  
-     int min_num;
-     int max_num;
+     for (j = 0; j < lines_used; j++)
+       if (SN_COMP_LEFT (c) > right[j])
+       break;
+     lines[i] = j;
+     right[j] = SN_COMP_RIGHT (c);
+     if (j >= lines_used)
+       lines_used = j + 1;
+   }
+   assert (lines_used >= 1);
+   return (((double) (lines_used - 1)) * INNER_SPACING);
+ }
+ static double determine_network_width (sn_network_t *n) /* {{{ */
+ {
+   double width;
+   int i;
+   /* Spacing between stages and at the beginning and end of the network */
+   width = (SN_NETWORK_STAGE_NUM (n) + 1) * OUTER_SPACING;
  
-     min_num = next_vertex_number;
-     next_vertex_number++;
+   /* Spacing required within a stage */
+   for (i = 0; i < SN_NETWORK_STAGE_NUM (n); i++)
+     width += determine_stage_width (SN_NETWORK_STAGE_GET (n, i));
  
-     max_num = next_vertex_number;
-     next_vertex_number++;
+   return (width);
+ } /* }}} double determine_network_width */
 -static int sn_svg_show_stage (sn_stage_t *s)
++static int sn_svg_show_stage (sn_stage_t *s) /* {{{ */
+ {
+   int lines[s->comparators_num];
+   int right[s->comparators_num];
+   int lines_used = 0;
+   int i;
+   printf ("  <!-- stage %i -->\n", SN_STAGE_DEPTH (s));
+   for (i = 0; i < SN_STAGE_COMP_NUM (s); i++)
+   {
+     lines[i] = -1;
+     right[i] = -1;
+   }
+   for (i = 0; i < SN_STAGE_COMP_NUM (s); i++)
+   {
+     int j;
+     sn_comparator_t *c = SN_STAGE_COMP_GET (s, i);
  
      for (j = 0; j < lines_used; j++)
        if (SN_COMP_LEFT (c) > right[j])
    printf ("\n");
  
    return (0);
- } /* }}} int tex_show_stage */
 -} /* int sn_svg_show_stage */
++} /* }}} int sn_svg_show_stage */
  
 -int main (int argc, char **argv)
 +int main (int argc, char **argv) /* {{{ */
  {
    sn_network_t *n;
    FILE *fh = NULL;
+   double svg_height;
+   double svg_width;
    int i;
  
 -  if (argc == 1)
 +  read_options (argc, argv);
 +
 +  if ((argc - optind) == 0)
      fh = stdin;
 -  else if (argc == 2)
 -    fh = fopen (argv[1], "r");
 +  else if ((argc - optind) == 1)
 +    fh = fopen (argv[optind], "r");
  
    if (fh == NULL)
 -  {
 -    printf ("fh == NULL!\n");
 -    return (1);
 -  }
 +    exit_usage ();
  
    n = sn_network_read (fh);
  
      return (1);
    }
  
 -  printf ("<?xml version=\"1.0\" standalone=\"no\"?>\n"
 -      "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" "
 -      "\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"
 -      "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" "
 -      "width=\"%gpt\" height=\"%gpt\" viewBox=\"0 0 %g %g\">\n",
 -      svg_width, svg_height, svg_width, svg_height);
+   svg_height = (2 * Y_OFFSET) + ((SN_NETWORK_INPUT_NUM (n) - 1) * Y_SPACING);
+   svg_width = determine_network_width (n);
-     printf ("<svg:svg version=\"1.1\">\n");
 +  if (embedded)
-       "<svg:svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">\n");
++    printf ("<svg:svg version=\"1.1\" viewBox=\"0 0 %g %g\">\n",
++      svg_width, svg_height);
 +  else
 +    printf ("<?xml version=\"1.0\" standalone=\"no\"?>\n"
 +      "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" "
 +      "\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"
++      "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" "
++      "width=\"%gpt\" height=\"%gpt\" viewBox=\"0 0 %g %g\">\n",
++      svg_width, svg_height, svg_width, svg_height);
  
    printf ("<!-- Output generated with sn-svg from %s -->\n", PACKAGE_STRING);