X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fq2c.c;h=5d188bbcedd1a04ca10b89d272aa45a5f8fbe693;hb=5156fa5a8323a16f6b4bbc8950221cdc1d0e023d;hp=13e8013e89ab9d17cb7b0b3fa25517e6cc7869b2;hpb=def7e6026513a3ee7c2b38416b30a2e890e34311;p=pspp-builds.git diff --git a/src/q2c.c b/src/q2c.c index 13e8013e..5d188bbc 100644 --- a/src/q2c.c +++ b/src/q2c.c @@ -30,6 +30,7 @@ #endif #include "str.h" + /* Brokenness. */ #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 @@ -704,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; @@ -778,6 +788,7 @@ parse_subcommand (subcommand *sbc) sbc->type = SBC_ARRAY; parse_specifiers (sbc); + } else { @@ -837,7 +848,12 @@ parse_subcommand (subcommand *sbc) else if (match_id ("PINT")) sbc->type = SBC_PINT; else if (match_id ("DOUBLE")) - sbc->type = match_id ("LIST") ? SBC_DBL_LIST : SBC_DBL; + { + if ( match_id ("LIST") ) + sbc->type = SBC_DBL_LIST; + else + sbc->type = SBC_DBL; + } else if (match_id ("STRING")) { sbc->type = SBC_STRING; @@ -1033,6 +1049,12 @@ dump_declarations (void) } } + /* Write out some type definitions */ + { + dump (0, "#define MAXLISTS 10"); + } + + /* For every array subcommand, write out the associated enumerated values. */ { @@ -1050,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); @@ -1096,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; } } @@ -1125,13 +1150,24 @@ 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: + dump (0, "subc_list_double dl_%s[MAXLISTS];", + st_lower(sbc->name)); + break; + + case SBC_INT_LIST: + dump (0, "subc_list_int il_%s[MAXLISTS];", + st_lower(sbc->name)); break; + default:; /* nothing */ } @@ -1227,9 +1263,27 @@ dump_vars_init (int persistent) { switch (sbc->type) { - case SBC_DBL: case SBC_INT_LIST: + break; + case SBC_DBL_LIST: + 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 (-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; @@ -1274,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: @@ -1345,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, @@ -1355,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) @@ -1570,7 +1638,7 @@ dump_subcommand (const subcommand *sbc) outdent (); } dump (0, "free(p->s_%s);", st_lower(sbc->name) ); - dump (0, "p->s_%s = xstrdup (ds_value (&tokstr));", + dump (0, "p->s_%s = xstrdup (ds_c_str (&tokstr));", st_lower (sbc->name)); dump (0, "lex_get ();"); if (sbc->restriction) @@ -1580,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) @@ -1595,7 +1664,7 @@ dump_subcommand (const subcommand *sbc) { char buf[1024]; dump (1, "if (!(%s))", sbc->restriction); - dump (1, "{"); + dump (1, "{"); sprintf(buf,sbc->message,sbc->name); if ( sbc->translatable ) dump (0, "msg (SE, gettext(\"%s\"));",buf); @@ -1604,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) @@ -1615,6 +1684,30 @@ dump_subcommand (const subcommand *sbc) dump (-1, "p->n_%s = lex_integer ();", st_lower (sbc->name)); dump (0, "lex_match (')');"); } + else if (sbc->type == SBC_DBL_LIST) + { + dump (0, "if ( p->sbc_%s > MAXLISTS)",st_lower(sbc->name)); + dump (1, "{"); + dump (0, "msg (SE, \"No more than %%d %s subcommands allowed\",MAXLISTS);",st_lower(sbc->name)); + dump (0, "goto lossage;"); + dump (-1,"}"); + + dump (1, "while (token != '/' && token != '.')"); + dump (1, "{"); + dump (0, "lex_match(',');"); + dump (0, "if (!lex_force_num ())"); + dump (1, "{"); + dump (0, "goto lossage;"); + dump (-1,"}"); + + dump (0, "subc_list_double_push(&p->dl_%s[p->sbc_%s-1],lex_double ());", + st_lower (sbc->name),st_lower (sbc->name) + ); + + dump (0, "lex_get();"); + dump (-1,"}"); + + } else if (sbc->type == SBC_CUSTOM) { dump (1, "switch (%scustom_%s (p))", @@ -1727,6 +1820,21 @@ dump_parser (int persistent) outdent (); } } + /* Now deal with the /ALGORITHM subcommand implicit to all commands */ + dump(1,"else if ( get_syntax() != COMPATIBLE && lex_match_id(\"ALGORITHM\"))"); + dump(1,"{"); + + dump (0, "lex_match ('=');"); + + dump(1,"if (lex_match_id(\"COMPATIBLE\"))"); + dump(0,"set_cmd_algorithm(COMPATIBLE);"); + outdent(); + dump(1,"else if (lex_match_id(\"ENHANCED\"))"); + dump(0,"set_cmd_algorithm(ENHANCED);"); + + dump (-1, "}"); + outdent (); + dump (1, "if (!lex_match ('/'))"); dump (0, "break;"); @@ -1775,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) { @@ -1909,7 +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); } /* Write out commands to free variable state. */ @@ -1925,8 +2037,13 @@ dump_free (int persistent) if ( ! persistent ) { for (sbc = subcommands; sbc; sbc = sbc->next) + { if (sbc->type == SBC_STRING) used = 1; + if (sbc->type == SBC_DBL_LIST) + used = 1; + } + } dump (0, "static void"); @@ -1938,8 +2055,22 @@ dump_free (int persistent) { for (sbc = subcommands; sbc; sbc = sbc->next) - if (sbc->type == SBC_STRING) - dump (0, "free (p->s_%s);", st_lower (sbc->name)); + { + switch (sbc->type) + { + case SBC_STRING: + dump (0, "free (p->s_%s);", st_lower (sbc->name)); + break; + case SBC_DBL_LIST: + 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; + } + } } dump (-1, "}"); @@ -2000,6 +2131,7 @@ main (int argc, char *argv[]) dump_header (); + indent = 0; dump (0, "#line %d \"%s\"", ln + 1, ifn); while (get_line ()) @@ -2011,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. */ @@ -2027,13 +2159,15 @@ main (int argc, char *argv[]) { indent = 0; - dump (0, "#include "); dump (0, "#include "); 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); } else if (!strcmp (directive, "declarations")) @@ -2059,6 +2193,8 @@ main (int argc, char *argv[]) dump (0, "#line %d \"%s\"", ln + 1, ifn); } + + return EXIT_SUCCESS; }