Added Boxplots to the EXAMINE subcommand repertoire
[pspp-builds.git] / src / q2c.c
index e8f09d8d5daa38f195166f44355de5f0a84ce7ea..aaf3343c2a25e4715e1cf60cacca6c4594c40e74 100644 (file)
--- a/src/q2c.c
+++ b/src/q2c.c
@@ -705,6 +705,15 @@ parse_specifier (specifier *spec, subcommand *sbc)
     }
   skip_token (':');
   
+  if ( sbc->type == SBC_ARRAY && token == T_ID ) 
+    {
+       spec->varname = xstrdup (st_lower (tokstr));
+       spec->index = sbc->narray;
+       sbc->narray++;
+    }
+    
+  
+  
   /* Parse all the settings. */
   {
     setting **s = &spec->s;
@@ -779,6 +788,7 @@ parse_subcommand (subcommand *sbc)
       
       sbc->type = SBC_ARRAY;
       parse_specifiers (sbc);
+
     }
   else
     {
@@ -1062,7 +1072,6 @@ dump_declarations (void)
            specifier *spec;
 
            for (spec = sbc->spec; spec; spec = spec->next)
-             if (!spec->s)
                dump (0, "%s%s%s = %d,",
                      st_upper (prefix), st_upper (sbc->prefix),
                      st_upper (spec->varname), spec->index);
@@ -1108,8 +1117,12 @@ dump_declarations (void)
                              spec->varname);
                      else if (f == 0)
                        {
-                         dump (0, "int a_%s[%d];", 
-                               st_lower (sbc->name), sbc->narray);
+                         dump (0, "int a_%s[%s%scount];", 
+                               st_lower (sbc->name), 
+                               st_upper (prefix),
+                               st_upper (sbc->prefix)
+                               );
+
                          f = 1;
                        }
                    }
@@ -1137,11 +1150,11 @@ dump_declarations (void)
 
          case SBC_INT:
          case SBC_PINT:
-           dump (0, "long n_%s;", st_lower (sbc->name));
+           dump (0, "long n_%s[MAXLISTS];", st_lower (sbc->name));
            break;
 
          case SBC_DBL:
-           dump (0, "double n_%s;", st_lower (sbc->name));
+           dump (0, "double n_%s[MAXLISTS];", st_lower (sbc->name));
            break;
 
          case SBC_DBL_LIST:
@@ -1254,16 +1267,23 @@ dump_vars_init (int persistent)
                break;
 
              case SBC_DBL_LIST:
-               dump (0, "int i;");
-               dump (0, "for (i = 0; i < MAXLISTS; ++i)");
                dump (1, "{");
+               dump (0, "int i;");
+               dump (1, "for (i = 0; i < MAXLISTS; ++i)");
                dump (0, "subc_list_double_create(&p->dl_%s[i]) ;",
                      st_lower (sbc->name)
                      );
-               dump (-1, "}");
+               dump (-2, "}");
                break;
 
              case SBC_DBL:
+               dump (1, "{");
+               dump (0, "int i;");
+               dump (1, "for (i = 0; i < MAXLISTS; ++i)");
+               dump (0, "p->n_%s[i] = SYSMIS;", st_lower (sbc->name));
+               dump (-2, "}");
+               break;
+
              case SBC_CUSTOM:
                /* nothing */
                break;
@@ -1308,7 +1328,11 @@ dump_vars_init (int persistent)
 
              case SBC_INT:
              case SBC_PINT:
-               dump (0, "p->n_%s = NOT_LONG;", st_lower (sbc->name));
+               dump (1, "{");
+               dump (0, "int i;");
+               dump (1, "for (i = 0; i < MAXLISTS; ++i)");
+               dump (0, "p->n_%s[i] = NOT_LONG;", st_lower (sbc->name));
+               dump (-2, "}");
                break;
 
              default:
@@ -1379,6 +1403,7 @@ dump_specifier_parse (const specifier *spec, const subcommand *sbc)
        dump (1, "%sif (%s)", first ? "" : "else ",
              make_match (s->specname));
 
