diff options
Diffstat (limited to 'src/strlist.c')
-rw-r--r-- | src/strlist.c | 239 |
1 files changed, 201 insertions, 38 deletions
diff --git a/src/strlist.c b/src/strlist.c index d54ed06..bdacb5a 100644 --- a/src/strlist.c +++ b/src/strlist.c @@ -3,7 +3,6 @@ * @file strlist.c */ #include "strlist.h" -//#include "url.h" #include "utils.h" /** @@ -71,6 +70,7 @@ int strlist_append_file(struct StrList *pStrList, char *_path, ReaderFn *readerF char *path = NULL; char *filename = NULL; char **data = NULL; + int is_url = strstr(_path, "://") != NULL; if (readerFn == NULL) { readerFn = reader_strlist_append_file; @@ -78,17 +78,31 @@ int strlist_append_file(struct StrList *pStrList, char *_path, ReaderFn *readerF path = strdup(_path); if (path == NULL) { - retval = -1; goto fatal; } - filename = expandpath(path); - - if (filename == NULL) { - - retval = -1; - goto fatal; + if (is_url) { + int fd; + char tempfile[PATH_MAX] = {0}; + strcpy(tempfile, "/tmp/.remote_file.XXXXXX"); + if ((fd = mkstemp(tempfile)) < 0) { + retval = -1; + goto fatal; + } + close(fd); + filename = strdup(tempfile); + long http_code = download(path, filename, NULL); + if (HTTP_ERROR(http_code)) { + retval = -1; + goto fatal; + } + } else { + filename = expandpath(path); + if (filename == NULL) { + retval = -1; + goto fatal; + } } data = file_readlines(filename, 0, 0, readerFn); @@ -96,17 +110,18 @@ int strlist_append_file(struct StrList *pStrList, char *_path, ReaderFn *readerF retval = 1; goto fatal; } - for (size_t record = 0; data[record] != NULL; record++) { strlist_append(&pStrList, data[record]); guard_free(data[record]); } + if (is_url) { + // remove temporary data + remove(filename); + } guard_free(data); fatal: - if (filename != NULL) { - guard_free(filename); - } + guard_free(filename); if (path != NULL) { guard_free(path); } @@ -115,7 +130,7 @@ fatal: } /** - * Append the contents of a `StrList` to another `StrList` + * Append the contents of `pStrList2` to `pStrList1` * @param pStrList1 `StrList` * @param pStrList2 `StrList` */ @@ -200,16 +215,14 @@ void strlist_remove(struct StrList *pStrList, size_t index) { if (count == 0) { return; } - - for (size_t i = index; i < count; i++) { - char *next = pStrList->data[i + 1]; - pStrList->data[i] = next; - if (next == NULL) { - break; + if (pStrList->data[index] != NULL) { + for (size_t i = index; i < count; i++) { + pStrList->data[i] = pStrList->data[i + 1]; + } + if (pStrList->num_inuse) { + pStrList->num_inuse--; } } - - pStrList->num_inuse--; } /** @@ -227,13 +240,10 @@ int strlist_cmp(struct StrList *a, struct StrList *b) { return -2; } - if (a->num_alloc != b->num_alloc) { + if (a->num_alloc != b->num_alloc || a->num_inuse != b->num_inuse) { return 1; } - if (a->num_inuse != b->num_inuse) { - return 1; - } for (size_t i = 0; i < strlist_count(a); i++) { if (strcmp(strlist_item(a, i), strlist_item(b, i)) != 0) { @@ -321,6 +331,29 @@ void strlist_set(struct StrList **pStrList, size_t index, char *value) { } } +const char *strlist_error_msgs[] = { + "success", + "index out of range", + "invalid value for type", + "unknown error", +}; +int strlist_errno = 0; + +void strlist_set_error(int flag) { + strlist_errno = flag; +} + +const char *strlist_get_error(int flag) { + if (flag < STRLIST_E_SUCCESS || flag > STRLIST_E_UNKNOWN) { + return strlist_error_msgs[STRLIST_E_UNKNOWN]; + } + return strlist_error_msgs[flag]; +} + +void strlist_clear_error() { + strlist_errno = STRLIST_E_SUCCESS; +} + /** * Retrieve data from a `StrList` * @param pStrList @@ -351,7 +384,17 @@ char *strlist_item_as_str(struct StrList *pStrList, size_t index) { * @return `char` */ char strlist_item_as_char(struct StrList *pStrList, size_t index) { - return (char) strtol(strlist_item(pStrList, index), NULL, 10); + char *error_p; + char result; + + strlist_clear_error(); + result = (char) strtol(strlist_item(pStrList, index), &error_p, 10); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** @@ -361,7 +404,17 @@ char strlist_item_as_char(struct StrList *pStrList, size_t index) { * @return `unsigned char` */ unsigned char strlist_item_as_uchar(struct StrList *pStrList, size_t index) { - return (unsigned char) strtol(strlist_item(pStrList, index), NULL, 10); + char *error_p; + unsigned char result; + + strlist_clear_error(); + result = (unsigned char) strtoul(strlist_item(pStrList, index), &error_p, 10); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** @@ -371,7 +424,17 @@ unsigned char strlist_item_as_uchar(struct StrList *pStrList, size_t index) { * @return `short` */ short strlist_item_as_short(struct StrList *pStrList, size_t index) { - return (short)strtol(strlist_item(pStrList, index), NULL, 10); + char *error_p; + short result; + + strlist_clear_error(); + result = (short) strtol(strlist_item(pStrList, index), &error_p, 10); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** @@ -381,7 +444,17 @@ short strlist_item_as_short(struct StrList *pStrList, size_t index) { * @return `unsigned short` */ unsigned short strlist_item_as_ushort(struct StrList *pStrList, size_t index) { - return (unsigned short)strtoul(strlist_item(pStrList, index), NULL, 10); + char *error_p; + unsigned short result; + + strlist_clear_error(); + result = (unsigned short) strtoul(strlist_item(pStrList, index), &error_p, 10); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** @@ -391,7 +464,17 @@ unsigned short strlist_item_as_ushort(struct StrList *pStrList, size_t index) { * @return `int` */ int strlist_item_as_int(struct StrList *pStrList, size_t index) { - return (int)strtol(strlist_item(pStrList, index), NULL, 10); + char *error_p; + int result; + + strlist_clear_error(); + result = (int) strtol(strlist_item(pStrList, index), &error_p, 10); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** @@ -401,7 +484,17 @@ int strlist_item_as_int(struct StrList *pStrList, size_t index) { * @return `unsigned int` */ unsigned int strlist_item_as_uint(struct StrList *pStrList, size_t index) { - return (unsigned int)strtoul(strlist_item(pStrList, index), NULL, 10); + char *error_p; + unsigned int result; + + strlist_clear_error(); + result = (unsigned int) strtoul(strlist_item(pStrList, index), &error_p, 10); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** @@ -411,7 +504,17 @@ unsigned int strlist_item_as_uint(struct StrList *pStrList, size_t index) { * @return `long` */ long strlist_item_as_long(struct StrList *pStrList, size_t index) { - return strtol(strlist_item(pStrList, index), NULL, 10); + char *error_p; + long result; + + strlist_clear_error(); + result = (long) strtol(strlist_item(pStrList, index), &error_p, 10); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** @@ -421,7 +524,17 @@ long strlist_item_as_long(struct StrList *pStrList, size_t index) { * @return `unsigned long` */ unsigned long strlist_item_as_ulong(struct StrList *pStrList, size_t index) { - return strtoul(strlist_item(pStrList, index), NULL, 10); + char *error_p; + unsigned long result; + + strlist_clear_error(); + result = (unsigned long) strtoul(strlist_item(pStrList, index), &error_p, 10); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** @@ -431,7 +544,17 @@ unsigned long strlist_item_as_ulong(struct StrList *pStrList, size_t index) { * @return `long long` */ long long strlist_item_as_long_long(struct StrList *pStrList, size_t index) { - return strtoll(strlist_item(pStrList, index), NULL, 10); + char *error_p; + long long result; + + strlist_clear_error(); + result = (long long) strtoll(strlist_item(pStrList, index), &error_p, 10); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** @@ -441,7 +564,17 @@ long long strlist_item_as_long_long(struct StrList *pStrList, size_t index) { * @return `unsigned long long` */ unsigned long long strlist_item_as_ulong_long(struct StrList *pStrList, size_t index) { - return strtoull(strlist_item(pStrList, index), NULL, 10); + char *error_p; + unsigned long long result; + + strlist_clear_error(); + result = (unsigned long long) strtol(strlist_item(pStrList, index), &error_p, 10); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** @@ -451,7 +584,17 @@ unsigned long long strlist_item_as_ulong_long(struct StrList *pStrList, size_t i * @return `float` */ float strlist_item_as_float(struct StrList *pStrList, size_t index) { - return (float)atof(strlist_item(pStrList, index)); + char *error_p; + float result; + + strlist_clear_error(); + result = (float) strtof(strlist_item(pStrList, index), &error_p); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** @@ -461,7 +604,17 @@ float strlist_item_as_float(struct StrList *pStrList, size_t index) { * @return `double` */ double strlist_item_as_double(struct StrList *pStrList, size_t index) { - return atof(strlist_item(pStrList, index)); + char *error_p; + double result; + + strlist_clear_error(); + result = (double) strtod(strlist_item(pStrList, index), &error_p); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** @@ -471,7 +624,17 @@ double strlist_item_as_double(struct StrList *pStrList, size_t index) { * @return `long double` */ long double strlist_item_as_long_double(struct StrList *pStrList, size_t index) { - return (long double)atof(strlist_item(pStrList, index)); + char *error_p; + long double result; + + strlist_clear_error(); + result = (long double) strtold(strlist_item(pStrList, index), &error_p); + if (!result && error_p && *error_p != 0) { + strlist_set_error(STRLIST_E_INVALID_VALUE); + return 0; + } + error_p = NULL; + return result; } /** |