X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flexer.c;h=fe999ff1aff50c24c783bab6a96dfa12dcd3d9a6;hb=897a260ef7a8b954d56698cc40241a3197127505;hp=568a87e316654c45b3b979460d8805bf0c9f8261;hpb=05e356b2a3087e819ef3b5388e29c822f41502e1;p=pspp diff --git a/src/lexer.c b/src/lexer.c index 568a87e316..fe999ff1af 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -14,8 +14,8 @@ 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 "lexer.h" @@ -29,11 +29,15 @@ #include "alloc.h" #include "command.h" #include "error.h" -#include "getline.h" +#include "getl.h" #include "magic.h" #include "settings.h" #include "str.h" +#include "gettext.h" +#define _(msgid) gettext (msgid) +#define N_(msgid) msgid + /* #define DUMP_TOKENS 1 */ @@ -51,7 +55,7 @@ double tokval; char tokid[LONG_NAME_LEN + 1]; /* T_ID, T_STRING: token string value. - For T_ID, this is not truncated to SHORT_NAME_LEN characters as is tokid. */ + For T_ID, this is not truncated as is tokid. */ struct string tokstr; /* Static variables. */ @@ -116,8 +120,7 @@ restore_token (void) assert (put_token != 0); token = put_token; ds_replace (&tokstr, ds_c_str (&put_tokstr)); - strncpy (tokid, ds_c_str (&put_tokstr), SHORT_NAME_LEN); - tokid[SHORT_NAME_LEN] = 0; + str_copy_trunc (tokid, sizeof tokid, ds_c_str (&tokstr)); tokval = put_tokval; put_token = 0; } @@ -137,8 +140,6 @@ save_token (void) void lex_get (void) { - int i; - /* If a token was pushed ahead, return it. */ if (put_token) { @@ -360,14 +361,10 @@ lex_get (void) while (CHAR_IS_IDN (*prog)) ds_putc (&tokstr, *prog++); - /* Copy tokstr to tokid, truncating it to LONG_NAME_LEN characters.*/ - strncpy (tokid, ds_c_str (&tokstr), LONG_NAME_LEN); - tokid[LONG_NAME_LEN] = 0; - - /* Convert to upper case */ - for ( i = 0 ; i < ds_length(&tokstr) ; ++i ) - tokstr.string[i] = toupper(tokstr.string[i]); + /* Copy tokstr to tokid, possibly truncating it.*/ + str_copy_trunc (tokid, sizeof tokid, ds_c_str (&tokstr)); + /* Determine token type. */ token = lex_id_to_token (ds_c_str (&tokstr), ds_length (&tokstr)); break; @@ -393,11 +390,18 @@ void lex_error (const char *message, ...) { char *token_rep; + char where[128]; token_rep = lex_token_representation (); - if (token_rep[0] == 0) - msg (SE, _("Syntax error at end of file.")); - else if (message) + if (token == T_STOP) + strcpy (where, "end of file"); + else if (token == '.') + strcpy (where, "end of command"); + else + snprintf (where, sizeof where, "`%s'", token_rep); + free (token_rep); + + if (message) { char buf[1024]; va_list args; @@ -406,12 +410,10 @@ lex_error (const char *message, ...) vsnprintf (buf, 1024, message, args); va_end (args); - msg (SE, _("Syntax error %s at `%s'."), buf, token_rep); + msg (SE, _("Syntax error %s at %s."), buf, where); } else - msg (SE, _("Syntax error at `%s'."), token_rep); - - free (token_rep); + msg (SE, _("Syntax error at %s."), where); } /* Checks that we're at end of command. @@ -485,7 +487,8 @@ lex_match (int t) } /* If the current token is the identifier S, skips it and returns - nonzero. + nonzero. The identifier may be abbreviated to its first three + letters. Otherwise, returns zero. */ int lex_match_id (const char *s) @@ -545,7 +548,7 @@ lex_force_match (int t) } else { - lex_error (_("expecting %s"), lex_token_name (t)); + lex_error (_("expecting `%s'"), lex_token_name (t)); return 0; } } @@ -609,7 +612,7 @@ lex_force_id (void) /* Comparing identifiers. */ /* Keywords match if one of the following is true: KW and TOK are - identical (barring differences in case), or TOK is at least 3 + identical (except for differences in case), or TOK is at least 3 characters long and those characters are identical to KW. KW_LEN is the length of KW, TOK_LEN is the length of TOK. */ int @@ -717,11 +720,11 @@ lex_put_back (int t) void lex_put_back_id (const char *id) { + assert (lex_id_to_token (id, strlen (id)) == T_ID); save_token (); token = T_ID; ds_replace (&tokstr, id); - strncpy (tokid, ds_c_str (&tokstr), SHORT_NAME_LEN); - tokid[SHORT_NAME_LEN] = 0; + str_copy_trunc (tokid, sizeof tokid, ds_c_str (&tokstr)); } /* Weird line processing functions. */ @@ -792,7 +795,7 @@ lex_preprocess_line (void) int quote; /* Remove C-style comments begun by slash-star and terminated by - star-slash or newline. */ + star-slash or newline. */ quote = comment = 0; for (cp = ds_c_str (&getl_buf); *cp; ) {