--- Urlader/urlib.c 2012/01/02 09:23:04 1.2 +++ Urlader/urlib.c 2012/01/06 07:56:36 1.3 @@ -112,15 +112,18 @@ { void *addr; -#ifdef _WIN32 - HANDLE handle = CreateFileMapping (0, 0, PAGE_READWRITE, 0, size, NULL); - - if (!handle) + if (!size) return 0; - addr = MapViewOfFile (handle, FILE_MAP_WRITE, 0, 0, size); +#ifdef _WIN32 + HANDLE handle = CreateFileMapping (0, 0, PAGE_READWRITE, 0, size, NULL); - CloseHandle (handle); + addr = 0; + if (handle) + { + addr = MapViewOfFile (handle, FILE_MAP_WRITE, 0, 0, size); + CloseHandle (handle); + } #elif defined (MAP_ANONYMOUS) addr = mmap (0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); @@ -130,12 +133,18 @@ addr = malloc (size); #endif + if (!addr) + u_fatal ("memory allocation failure, aborting."); + return addr; } static void u_free (void *addr, unsigned int size) { + if (!addr) + return; + #ifdef _WIN32 UnmapViewOfFile (addr); #elif defined (MAP_ANONYMOUS) @@ -146,6 +155,16 @@ } static void * +u_realloc (void *addr, unsigned int old_size, unsigned int new_size) +{ + void *addr2 = u_malloc (new_size); + memcpy (addr2, addr, (new_size < old_size ? new_size : old_size)); + u_free (addr, old_size); + + return addr2; +} + +static void * u_mmap (u_handle h, unsigned int size) { void *addr; @@ -180,6 +199,35 @@ } ///////////////////////////////////////////////////////////////////////////// + +typedef struct +{ + char *addr; + unsigned int used; + unsigned int size; +} u_dynbuf; + +static void * +u_dynbuf_append (u_dynbuf *dynbuf, void *data, unsigned int len) +{ + char *dest; + + if ((dynbuf->used += len) > dynbuf->size) + { + unsigned int new_size = dynbuf->size ? dynbuf->size * 2 : 4096; + dynbuf->addr = u_realloc (dynbuf->addr, dynbuf->size, new_size); + dynbuf->size = new_size; + } + + dest = dynbuf->addr + dynbuf->used - len; + + if (data) + memcpy (dest, data, len); + + return dest; +} + +///////////////////////////////////////////////////////////////////////////// static void u_set_datadir (void)