glsl/pp: Add remaining error messages.
This commit is contained in:
parent
69bdd47dba
commit
0ddf41d34d
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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++;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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, ¯o->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, ¯o->body[j])) {
|
||||
strcpy(context->error_msg, "out of memory");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue