X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flexer.c;h=575e917bbd4f81696d7d38c2ff2404f482bd3e60;hb=1339492699ce7e12c9bf9fa17f9d60a66024cbd1;hp=e4b6aaee308901a2ec7bb44f052aa6195b7050bb;hpb=25fae0555073f526e5d5825133a2f62454a7b4c6;p=pspp diff --git a/src/lexer.c b/src/lexer.c index e4b6aaee30..575e917bbd 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" @@ -48,10 +48,10 @@ int token; double tokval; /* T_ID: the identifier. */ -char tokid[9]; +char tokid[LONG_NAME_LEN + 1]; /* T_ID, T_STRING: token string value. - For T_ID, this is not truncated to 8 characters as is tokid. */ + For T_ID, this is not truncated as is tokid. */ struct string tokstr; /* Static variables. */ @@ -116,8 +116,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), 8); - tokid[8] = 0; + st_trim_copy (tokid, ds_c_str (&tokstr), sizeof tokid); tokval = put_tokval; put_token = 0; } @@ -354,14 +353,14 @@ lex_get (void) } /* Copy id to tokstr. */ - ds_putc (&tokstr, toupper ((unsigned char) *prog++)); + ds_putc (&tokstr, *prog++); while (CHAR_IS_IDN (*prog)) - ds_putc (&tokstr, toupper ((unsigned char) *prog++)); + ds_putc (&tokstr, *prog++); - /* Copy tokstr to tokid, truncating it to 8 characters. */ - strncpy (tokid, ds_c_str (&tokstr), 8); - tokid[8] = 0; + /* Copy tokstr to tokid, possibly truncating it.*/ + st_trim_copy (tokid, ds_c_str (&tokstr), sizeof tokid); + /* Determine token type. */ token = lex_id_to_token (ds_c_str (&tokstr), ds_length (&tokstr)); break; @@ -479,7 +478,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) @@ -603,7 +603,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 @@ -711,11 +711,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), 8); - tokid[8] = 0; + st_trim_copy (tokid, ds_c_str (&tokstr), sizeof tokid); } /* Weird line processing functions. */ @@ -786,7 +786,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; ) {