X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Flexer%2Flexer.c;h=3dda38a6a0b8ab4f39d87d3e8a05c36ba4761488;hb=751d7694b0904b580fad3903205341c85c04d421;hp=8b3f2a48d00474811a09c090f8a82d1b75ed7546;hpb=3bbb4370239deb29ebbf813d258aef6249e2a431;p=pspp diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c index 8b3f2a48d0..3dda38a6a0 100644 --- a/src/language/lexer/lexer.c +++ b/src/language/lexer/lexer.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,6 +32,7 @@ #include #include #include +#include #include "xalloc.h" @@ -175,19 +176,19 @@ lex_get (struct lexer *lexer) return; } - /* If a token was pushed ahead, return it. */ - if (lexer->put_token) - { - restore_token (lexer); + /* If a token was pushed ahead, return it. */ + if (lexer->put_token) + { + restore_token (lexer); #if DUMP_TOKENS dump_token (lexer); #endif - return; - } + return; + } - for (;;) - { - /* Skip whitespace. */ + for (;;) + { + /* Skip whitespace. */ while (c_isspace ((unsigned char) *lexer->prog)) lexer->prog++; @@ -439,31 +440,34 @@ lex_sbc_missing (struct lexer *lexer, const char *sbc) void lex_error (struct lexer *lexer, const char *message, ...) { - char *token_rep; - char where[128]; + struct string s; + + ds_init_empty (&s); - token_rep = lex_token_representation (lexer); if (lexer->token == T_STOP) - strcpy (where, "end of file"); + ds_put_cstr (&s, _("Syntax error at end of file")); else if (lexer->token == '.') - strcpy (where, "end of command"); + ds_put_cstr (&s, _("Syntax error at end of command")); else - snprintf (where, sizeof where, "`%s'", token_rep); - free (token_rep); + { + char *token_rep = lex_token_representation (lexer); + ds_put_format (&s, _("Syntax error at `%s'"), token_rep); + free (token_rep); + } if (message) { - char buf[1024]; va_list args; + ds_put_cstr (&s, ": "); + va_start (args, message); - vsnprintf (buf, 1024, message, args); + ds_put_vformat (&s, message, args); va_end (args); - - msg (SE, _("Syntax error %s at %s."), buf, where); } - else - msg (SE, _("Syntax error at %s."), where); + + msg (SE, "%s.", ds_cstr (&s)); + ds_destroy (&s); } /* Checks that we're at end of command. @@ -873,16 +877,16 @@ lex_preprocess_line (struct string *line, } } -/* Reads a line, without performing any preprocessing. - Sets *SYNTAX, if SYNTAX is non-null, to the line's syntax - mode. */ +/* Reads a line, without performing any preprocessing. */ bool lex_get_line_raw (struct lexer *lexer) { bool ok = getl_read_line (lexer->ss, &lexer->line_buffer); - enum syntax_mode mode = lex_current_syntax_mode (lexer); - journal_write (mode == GETL_BATCH, ds_cstr (&lexer->line_buffer)); - + if (ok) + { + const char *line = ds_cstr (&lexer->line_buffer); + text_item_submit (text_item_create (TEXT_ITEM_SYNTAX, line)); + } return ok; } @@ -1217,13 +1221,6 @@ finish: if (type != CHARACTER_STRING) convert_numeric_string_to_char_string (lexer, type); - if (ds_length (&lexer->tokstr) > 255) - { - msg (SE, _("String exceeds 255 characters in length (%zu characters)."), - ds_length (&lexer->tokstr)); - ds_truncate (&lexer->tokstr, 255); - } - return T_STRING; } @@ -1255,7 +1252,7 @@ dump_token (struct lexer *lexer) break; case T_STRING: - fprintf (stderr, "STRING\t\"%s\"\n", ds_cstr (&lexer->tokstr)); + fprintf (stderr, "STRING\t`%s'\n", ds_cstr (&lexer->tokstr)); break; case T_STOP: