Sfoglia il codice sorgente

First working text-compiler implementation

Daniele Bartolini 13 anni fa
parent
commit
bfb5dfac5f
1 ha cambiato i file con 75 aggiunte e 0 eliminazioni
  1. 75 0
      tools/resource-compilers/text-compiler.cpp

+ 75 - 0
tools/resource-compilers/text-compiler.cpp

@@ -0,0 +1,75 @@
+#include <stdio.h>
+#include "Filesystem.h"
+#include "Stream.h"
+#include "Path.h"
+#include "String.h"
+#include "Hash.h"
+#include "Resource.h"
+#include "ResourceArchive.h"
+#include "FileStream.h"
+
+using namespace crown;
+
+/// UTF-8 compiler for "txt" resource types
+int main(int argc, char** argv)
+{
+	if (argc != 4)
+	{
+		printf("Usage: %s /path/to/resources /path/to/compiled resource.txt\n", argv[0]);
+		return -1;
+	}
+
+	Filesystem fs_root(argv[1]);
+	Filesystem fs_dest(argv[2]);
+	
+	const char* resource = argv[3];
+	
+	if (!fs_root.exists(resource))
+	{
+		printf("Fatal: resource %s does not exists. Aborting.\n", resource);
+		return -1;
+	}
+	
+	char resource_basename[256];
+	char resource_extension[256];
+	
+	path::basename(resource, resource_basename, 256);
+	path::extension(resource, resource_extension, 256);
+	
+	printf("Resource basename  : %s\n", resource_basename);
+	printf("Resource extension : %s\n", resource_extension);
+	
+	uint32_t resource_basename_hash = hash::fnv1a_32(resource_basename, string::strlen(resource_basename));
+	uint32_t resource_extension_hash = hash::fnv1a_32(resource_extension, string::strlen(resource_extension));
+	
+	printf("Resource basename  (hash) : %X\n", resource_basename_hash);
+	printf("Resource extension (hash) : %X\n", resource_extension_hash);
+
+	FileStream* src_file = (FileStream*)fs_root.open(resource, SOM_READ);
+	
+	size_t src_file_size = src_file->size();
+	
+	ArchiveEntry archive_entry;
+	archive_entry.name = resource_basename_hash;
+	archive_entry.type = resource_extension_hash;
+	archive_entry.offset = sizeof (ArchiveEntry);
+	archive_entry.size = src_file_size + sizeof(uint32_t);
+	
+	void* buffer = new uint8_t[src_file_size];
+	
+	src_file->read(buffer, src_file_size);
+	
+	fs_root.close(src_file);
+	
+	
+	FileStream* dest_file = (FileStream*)fs_dest.open(resource, SOM_WRITE);
+
+	dest_file->write(&archive_entry, sizeof(ArchiveEntry));
+	dest_file->write(&src_file_size, sizeof(uint32_t));
+	dest_file->write(buffer, src_file_size);
+
+	fs_dest.close(dest_file);
+	
+	return 0;
+}
+