diff --git a/tools/tools.h b/tools/tools.h index 93a7b3c5b09..1065d25c6d6 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -561,6 +561,86 @@ static inline struct target init_argv0_target( const char *argv0 ) } +/* output buffer management */ + +extern unsigned char *output_buffer; +extern size_t output_buffer_pos; +extern size_t output_buffer_size; + +static inline void check_output_buffer_space( size_t size ) +{ + if (output_buffer_pos + size >= output_buffer_size) + { + output_buffer_size = max( output_buffer_size * 2, output_buffer_pos + size ); + output_buffer = xrealloc( output_buffer, output_buffer_size ); + } +} + +static inline void init_output_buffer(void) +{ + output_buffer_size = 1024; + output_buffer_pos = 0; + output_buffer = xmalloc( output_buffer_size ); +} + +static inline void put_data( const void *data, size_t size ) +{ + check_output_buffer_space( size ); + memcpy( output_buffer + output_buffer_pos, data, size ); + output_buffer_pos += size; +} + +static inline void put_byte( unsigned char val ) +{ + check_output_buffer_space( 1 ); + output_buffer[output_buffer_pos++] = val; +} + +static inline void put_word( unsigned short val ) +{ + check_output_buffer_space( 2 ); + output_buffer[output_buffer_pos++] = val; + output_buffer[output_buffer_pos++] = val >> 8; +} + +static inline void put_dword( unsigned int val ) +{ + check_output_buffer_space( 4 ); + output_buffer[output_buffer_pos++] = val; + output_buffer[output_buffer_pos++] = val >> 8; + output_buffer[output_buffer_pos++] = val >> 16; + output_buffer[output_buffer_pos++] = val >> 24; +} + +static inline void put_qword( unsigned int val ) +{ + put_dword( val ); + put_dword( 0 ); +} + +static inline void align_output( unsigned int align ) +{ + size_t size = align - (output_buffer_pos % align); + + if (size == align) return; + check_output_buffer_space( size ); + memset( output_buffer + output_buffer_pos, 0, size ); + output_buffer_pos += size; +} + +static inline void flush_output_buffer( const char *name ) +{ + int fd = open( name, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666 ); + + if (fd == -1 || write( fd, output_buffer, output_buffer_pos ) != output_buffer_pos) + { + perror( name ); + exit(1); + } + close( fd ); + free( output_buffer ); +} + /* command-line option parsing */ /* partly based on the Glibc getopt() implementation */ diff --git a/tools/widl/utils.c b/tools/widl/utils.c index cf95f76e602..feb590057f5 100644 --- a/tools/widl/utils.c +++ b/tools/widl/utils.c @@ -222,32 +222,6 @@ static struct resource } resources[16]; static unsigned int nb_resources; -static void check_output_buffer_space( size_t size ) -{ - if (output_buffer_pos + size >= output_buffer_size) - { - output_buffer_size = max( output_buffer_size * 2, output_buffer_pos + size ); - output_buffer = xrealloc( output_buffer, output_buffer_size ); - } -} - -void init_output_buffer(void) -{ - output_buffer_size = 1024; - output_buffer_pos = 0; - output_buffer = xmalloc( output_buffer_size ); -} - -void flush_output_buffer( const char *name ) -{ - int fd = open( name, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666 ); - if (fd == -1) error( "Error creating %s\n", name ); - if (write( fd, output_buffer, output_buffer_pos ) != output_buffer_pos) - error( "Error writing to %s\n", name ); - close( fd ); - free( output_buffer ); -} - static inline void put_resource_id( const char *str ) { if (str[0] != '#') @@ -335,41 +309,6 @@ void flush_output_resources( const char *name ) free( output_buffer ); } -void put_data( const void *data, size_t size ) -{ - check_output_buffer_space( size ); - memcpy( output_buffer + output_buffer_pos, data, size ); - output_buffer_pos += size; -} - -void put_byte( unsigned char val ) -{ - check_output_buffer_space( 1 ); - output_buffer[output_buffer_pos++] = val; -} - -void put_word( unsigned short val ) -{ - check_output_buffer_space( 2 ); - output_buffer[output_buffer_pos++] = val; - output_buffer[output_buffer_pos++] = val >> 8; -} - -void put_dword( unsigned int val ) -{ - check_output_buffer_space( 4 ); - output_buffer[output_buffer_pos++] = val; - output_buffer[output_buffer_pos++] = val >> 8; - output_buffer[output_buffer_pos++] = val >> 16; - output_buffer[output_buffer_pos++] = val >> 24; -} - -void put_qword( unsigned int val ) -{ - put_dword( val ); - put_dword( 0 ); -} - /* pointer-sized word */ void put_pword( unsigned int val ) { @@ -402,13 +341,3 @@ void put_str( int indent, const char *format, ... ) check_output_buffer_space( size ); } } - -void align_output( unsigned int align ) -{ - size_t size = align - (output_buffer_pos % align); - - if (size == align) return; - check_output_buffer_space( size ); - memset( output_buffer + output_buffer_pos, 0, size ); - output_buffer_pos += size; -} diff --git a/tools/widl/utils.h b/tools/widl/utils.h index 29a04bff69d..401433ea4af 100644 --- a/tools/widl/utils.h +++ b/tools/widl/utils.h @@ -40,22 +40,10 @@ int is_valid_uuid(const char *s); /* buffer management */ -extern unsigned char *output_buffer; -extern size_t output_buffer_pos; -extern size_t output_buffer_size; - -extern void init_output_buffer(void); -extern void flush_output_buffer( const char *name ); extern void add_output_to_resources( const char *type, const char *name ); extern void flush_output_resources( const char *name ); -extern void put_data( const void *data, size_t size ); -extern void put_byte( unsigned char val ); -extern void put_word( unsigned short val ); -extern void put_dword( unsigned int val ); -extern void put_qword( unsigned int val ); extern void put_pword( unsigned int val ); extern void put_str( int indent, const char *format, ... ) __attribute__((format (printf, 2, 3))); -extern void align_output( unsigned int align ); /* typelibs expect the minor version to be stored in the higher bits and * major to be stored in the lower bits */ diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h index 2ed180aef58..85cbc100b59 100644 --- a/tools/winebuild/build.h +++ b/tools/winebuild/build.h @@ -307,23 +307,12 @@ extern const char *input_buffer_filename; extern const unsigned char *input_buffer; extern size_t input_buffer_pos; extern size_t input_buffer_size; -extern unsigned char *output_buffer; -extern size_t output_buffer_pos; -extern size_t output_buffer_size; extern void init_input_buffer( const char *file ); -extern void init_output_buffer(void); -extern void flush_output_buffer(void); extern unsigned char get_byte(void); extern unsigned short get_word(void); extern unsigned int get_dword(void); -extern void put_data( const void *data, size_t size ); -extern void put_byte( unsigned char val ); -extern void put_word( unsigned short val ); -extern void put_dword( unsigned int val ); -extern void put_qword( unsigned int val ); extern void put_pword( unsigned int val ); -extern void align_output( unsigned int align ); /* global variables */ diff --git a/tools/winebuild/res32.c b/tools/winebuild/res32.c index a70369753b5..85c49d0019a 100644 --- a/tools/winebuild/res32.c +++ b/tools/winebuild/res32.c @@ -668,7 +668,7 @@ void output_res_o_file( DLLSPEC *spec ) /* if the output file name is a .res too, don't run the results through windres */ if (strendswith( output_file_name, ".res")) { - flush_output_buffer(); + flush_output_buffer( output_file_name ); return; } diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c index d8510282b29..a2fb6ad25de 100644 --- a/tools/winebuild/spec32.c +++ b/tools/winebuild/spec32.c @@ -1041,7 +1041,7 @@ void output_fake_module( DLLSPEC *spec ) put_data( pe.sec[i].ptr, pe.sec[i].size ); } - flush_output_buffer(); + flush_output_buffer( output_file_name ? output_file_name : spec->file_name ); } diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c index 252577b182e..a4393850823 100644 --- a/tools/winebuild/utils.c +++ b/tools/winebuild/utils.c @@ -415,15 +415,6 @@ unsigned char *output_buffer; size_t output_buffer_pos; size_t output_buffer_size; -static void check_output_buffer_space( size_t size ) -{ - if (output_buffer_pos + size >= output_buffer_size) - { - output_buffer_size = max( output_buffer_size * 2, output_buffer_pos + size ); - output_buffer = xrealloc( output_buffer, output_buffer_size ); - } -} - void init_input_buffer( const char *file ) { int fd; @@ -442,22 +433,6 @@ void init_input_buffer( const char *file ) byte_swapped = 0; } -void init_output_buffer(void) -{ - output_buffer_size = 1024; - output_buffer_pos = 0; - output_buffer = xmalloc( output_buffer_size ); -} - -void flush_output_buffer(void) -{ - open_output_file(); - if (fwrite( output_buffer, 1, output_buffer_pos, output_file ) != output_buffer_pos) - fatal_error( "Error writing to %s\n", output_file_name ); - close_output_file(); - free( output_buffer ); -} - unsigned char get_byte(void) { if (input_buffer_pos >= input_buffer_size) @@ -490,46 +465,6 @@ unsigned int get_dword(void) return ret; } -void put_data( const void *data, size_t size ) -{ - check_output_buffer_space( size ); - memcpy( output_buffer + output_buffer_pos, data, size ); - output_buffer_pos += size; -} - -void put_byte( unsigned char val ) -{ - check_output_buffer_space( 1 ); - output_buffer[output_buffer_pos++] = val; -} - -void put_word( unsigned short val ) -{ - if (byte_swapped) val = (val << 8) | (val >> 8); - put_data( &val, sizeof(val) ); -} - -void put_dword( unsigned int val ) -{ - if (byte_swapped) - val = ((val << 24) | ((val << 8) & 0x00ff0000) | ((val >> 8) & 0x0000ff00) | (val >> 24)); - put_data( &val, sizeof(val) ); -} - -void put_qword( unsigned int val ) -{ - if (byte_swapped) - { - put_dword( 0 ); - put_dword( val ); - } - else - { - put_dword( val ); - put_dword( 0 ); - } -} - /* pointer-sized word */ void put_pword( unsigned int val ) { @@ -537,16 +472,6 @@ void put_pword( unsigned int val ) else put_dword( val ); } -void align_output( unsigned int align ) -{ - size_t size = align - (output_buffer_pos % align); - - if (size == align) return; - check_output_buffer_space( size ); - memset( output_buffer + output_buffer_pos, 0, size ); - output_buffer_pos += size; -} - /* output a standard header for generated files */ void output_standard_file_header(void) { diff --git a/tools/wmc/utils.c b/tools/wmc/utils.c index 80e9cf0c96b..26becacfe87 100644 --- a/tools/wmc/utils.c +++ b/tools/wmc/utils.c @@ -433,70 +433,6 @@ WCHAR *codepage_to_unicode( int codepage, const char *src, int srclen, int *dstl #endif /* _WIN32 */ -/******************************************************************* - * buffer management - * - * Function for writing to a memory buffer. - */ - unsigned char *output_buffer; size_t output_buffer_pos; size_t output_buffer_size; - -static void check_output_buffer_space( size_t size ) -{ - if (output_buffer_pos + size >= output_buffer_size) - { - output_buffer_size = max( output_buffer_size * 2, output_buffer_pos + size ); - output_buffer = xrealloc( output_buffer, output_buffer_size ); - } -} - -void init_output_buffer(void) -{ - output_buffer_size = 1024; - output_buffer_pos = 0; - output_buffer = xmalloc( output_buffer_size ); -} - -void flush_output_buffer( const char *name ) -{ - int fd = open( name, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666 ); - if (fd == -1) error( "Error creating %s\n", name ); - if (write( fd, output_buffer, output_buffer_pos ) != output_buffer_pos) - error( "Error writing to %s\n", name ); - close( fd ); - free( output_buffer ); -} - -void put_byte( unsigned char val ) -{ - check_output_buffer_space( 1 ); - output_buffer[output_buffer_pos++] = val; -} - -void put_word( unsigned short val ) -{ - check_output_buffer_space( 2 ); - output_buffer[output_buffer_pos++] = val; - output_buffer[output_buffer_pos++] = val >> 8; -} - -void put_dword( unsigned int val ) -{ - check_output_buffer_space( 4 ); - output_buffer[output_buffer_pos++] = val; - output_buffer[output_buffer_pos++] = val >> 8; - output_buffer[output_buffer_pos++] = val >> 16; - output_buffer[output_buffer_pos++] = val >> 24; -} - -void align_output( unsigned int align ) -{ - size_t size = align - (output_buffer_pos % align); - - if (size == align) return; - check_output_buffer_space( size ); - memset( output_buffer + output_buffer_pos, 0, size ); - output_buffer_pos += size; -} diff --git a/tools/wmc/utils.h b/tools/wmc/utils.h index 4a4bef37ee8..21ec9f59ade 100644 --- a/tools/wmc/utils.h +++ b/tools/wmc/utils.h @@ -41,17 +41,4 @@ char *unicode_to_utf8( const WCHAR *src, int srclen, int *dstlen ); int is_valid_codepage(int id); WCHAR *codepage_to_unicode( int codepage, const char *src, int srclen, int *dstlen ); -/* buffer management */ - -extern unsigned char *output_buffer; -extern size_t output_buffer_pos; -extern size_t output_buffer_size; - -extern void init_output_buffer(void); -extern void flush_output_buffer( const char *name ); -extern void put_byte( unsigned char val ); -extern void put_word( unsigned short val ); -extern void put_dword( unsigned int val ); -extern void align_output( unsigned int align ); - #endif diff --git a/tools/wrc/genres.c b/tools/wrc/genres.c index 173aff0c19a..be511378a7a 100644 --- a/tools/wrc/genres.c +++ b/tools/wrc/genres.c @@ -42,64 +42,9 @@ #include "wingdi.h" #include "winuser.h" -static unsigned char *output_buffer; -static size_t output_buffer_pos; -static size_t output_buffer_size; - -static void check_output_buffer_space( size_t size ) -{ - if (output_buffer_pos + size >= output_buffer_size) - { - output_buffer_size = max( output_buffer_size * 2, output_buffer_pos + size ); - output_buffer = xrealloc( output_buffer, output_buffer_size ); - } -} - -static void init_output_buffer(void) -{ - output_buffer_size = 1024; - output_buffer_pos = 0; - output_buffer = xmalloc( output_buffer_size ); -} - -static void put_data( const void *data, size_t size ) -{ - check_output_buffer_space( size ); - memcpy( output_buffer + output_buffer_pos, data, size ); - output_buffer_pos += size; -} - -static void put_byte( unsigned char val ) -{ - check_output_buffer_space( 1 ); - output_buffer[output_buffer_pos++] = val; -} - -static void put_word( unsigned short val ) -{ - check_output_buffer_space( 2 ); - output_buffer[output_buffer_pos++] = val; - output_buffer[output_buffer_pos++] = val >> 8; -} - -static void put_dword( unsigned int val ) -{ - check_output_buffer_space( 4 ); - output_buffer[output_buffer_pos++] = val; - output_buffer[output_buffer_pos++] = val >> 8; - output_buffer[output_buffer_pos++] = val >> 16; - output_buffer[output_buffer_pos++] = val >> 24; -} - -static void align_output( unsigned int align ) -{ - size_t size = align - (output_buffer_pos % align); - - if (size == align) return; - check_output_buffer_space( size ); - memset( output_buffer + output_buffer_pos, 0, size ); - output_buffer_pos += size; -} +unsigned char *output_buffer = NULL; +size_t output_buffer_pos = 0; +size_t output_buffer_size = 0; static void set_word(int ofs, unsigned int w) { @@ -1202,13 +1147,6 @@ static void dlginit2res(name_id_t *name, dlginit_t *dit) */ void write_resfile(char *outname, resource_t *top) { - FILE *fo; - unsigned int ret; - - fo = fopen(outname, "wb"); - if(!fo) - fatal_perror("Could not open %s", outname); - init_output_buffer(); if(win32) @@ -1256,12 +1194,5 @@ void write_resfile(char *outname, resource_t *top) if (win32) align_output( 4 ); } - ret = fwrite(output_buffer, 1, output_buffer_pos, fo); - if(ret != output_buffer_pos) - { - fclose(fo); - error("Error writing %s\n", outname); - } - if (fclose(fo)) - fatal_perror("Error writing %s", outname); + flush_output_buffer( outname ); }