aboutsummaryrefslogtreecommitdiff
path: root/docs/examples/getinmemory.c
diff options
context:
space:
mode:
authorJames Bursa <james@zamez.org>2010-09-14 22:52:04 +0200
committerDaniel Stenberg <daniel@haxx.se>2010-09-14 22:52:04 +0200
commitfbefd816e493a2c690e342bd3e91ce6e5300f31e (patch)
treea6a42eb08b701689c5e2b5d4a9a6724605c48bef /docs/examples/getinmemory.c
parent296b246b9cd1da5d13c56254e1c68914f8756a2e (diff)
getinmemory: make the example easier to follow
1. Remove the comment warning that it's "not been verified to work". It works with no problems in my testing. 2. Remove 2 unnecessary includes. 3. Remove the myrealloc(). Initialize chunk.memory with malloc() instead of NULL. The comments for these two parts contradicted each other. 4. Handle out of memory from realloc() instead of continuing. 5. Print a brief status message at the end.
Diffstat (limited to 'docs/examples/getinmemory.c')
-rw-r--r--docs/examples/getinmemory.c35
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);