glsl/pp: Add remaining error messages.

This commit is contained in:
Michal Krol 2009-09-17 11:51:35 +02:00
parent 69bdd47dba
commit 0ddf41d34d
9 changed files with 68 additions and 97 deletions

View File

@ -85,6 +85,7 @@ sl_pp_context_add_unique_str(struct sl_pp_context *context,
} }
if (!context->cstr_pool) { if (!context->cstr_pool) {
strcpy(context->error_msg, "out of memory");
return -1; return -1;
} }

View File

@ -47,7 +47,7 @@ struct sl_pp_context {
unsigned int if_stack[SL_PP_MAX_IF_NESTING]; unsigned int if_stack[SL_PP_MAX_IF_NESTING];
unsigned int if_ptr; unsigned int if_ptr;
int if_value; unsigned int if_value;
char error_msg[SL_PP_MAX_ERROR_MSG]; char error_msg[SL_PP_MAX_ERROR_MSG];

View File

@ -41,7 +41,8 @@ skip_whitespace(const struct sl_pp_token_info *input,
static int static int
_parse_formal_args(const struct sl_pp_token_info *input, _parse_formal_args(struct sl_pp_context *context,
const struct sl_pp_token_info *input,
unsigned int *first, unsigned int *first,
unsigned int last, unsigned int last,
struct sl_pp_macro *macro) struct sl_pp_macro *macro)
@ -57,7 +58,7 @@ _parse_formal_args(const struct sl_pp_token_info *input,
return 0; return 0;
} }
} else { } else {
/* Expected either an identifier or `)'. */ strcpy(context->error_msg, "expected either an identifier or `)'");
return -1; return -1;
} }
@ -65,12 +66,13 @@ _parse_formal_args(const struct sl_pp_token_info *input,
for (;;) { for (;;) {
if (*first < last && input[*first].token != SL_PP_IDENTIFIER) { if (*first < last && input[*first].token != SL_PP_IDENTIFIER) {
/* Expected an identifier. */ strcpy(context->error_msg, "expected an identifier");
return -1; return -1;
} }
*arg = malloc(sizeof(struct sl_pp_macro_formal_arg)); *arg = malloc(sizeof(struct sl_pp_macro_formal_arg));
if (!*arg) { if (!*arg) {
strcpy(context->error_msg, "out of memory");
return -1; return -1;
} }
@ -90,14 +92,16 @@ _parse_formal_args(const struct sl_pp_token_info *input,
(*first)++; (*first)++;
return 0; return 0;
} else { } else {
/* Expected either `,' or `)'. */ strcpy(context->error_msg, "expected either `,' or `)'");
return -1; return -1;
} }
} else { } else {
/* Expected either `,' or `)'. */ strcpy(context->error_msg, "expected either `,' or `)'");
return -1; return -1;
} }
} }
/* Should not gete here. */
} }
@ -118,6 +122,7 @@ sl_pp_process_define(struct sl_pp_context *context,
first++; first++;
} }
if (macro_name == -1) { if (macro_name == -1) {
strcpy(context->error_msg, "expected an identifier");
return -1; return -1;
} }
@ -130,6 +135,7 @@ sl_pp_process_define(struct sl_pp_context *context,
if (!macro) { if (!macro) {
macro = sl_pp_macro_new(); macro = sl_pp_macro_new();
if (!macro) { if (!macro) {
strcpy(context->error_msg, "out of memory");
return -1; return -1;
} }
@ -149,7 +155,7 @@ sl_pp_process_define(struct sl_pp_context *context,
*/ */
if (first < last && input[first].token == SL_PP_LPAREN) { if (first < last && input[first].token == SL_PP_LPAREN) {
first++; first++;
if (_parse_formal_args(input, &first, last, macro)) { if (_parse_formal_args(context, input, &first, last, macro)) {
return -1; return -1;
} }
} }
@ -164,6 +170,7 @@ sl_pp_process_define(struct sl_pp_context *context,
macro->body = malloc(sizeof(struct sl_pp_token_info) * body_len); macro->body = malloc(sizeof(struct sl_pp_token_info) * body_len);
if (!macro->body) { if (!macro->body) {
strcpy(context->error_msg, "out of memory");
return -1; return -1;
} }

View File

@ -47,6 +47,7 @@ _parse_primary(struct parse_context *ctx,
ctx->input++; ctx->input++;
} else { } else {
if (ctx->input->token != SL_PP_LPAREN) { if (ctx->input->token != SL_PP_LPAREN) {
strcpy(ctx->context->error_msg, "expected `('");
return -1; return -1;
} }
ctx->input++; ctx->input++;
@ -54,6 +55,7 @@ _parse_primary(struct parse_context *ctx,
return -1; return -1;
} }
if (ctx->input->token != SL_PP_RPAREN) { if (ctx->input->token != SL_PP_RPAREN) {
strcpy(ctx->context->error_msg, "expected `)'");
return -1; return -1;
} }
ctx->input++; ctx->input++;

View File

@ -59,7 +59,7 @@ _parse_defined(struct sl_pp_context *context,
} }
if (input[*pi].token != SL_PP_IDENTIFIER) { if (input[*pi].token != SL_PP_IDENTIFIER) {
/* Identifier expected. */ strcpy(context->error_msg, "expected an identifier");
return -1; return -1;
} }
@ -75,7 +75,7 @@ _parse_defined(struct sl_pp_context *context,
if (parens) { if (parens) {
skip_whitespace(input, pi); skip_whitespace(input, pi);
if (input[*pi].token != SL_PP_RPAREN) { if (input[*pi].token != SL_PP_RPAREN) {
/* `)' expected */ strcpy(context->error_msg, "expected `)'");
return -1; return -1;
} }
(*pi)++; (*pi)++;
@ -91,10 +91,15 @@ _parse_defined(struct sl_pp_context *context,
return -1; return -1;
} }
return sl_pp_process_out(state, &result); if (sl_pp_process_out(state, &result)) {
strcpy(context->error_msg, "out of memory");
return -1;
}
return 0;
} }
static int static unsigned int
_evaluate_if_stack(struct sl_pp_context *context) _evaluate_if_stack(struct sl_pp_context *context)
{ {
unsigned int i; unsigned int i;
@ -119,7 +124,7 @@ _parse_if(struct sl_pp_context *context,
int result; int result;
if (!context->if_ptr) { if (!context->if_ptr) {
/* #if nesting too deep. */ strcpy(context->error_msg, "`#if' nesting too deep");
return -1; return -1;
} }
@ -151,6 +156,7 @@ _parse_if(struct sl_pp_context *context,
default: default:
if (sl_pp_process_out(&state, &input[i])) { if (sl_pp_process_out(&state, &input[i])) {
strcpy(context->error_msg, "out of memory");
free(state.out); free(state.out);
return -1; return -1;
} }
@ -160,6 +166,7 @@ _parse_if(struct sl_pp_context *context,
eof.token = SL_PP_EOF; eof.token = SL_PP_EOF;
if (sl_pp_process_out(&state, &eof)) { if (sl_pp_process_out(&state, &eof)) {
strcpy(context->error_msg, "out of memory");
free(state.out); free(state.out);
return -1; return -1;
} }
@ -182,13 +189,13 @@ static int
_parse_else(struct sl_pp_context *context) _parse_else(struct sl_pp_context *context)
{ {
if (context->if_ptr == SL_PP_MAX_IF_NESTING) { if (context->if_ptr == SL_PP_MAX_IF_NESTING) {
/* No matching #if. */ strcpy(context->error_msg, "no matching `#if'");
return -1; return -1;
} }
/* Bit b1 indicates we already went through #else. */ /* Bit b1 indicates we already went through #else. */
if (context->if_stack[context->if_ptr] & 2) { if (context->if_stack[context->if_ptr] & 2) {
/* No matching #if. */ strcpy(context->error_msg, "no matching `#if'");
return -1; return -1;
} }
@ -217,7 +224,7 @@ sl_pp_process_ifdef(struct sl_pp_context *context,
unsigned int i; unsigned int i;
if (!context->if_ptr) { if (!context->if_ptr) {
/* #if nesting too deep. */ strcpy(context->error_msg, "`#if' nesting too deep");
return -1; return -1;
} }
@ -246,12 +253,12 @@ sl_pp_process_ifdef(struct sl_pp_context *context,
break; break;
default: default:
/* Expected an identifier. */ strcpy(context->error_msg, "expected an identifier");
return -1; return -1;
} }
} }
/* Expected an identifier. */ strcpy(context->error_msg, "expected an identifier");
return -1; return -1;
} }
@ -264,7 +271,7 @@ sl_pp_process_ifndef(struct sl_pp_context *context,
unsigned int i; unsigned int i;
if (!context->if_ptr) { if (!context->if_ptr) {
/* #if nesting too deep. */ strcpy(context->error_msg, "`#if' nesting too deep");
return -1; return -1;
} }
@ -293,12 +300,12 @@ sl_pp_process_ifndef(struct sl_pp_context *context,
break; break;
default: default:
/* Expected an identifier. */ strcpy(context->error_msg, "expected an identifier");
return -1; return -1;
} }
} }
/* Expected an identifier. */ strcpy(context->error_msg, "expected an identifier");
return -1; return -1;
} }
@ -341,7 +348,7 @@ sl_pp_process_endif(struct sl_pp_context *context,
unsigned int last) unsigned int last)
{ {
if (context->if_ptr == SL_PP_MAX_IF_NESTING) { if (context->if_ptr == SL_PP_MAX_IF_NESTING) {
/* No matching #if. */ strcpy(context->error_msg, "no matching `#if'");
return -1; return -1;
} }

View File

@ -29,31 +29,6 @@
#include "sl_pp_process.h" #include "sl_pp_process.h"
static int
_parse_integer(const char *input,
unsigned int *number)
{
unsigned int n = 0;
while (*input >= '0' && *input <= '9') {
if (n * 10 < n) {
/* Overflow. */
return -1;
}
n = n * 10 + (*input++ - '0');
}
if (*input != '\0') {
/* Invalid decimal number. */
return -1;
}
*number = n;
return 0;
}
int int
sl_pp_process_line(struct sl_pp_context *context, sl_pp_process_line(struct sl_pp_context *context,
const struct sl_pp_token_info *input, const struct sl_pp_token_info *input,
@ -65,7 +40,6 @@ sl_pp_process_line(struct sl_pp_context *context,
struct sl_pp_process_state state; struct sl_pp_process_state state;
int line_number = -1; int line_number = -1;
int file_number = -1; int file_number = -1;
const char *str;
unsigned int line; unsigned int line;
memset(&state, 0, sizeof(state)); memset(&state, 0, sizeof(state));
@ -84,6 +58,7 @@ sl_pp_process_line(struct sl_pp_context *context,
default: default:
if (sl_pp_process_out(&state, &input[i])) { if (sl_pp_process_out(&state, &input[i])) {
strcpy(context->error_msg, "out of memory");
free(state.out); free(state.out);
return -1; return -1;
} }
@ -94,7 +69,7 @@ sl_pp_process_line(struct sl_pp_context *context,
if (state.out_len > 0 && state.out[0].token == SL_PP_NUMBER) { if (state.out_len > 0 && state.out[0].token == SL_PP_NUMBER) {
line_number = state.out[0].data.number; line_number = state.out[0].data.number;
} else { } else {
strcpy(context->error_msg, "expected number after `#line'"); strcpy(context->error_msg, "expected a number after `#line'");
free(state.out); free(state.out);
return -1; return -1;
} }
@ -103,13 +78,13 @@ sl_pp_process_line(struct sl_pp_context *context,
if (state.out[1].token == SL_PP_NUMBER) { if (state.out[1].token == SL_PP_NUMBER) {
file_number = state.out[1].data.number; file_number = state.out[1].data.number;
} else { } else {
strcpy(context->error_msg, "expected number after line number"); strcpy(context->error_msg, "expected a number after line number");
free(state.out); free(state.out);
return -1; return -1;
} }
if (state.out_len > 2) { if (state.out_len > 2) {
strcpy(context->error_msg, "expected end of line after file number"); strcpy(context->error_msg, "expected an end of line after file number");
free(state.out); free(state.out);
return -1; return -1;
} }
@ -117,10 +92,7 @@ sl_pp_process_line(struct sl_pp_context *context,
free(state.out); free(state.out);
str = sl_pp_context_cstr(context, line_number); line = atoi(sl_pp_context_cstr(context, line_number));
if (_parse_integer(str, &line)) {
return -1;
}
if (context->line != line) { if (context->line != line) {
struct sl_pp_token_info ti; struct sl_pp_token_info ti;
@ -128,6 +100,7 @@ sl_pp_process_line(struct sl_pp_context *context,
ti.token = SL_PP_LINE; ti.token = SL_PP_LINE;
ti.data.line = line; ti.data.line = line;
if (sl_pp_process_out(pstate, &ti)) { if (sl_pp_process_out(pstate, &ti)) {
strcpy(context->error_msg, "out of memory");
return -1; return -1;
} }
@ -137,10 +110,7 @@ sl_pp_process_line(struct sl_pp_context *context,
if (file_number != -1) { if (file_number != -1) {
unsigned int file; unsigned int file;
str = sl_pp_context_cstr(context, file_number); file_number = atoi(sl_pp_context_cstr(context, file_number));
if (_parse_integer(str, &file)) {
return -1;
}
if (context->file != file) { if (context->file != file) {
struct sl_pp_token_info ti; struct sl_pp_token_info ti;
@ -148,6 +118,7 @@ sl_pp_process_line(struct sl_pp_context *context,
ti.token = SL_PP_FILE; ti.token = SL_PP_FILE;
ti.data.file = file; ti.data.file = file;
if (sl_pp_process_out(pstate, &ti)) { if (sl_pp_process_out(pstate, &ti)) {
strcpy(context->error_msg, "out of memory");
return -1; return -1;
} }

View File

@ -107,7 +107,12 @@ _out_number(struct sl_pp_context *context,
ti.token = SL_PP_NUMBER; ti.token = SL_PP_NUMBER;
ti.data.number = sl_pp_context_add_unique_str(context, buf); ti.data.number = sl_pp_context_add_unique_str(context, buf);
return sl_pp_process_out(state, &ti); if (sl_pp_process_out(state, &ti)) {
strcpy(context->error_msg, "out of memory");
return -1;
}
return 0;
} }
int int
@ -125,6 +130,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
unsigned int j; unsigned int j;
if (input[*pi].token != SL_PP_IDENTIFIER) { if (input[*pi].token != SL_PP_IDENTIFIER) {
strcpy(context->error_msg, "expected an identifier");
return -1; return -1;
} }
@ -172,6 +178,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
if (!macro) { if (!macro) {
if (!mute) { if (!mute) {
if (sl_pp_process_out(state, &input[*pi])) { if (sl_pp_process_out(state, &input[*pi])) {
strcpy(context->error_msg, "out of memory");
return -1; return -1;
} }
} }
@ -184,6 +191,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
if (macro->num_args >= 0) { if (macro->num_args >= 0) {
skip_whitespace(input, pi); skip_whitespace(input, pi);
if (input[*pi].token != SL_PP_LPAREN) { if (input[*pi].token != SL_PP_LPAREN) {
strcpy(context->error_msg, "expected `('");
return -1; return -1;
} }
(*pi)++; (*pi)++;
@ -203,6 +211,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
*pmacro = sl_pp_macro_new(); *pmacro = sl_pp_macro_new();
if (!*pmacro) { if (!*pmacro) {
strcpy(context->error_msg, "out of memory");
return -1; return -1;
} }
@ -219,6 +228,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
if (j < (unsigned int)macro->num_args - 1) { if (j < (unsigned int)macro->num_args - 1) {
done = 1; done = 1;
} else { } else {
strcpy(context->error_msg, "too many actual macro arguments");
return -1; return -1;
} }
} else { } else {
@ -236,6 +246,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
if (j == (unsigned int)macro->num_args - 1) { if (j == (unsigned int)macro->num_args - 1) {
done = 1; done = 1;
} else { } else {
strcpy(context->error_msg, "too few actual macro arguments");
return -1; return -1;
} }
} else { } else {
@ -245,6 +256,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
break; break;
case SL_PP_EOF: case SL_PP_EOF:
strcpy(context->error_msg, "too few actual macro arguments");
return -1; return -1;
default: default:
@ -254,6 +266,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
(**pmacro).body = malloc(sizeof(struct sl_pp_token_info) * body_len); (**pmacro).body = malloc(sizeof(struct sl_pp_token_info) * body_len);
if (!(**pmacro).body) { if (!(**pmacro).body) {
strcpy(context->error_msg, "out of memory");
return -1; return -1;
} }
@ -301,6 +314,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
if (macro->num_args == 0) { if (macro->num_args == 0) {
skip_whitespace(input, pi); skip_whitespace(input, pi);
if (input[*pi].token != SL_PP_RPAREN) { if (input[*pi].token != SL_PP_RPAREN) {
strcpy(context->error_msg, "expected `)'");
return -1; return -1;
} }
(*pi)++; (*pi)++;
@ -310,6 +324,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
switch (macro->body[j].token) { switch (macro->body[j].token) {
case SL_PP_NEWLINE: case SL_PP_NEWLINE:
if (sl_pp_process_out(state, &macro->body[j])) { if (sl_pp_process_out(state, &macro->body[j])) {
strcpy(context->error_msg, "out of memory");
return -1; return -1;
} }
j++; j++;
@ -328,6 +343,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
default: default:
if (!mute) { if (!mute) {
if (sl_pp_process_out(state, &macro->body[j])) { if (sl_pp_process_out(state, &macro->body[j])) {
strcpy(context->error_msg, "out of memory");
return -1; return -1;
} }
} }

View File

@ -99,6 +99,7 @@ sl_pp_process_pragma(struct sl_pp_context *context,
/* Ignore the tokens that follow. */ /* Ignore the tokens that follow. */
if (sl_pp_process_out(state, &out)) { if (sl_pp_process_out(state, &out)) {
strcpy(context->error_msg, "out of memory");
return -1; return -1;
} }

View File

@ -25,34 +25,10 @@
* *
**************************************************************************/ **************************************************************************/
#include <stdlib.h>
#include "sl_pp_version.h" #include "sl_pp_version.h"
static int
_parse_integer(const char *input,
unsigned int *number)
{
unsigned int n = 0;
while (*input >= '0' && *input <= '9') {
if (n * 10 < n) {
/* Overflow. */
return -1;
}
n = n * 10 + (*input++ - '0');
}
if (*input != '\0') {
/* Invalid decimal number. */
return -1;
}
*number = n;
return 0;
}
int int
sl_pp_version(struct sl_pp_context *context, sl_pp_version(struct sl_pp_context *context,
const struct sl_pp_token_info *input, const struct sl_pp_token_info *input,
@ -130,19 +106,9 @@ sl_pp_version(struct sl_pp_context *context,
break; break;
case SL_PP_NUMBER: case SL_PP_NUMBER:
{ *version = atoi(sl_pp_context_cstr(context, input[i].data.number));
const char *num = sl_pp_context_cstr(context, input[i].data.number); i++;
found_number = 1;
if (!num) {
return -1;
}
if (_parse_integer(num, version)) {
strcpy(context->error_msg, "expected version number after `#version'");
return -1;
}
i++;
found_number = 1;
}
break; break;
default: default: