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) {
strcpy(context->error_msg, "out of memory");
return -1;
}

View File

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

View File

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

View File

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

View File

@ -29,31 +29,6 @@
#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
sl_pp_process_line(struct sl_pp_context *context,
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;
int line_number = -1;
int file_number = -1;
const char *str;
unsigned int line;
memset(&state, 0, sizeof(state));
@ -84,6 +58,7 @@ sl_pp_process_line(struct sl_pp_context *context,
default:
if (sl_pp_process_out(&state, &input[i])) {
strcpy(context->error_msg, "out of memory");
free(state.out);
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) {
line_number = state.out[0].data.number;
} else {
strcpy(context->error_msg, "expected number after `#line'");
strcpy(context->error_msg, "expected a number after `#line'");
free(state.out);
return -1;
}
@ -103,13 +78,13 @@ sl_pp_process_line(struct sl_pp_context *context,
if (state.out[1].token == SL_PP_NUMBER) {
file_number = state.out[1].data.number;
} else {
strcpy(context->error_msg, "expected number after line number");
strcpy(context->error_msg, "expected a number after line number");
free(state.out);
return -1;
}
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);
return -1;
}
@ -117,10 +92,7 @@ sl_pp_process_line(struct sl_pp_context *context,
free(state.out);
str = sl_pp_context_cstr(context, line_number);
if (_parse_integer(str, &line)) {
return -1;
}
line = atoi(sl_pp_context_cstr(context, line_number));
if (context->line != line) {
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.data.line = line;
if (sl_pp_process_out(pstate, &ti)) {
strcpy(context->error_msg, "out of memory");
return -1;
}
@ -137,10 +110,7 @@ sl_pp_process_line(struct sl_pp_context *context,
if (file_number != -1) {
unsigned int file;
str = sl_pp_context_cstr(context, file_number);
if (_parse_integer(str, &file)) {
return -1;
}
file_number = atoi(sl_pp_context_cstr(context, file_number));
if (context->file != file) {
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.data.file = file;
if (sl_pp_process_out(pstate, &ti)) {
strcpy(context->error_msg, "out of memory");
return -1;
}

View File

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

View File

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

View File

@ -25,34 +25,10 @@
*
**************************************************************************/
#include <stdlib.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
sl_pp_version(struct sl_pp_context *context,
const struct sl_pp_token_info *input,
@ -130,19 +106,9 @@ sl_pp_version(struct sl_pp_context *context,
break;
case SL_PP_NUMBER:
{
const char *num = sl_pp_context_cstr(context, input[i].data.number);
if (!num) {
return -1;
}
if (_parse_integer(num, version)) {
strcpy(context->error_msg, "expected version number after `#version'");
return -1;
}
i++;
found_number = 1;
}
*version = atoi(sl_pp_context_cstr(context, input[i].data.number));
i++;
found_number = 1;
break;
default: