about summary refs log tree commit diff stats
path: root/decode.c
diff options
context:
space:
mode:
authorAli Fardan <raiz@stellarbound.space>2020-10-23 08:04:20 +0300
committerAli Fardan <raiz@stellarbound.space>2020-10-23 08:04:20 +0300
commit3f2b7b2eb305f9ed9840b2daf5476c693b434628 (patch)
treef9a6be2e628c392fc560229f82710888a2b76a2a /decode.c
parent2024b2562ad83a04fbfb6699ca8dc4b877a676e4 (diff)
downloadlibgemtext-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.c188
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;