From: Not Zed <notzed@gmail.com>
Date: Thu, 11 Jan 2024 06:38:37 +0000 (+1030)
Subject: Add a *_free() function generator.
X-Git-Url: https://code.zedzone.au/cvs?a=commitdiff_plain;h=7062a6c280ccc8a2d92fd9c5a73f16cfba19cbc9;p=libeze

Add a *_free() function generator.
Plus some small fixes.
---

diff --git a/ez-blob-compiler.c b/ez-blob-compiler.c
index 56f023c..d86969b 100644
--- a/ez-blob-compiler.c
+++ b/ez-blob-compiler.c
@@ -171,7 +171,6 @@ static void export_encode(const ez_blob_desc *desc, const char *name) {
 }
 
 static void export_decode(const ez_blob_desc *desc, const char *name, int doos) {
-	fputs("\n", stdout);
 	if (doos) {
 		printf("void *%s_decode_os(const ez_blob * __restrict blob, struct obstack * __restrict os) {\n", name);
 		printf("\tvoid *p = obstack_alloc(os, %u);\n", desc->bd_offset);
@@ -181,8 +180,7 @@ static void export_decode(const ez_blob_desc *desc, const char *name, int doos)
 	printf("\tconst char * __restrict b = blob->eb_data;\n");
 	printf("\tsize_t len;\n");
 	printf("\tchar **sp;\n");
-	if (doos)
-		printf("\tmemset(p, 0, %u);\n", desc->bd_offset);
+	printf("\tmemset(p, 0, %u);\n", desc->bd_offset);
 
 	for (int i=0,dlen=desc->bd_length;i<dlen;i++) {
 		const ez_blob_desc *d = &desc[i+1];
@@ -238,9 +236,9 @@ static void export_decode(const ez_blob_desc *desc, const char *name, int doos)
 	printf("}\n");
 
 	if (!doos) {
-		fputs("\n", stdout);
-		printf("void *%1$s_decode(const ez_blob *blob) {\n"
-			"\tvoid *p = calloc(1, %2$u);\n"
+		printf("struct %1$s;\n"
+			"void *%1$s_decode(const ez_blob *blob) {\n"
+			"\tvoid *p = malloc(%2$u);\n"
 			"\t%1$s_decode_raw(blob, p);\n"
 			"\treturn p;\n"
 			"}\n",
@@ -248,6 +246,36 @@ static void export_decode(const ez_blob_desc *desc, const char *name, int doos)
 	}
 }
 
+static void export_free(const ez_blob_desc *desc, const char *name) {
+	printf("void %1$s_free_raw(void * __restrict p) {\n", name);
+	for (int i=0,dlen=desc->bd_length;i<dlen;i++) {
+		const ez_blob_desc *d = &desc[i+1];
+		switch (d->bd_type) {
+		case EZ_BLOB_INT8:
+		case EZ_BLOB_INT16:
+		case EZ_BLOB_INT32:
+		case EZ_BLOB_FLOAT32:
+		case EZ_BLOB_INT64:
+		case EZ_BLOB_FLOAT64:
+			break;
+		case EZ_BLOB_INT8 | EZ_BLOB_CSTRING:
+		case EZ_BLOB_TRANSIENTP:
+			printf("\tfree(*((char **)(p + %d)));\n", d->bd_offset);
+			break;
+		default:
+			fprintf(stderr, "Unsupported type: %d\n", d->bd_type);
+			abort();
+		}
+	}
+	printf("}\n");
+	printf("void %1$s_free(struct %1$s * __restrict p) {\n"
+		"\tif (p) {\n"
+		"\t\t%1$s_free_raw(p);\n"
+		"\t\tfree(p);\n"
+		"\t}\n"
+		"}\n" , name);
+}
+
 int main(int argc, char **argv) {
 	int gen = 0;
 	int header = 0;
@@ -281,12 +309,17 @@ int main(int argc, char **argv) {
 					dogen |= 4;
 				else if (strcmp(s, "decode_obstack") == 0)
 					dogen |= 8;
+				else if (strcmp(s, "free") == 0)
+					dogen |= 16;
 			}
 			if (dogen)
 				gen = dogen;
 			i += 1;
 		} else if (strcmp(cmd, "--header") == 0 || strcmp(cmd, "-h") == 0) {
 			header = 1;
+		} else if (strcmp(cmd, "-i") == 0) {
+			printf("#include \"%s\"\n", argv[i+1]);
+			i += 1;
 		} else {
 			file = cmd;
 			tables = i + 1;
@@ -373,12 +406,14 @@ int main(int argc, char **argv) {
 			if (gen & 2)
 				printf("void %s_encode_raw(const void *p, ez_blob *blob);\n", xname);
 			if (gen & 4) {
-				printf("void %s_decode_raw(const ez_blob *blob, void *p);\n", xname);
-				if ((gen & 8) == 0)
-					printf("void *%s_decode(const ez_blob *blob);\n", xname);
+				printf("void %1$s_decode_raw(const ez_blob *blob, void *p);\n"
+					"void *%1$s_decode(const ez_blob *blob);\n", xname);
 			}
 			if (gen & 8)
 				printf("void *%s_decode_os(const ez_blob *blob, struct obstack *os);\n", xname);
+			if (gen & 16)
+				printf("struct %1$s;\n"
+					"void %1$s_free(struct %1$s *p);\n", xname);
 		} else {
 			if (gen & 1)
 				export_size(desc, xname);
@@ -388,6 +423,8 @@ int main(int argc, char **argv) {
 				export_decode(desc, xname, 0);
 			if (gen & 8)
 				export_decode(desc, xname, 1);
+			if (gen & 16)
+				export_free(desc, xname);
 		}
 
 	}