diff options
Diffstat (limited to 'docs/examples/getinmemory.c')
-rw-r--r-- | docs/examples/getinmemory.c | 35 |
1 files changed, 14 insertions, 21 deletions
diff --git a/docs/examples/getinmemory.c b/docs/examples/getinmemory.c index 5a66a04ca..2e34f1787 100644 --- a/docs/examples/getinmemory.c +++ b/docs/examples/getinmemory.c @@ -8,8 +8,6 @@ * * Example source code to show how the callback function can be used to * download data into a chunk of memory instead of storing it in a file. - * - * This exact source code has not been verified to work. */ #include <stdio.h> @@ -17,25 +15,12 @@ #include <string.h> #include <curl/curl.h> -#include <curl/types.h> -#include <curl/easy.h> struct MemoryStruct { char *memory; size_t size; }; -static void *myrealloc(void *ptr, size_t size); - -static void *myrealloc(void *ptr, size_t size) -{ - /* There might be a realloc() out there that doesn't like reallocing - NULL pointers, so we take care of it here */ - if(ptr) - return realloc(ptr, size); - else - return malloc(size); -} static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) @@ -43,22 +28,28 @@ WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) size_t realsize = size * nmemb; struct MemoryStruct *mem = (struct MemoryStruct *)data; - mem->memory = myrealloc(mem->memory, mem->size + realsize + 1); - if (mem->memory) { - memcpy(&(mem->memory[mem->size]), ptr, realsize); - mem->size += realsize; - mem->memory[mem->size] = 0; + mem->memory = realloc(mem->memory, mem->size + realsize + 1); + if (mem->memory == NULL) { + /* out of memory! */ + printf("not enough memory (realloc returned NULL)\n"); + exit(EXIT_FAILURE); } + + memcpy(&(mem->memory[mem->size]), ptr, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + return realsize; } + int main(int argc, char **argv) { CURL *curl_handle; struct MemoryStruct chunk; - chunk.memory=NULL; /* we expect realloc(NULL, size) to work */ + chunk.memory = malloc(1); /* will be grown as needed by the realloc above */ chunk.size = 0; /* no data at this point */ curl_global_init(CURL_GLOBAL_ALL); @@ -96,6 +87,8 @@ int main(int argc, char **argv) * you're done with it, you should free() it as a nice application. */ + printf("%lu bytes retrieved\n", chunk.size); + if(chunk.memory) free(chunk.memory); |