X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Frepeat.c;h=c0510c5d5e26fc94df4dca0514660c369e8efe4d;hb=4a73877b4d56caed03d383fb4d38347a9774046f;hp=09809fde1e5414d9043158cf898e2ff50d349203;hpb=3a7fba81ceae5b049d0f7d671e9e3c3c43bbf703;p=pspp-builds.git diff --git a/src/repeat.c b/src/repeat.c index 09809fde..c0510c5d 100644 --- a/src/repeat.c +++ b/src/repeat.c @@ -14,33 +14,36 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ #include #include "repeat.h" -#include +#include "error.h" #include #include #include #include "alloc.h" -#include "cases.h" #include "command.h" +#include "dictionary.h" #include "error.h" -#include "getline.h" +#include "getl.h" #include "lexer.h" #include "misc.h" #include "settings.h" #include "str.h" #include "var.h" +#include "gettext.h" +#define _(msgid) gettext (msgid) + #include "debug-print.h" /* Describes one DO REPEAT macro. */ struct repeat_entry { int type; /* 1=variable names, 0=any other. */ - char id[9]; /* Macro identifier. */ + char id[LONG_NAME_LEN + 1]; /* Macro identifier. */ char **replacement; /* Macro replacement. */ struct repeat_entry *next; }; @@ -61,11 +64,6 @@ static int parse_strings (struct repeat_entry *); static void clean_up (void); static int internal_cmd_do_repeat (void); -#if DEBUGGING -static void debug_print (void); -static void debug_print_lines (void); -#endif - int cmd_do_repeat (void) { @@ -130,7 +128,7 @@ static int internal_cmd_do_repeat (void) { /* Name of first DO REPEAT macro. */ - char first_name[9]; + char first_name[LONG_NAME_LEN + 1]; /* Current filename. */ const char *current_filename = NULL; @@ -139,9 +137,6 @@ internal_cmd_do_repeat (void) int print; /* The first step is parsing the DO REPEAT command itself. */ - lex_match_id ("DO"); - lex_match_id ("REPEAT"); - count = 0; line_buf_head = NULL; do @@ -154,7 +149,7 @@ internal_cmd_do_repeat (void) if (!lex_force_id ()) return 0; for (iter = repeat_tab; iter; iter = iter->next) - if (!strcmp (iter->id, tokid)) + if (!strcasecmp (iter->id, tokid)) { msg (SE, _("Identifier %s is given twice."), tokid); return 0; @@ -177,7 +172,7 @@ internal_cmd_do_repeat (void) if (token == T_ID) result = parse_ids (e); - else if (token == T_NUM) + else if (lex_is_number ()) result = parse_numbers (e); else if (token == T_STRING) result = parse_strings (e); @@ -212,10 +207,6 @@ internal_cmd_do_repeat (void) } while (token != '.'); -#if DEBUGGING - debug_print (); -#endif - /* Read all the lines inside the DO REPEAT ... END REPEAT. */ { int nest = 1; @@ -249,7 +240,7 @@ internal_cmd_do_repeat (void) command names must appear on a single line--they can't be spread out. */ { - char *cp = ds_value (&getl_buf); + char *cp = ds_c_str (&getl_buf); /* Skip leading indentors and any whitespace. */ if (*cp == '+' || *cp == '-' || *cp == '.') @@ -295,7 +286,7 @@ internal_cmd_do_repeat (void) line_buf_tail->len = ds_length (&getl_buf); line_buf_tail->line = xmalloc (ds_length (&getl_buf) + 1); memcpy (line_buf_tail->line, - ds_value (&getl_buf), ds_length (&getl_buf) + 1); + ds_c_str (&getl_buf), ds_length (&getl_buf) + 1); } } @@ -303,7 +294,7 @@ internal_cmd_do_repeat (void) REPEAT line. We should actually check for the PRINT specifier. This can be done easier when we buffer entire commands instead of doing it token by token; see TODO. */ - lex_entire_line (); + lex_discard_line (); /* Tie up the loose end of the chain. */ if (line_buf_head == NULL) @@ -313,11 +304,6 @@ internal_cmd_do_repeat (void) } line_buf_tail->next = NULL; - /* Show the line list. */ -#if DEBUGGING - debug_print_lines (); -#endif - /* Make new variables. */ { struct repeat_entry *iter; @@ -329,14 +315,7 @@ internal_cmd_do_repeat (void) { /* Note that if the variable already exists there is no harm done. */ - struct variable *v = dict_create_var (default_dict, - iter->replacement[i], - 0); - - /* If we created the variable then we need to initialize - its observations to SYSMIS. */ - if (v) - envector (v); + dict_create_var (default_dict, iter->replacement[i], 0); } } } @@ -362,8 +341,8 @@ internal_cmd_do_repeat (void) static int parse_ids (struct repeat_entry * e) { - int i; - int n = 0; + size_t i; + size_t n = 0; e->type = 1; e->replacement = NULL; @@ -371,13 +350,13 @@ parse_ids (struct repeat_entry * e) do { char **names; - int nnames; + size_t nnames; if (!parse_mixed_vars (&names, &nnames, PV_NONE)) return 0; - e->replacement = xrealloc (e->replacement, - (nnames + n) * sizeof *e->replacement); + e->replacement = xnrealloc (e->replacement, + nnames + n, sizeof *e->replacement); for (i = 0; i < nnames; i++) { e->replacement[n + i] = xstrdup (names[i]); @@ -439,8 +418,8 @@ parse_numbers (struct repeat_entry *e) if (n + (abs (b - a) + 1) > m) { m = n + (abs (b - a) + 1) + 16; - e->replacement = array = xrealloc (array, - m * sizeof *e->replacement); + e->replacement = array = xnrealloc (array, + m, sizeof *e->replacement); } if (a == b) @@ -491,8 +470,8 @@ parse_strings (struct repeat_entry * e) if (n + 1 > m) { m += 16; - e->replacement = string = xrealloc (string, - m * sizeof *e->replacement); + e->replacement = string = xnrealloc (string, + m, sizeof *e->replacement); } string[n++] = lex_token_representation (); lex_get (); @@ -500,7 +479,7 @@ parse_strings (struct repeat_entry * e) lex_match (','); } while (token != '/' && token != '.'); - e->replacement = xrealloc (string, n * sizeof *e->replacement); + e->replacement = xnrealloc (string, n, sizeof *e->replacement); return n; } @@ -550,19 +529,19 @@ perform_DO_REPEAT_substitutions (void) /* Terminal dot. */ int dot = 0; - ds_init (NULL, &output, ds_size (&getl_buf)); + ds_init (&output, ds_capacity (&getl_buf)); /* Strip trailing whitespace, check for & remove terminal dot. */ while (ds_length (&getl_buf) > 0 && isspace ((unsigned char) ds_end (&getl_buf)[-1])) ds_truncate (&getl_buf, ds_length (&getl_buf) - 1); - if (ds_length (&getl_buf) > 0 && ds_end (&getl_buf)[-1] == set_endcmd) + if (ds_length (&getl_buf) > 0 && ds_end (&getl_buf)[-1] == get_endcmd() ) { dot = 1; ds_truncate (&getl_buf, ds_length (&getl_buf) - 1); } - for (cp = ds_value (&getl_buf); cp < ds_end (&getl_buf); ) + for (cp = ds_c_str (&getl_buf); cp < ds_end (&getl_buf); ) { if (*cp == '\'' && !in_quote) in_apos ^= 1; @@ -571,18 +550,18 @@ perform_DO_REPEAT_substitutions (void) if (in_quote || in_apos || !CHAR_IS_ID1 (*cp)) { - ds_putchar (&output, *cp++); + ds_putc (&output, *cp++); continue; } /* Collect an identifier. */ { - char name[9]; + char name[LONG_NAME_LEN + 1]; char *start = cp; char *np = name; char *substitution; - while (CHAR_IS_IDN (*cp) && np < &name[8]) + while (CHAR_IS_IDN (*cp) && np < &name[LONG_NAME_LEN]) *np++ = *cp++; while (CHAR_IS_IDN (*cp)) cp++; @@ -591,59 +570,17 @@ perform_DO_REPEAT_substitutions (void) substitution = find_DO_REPEAT_substitution (name); if (!substitution) { - ds_concat_buffer (&output, start, cp - start); + ds_concat (&output, start, cp - start); continue; } /* Force output buffer size, copy substitution. */ - ds_concat (&output, substitution); + ds_puts (&output, substitution); } } if (dot) - ds_putchar (&output, (unsigned char) set_endcmd); + ds_putc (&output, get_endcmd ()); ds_destroy (&getl_buf); getl_buf = output; } - -/* Debugging code. */ - -#if DEBUGGING -static void -debug_print (void) -{ - struct repeat_entry *iter; - int j; - - printf ("DO REPEAT\n"); - for (iter = repeat_tab; iter; iter = iter->next) - { - printf (" %s%s=", iter->id, iter->type ? "(ids)" : ""); - for (j = 0; j < count; j++) - printf ("%s ", iter->replacement[j]); - putc (iter->next ? '/' : '.', stdout); - printf ("\n"); - } -} - -static void -debug_print_lines (void) -{ - struct getl_line_list *iter; - const char *fn = "(none)"; - int ln = 65536; - - printf ("---begin DO REPEAT lines---\n"); - for (iter = line_buf_head; iter; iter = iter->next) - { - if (iter->len < 0) - { - ln = -iter->len; - fn = iter->line; - } else { - printf ("%s:%d: %s", fn, ln++, iter->line); - } - } - printf ("---end DO REPEAT lines---\n"); -} -#endif /* DEBUGGING */