Add `struct string` for strings parsed from FDT

Just a small wrapper around a char array to make things simpler.

Bug: 117551352
Change-Id: I0880ebbb81258830290ce49bf3772280551d3483
diff --git a/src/manifest.c b/src/manifest.c
index 80382ee..6d8b4ba 100644
--- a/src/manifest.c
+++ b/src/manifest.c
@@ -53,29 +53,9 @@
 	return ptr;
 }
 
-static enum manifest_return_code extract_string(const char *data, uint32_t size,
-						char *out, rsize_t out_sz)
-{
-	/*
-	 * Require that the value contains exactly one NULL character and that
-	 * it is the last byte.
-	 */
-	if (memchr(data, '\0', size) != &data[size - 1]) {
-		return MANIFEST_ERROR_MALFORMED_STRING;
-	}
-
-	/* Check that the string fits into the buffer. */
-	if (size > out_sz) {
-		return MANIFEST_ERROR_STRING_TOO_LONG;
-	}
-
-	memcpy_s(out, out_sz, data, size);
-	return MANIFEST_SUCCESS;
-}
-
 static enum manifest_return_code read_string(const struct fdt_node *node,
-					     const char *property, char *out,
-					     rsize_t out_sz)
+					     const char *property,
+					     struct string *out)
 {
 	const char *data;
 	uint32_t size;
@@ -84,26 +64,27 @@
 		return MANIFEST_ERROR_PROPERTY_NOT_FOUND;
 	}
 
-	return extract_string(data, size, out, out_sz);
+	switch (string_init(out, data, size)) {
+	case STRING_SUCCESS:
+		return MANIFEST_SUCCESS;
+	case STRING_ERROR_INVALID_INPUT:
+		return MANIFEST_ERROR_MALFORMED_STRING;
+	case STRING_ERROR_TOO_LONG:
+		return MANIFEST_ERROR_STRING_TOO_LONG;
+	}
 }
 
 static enum manifest_return_code read_optional_string(
-	const struct fdt_node *node, const char *property, char *out,
-	rsize_t out_sz)
+	const struct fdt_node *node, const char *property, struct string *out)
 {
-	const char *data;
-	uint32_t size;
+	enum manifest_return_code ret;
 
-	if (!fdt_read_property(node, property, &data, &size)) {
-		if (out_sz < 1) {
-			return MANIFEST_ERROR_STRING_TOO_LONG;
-		}
-
-		*out = '\0';
-		return MANIFEST_SUCCESS;
+	ret = read_string(node, property, out);
+	if (ret == MANIFEST_ERROR_PROPERTY_NOT_FOUND) {
+		string_init_empty(out);
+		ret = MANIFEST_SUCCESS;
 	}
-
-	return extract_string(data, size, out, out_sz);
+	return ret;
 }
 
 static enum manifest_return_code read_uint64(const struct fdt_node *node,
@@ -225,10 +206,9 @@
 					  struct manifest_vm *vm,
 					  spci_vm_id_t vm_id)
 {
-	TRY(read_string(node, "debug_name", vm->debug_name,
-			sizeof(vm->debug_name)));
-	TRY(read_optional_string(node, "kernel_filename", vm->kernel_filename,
-				 sizeof(vm->kernel_filename)));
+	TRY(read_string(node, "debug_name", &vm->debug_name));
+	TRY(read_optional_string(node, "kernel_filename",
+				 &vm->kernel_filename));
 	if (vm_id != HF_PRIMARY_VM_ID) {
 		TRY(read_uint64(node, "mem_size", &vm->secondary.mem_size));
 		TRY(read_uint16(node, "vcpu_count", &vm->secondary.vcpu_count));