working version
This commit is contained in:
parent
71339f13b8
commit
6cbb7af9af
6
data.h
6
data.h
|
@ -10,9 +10,11 @@
|
||||||
/** \brief use this data type for buffer */
|
/** \brief use this data type for buffer */
|
||||||
typedef struct BufferStruct BufferStruct;
|
typedef struct BufferStruct BufferStruct;
|
||||||
|
|
||||||
struct BufferStruct {
|
struct MemoryStruct {
|
||||||
|
char *memory;
|
||||||
size_t size;
|
size_t size;
|
||||||
char *data;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct MemoryStruct MemoryStruct;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
54
network.c
54
network.c
|
@ -98,7 +98,7 @@ static char *url_append(const char *url, const char *sublink)
|
||||||
char *str;
|
char *str;
|
||||||
size_t ul = strlen(url);
|
size_t ul = strlen(url);
|
||||||
size_t sl = strlen(sublink);
|
size_t sl = strlen(sublink);
|
||||||
str = calloc(ul + sl + needs_separator, sizeof(char));
|
str = calloc(ul + sl + needs_separator + 1, sizeof(char));
|
||||||
strncpy(str, url, ul);
|
strncpy(str, url, ul);
|
||||||
if (needs_separator) {
|
if (needs_separator) {
|
||||||
str[ul] = '/';
|
str[ul] = '/';
|
||||||
|
@ -200,29 +200,22 @@ static void do_transfer_(CURL *curl)
|
||||||
static size_t
|
static size_t
|
||||||
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
||||||
{
|
{
|
||||||
BufferStruct *buf = (BufferStruct *)userp;
|
size_t realsize = size * nmemb;
|
||||||
size_t recv_size = size * nmemb;
|
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
|
||||||
|
|
||||||
if ( !(buf->size) ) {
|
mem->memory = realloc(mem->memory, mem->size + realsize + 1);
|
||||||
buf->data = malloc(recv_size + 1);
|
if(mem->memory == NULL) {
|
||||||
buf->data[recv_size] = '\0';
|
/* out of memory! */
|
||||||
if(!buf->data) {
|
fprintf(stderr, "WriteMemoryCallback(): cannot realloc!\n");
|
||||||
fprintf(stderr,
|
fflush(stderr);
|
||||||
"WriteMemoryCallback(): cannot malloc.\n");
|
return 0;
|
||||||
fflush(stderr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
memmove(buf->data, contents, recv_size);
|
|
||||||
return recv_size;
|
|
||||||
} else {
|
|
||||||
if(recv_size < buf->size) {
|
|
||||||
memmove(buf->data, contents, recv_size);
|
|
||||||
return recv_size;
|
|
||||||
} else {
|
|
||||||
memmove(buf->data, contents, buf->size);
|
|
||||||
return buf->size;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memmove(&(mem->memory[mem->size]), contents, realsize);
|
||||||
|
mem->size += realsize;
|
||||||
|
mem->memory[mem->size] = 0;
|
||||||
|
|
||||||
|
return realsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Link *Link_new(const char *p_url)
|
static Link *Link_new(const char *p_url)
|
||||||
|
@ -263,13 +256,12 @@ long Link_download(const char *path, char *output_buf, size_t size,
|
||||||
char range_str[64];
|
char range_str[64];
|
||||||
snprintf(range_str, sizeof(range_str), "%lu-%lu", start, end);
|
snprintf(range_str, sizeof(range_str), "%lu-%lu", start, end);
|
||||||
|
|
||||||
BufferStruct buf;
|
MemoryStruct buf;
|
||||||
buf.size = size;
|
buf.size = 0;
|
||||||
buf.data = output_buf;
|
buf.memory = NULL;
|
||||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&buf);
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&buf);
|
||||||
curl_easy_setopt(curl, CURLOPT_RANGE, range_str);
|
curl_easy_setopt(curl, CURLOPT_RANGE, range_str);
|
||||||
|
|
||||||
|
|
||||||
do_transfer(curl);
|
do_transfer(curl);
|
||||||
|
|
||||||
long http_resp;
|
long http_resp;
|
||||||
|
@ -289,6 +281,8 @@ long Link_download(const char *path, char *output_buf, size_t size,
|
||||||
recv = size;
|
recv = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memmove(output_buf, buf.memory, recv);
|
||||||
|
|
||||||
curl_easy_cleanup(curl);
|
curl_easy_cleanup(curl);
|
||||||
return recv;
|
return recv;
|
||||||
}
|
}
|
||||||
|
@ -305,9 +299,9 @@ LinkTable *LinkTable_new(const char *url)
|
||||||
|
|
||||||
/* start downloading the base URL */
|
/* start downloading the base URL */
|
||||||
CURL *curl = Link_to_curl(head_link);
|
CURL *curl = Link_to_curl(head_link);
|
||||||
BufferStruct buf;
|
MemoryStruct buf;
|
||||||
buf.size = 0;
|
buf.size = 0;
|
||||||
buf.data = NULL;
|
buf.memory = NULL;
|
||||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&buf);
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&buf);
|
||||||
|
|
||||||
do_transfer(curl);
|
do_transfer(curl);
|
||||||
|
@ -325,8 +319,8 @@ URL: %s, HTTP %ld\n", url, http_resp);
|
||||||
curl_easy_cleanup(curl);
|
curl_easy_cleanup(curl);
|
||||||
|
|
||||||
/* Otherwise parsed the received data */
|
/* Otherwise parsed the received data */
|
||||||
GumboOutput* output = gumbo_parse(buf.data);
|
GumboOutput* output = gumbo_parse(buf.memory);
|
||||||
free(buf.data);
|
free(buf.memory);
|
||||||
HTML_to_LinkTable(output->root, linktbl);
|
HTML_to_LinkTable(output->root, linktbl);
|
||||||
gumbo_destroy_output(&kGumboDefaultOptions, output);
|
gumbo_destroy_output(&kGumboDefaultOptions, output);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue