make_xftmpl: Report errors in standard format.
This commit is contained in:
parent
f50ead6358
commit
31ad5fe6a2
|
@ -22,6 +22,7 @@
|
||||||
#include "wine/port.h"
|
#include "wine/port.h"
|
||||||
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
|
@ -75,7 +76,6 @@ struct parser
|
||||||
int line_no;
|
int line_no;
|
||||||
UINT bytes_output;
|
UINT bytes_output;
|
||||||
BOOL(*write_bytes)(struct parser *parser, const BYTE *data, DWORD size);
|
BOOL(*write_bytes)(struct parser *parser, const BYTE *data, DWORD size);
|
||||||
BOOL error;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct keyword
|
struct keyword
|
||||||
|
@ -102,16 +102,41 @@ static const struct keyword reserved_words[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *program_name;
|
static char *program_name;
|
||||||
|
static const char *infile_name;
|
||||||
|
|
||||||
|
#ifndef __GNUC__
|
||||||
|
#define __attribute__(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void fatal_error( struct parser *parser, const char *msg, ... ) __attribute__ ((__format__ (__printf__, 2, 3)));
|
||||||
|
|
||||||
|
static void fatal_error( struct parser *parser, const char *msg, ... )
|
||||||
|
{
|
||||||
|
va_list valist;
|
||||||
|
va_start( valist, msg );
|
||||||
|
if (infile_name)
|
||||||
|
{
|
||||||
|
fprintf( stderr, "%s:%d:", infile_name, parser->line_no );
|
||||||
|
fprintf( stderr, " error: " );
|
||||||
|
}
|
||||||
|
else fprintf( stderr, "%s: error: ", program_name );
|
||||||
|
vfprintf( stderr, msg, valist );
|
||||||
|
va_end( valist );
|
||||||
|
exit( 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline BOOL read_byte(struct parser *parser, char *byte)
|
static inline BOOL read_byte(struct parser *parser, char *byte)
|
||||||
{
|
{
|
||||||
int c = fgetc(parser->infile);
|
int c = fgetc(parser->infile);
|
||||||
*byte = c;
|
*byte = c;
|
||||||
|
if (c == '\n') parser->line_no++;
|
||||||
return c != EOF;
|
return c != EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline BOOL unread_byte(struct parser *parser, char last_byte)
|
static inline BOOL unread_byte(struct parser *parser, char last_byte)
|
||||||
{
|
{
|
||||||
|
if (last_byte == '\n') parser->line_no--;
|
||||||
return ungetc(last_byte, parser->infile) != EOF;
|
return ungetc(last_byte, parser->infile) != EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,21 +208,11 @@ static BOOL parse_guid(struct parser *parser)
|
||||||
static const char *guidfmt = "<%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X>";
|
static const char *guidfmt = "<%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X>";
|
||||||
|
|
||||||
buf[0] = '<';
|
buf[0] = '<';
|
||||||
if (!read_bytes(parser, buf + 1, 37)) {
|
if (!read_bytes(parser, buf + 1, 37)) fatal_error( parser, "truncated GUID\n" );
|
||||||
fprintf(stderr, "%s: Truncated GUID (line %d)\n",
|
|
||||||
program_name, parser->line_no);
|
|
||||||
parser->error = TRUE;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
buf[38] = 0;
|
buf[38] = 0;
|
||||||
|
|
||||||
ret = sscanf(buf, guidfmt, &guid.Data1, tab, tab+1, tab+2, tab+3, tab+4, tab+5, tab+6, tab+7, tab+8, tab+9);
|
ret = sscanf(buf, guidfmt, &guid.Data1, tab, tab+1, tab+2, tab+3, tab+4, tab+5, tab+6, tab+7, tab+8, tab+9);
|
||||||
if (ret != 11) {
|
if (ret != 11) fatal_error( parser, "invalid GUID '%s'\n", buf );
|
||||||
fprintf(stderr, "%s: Invalid GUID '%s' (line %d)\n",
|
|
||||||
program_name, buf, parser->line_no);
|
|
||||||
parser->error = TRUE;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
guid.Data2 = tab[0];
|
guid.Data2 = tab[0];
|
||||||
guid.Data3 = tab[1];
|
guid.Data3 = tab[1];
|
||||||
|
@ -260,25 +275,15 @@ static BOOL parse_number(struct parser *parser)
|
||||||
if (dot) {
|
if (dot) {
|
||||||
float value;
|
float value;
|
||||||
ret = sscanf(buffer, "%f", &value);
|
ret = sscanf(buffer, "%f", &value);
|
||||||
if (!ret) {
|
if (!ret) fatal_error( parser, "invalid float token\n" );
|
||||||
fprintf(stderr, "%s: Invalid float token (line %d).\n",
|
ret = write_word(parser, TOKEN_FLOAT) &&
|
||||||
program_name, parser->line_no);
|
write_bytes(parser, &value, sizeof(value));
|
||||||
parser->error = TRUE;
|
|
||||||
} else {
|
|
||||||
ret = write_word(parser, TOKEN_FLOAT) &&
|
|
||||||
write_bytes(parser, &value, sizeof(value));
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
int value;
|
int value;
|
||||||
ret = sscanf(buffer, "%d", &value);
|
ret = sscanf(buffer, "%d", &value);
|
||||||
if (!ret) {
|
if (!ret) fatal_error( parser, "invalid integer token\n" );
|
||||||
fprintf(stderr, "%s: Invalid integer token (line %d).\n",
|
ret = write_word(parser, TOKEN_INTEGER) &&
|
||||||
program_name, parser->line_no);
|
write_dword(parser, value);
|
||||||
parser->error = TRUE;
|
|
||||||
} else {
|
|
||||||
ret = write_word(parser, TOKEN_INTEGER) &&
|
|
||||||
write_dword(parser, value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -294,8 +299,6 @@ static BOOL parse_token(struct parser *parser)
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
case '\n':
|
case '\n':
|
||||||
parser->line_no++;
|
|
||||||
/* fall through */
|
|
||||||
case '\r':
|
case '\r':
|
||||||
case ' ':
|
case ' ':
|
||||||
case '\t':
|
case '\t':
|
||||||
|
@ -312,12 +315,8 @@ static BOOL parse_token(struct parser *parser)
|
||||||
case '.': return write_word(parser, TOKEN_DOT);
|
case '.': return write_word(parser, TOKEN_DOT);
|
||||||
|
|
||||||
case '/':
|
case '/':
|
||||||
if (!read_byte(parser, &c) || c != '/') {
|
if (!read_byte(parser, &c) || c != '/')
|
||||||
fprintf(stderr, "%s: Invalid single '/' comment token (line %d).\n",
|
fatal_error( parser, "invalid single '/' comment token\n" );
|
||||||
program_name, parser->line_no);
|
|
||||||
parser->error = TRUE;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case '#':
|
case '#':
|
||||||
while (read_byte(parser, &c) && c != '\n');
|
while (read_byte(parser, &c) && c != '\n');
|
||||||
|
@ -336,12 +335,7 @@ static BOOL parse_token(struct parser *parser)
|
||||||
if (len + 1 < sizeof(buffer))
|
if (len + 1 < sizeof(buffer))
|
||||||
buffer[len++] = c;
|
buffer[len++] = c;
|
||||||
}
|
}
|
||||||
if (c != '"') {
|
if (c != '"') fatal_error( parser, "unterminated string\n" );
|
||||||
fprintf(stderr, "%s: Unterminated string (line %d).\n",
|
|
||||||
program_name, parser->line_no);
|
|
||||||
parser->error = TRUE;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return write_word(parser, TOKEN_STRING) &&
|
return write_word(parser, TOKEN_STRING) &&
|
||||||
write_dword(parser, len) &&
|
write_dword(parser, len) &&
|
||||||
write_bytes(parser, buffer, len);
|
write_bytes(parser, buffer, len);
|
||||||
|
@ -353,10 +347,7 @@ static BOOL parse_token(struct parser *parser)
|
||||||
return parse_number(parser);
|
return parse_number(parser);
|
||||||
if (isalpha(c) || c == '_')
|
if (isalpha(c) || c == '_')
|
||||||
return parse_name(parser);
|
return parse_name(parser);
|
||||||
fprintf(stderr, "%s: Invalid character (%d) to start token (line %d).\n",
|
fatal_error( parser, "invalid character '%c' to start token\n", c );
|
||||||
program_name, c, parser->line_no);
|
|
||||||
parser->error = TRUE;
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -415,7 +406,6 @@ static char **parse_options(int argc, char **argv)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
const char *infile_name;
|
|
||||||
char header[16];
|
char header[16];
|
||||||
struct parser parser;
|
struct parser parser;
|
||||||
char **args;
|
char **args;
|
||||||
|
@ -433,7 +423,6 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
parser.infile = stdin;
|
parser.infile = stdin;
|
||||||
parser.outfile = NULL;
|
parser.outfile = NULL;
|
||||||
parser.error = FALSE;
|
|
||||||
|
|
||||||
if (!strcmp(infile_name, "-")) {
|
if (!strcmp(infile_name, "-")) {
|
||||||
infile_name = "stdin";
|
infile_name = "stdin";
|
||||||
|
@ -533,7 +522,7 @@ int main(int argc, char **argv)
|
||||||
parser.line_no = 1;
|
parser.line_no = 1;
|
||||||
while (parse_token(&parser));
|
while (parse_token(&parser));
|
||||||
|
|
||||||
if (parser.error || ferror(parser.outfile) || ferror(parser.infile))
|
if (ferror(parser.outfile) || ferror(parser.infile))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (option_inc_var_name)
|
if (option_inc_var_name)
|
||||||
|
|
Loading…
Reference in New Issue