d3dcompiler: Generalize message reporting function.

This commit is contained in:
Matteo Bruni 2012-05-08 16:17:31 +02:00 committed by Alexandre Julliard
parent 555f634912
commit e2866d6fa1
3 changed files with 73 additions and 50 deletions

View file

@ -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;

View file

@ -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)
{

View file

@ -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;
}
}
}