From 48c4248d3aefa413e818821e7211227ed3b58a43 Mon Sep 17 00:00:00 2001 From: Christian Costa Date: Sun, 9 Nov 2008 11:11:40 +0100 Subject: [PATCH] d3dxof: Finish strings support. --- dlls/d3dxof/d3dxof.c | 37 ++++++++++++++++++++++++++---------- dlls/d3dxof/d3dxof_private.h | 4 ++++ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c index d55d2be1008..20993f56280 100644 --- a/dlls/d3dxof/d3dxof.c +++ b/dlls/d3dxof/d3dxof.c @@ -668,22 +668,21 @@ static BOOL is_integer(parse_buffer* buf) static BOOL is_string(parse_buffer* buf) { char tmp[32]; - DWORD pos = 1; + DWORD pos = 0; char c; BOOL ok = 0; if (*buf->buffer != '"') return FALSE; - tmp[0] = '"'; - while (!is_separator(c = *(buf->buffer+pos)) && (pos < 32)) + while (!is_separator(c = *(buf->buffer+pos+1)) && (pos < 31)) { - tmp[pos++] = c; if (c == '"') { ok = 1; break; } + tmp[pos++] = c; } tmp[pos] = 0; @@ -693,8 +692,8 @@ static BOOL is_string(parse_buffer* buf) return FALSE; } - buf->buffer += pos; - buf->rem_bytes -= pos; + buf->buffer += pos + 2; + buf->rem_bytes -= pos + 2; TRACE("Found string %s\n", tmp); strcpy((char*)buf->value, tmp); @@ -1884,7 +1883,6 @@ static BOOL parse_object_members_list(parse_buffer * buf) } else if (token == TOKEN_LPSTR) { - static char fake_string[] = "Fake string"; get_TOKEN(buf); TRACE("%s = %s\n", pt->members[i].name, (char*)buf->value); /* Assume larger size */ @@ -1895,8 +1893,15 @@ static BOOL parse_object_members_list(parse_buffer * buf) } if (pt->members[i].type == TOKEN_LPSTR) { - /* Use a fake string for now */ - *(((LPCSTR*)(buf->cur_pdata))) = fake_string; + int len = strlen((char*)buf->value) + 1; + if ((buf->cur_pstrings - buf->pstrings + len) > MAX_STRINGS_BUFFER) + { + WARN("Buffer too small %p %p %d\n", buf->cur_pstrings, buf->pstrings, len); + return FALSE; + } + strcpy((char*)buf->cur_pstrings, (char*)buf->value); + *(((LPCSTR*)(buf->cur_pdata))) = (char*)buf->cur_pstrings; + buf->cur_pstrings += len; buf->cur_pdata += 4; } else @@ -2067,6 +2072,7 @@ static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileE IDirectXFileDataImpl* object; HRESULT hr; LPBYTE pdata; + LPBYTE pstrings; TRACE("(%p/%p)->(%p)\n", This, iface, ppDataObj); @@ -2082,6 +2088,7 @@ static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileE This->buf.pxo_tab = &This->xobjects[This->nb_xobjects][0]; This->buf.cur_subobject = 0; This->buf.pxo = &This->buf.pxo_tab[This->buf.cur_subobject++]; + This->buf.level = 0; pdata = HeapAlloc(GetProcessHeap(), 0, MAX_DATA_SIZE); if (!pdata) @@ -2090,12 +2097,21 @@ static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileE return DXFILEERR_BADALLOC; } This->buf.cur_pdata = pdata; - This->buf.level = 0; + + pstrings = HeapAlloc(GetProcessHeap(), 0, MAX_STRINGS_BUFFER); + if (!pstrings) + { + WARN("Out of memory\n"); + HeapFree(GetProcessHeap(), 0, This->buf.pxo->pdata); + return DXFILEERR_BADALLOC; + } + This->buf.cur_pstrings = This->buf.pstrings = pstrings; if (!parse_object(&This->buf)) { TRACE("Object is not correct\n"); HeapFree(GetProcessHeap(), 0, This->buf.pxo->pdata); + HeapFree(GetProcessHeap(), 0, This->buf.pstrings); return DXFILEERR_PARSEERROR; } @@ -2106,6 +2122,7 @@ static HRESULT WINAPI IDirectXFileEnumObjectImpl_GetNextDataObject(IDirectXFileE return DXFILEERR_BADALLOC; } + object->pstrings = pstrings; object->pobj = This->buf.pxo; object->cur_enum_object = 0; object->level = 0; diff --git a/dlls/d3dxof/d3dxof_private.h b/dlls/d3dxof/d3dxof_private.h index 4d8716c5ba6..f70eb67d317 100644 --- a/dlls/d3dxof/d3dxof_private.h +++ b/dlls/d3dxof/d3dxof_private.h @@ -40,6 +40,7 @@ #define MAX_TEMPLATES 200 #define MAX_OBJECTS 200 #define MAX_SUBOBJECTS 120 +#define MAX_STRINGS_BUFFER 200 typedef struct { DWORD type; @@ -101,6 +102,7 @@ typedef struct { int cur_enum_object; BOOL from_ref; ULONG level; + LPBYTE pstrings; } IDirectXFileDataImpl; typedef struct { @@ -124,6 +126,7 @@ typedef struct { BOOL txt; ULONG cur_subobject; LPBYTE cur_pdata; + LPBYTE cur_pstrings; BYTE value[100]; xobject* pxo_globals; ULONG nb_pxo_globals; @@ -132,6 +135,7 @@ typedef struct { xobject* pxo; xtemplate* pxt[MAX_SUBOBJECTS]; ULONG level; + LPBYTE pstrings; } parse_buffer; typedef struct {