+
       /* Handle values. */
       if (s->value == VAL_NONE)
        dump (0, "p->%s%s = %s%s;", sbc->prefix, spec->varname,
@@ -1389,9 +1414,18 @@ dump_specifier_parse (const specifier *spec, const subcommand *sbc)
            dump (1, "{");
          
          if (spec->varname)
-           dump (0, "p->%s%s = %s%s;", sbc->prefix, spec->varname,
-                 st_upper (prefix), find_symbol (s->con)->name);
-         
+           {
+             dump (0, "p->%s%s = %s%s;", sbc->prefix, spec->varname,
+                   st_upper (prefix), find_symbol (s->con)->name);
+
+             if ( sbc->type == SBC_ARRAY ) 
+               dump (0, "p->a_%s[%s%s%s] = 1;",
+                     st_lower (sbc->name),
+                     st_upper (prefix), st_upper (sbc->prefix),
+                     st_upper (spec->varname));
+           }
+
+
          if (s->valtype == VT_PAREN)
            {
              if (s->optvalue)
@@ -1577,7 +1611,7 @@ dump_subcommand (const subcommand *sbc)
     {
       dump (0, "p->%sv_%s = parse_variable ();",
            st_lower (sbc->prefix), st_lower (sbc->name));
-      dump (1, "if (p->%sv_%s)",
+      dump (1, "if (!p->%sv_%s)",
            st_lower (sbc->prefix), st_lower (sbc->name));
       dump (0, "goto lossage;");
       outdent ();
@@ -1614,7 +1648,8 @@ dump_subcommand (const subcommand *sbc)
     {
       dump (1, "if (!lex_force_num ())");
       dump (0, "goto lossage;");
-      dump (-1, "p->n_%s = lex_double ();", st_lower (sbc->name));
+      dump (-1, "p->n_%s[p->sbc_%s - 1] = lex_double ();", 
+           st_lower (sbc->name), st_lower (sbc->name) );
       dump (0, "lex_get();");
     }
   else if (sbc->type == SBC_INT)
@@ -1638,7 +1673,7 @@ dump_subcommand (const subcommand *sbc)
          dump (0, "goto lossage;");
          dump (-1, "}");
       }
-      dump (-1, "p->n_%s = x;", st_lower (sbc->name));
+      dump (0, "p->n_%s[p->sbc_%s - 1] = x;", st_lower (sbc->name), st_lower(sbc->name) );
       dump (-1,"}");
     }
   else if (sbc->type == SBC_PINT)
@@ -1848,7 +1883,12 @@ dump_aux_subcommand (const subcommand *sbc)
     }
   else if (sbc->type == SBC_INT)
     {
-      dump (0, "msg(MM,\"%s is %%ld\",p->n_%s);", sbc->name,st_lower(sbc->name) ); 
+      dump (1, "{");
+      dump (0, "int i;");
+      dump (1, "for (i = 0; i < MAXLISTS; ++i)");
+      dump (0, "msg(MM,\"%s is %%ld\",p->n_%s[i]);", sbc->name,st_lower(sbc->name) ); 
+      outdent();
+      dump (-1, "}");
     }
   else if (sbc->type == SBC_CUSTOM)
     {
@@ -1982,11 +2022,6 @@ dump_header (void)
   dump (0, "   Generated by q2c from %s on %s.", ifn, timep);
   dump (0, "   Do not modify!");
   dump (0, " */");
-
-  dump (0, nullstr);
-  dump (0, "#include \"settings.h\"");
-  dump (0, "#include \"subclist.h\"");
-  dump (0, nullstr);
 }
 
 /* Write out commands to free variable state. */
@@ -2027,7 +2062,10 @@ dump_free (int persistent)
              dump (0, "free (p->s_%s);", st_lower (sbc->name));
              break;
            case SBC_DBL_LIST:
-             dump (0, "subc_list_double_destroy(p->dl_%s);", st_lower (sbc->name));
+             dump (0, "int i;");
+             dump (1, "for(i = 0; i < MAXLISTS ; ++i)");
+             dump (0, "subc_list_double_destroy(&p->dl_%s[i]);", st_lower (sbc->name));
+             outdent();
              break;
            default:
              break;
@@ -2105,7 +2143,7 @@ main (int argc, char *argv[])
          continue;
        }
       
-      dump (0, "#line %d \"%s\"", oln - 1, ofn);
+      dump (0, "#line %d \"%s\"", oln + 1, ofn);
       if (!strcmp (directive, "specification"))
        {
          /* Skip leading slash-star line. */
@@ -2125,7 +2163,9 @@ main (int argc, char *argv[])
          dump (0, "#include \"alloc.h\"");
          dump (0, "#include \"error.h\"");
          dump (0, "#include \"lexer.h\"");
+          dump (0, "#include \"settings.h\"");
          dump (0, "#include \"str.h\"");
+          dump (0, "#include \"subclist.h\"");
          dump (0, "#include \"var.h\"");
 
          dump (0, nullstr);