Alexandre Julliard : make_xftmpl: Use the standard output buffer routines.
Alexandre Julliard
julliard at winehq.org
Tue Feb 8 16:11:45 CST 2022
Module: wine
Branch: master
Commit: 7d3938e81146e99b5b188aa49eb1b3345c697db7
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7d3938e81146e99b5b188aa49eb1b3345c697db7
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Feb 8 17:40:53 2022 +0100
make_xftmpl: Use the standard output buffer routines.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
tools/make_xftmpl.c | 167 ++++++++++++++++++++++------------------------------
1 file changed, 69 insertions(+), 98 deletions(-)
diff --git a/tools/make_xftmpl.c b/tools/make_xftmpl.c
index b7f964c28d7..d707dc06cd2 100644
--- a/tools/make_xftmpl.c
+++ b/tools/make_xftmpl.c
@@ -93,8 +93,10 @@ static FILE *infile;
static int line_no;
static const char *infile_name;
static FILE *outfile;
-static BYTE *output_data;
-static UINT output_pos, output_size;
+
+unsigned char *output_buffer = NULL;
+size_t output_buffer_pos = 0;
+size_t output_buffer_size = 0;
static void fatal_error( const char *msg, ... ) __attribute__ ((__format__ (__printf__, 1, 2)));
@@ -136,63 +138,33 @@ static inline BOOL read_bytes( void *data, DWORD size )
static BOOL write_c_hex_bytes(void)
{
UINT i;
- for (i = 0; i < output_pos; i++)
+ for (i = 0; i < output_buffer_pos; i++)
{
if (i % 12 == 0)
fprintf(outfile, "\n ");
- fprintf(outfile, " 0x%02x,", output_data[i]);
+ fprintf(outfile, " 0x%02x,", output_buffer[i]);
}
return TRUE;
}
static BOOL write_raw_bytes(void)
{
- return fwrite(output_data, output_pos, 1, outfile) > 0;
-}
-
-static inline BOOL write_bytes(const void *data, DWORD size)
-{
- if (output_pos + size > output_size)
- {
- output_size = max( output_size * 2, size );
- output_data = realloc( output_data, output_size );
- if (!output_data) return FALSE;
- }
- memcpy( output_data + output_pos, data, size );
- output_pos += size;
- return TRUE;
-}
-
-static inline BOOL write_byte(BYTE value)
-{
- return write_bytes( &value, sizeof(value) );
+ return fwrite(output_buffer, output_buffer_pos, 1, outfile) > 0;
}
-static inline BOOL write_word(WORD value)
-{
- return write_byte( value ) &&
- write_byte( value >> 8 );
-}
-
-static inline BOOL write_dword(DWORD value)
-{
- return write_word( value ) &&
- write_word( value >> 16 );
-}
-
-static inline BOOL write_float(float value)
+static inline void put_float(float value)
{
DWORD val;
memcpy( &val, &value, sizeof(value) );
- return write_dword( val );
+ return put_dword( val );
}
-static inline BOOL write_guid(const GUID *guid)
+static inline void put_guid(const GUID *guid)
{
- return write_dword( guid->Data1 ) &&
- write_word( guid->Data2 ) &&
- write_word( guid->Data3 ) &&
- write_bytes( guid->Data4, sizeof(guid->Data4) );
+ put_dword( guid->Data1 );
+ put_word( guid->Data2 );
+ put_word( guid->Data3 );
+ put_data( guid->Data4, sizeof(guid->Data4) );
}
static int compare_names(const void *a, const void *b)
@@ -209,10 +181,11 @@ static BOOL parse_keyword( const char *name )
if (!keyword)
return FALSE;
- return write_word(keyword->token);
+ put_word(keyword->token);
+ return TRUE;
}
-static BOOL parse_guid(void)
+static void parse_guid(void)
{
char buf[39];
GUID guid;
@@ -238,11 +211,11 @@ static BOOL parse_guid(void)
guid.Data4[6] = tab[8];
guid.Data4[7] = tab[9];
- return write_word(TOKEN_GUID) &&
- write_guid(&guid);
+ put_word(TOKEN_GUID);
+ put_guid(&guid);
}
-static BOOL parse_name(void)
+static void parse_name(void)
{
char c;
int len = 0;
@@ -257,16 +230,15 @@ static BOOL parse_name(void)
unread_byte(c);
name[len] = 0;
- if (parse_keyword(name)) {
- return TRUE;
- } else {
- return write_word(TOKEN_NAME) &&
- write_dword(len) &&
- write_bytes(name, len);
+ if (!parse_keyword(name))
+ {
+ put_word(TOKEN_NAME);
+ put_dword(len);
+ put_data(name, len);
}
}
-static BOOL parse_number(void)
+static void parse_number(void)
{
int len = 0;
char c;
@@ -289,17 +261,15 @@ static BOOL parse_number(void)
float value;
ret = sscanf(buffer, "%f", &value);
if (!ret) fatal_error( "invalid float token\n" );
- ret = write_word(TOKEN_FLOAT) &&
- write_float(value);
+ put_word(TOKEN_FLOAT);
+ put_float(value);
} else {
int value;
ret = sscanf(buffer, "%d", &value);
if (!ret) fatal_error( "invalid integer token\n" );
- ret = write_word(TOKEN_INTEGER) &&
- write_dword(value);
+ put_word(TOKEN_INTEGER);
+ put_dword(value);
}
-
- return ret;
}
static BOOL parse_token(void)
@@ -317,17 +287,17 @@ static BOOL parse_token(void)
case '\r':
case ' ':
case '\t':
- return TRUE;
-
- case '{': return write_word(TOKEN_OBRACE);
- case '}': return write_word(TOKEN_CBRACE);
- case '[': return write_word(TOKEN_OBRACKET);
- case ']': return write_word(TOKEN_CBRACKET);
- case '(': return write_word(TOKEN_OPAREN);
- case ')': return write_word(TOKEN_CPAREN);
- case ',': return write_word(TOKEN_COMMA);
- case ';': return write_word(TOKEN_SEMICOLON);
- case '.': return write_word(TOKEN_DOT);
+ break;
+
+ case '{': put_word(TOKEN_OBRACE); break;
+ case '}': put_word(TOKEN_CBRACE); break;
+ case '[': put_word(TOKEN_OBRACKET); break;
+ case ']': put_word(TOKEN_CBRACKET); break;
+ case '(': put_word(TOKEN_OPAREN); break;
+ case ')': put_word(TOKEN_CPAREN); break;
+ case ',': put_word(TOKEN_COMMA); break;
+ case ';': put_word(TOKEN_SEMICOLON); break;
+ case '.': put_word(TOKEN_DOT); break;
case '/':
if (!read_byte(&c) || c != '/')
@@ -342,11 +312,11 @@ static BOOL parse_token(void)
if (c != '\n') fatal_error( "line too long\n" );
buffer[len] = 0;
tok = strtok( buffer, " \t" );
- if (!tok || strcmp( tok, "pragma" )) return TRUE;
+ if (!tok || strcmp( tok, "pragma" )) break;
tok = strtok( NULL, " \t" );
- if (!tok || strcmp( tok, "xftmpl" )) return TRUE;
+ if (!tok || strcmp( tok, "xftmpl" )) break;
tok = strtok( NULL, " \t" );
- if (!tok) return TRUE;
+ if (!tok) break;
if (!strcmp( tok, "name" ))
{
tok = strtok( NULL, " \t" );
@@ -357,10 +327,11 @@ static BOOL parse_token(void)
tok = strtok( NULL, " \t" );
if (tok && !option_inc_size_name) option_inc_size_name = xstrdup( tok );
}
- return TRUE;
+ break;
case '<':
- return parse_guid();
+ parse_guid();
+ break;
case '"':
len = 0;
@@ -371,17 +342,16 @@ static BOOL parse_token(void)
buffer[len++] = c;
}
if (c != '"') fatal_error( "unterminated string\n" );
- return write_word(TOKEN_STRING) &&
- write_dword(len) &&
- write_bytes(buffer, len);
+ put_word(TOKEN_STRING);
+ put_dword(len);
+ put_data(buffer, len);
+ break;
default:
unread_byte(c);
- if (isdigit(c) || c == '-')
- return parse_number();
- if (isalpha(c) || c == '_')
- return parse_name();
- fatal_error( "invalid character '%c' to start token\n", c );
+ if (isdigit(c) || c == '-') parse_number();
+ else if (isalpha(c) || c == '_') parse_name();
+ else fatal_error( "invalid character '%c' to start token\n", c );
}
return TRUE;
@@ -489,6 +459,19 @@ int main(int argc, char **argv)
goto error;
}
+ init_output_buffer();
+ put_data("xof 0302bin 0064", 16);
+
+ line_no = 1;
+ while (parse_token());
+
+ if (ferror(infile))
+ {
+ perror(infile_name);
+ return 1;
+ }
+ fclose(infile);
+
if (!strcmp(option_outfile_name, "-")) {
option_outfile_name = "stdout";
outfile = stdout;
@@ -506,13 +489,7 @@ int main(int argc, char **argv)
}
}
- if (!write_bytes("xof 0302bin 0064", 16))
- goto error;
-
- line_no = 1;
- while (parse_token());
-
- if (ferror(outfile) || ferror(infile))
+ if (ferror(outfile))
goto error;
if (option_header)
@@ -543,24 +520,18 @@ int main(int argc, char **argv)
write_c_hex_bytes();
fprintf(outfile, "\n};\n\n");
if (option_inc_size_name)
- fprintf(outfile, "#define %s %u\n\n", option_inc_size_name, output_pos);
+ fprintf(outfile, "#define %s %u\n\n", option_inc_size_name, (unsigned int)output_buffer_pos);
fprintf(outfile, "#endif /* __WINE_%s */\n", header_name);
if (ferror(outfile))
goto error;
}
else write_raw_bytes();
- fclose(infile);
fclose(outfile);
output_file = NULL;
return 0;
error:
- if (infile) {
- if (ferror(infile))
- perror(infile_name);
- fclose(infile);
- }
if (outfile) {
if (ferror(outfile))
perror(option_outfile_name);
More information about the wine-cvs
mailing list