Alexandre Julliard : widl: Copy the output buffer management functions from winebuild.

Alexandre Julliard julliard at winehq.org
Mon Nov 29 13:38:33 CST 2010


Module: wine
Branch: master
Commit: 00dda6f68728d1698adb98916c3e5e361c899822
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=00dda6f68728d1698adb98916c3e5e361c899822

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Sat Nov 27 11:42:09 2010 +0100

widl: Copy the output buffer management functions from winebuild.

---

 tools/widl/utils.c |  101 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 tools/widl/utils.h |   25 +++++++++++++
 2 files changed, 126 insertions(+), 0 deletions(-)

diff --git a/tools/widl/utils.c b/tools/widl/utils.c
index 6547774..c0f6de6 100644
--- a/tools/widl/utils.c
+++ b/tools/widl/utils.c
@@ -234,3 +234,104 @@ char *xstrdup(const char *str)
 	s = xmalloc(strlen(str)+1);
 	return strcpy(s, str);
 }
+
+int strendswith(const char* str, const char* end)
+{
+    int l = strlen(str);
+    int m = strlen(end);
+    return l >= m && strcmp(str + l - m, end) == 0;
+}
+
+/*******************************************************************
+ *         buffer management
+ *
+ * Function for writing to a memory buffer.
+ */
+
+int byte_swapped = 0;
+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_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 )
+{
+    if (pointer_size == 8) put_qword( 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;
+}
diff --git a/tools/widl/utils.h b/tools/widl/utils.h
index 5c440be..da589b9 100644
--- a/tools/widl/utils.h
+++ b/tools/widl/utils.h
@@ -28,6 +28,7 @@
 void *xmalloc(size_t);
 void *xrealloc(void *, size_t);
 char *xstrdup(const char *str);
+int strendswith(const char* str, const char* end);
 
 #ifndef __GNUC__
 #define __attribute__(X)
@@ -48,10 +49,34 @@ size_t widl_getline(char **linep, size_t *lenp, FILE *fp);
 UUID *parse_uuid(const char *u);
 int is_valid_uuid(const char *s);
 
+/* buffer management */
+
+extern int byte_swapped;
+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_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 );
+
 /* typelibs expect the minor version to be stored in the higher bits and
  * major to be stored in the lower bits */
 #define MAKEVERSION(major, minor) ((((minor) & 0xffff) << 16) | ((major) & 0xffff))
 #define MAJORVERSION(version) ((version) & 0xffff)
 #define MINORVERSION(version) (((version) >> 16) & 0xffff)
 
+#ifndef max
+#define max(a,b)   (((a) > (b)) ? (a) : (b))
+#endif
+#ifndef min
+#define min(a,b)   (((a) < (b)) ? (a) : (b))
+#endif
+
 #endif




More information about the wine-cvs mailing list