diff options
author | Ali Fardan <raiz@stellarbound.space> | 2020-10-23 08:04:20 +0300 |
---|---|---|
committer | Ali Fardan <raiz@stellarbound.space> | 2020-10-23 08:04:20 +0300 |
commit | 3f2b7b2eb305f9ed9840b2daf5476c693b434628 (patch) | |
tree | f9a6be2e628c392fc560229f82710888a2b76a2a /decode.c | |
parent | 2024b2562ad83a04fbfb6699ca8dc4b877a676e4 (diff) | |
download | libgemtext-3f2b7b2eb305f9ed9840b2daf5476c693b434628.tar.gz |
- rename previous gemtext_decode() family of functions to gemtext_list_decode()
- change behavior of gemtext_decode family of functions to handle struct gemtext* only - introduce new gemtext_list_decode() family of functions to handle lists of struct gemtext* - rename previous gemtext_encode() family of functions to gemtext_list_encode() - change behavior of gemtext_encode family of functions to handle struct gemtext* only - introduce new gemtext_list_encode() family of functions to handle lists of struct gemtext* - reexport gemtext_free() - update manpages
Diffstat (limited to 'decode.c')
-rw-r--r-- | decode.c | 188 |
1 files changed, 96 insertions, 92 deletions
diff --git a/decode.c b/decode.c index 7aa0d57..f26f3f6 100644 --- a/decode.c +++ b/decode.c @@ -29,7 +29,7 @@ _case_default(char **text) ret->text = strndup(cpy, ptr-cpy); if (ret->text == NULL) { - _gemtext_free((struct gemtext *)ret); + gemtext_free((struct gemtext *)ret); return NULL; } @@ -120,7 +120,7 @@ _case_h1(char **text) ret->text = strndup(cpy, ptr-cpy); if (ret->text == NULL) { - _gemtext_free((struct gemtext *)ret); + gemtext_free((struct gemtext *)ret); return NULL; } @@ -163,7 +163,7 @@ _case_h2(char **text) ret->text = strndup(cpy, ptr-cpy); if (ret->text == NULL) { - _gemtext_free((struct gemtext *)ret); + gemtext_free((struct gemtext *)ret); return NULL; } @@ -206,7 +206,7 @@ _case_h3(char **text) ret->text = strndup(cpy, ptr-cpy); if (ret->text == NULL) { - _gemtext_free((struct gemtext *)ret); + gemtext_free((struct gemtext *)ret); return NULL; } @@ -278,7 +278,7 @@ _case_pre(char **text) ptr++; ret->text = strndup(cpy, ptr-cpy); if (ret->text == NULL) { - _gemtext_free((struct gemtext *)ret); + gemtext_free((struct gemtext *)ret); return NULL; } break; @@ -292,7 +292,7 @@ _case_pre(char **text) if (*ptr == '\0') { ret->text = strndup(cpy, ptr-cpy); if (ret->text == NULL) { - _gemtext_free((struct gemtext *)ret); + gemtext_free((struct gemtext *)ret); return NULL; } } @@ -342,7 +342,7 @@ _case_ul(char **text) ret->text = strndup(cpy, ptr-cpy); if (ret->text == NULL) { - _gemtext_free((struct gemtext *)ret); + gemtext_free((struct gemtext *)ret); return NULL; } @@ -385,7 +385,7 @@ _case_qt(char **text) ret->text = strndup(cpy, ptr-cpy); if (ret->text == NULL) { - _gemtext_free((struct gemtext *)ret); + gemtext_free((struct gemtext *)ret); return NULL; } @@ -424,9 +424,82 @@ _gemtext_append(struct gemtext **list, struct gemtext *item) return ret; } -struct gemtext ** +static struct gemtext * +_gemtext_decode(char **text) +{ + switch (**text) { + case '=': + return _case_link(text); + case '#': + return _case_h(text); + case '`': + return _case_pre(text); + case '*': + return _case_ul(text); + case '>': + return _case_qt(text); + default: + return _case_default(text); + } + + /* NOT REACHED */ + return NULL; +} + +struct gemtext * gemtext_decode(char *text) { + return _gemtext_decode(&text); +} + +struct gemtext * +gemtext_decode_fd(int fd) +{ + struct gemtext *ret; + struct stat fst; + char *tbuf; + + if (fstat(fd, &fst) == -1) + return NULL; + tbuf = malloc(fst.st_size+1); + if (tbuf == NULL) + return NULL; + + if (read(fd, tbuf, fst.st_size) == -1) { + free(tbuf); + return NULL; + } + tbuf[fst.st_size-1] = '\0'; + + ret = gemtext_decode(tbuf); + free(tbuf); + if (ret == NULL) + return NULL; + + return ret; +} + +struct gemtext * +gemtext_decode_file(const char *path) +{ + struct gemtext *ret; + int fd; + + fd = open(path, O_RDONLY); + if (fd == -1) + return NULL; + + ret = gemtext_decode_fd(fd); + close(fd); + if (ret == NULL) + return NULL; + + return ret; +} + +struct gemtext ** +gemtext_list_decode(char *text) +{ struct gemtext **ret; struct gemtext **append; struct gemtext *item; @@ -435,93 +508,24 @@ gemtext_decode(char *text) ret = NULL; ptr = text; while (*ptr) { - switch (*ptr) { - case '=': - item = _case_link(&ptr); - if (item == NULL) { - gemtext_list_free(ret); - return NULL; - } - append = _gemtext_append(ret, item); - if (append == NULL) { - gemtext_list_free(ret); - return NULL; - } - ret = append; - break; - case '#': - item = _case_h(&ptr); - if (item == NULL) { - gemtext_list_free(ret); - return NULL; - } - append = _gemtext_append(ret, item); - if (append == NULL) { - gemtext_list_free(ret); - return NULL; - } - ret = append; - break; - case '`': - item = _case_pre(&ptr); - if (item == NULL) { - gemtext_list_free(ret); - return NULL; - } - append = _gemtext_append(ret, item); - if (append == NULL) { - gemtext_list_free(ret); - return NULL; - } - ret = append; - break; - case '*': - item = _case_ul(&ptr); - if (item == NULL) { - gemtext_list_free(ret); - return NULL; - } - append = _gemtext_append(ret, item); - if (append == NULL) { - gemtext_list_free(ret); - return NULL; - } - ret = append; - break; - case '>': - item = _case_qt(&ptr); - if (item == NULL) { - gemtext_list_free(ret); - return NULL; - } - append = _gemtext_append(ret, item); - if (append == NULL) { - gemtext_list_free(ret); - return NULL; - } - ret = append; - break; - default: - item = _case_default(&ptr); - if (item == NULL) { - gemtext_list_free(ret); - return NULL; - } - append = _gemtext_append(ret, item); - if (append == NULL) { - gemtext_list_free(ret); - return NULL; - } - ret = append; - break; + item = _gemtext_decode(&ptr); + if (item == NULL) { + gemtext_list_free(ret); + return NULL; + } + append = _gemtext_append(ret, item); + if (append == NULL) { + gemtext_list_free(ret); + return NULL; } + ret = append; } return ret; } struct gemtext ** -gemtext_decode_fd(int fd) +gemtext_list_decode_fd(int fd) { struct gemtext **ret; struct stat fst; @@ -539,7 +543,7 @@ gemtext_decode_fd(int fd) } tbuf[fst.st_size-1] = '\0'; - ret = gemtext_decode(tbuf); + ret = gemtext_list_decode(tbuf); free(tbuf); if (ret == NULL) return NULL; @@ -548,7 +552,7 @@ gemtext_decode_fd(int fd) } struct gemtext ** -gemtext_decode_file(const char *path) +gemtext_list_decode_file(const char *path) { struct gemtext **ret; int fd; @@ -557,7 +561,7 @@ gemtext_decode_file(const char *path) if (fd == -1) return NULL; - ret = gemtext_decode_fd(fd); + ret = gemtext_list_decode_fd(fd); close(fd); if (ret == NULL) return NULL; |