[PATCH 3/5] d3dcompiler: Generalize message reporting function.

Matteo Bruni mbruni at codeweavers.com
Tue May 8 09:17:31 CDT 2012


---
 dlls/d3dcompiler_43/asmshader.y           |   65 ++++++++--------------------
 dlls/d3dcompiler_43/d3dcompiler_private.h |   15 +++++--
 dlls/d3dcompiler_43/utils.c               |   43 +++++++++++++++++++
 3 files changed, 73 insertions(+), 50 deletions(-)

diff --git a/dlls/d3dcompiler_43/asmshader.y b/dlls/d3dcompiler_43/asmshader.y
index cf50bc9..5294fa9 100644
--- a/dlls/d3dcompiler_43/asmshader.y
+++ b/dlls/d3dcompiler_43/asmshader.y
@@ -26,49 +26,17 @@
 
 #include "d3dcompiler_private.h"
 
-#include <stdio.h>
-
 WINE_DEFAULT_DEBUG_CHANNEL(asmshader);
 
 struct asm_parser asm_ctx;
 
-/* Error reporting function */
-void asmparser_message(struct asm_parser *ctx, const char *fmt, ...) {
+void asmparser_message(struct asm_parser *ctx, const char *fmt, ...)
+{
     va_list args;
-    char* newbuffer;
-    int rc, newsize;
-
-    if(ctx->messagecapacity == 0) {
-        ctx->messages = asm_alloc(MESSAGEBUFFER_INITIAL_SIZE);
-        if(ctx->messages == NULL) {
-            ERR("Error allocating memory for parser messages\n");
-            return;
-        }
-        ctx->messagecapacity = MESSAGEBUFFER_INITIAL_SIZE;
-    }
-
-    while(1) {
-        va_start(args, fmt);
-        rc = vsnprintf(ctx->messages + ctx->messagesize,
-                       ctx->messagecapacity - ctx->messagesize, fmt, args);
-        va_end(args);
 
-        if (rc < 0 ||                                           /* C89 */
-            rc >= ctx->messagecapacity - ctx->messagesize) {    /* C99 */
-            /* Resize the buffer */
-            newsize = ctx->messagecapacity * 2;
-            newbuffer = asm_realloc(ctx->messages, newsize);
-            if(newbuffer == NULL){
-                ERR("Error reallocating memory for parser messages\n");
-                return;
-            }
-            ctx->messages = newbuffer;
-            ctx->messagecapacity = newsize;
-        } else {
-            ctx->messagesize += rc;
-            return;
-        }
-    }
+    va_start(args, fmt);
+    compilation_message(&ctx->messages, fmt, args);
+    va_end(args);
 }
 
 static void asmshader_error(char const *s) {
@@ -1704,32 +1672,37 @@ predicate:            '(' REG_PREDICATE swizzle ')'
 
 %%
 
-struct bwriter_shader *parse_asm_shader(char **messages) {
+struct bwriter_shader *parse_asm_shader(char **messages)
+{
     struct bwriter_shader *ret = NULL;
 
     asm_ctx.shader = NULL;
     asm_ctx.status = PARSE_SUCCESS;
-    asm_ctx.messagesize = asm_ctx.messagecapacity = 0;
+    asm_ctx.messages.size = asm_ctx.messages.capacity = 0;
     asm_ctx.line_no = 1;
 
     asmshader_parse();
 
-    if(asm_ctx.status != PARSE_ERR) ret = asm_ctx.shader;
-    else if(asm_ctx.shader) SlDeleteShader(asm_ctx.shader);
+    if (asm_ctx.status != PARSE_ERR)
+        ret = asm_ctx.shader;
+    else if (asm_ctx.shader)
+        SlDeleteShader(asm_ctx.shader);
 
-    if(messages) {
-        if(asm_ctx.messagesize) {
+    if (messages)
+    {
+        if (asm_ctx.messages.size)
+        {
             /* Shrink the buffer to the used size */
-            *messages = asm_realloc(asm_ctx.messages, asm_ctx.messagesize + 1);
+            *messages = asm_realloc(asm_ctx.messages.string, asm_ctx.messages.size + 1);
             if(!*messages) {
                 ERR("Out of memory, no messages reported\n");
-                asm_free(asm_ctx.messages);
+                asm_free(asm_ctx.messages.string);
             }
         } else {
             *messages = NULL;
         }
     } else {
-        if(asm_ctx.messagecapacity) asm_free(asm_ctx.messages);
+        if(asm_ctx.messages.capacity) asm_free(asm_ctx.messages.string);
     }
 
     return ret;
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index 74ed379..c953e7f 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -216,7 +216,15 @@ enum parse_status
     PARSE_ERR = 2
 };
 
-struct asm_parser {
+struct compilation_messages
+{
+    char *string;
+    unsigned int size;
+    unsigned int capacity;
+};
+
+struct asm_parser
+{
     /* The function table of the parser implementation */
     const struct asmparser_backend *funcs;
 
@@ -225,9 +233,7 @@ struct asm_parser {
     unsigned int m3x3pad_count;
 
     enum parse_status status;
-    char *messages;
-    unsigned int messagesize;
-    unsigned int messagecapacity;
+    struct compilation_messages messages;
     unsigned int line_no;
 };
 
@@ -255,6 +261,7 @@ struct bwriter_shader *parse_asm_shader(char **messages) DECLSPEC_HIDDEN;
 #define PRINTF_ATTR(fmt,args)
 #endif
 
+void compilation_message(struct compilation_messages *msg, const char *fmt, va_list args) DECLSPEC_HIDDEN;
 void asmparser_message(struct asm_parser *ctx, const char *fmt, ...) PRINTF_ATTR(2,3) DECLSPEC_HIDDEN;
 static inline void set_parse_status(enum parse_status *current, enum parse_status update)
 {
diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c
index 94264e4..bc4f6fc 100644
--- a/dlls/d3dcompiler_43/utils.c
+++ b/dlls/d3dcompiler_43/utils.c
@@ -23,6 +23,8 @@
 #include "config.h"
 #include "wine/port.h"
 
+#include <stdio.h>
+
 #include "d3dcompiler_private.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3dcompiler);
@@ -715,3 +717,44 @@ HRESULT dxbc_write_blob(struct dxbc *dxbc, ID3DBlob **blob)
 
     return S_OK;
 }
+
+void compilation_message(struct compilation_messages *msg, const char *fmt, va_list args)
+{
+    char* buffer;
+    int rc, size;
+
+    if (msg->capacity == 0)
+    {
+        msg->string = asm_alloc(MESSAGEBUFFER_INITIAL_SIZE);
+        if (msg->string == NULL)
+        {
+            ERR("Error allocating memory for parser messages\n");
+            return;
+        }
+        msg->capacity = MESSAGEBUFFER_INITIAL_SIZE;
+    }
+
+    while (1)
+    {
+        rc = vsnprintf(msg->string + msg->size,
+                msg->capacity - msg->size, fmt, args);
+
+        if (rc < 0 || rc >= msg->capacity - msg->size)
+        {
+            size = msg->capacity * 2;
+            buffer = asm_realloc(msg->string, size);
+            if (buffer == NULL)
+            {
+                ERR("Error reallocating memory for parser messages\n");
+                return;
+            }
+            msg->string = buffer;
+            msg->capacity = size;
+        }
+        else
+        {
+            msg->size += rc;
+            return;
+        }
+    }
+}
-- 
1.7.3.4




More information about the wine-patches mailing list