X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flexer.c;h=e573bbb7818f9b3cce8d07fe9edd9b930c8936bc;hb=a1887dd91b27990bba31adb888a4273379a4bf8c;hp=9ad48dfb4b5431a4b41d5bb51efee6754c6e2386;hpb=205ac3afa4c2b19c85819d8695abf3975bb11807;p=pspp-builds.git diff --git a/src/lexer.c b/src/lexer.c index 9ad48dfb..e573bbb7 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -71,7 +71,7 @@ static char *prog; /* Nonzero only if this line ends with a terminal dot. */ static int dot; -/* Nonzero only if the last token returned was T_EOF. */ +/* Nonzero only if the last token returned was T_STOP. */ static int eof; /* If nonzero, next token returned by lex_get(). @@ -95,10 +95,17 @@ static void dump_token (void); void lex_init (void) { - ds_init (NULL, &put_tokstr, 64); + ds_init (&put_tokstr, 64); if (!lex_get_line ()) unexpected_eof (); } + +void +lex_done (void) +{ + ds_destroy(&put_tokstr); +} + /* Common functions. */ @@ -109,8 +116,8 @@ restore_token (void) { assert (put_token != 0); token = put_token; - ds_replace (&tokstr, ds_value (&put_tokstr)); - strncpy (tokid, ds_value (&put_tokstr), 8); + ds_replace (&tokstr, ds_c_str (&put_tokstr)); + strncpy (tokid, ds_c_str (&put_tokstr), 8); tokid[8] = 0; tokval = put_tokval; put_token = 0; @@ -122,7 +129,7 @@ static void save_token (void) { put_token = token; - ds_replace (&put_tokstr, ds_value (&tokstr)); + ds_replace (&put_tokstr, ds_c_str (&tokstr)); put_tokval = tokval; } @@ -208,7 +215,7 @@ lex_get (void) negative numbers into two tokens. */ if (*cp == '-') { - ds_putchar (&tokstr, *prog++); + ds_putc (&tokstr, *prog++); while (isspace ((unsigned char) *prog)) prog++; @@ -221,32 +228,32 @@ lex_get (void) /* Parse the number, copying it into tokstr. */ while (isdigit ((unsigned char) *prog)) - ds_putchar (&tokstr, *prog++); + ds_putc (&tokstr, *prog++); if (*prog == '.') { - ds_putchar (&tokstr, *prog++); + ds_putc (&tokstr, *prog++); while (isdigit ((unsigned char) *prog)) - ds_putchar (&tokstr, *prog++); + ds_putc (&tokstr, *prog++); } if (*prog == 'e' || *prog == 'E') { - ds_putchar (&tokstr, *prog++); + ds_putc (&tokstr, *prog++); if (*prog == '+' || *prog == '-') - ds_putchar (&tokstr, *prog++); + ds_putc (&tokstr, *prog++); while (isdigit ((unsigned char) *prog)) - ds_putchar (&tokstr, *prog++); + ds_putc (&tokstr, *prog++); } /* Parse as floating point. */ - tokval = strtod (ds_value (&tokstr), &tail); + tokval = strtod (ds_c_str (&tokstr), &tail); if (*tail) { msg (SE, _("%s does not form a valid number."), - ds_value (&tokstr)); + ds_c_str (&tokstr)); tokval = 0.0; ds_clear (&tokstr); - ds_putchar (&tokstr, '0'); + ds_putc (&tokstr, '0'); } token = T_NUM; @@ -346,15 +353,15 @@ lex_get (void) } /* Copy id to tokstr. */ - ds_putchar (&tokstr, toupper ((unsigned char) *prog++)); + ds_putc (&tokstr, toupper ((unsigned char) *prog++)); while (CHAR_IS_IDN (*prog)) - ds_putchar (&tokstr, toupper ((unsigned char) *prog++)); + ds_putc (&tokstr, toupper ((unsigned char) *prog++)); /* Copy tokstr to tokid, truncating it to 8 characters. */ - strncpy (tokid, ds_value (&tokstr), 8); + strncpy (tokid, ds_c_str (&tokstr), 8); tokid[8] = 0; - token = check_id (ds_value (&tokstr), ds_length (&tokstr)); + token = check_id (ds_c_str (&tokstr), ds_length (&tokstr)); break; default: @@ -690,38 +697,29 @@ lex_put_back_id (const char *id) save_token (); token = T_ID; ds_replace (&tokstr, id); - strncpy (tokid, ds_value (&tokstr), 8); + strncpy (tokid, ds_c_str (&tokstr), 8); tokid[8] = 0; } /* Weird line processing functions. */ -/* Discards the rest of the current input line for tokenization - purposes, but returns the entire contents of the line for use by - the caller. */ -char * +/* Returns the entire contents of the current line. */ +const char * lex_entire_line (void) { - prog = ds_end (&getl_buf); - dot = 0; - return ds_value (&getl_buf); + return ds_c_str (&getl_buf); } /* As lex_entire_line(), but only returns the part of the current line that hasn't already been tokenized. - If HAD_DOT is non-null, stores nonzero into *HAD_DOT if the line + If END_DOT is non-null, stores nonzero into *END_DOT if the line ends with a terminal dot, or zero if it doesn't. */ -char * -lex_rest_of_line (int *had_dot) +const char * +lex_rest_of_line (int *end_dot) { - char *s = prog; - prog = ds_end (&getl_buf); - - if (had_dot) - *had_dot = dot; - dot = 0; - - return s; + if (end_dot) + *end_dot = dot; + return prog; } /* Causes the rest of the current input line to be ignored for @@ -729,10 +727,7 @@ lex_rest_of_line (int *had_dot) void lex_discard_line (void) { - msg (SW, _("The rest of this command has been discarded.")); - - ds_clear (&getl_buf); - prog = ds_value (&getl_buf); + prog = ds_end (&getl_buf); dot = put_token = 0; } @@ -776,7 +771,7 @@ lex_preprocess_line (void) /* Remove C-style comments begun by slash-star and terminated by star-slash or newline. */ quote = comment = 0; - for (cp = ds_value (&getl_buf); *cp; ) + for (cp = ds_c_str (&getl_buf); *cp; ) { /* If we're not commented out, toggle quoting. */ if (!comment) @@ -817,7 +812,7 @@ lex_preprocess_line (void) /* Strip trailing whitespace and terminal dot. */ { size_t len = ds_length (&getl_buf); - char *s = ds_value (&getl_buf); + char *s = ds_c_str (&getl_buf); /* Strip trailing whitespace. */ while (len > 0 && isspace ((unsigned char) s[len - 1])) @@ -842,7 +837,7 @@ lex_preprocess_line (void) as necessary. */ if (getl_interactive != 2 && getl_mode == GETL_MODE_BATCH) { - char *s = ds_value (&getl_buf); + char *s = ds_c_str (&getl_buf); if (s[0] == '+' || s[0] == '-' || s[0] == '.') s[0] = ' '; @@ -850,7 +845,7 @@ lex_preprocess_line (void) put_token = '.'; } - prog = ds_value (&getl_buf); + prog = ds_c_str (&getl_buf); } /* Token names. */ @@ -883,7 +878,7 @@ lex_token_representation (void) { case T_ID: case T_NUM: - return xstrdup (ds_value (&tokstr)); + return xstrdup (ds_c_str (&tokstr)); break; case T_STRING: @@ -891,7 +886,7 @@ lex_token_representation (void) int hexstring = 0; char *sp, *dp; - for (sp = ds_value (&tokstr); sp < ds_end (&tokstr); sp++) + for (sp = ds_c_str (&tokstr); sp < ds_end (&tokstr); sp++) if (!isprint ((unsigned char) *sp)) { hexstring = 1; @@ -906,14 +901,14 @@ lex_token_representation (void) *dp++ = '\''; if (!hexstring) - for (sp = ds_value (&tokstr); *sp; ) + for (sp = ds_c_str (&tokstr); *sp; ) { if (*sp == '\'') *dp++ = '\''; *dp++ = (unsigned char) *sp++; } else - for (sp = ds_value (&tokstr); sp < ds_end (&tokstr); sp++) + for (sp = ds_c_str (&tokstr); sp < ds_end (&tokstr); sp++) { *dp++ = (((unsigned char) *sp) >> 4)["0123456789ABCDEF"]; *dp++ = (((unsigned char) *sp) & 15)["0123456789ABCDEF"]; @@ -961,7 +956,7 @@ lex_negative_to_dash (void) { token = T_NUM; tokval = -tokval; - ds_replace (&tokstr, ds_value (&tokstr) + 1); + ds_replace (&tokstr, ds_c_str (&tokstr) + 1); save_token (); token = '-'; } @@ -980,7 +975,13 @@ lex_skip_comment (void) { for (;;) { - lex_get_line (); + if (!lex_get_line ()) + { + put_token = T_STOP; + eof = 1; + return; + } + if (put_token == '.') break; @@ -1040,7 +1041,7 @@ convert_numeric_string_to_char_string (int type) "multiple of %d."), gettext (base_name), ds_length (&tokstr), cpb); - p = ds_value (&tokstr); + p = ds_c_str (&tokstr); for (i = 0; i < nb; i++) { int value; @@ -1070,7 +1071,7 @@ convert_numeric_string_to_char_string (int type) value = value * base + v; } - ds_value (&tokstr)[i] = (unsigned char) value; + ds_c_str (&tokstr)[i] = (unsigned char) value; } ds_truncate (&tokstr, nb); @@ -1109,7 +1110,7 @@ parse_string (int type) break; } - ds_putchar (&tokstr, *prog++); + ds_putc (&tokstr, *prog++); } prog++; @@ -1179,7 +1180,7 @@ finish: int warned = 0; for (i = 0; i < ds_length (&tokstr); i++) - if (ds_value (&tokstr)[i] == 0) + if (ds_c_str (&tokstr)[i] == 0) { if (!warned) { @@ -1187,7 +1188,7 @@ finish: "characters. Replacing with spaces.")); warned = 1; } - ds_value (&tokstr)[i] = ' '; + ds_c_str (&tokstr)[i] = ' '; } } @@ -1220,7 +1221,7 @@ dump_token (void) break; case T_STRING: - fprintf (stderr, "STRING\t\"%s\"\n", ds_value (&tokstr)); + fprintf (stderr, "STRING\t\"%s\"\n", ds_c_str (&tokstr)); break; case T_STOP: @@ -1243,4 +1244,4 @@ dump_token (void) break; } } -#endif /* DEBUGGING */ +#endif /* DUMP_TOKENS */