X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Flexer%2Flexer.c;fp=src%2Flanguage%2Flexer%2Flexer.c;h=1fadf53b3079e9758bc4e13a5fc8bc36f1d0a046;hb=3f3b74c2dd0e8468e11b0bb22366f6081ba0d459;hp=908556a7eeaab39472de12da5a0434b2ad03a6c5;hpb=4d2ddbb1b001928a9c7fb6d5d8d1e26c47216c3f;p=pspp diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c index 908556a7ee..1fadf53b30 100644 --- a/src/language/lexer/lexer.c +++ b/src/language/lexer/lexer.c @@ -282,8 +282,8 @@ struct lexer }; static struct lex_source *lex_source__ (const struct lexer *); -static char *lex_source_get_syntax__ (const struct lex_source *, - int n0, int n1); +static char *lex_source_syntax__ (const struct lex_source *, + int ofs0, int ofs1); static const struct lex_token *lex_next__ (const struct lexer *, int n); static void lex_source_push_endcmd__ (struct lex_source *); static void lex_source_push_parse (struct lex_source *, struct lex_token *); @@ -1451,15 +1451,37 @@ lex_ofs_end_point (const struct lexer *lexer, int ofs) /* Returns the text of the syntax in tokens N0 ahead of the current one, through N1 ahead of the current one, inclusive. (For example, if N0 and N1 - are both zero, this requests the syntax for the current token.) The caller - must eventually free the returned string (with free()). The syntax is - encoded in UTF-8 and in the original form supplied to the lexer so that, for - example, it may include comments, spaces, and new-lines if it spans multiple - tokens. Macro expansion, however, has already been performed. */ + are both zero, this requests the syntax for the current token.) + + The caller must eventually free the returned string (with free()). The + syntax is encoded in UTF-8 and in the original form supplied to the lexer so + that, for example, it may include comments, spaces, and new-lines if it + spans multiple tokens. Macro expansion, however, has already been + performed. */ char * lex_next_representation (const struct lexer *lexer, int n0, int n1) { - return lex_source_get_syntax__ (lex_source__ (lexer), n0, n1); + const struct lex_source *src = lex_source__ (lexer); + return (src + ? lex_source_syntax__ (src, n0 + src->parse_ofs, n1 + src->parse_ofs) + : xstrdup ("")); +} + + +/* Returns the text of the syntax in tokens with offsets OFS0 to OFS1, + inclusive. (For example, if OFS0 and OFS1 are both zero, this requests the + syntax for the first token in the current command.) + + The caller must eventually free the returned string (with free()). The + syntax is encoded in UTF-8 and in the original form supplied to the lexer so + that, for example, it may include comments, spaces, and new-lines if it + spans multiple tokens. Macro expansion, however, has already been + performed. */ +char * +lex_ofs_representation (const struct lexer *lexer, int ofs0, int ofs1) +{ + const struct lex_source *src = lex_source__ (lexer); + return src ? lex_source_syntax__ (src, ofs0, ofs1) : xstrdup (""); } /* Returns true if the token N ahead of the current one was produced by macro @@ -1787,32 +1809,33 @@ lex_source__ (const struct lexer *lexer) : ll_data (ll_head (&lexer->sources), struct lex_source, ll)); } -/* Returns the text of the syntax in SRC for tokens N0 ahead of the current - one, through N1 ahead of the current one, inclusive. (For example, if N0 - and N1 are both zero, this requests the syntax for the current token.) The - caller must eventually free the returned string (with free()). The syntax - is encoded in UTF-8 and in the original form supplied to the lexer so that, - for example, it may include comments, spaces, and new-lines if it spans - multiple tokens. Macro expansion, however, has already been performed. */ +/* Returns the text of the syntax in SRC for tokens with offsets OFS0 through + OFS1 in the current command, inclusive. (For example, if OFS0 and OFS1 are + both zero, this requests the syntax for the first token in the current + command.) The caller must eventually free the returned string (with + free()). The syntax is encoded in UTF-8 and in the original form supplied + to the lexer so that, for example, it may include comments, spaces, and + new-lines if it spans multiple tokens. Macro expansion, however, has + already been performed. */ static char * -lex_source_get_syntax__ (const struct lex_source *src, int n0, int n1) +lex_source_syntax__ (const struct lex_source *src, int ofs0, int ofs1) { struct string s = DS_EMPTY_INITIALIZER; - for (size_t i = n0; i <= n1; ) + for (size_t i = ofs0; i <= ofs1; ) { /* Find [I,J) as the longest sequence of tokens not produced by macro expansion, or otherwise the longest sequence expanded from a single macro call. */ - const struct lex_token *first = lex_source_next__ (src, i); + const struct lex_token *first = lex_source_ofs__ (src, i); size_t j; - for (j = i + 1; j <= n1; j++) + for (j = i + 1; j <= ofs1; j++) { - const struct lex_token *cur = lex_source_next__ (src, j); + const struct lex_token *cur = lex_source_ofs__ (src, j); if ((first->macro_rep != NULL) != (cur->macro_rep != NULL) || first->macro_rep != cur->macro_rep) break; } - const struct lex_token *last = lex_source_next__ (src, j - 1); + const struct lex_token *last = lex_source_ofs__ (src, j - 1); /* Now add the syntax for this sequence of tokens to SRC. */ if (!ds_is_empty (&s)) @@ -1883,7 +1906,8 @@ lex_source_error_valist (struct lex_source *src, int n0, int n1, else { /* Get the syntax that caused the error. */ - char *raw_syntax = lex_source_get_syntax__ (src, n0, n1); + char *raw_syntax = lex_source_syntax__ (src, n0 + src->parse_ofs, + n1 + src->parse_ofs); char syntax[64]; str_ellipsize (ss_cstr (raw_syntax), syntax, sizeof syntax); free (raw_syntax);