added JS and MoonScript project text format #374
This commit is contained in:
		@@ -511,9 +511,19 @@ static void onCartLoaded(Console* console, const char* name)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#if defined(TIC80_PRO)
 | 
					#if defined(TIC80_PRO)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const char* getProjectName(const char* name)
 | 
					static bool hasExt(const char* name, const char* ext)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return getName(name, PROJECT_EXT);
 | 
						return strcmp(name + strlen(name) - strlen(ext), ext) == 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool hasProjectExt(const char* name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return hasExt(name, PROJECT_LUA_EXT) || hasExt(name, PROJECT_MOON_EXT) || hasExt(name, PROJECT_JS_EXT);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* projectComment(const char* name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return hasExt(name, PROJECT_JS_EXT) ? "//" : "--";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void buf2str(const void* data, s32 size, char* ptr, bool flip)
 | 
					static void buf2str(const void* data, s32 size, char* ptr, bool flip)
 | 
				
			||||||
@@ -553,12 +563,12 @@ static char* saveTextSection(char* ptr, const char* data)
 | 
				
			|||||||
	return ptr;
 | 
						return ptr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char* saveBinaryBuffer(char* ptr, const void* data, s32 size, s32 row, bool flip)
 | 
					static char* saveBinaryBuffer(char* ptr, const char* comment, const void* data, s32 size, s32 row, bool flip)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if(bufferEmpty(data, size)) 
 | 
						if(bufferEmpty(data, size)) 
 | 
				
			||||||
		return ptr;
 | 
							return ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(ptr, "-- %03i:", row);
 | 
						sprintf(ptr, "%s %03i:", comment, row);
 | 
				
			||||||
	ptr += strlen(ptr);
 | 
						ptr += strlen(ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	buf2str(data, size, ptr, flip);
 | 
						buf2str(data, size, ptr, flip);
 | 
				
			||||||
@@ -570,18 +580,18 @@ static char* saveBinaryBuffer(char* ptr, const void* data, s32 size, s32 row, bo
 | 
				
			|||||||
	return ptr;
 | 
						return ptr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char* saveBinarySection(char* ptr, const char* tag, s32 count, const void* data, s32 size, bool flip)
 | 
					static char* saveBinarySection(char* ptr, const char* comment, const char* tag, s32 count, const void* data, s32 size, bool flip)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if(bufferEmpty(data, size * count)) 
 | 
						if(bufferEmpty(data, size * count)) 
 | 
				
			||||||
		return ptr;
 | 
							return ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(ptr, "\n-- <%s>\n", tag);
 | 
						sprintf(ptr, "%s <%s>\n", comment, tag);
 | 
				
			||||||
	ptr += strlen(ptr);
 | 
						ptr += strlen(ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for(s32 i = 0; i < count; i++, data = (u8*)data + size)
 | 
						for(s32 i = 0; i < count; i++, data = (u8*)data + size)
 | 
				
			||||||
		ptr = saveBinaryBuffer(ptr, data, size, i, flip);
 | 
							ptr = saveBinaryBuffer(ptr, comment, data, size, i, flip);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(ptr, "-- </%s>\n", tag);
 | 
						sprintf(ptr, "%s </%s>\n\n", comment, tag);
 | 
				
			||||||
	ptr += strlen(ptr);
 | 
						ptr += strlen(ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ptr;
 | 
						return ptr;
 | 
				
			||||||
@@ -600,7 +610,7 @@ static const BinarySection BinarySections[] =
 | 
				
			|||||||
	{"TRACKS", 		MUSIC_TRACKS, offsetof(tic_cartridge, sound.music.tracks), sizeof(tic_track), true},
 | 
						{"TRACKS", 		MUSIC_TRACKS, offsetof(tic_cartridge, sound.music.tracks), sizeof(tic_track), true},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static s32 saveProject(Console* console, void* buffer)
 | 
					static s32 saveProject(Console* console, void* buffer, const char* comment)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	tic_mem* tic = console->tic;
 | 
						tic_mem* tic = console->tic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -610,15 +620,15 @@ static s32 saveProject(Console* console, void* buffer)
 | 
				
			|||||||
	for(s32 i = 0; i < COUNT_OF(BinarySections); i++)
 | 
						for(s32 i = 0; i < COUNT_OF(BinarySections); i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		const BinarySection* section = &BinarySections[i];
 | 
							const BinarySection* section = &BinarySections[i];
 | 
				
			||||||
		ptr = saveBinarySection(ptr, section->tag, section->count, (u8*)&tic->cart + section->offset, section->size, section->flip);
 | 
							ptr = saveBinarySection(ptr, comment, section->tag, section->count, (u8*)&tic->cart + section->offset, section->size, section->flip);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	saveBinarySection(ptr, "COVER", 1, &tic->cart.cover, tic->cart.cover.size + sizeof(s32), true);
 | 
						saveBinarySection(ptr, comment, "COVER", 1, &tic->cart.cover, tic->cart.cover.size + sizeof(s32), true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return strlen(stream);
 | 
						return strlen(stream);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool loadTextSection(const char* project, void* dst, s32 size)
 | 
					static bool loadTextSection(const char* project, const char* comment, void* dst, s32 size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	bool done = false;
 | 
						bool done = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -630,7 +640,7 @@ static bool loadTextSection(const char* project, void* dst, s32 size)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		for(s32 i = 0; i < COUNT_OF(BinarySections); i++)
 | 
							for(s32 i = 0; i < COUNT_OF(BinarySections); i++)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			sprintf(tagbuf, "-- <%s>\n", BinarySections[i].tag);
 | 
								sprintf(tagbuf, "\n%s <%s>\n", comment, BinarySections[i].tag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			const char* ptr = SDL_strstr(project, tagbuf);
 | 
								const char* ptr = SDL_strstr(project, tagbuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -648,10 +658,10 @@ static bool loadTextSection(const char* project, void* dst, s32 size)
 | 
				
			|||||||
	return done;
 | 
						return done;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool loadBinarySection(const char* project, const char* tag, s32 count, void* dst, s32 size, bool flip)
 | 
					static bool loadBinarySection(const char* project, const char* comment, const char* tag, s32 count, void* dst, s32 size, bool flip)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char tagbuf[64];
 | 
						char tagbuf[64];
 | 
				
			||||||
	sprintf(tagbuf, "-- <%s>\n", tag);
 | 
						sprintf(tagbuf, "%s <%s>\n", comment, tag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const char* start = SDL_strstr(project, tagbuf);
 | 
						const char* start = SDL_strstr(project, tagbuf);
 | 
				
			||||||
	bool done = false;
 | 
						bool done = false;
 | 
				
			||||||
@@ -660,7 +670,7 @@ static bool loadBinarySection(const char* project, const char* tag, s32 count, v
 | 
				
			|||||||
	{
 | 
						{
 | 
				
			||||||
		start += strlen(tagbuf);
 | 
							start += strlen(tagbuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sprintf(tagbuf, "\n-- </%s>", tag);
 | 
							sprintf(tagbuf, "\n%s </%s>", comment, tag);
 | 
				
			||||||
		const char* end = SDL_strstr(start, tagbuf);
 | 
							const char* end = SDL_strstr(start, tagbuf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if(end > start)
 | 
							if(end > start)
 | 
				
			||||||
@@ -697,7 +707,7 @@ static bool loadBinarySection(const char* project, const char* tag, s32 count, v
 | 
				
			|||||||
	return done;
 | 
						return done;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool loadProject(Console* console, const char* data, s32 size, tic_cartridge* dst)
 | 
					static bool loadProject(Console* console, const char* name, const char* data, s32 size, tic_cartridge* dst)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	tic_mem* tic = console->tic;
 | 
						tic_mem* tic = console->tic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -723,17 +733,19 @@ static bool loadProject(Console* console, const char* data, s32 size, tic_cartri
 | 
				
			|||||||
			SDL_memset(cart, 0, sizeof(tic_cartridge));
 | 
								SDL_memset(cart, 0, sizeof(tic_cartridge));
 | 
				
			||||||
			SDL_memcpy(&cart->palette, &tic->config.palette.data, sizeof(tic_palette));
 | 
								SDL_memcpy(&cart->palette, &tic->config.palette.data, sizeof(tic_palette));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if(loadTextSection(project, cart->code.data, sizeof(tic_code)))
 | 
								const char* comment = projectComment(name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if(loadTextSection(project, comment, cart->code.data, sizeof(tic_code)))
 | 
				
			||||||
				done = true;
 | 
									done = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for(s32 i = 0; i < COUNT_OF(BinarySections); i++)
 | 
								for(s32 i = 0; i < COUNT_OF(BinarySections); i++)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				const BinarySection* section = &BinarySections[i];
 | 
									const BinarySection* section = &BinarySections[i];
 | 
				
			||||||
				if(loadBinarySection(project, section->tag, section->count, (u8*)cart + section->offset, section->size, section->flip))
 | 
									if(loadBinarySection(project, comment, section->tag, section->count, (u8*)cart + section->offset, section->size, section->flip))
 | 
				
			||||||
					done = true;
 | 
										done = true;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if(loadBinarySection(project, "COVER", 1, &cart->cover, -1, true))
 | 
								if(loadBinarySection(project, comment, "COVER", 1, &cart->cover, -1, true))
 | 
				
			||||||
				done = true;
 | 
									done = true;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			SDL_memcpy(dst, cart, sizeof(tic_cartridge));
 | 
								SDL_memcpy(dst, cart, sizeof(tic_cartridge));
 | 
				
			||||||
@@ -762,7 +774,7 @@ static void updateProject(Console* console)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			if(cart)
 | 
								if(cart)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if(loadProject(console, data, size, cart))
 | 
									if(loadProject(console, console->romName, data, size, cart))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					SDL_memcpy(&tic->cart, cart, sizeof(tic_cartridge));
 | 
										SDL_memcpy(&tic->cart, cart, sizeof(tic_cartridge));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -777,11 +789,6 @@ static void updateProject(Console* console)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool hasExt(const char* name, const char* ext)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return strcmp(name + strlen(name) - strlen(ext), ext) == 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void onConsoleLoadCommandConfirmed(Console* console, const char* param)
 | 
					static void onConsoleLoadCommandConfirmed(Console* console, const char* param)
 | 
				
			||||||
@@ -810,13 +817,19 @@ static void onConsoleLoadCommandConfirmed(Console* console, const char* param)
 | 
				
			|||||||
		else
 | 
							else
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
#if defined(TIC80_PRO)
 | 
					#if defined(TIC80_PRO)
 | 
				
			||||||
			const char* name = getProjectName(param);
 | 
								const char* name = getName(param, PROJECT_LUA_EXT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if(!fsExistsFile(console->fs, name))
 | 
				
			||||||
 | 
									name = getName(param, PROJECT_MOON_EXT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if(!fsExistsFile(console->fs, name))
 | 
				
			||||||
 | 
									name = getName(param, PROJECT_JS_EXT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			void* data = fsLoadFile(console->fs, name, &size);
 | 
								void* data = fsLoadFile(console->fs, name, &size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if(data)
 | 
								if(data)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				loadProject(console, data, size, &console->tic->cart);
 | 
									loadProject(console, name, data, size, &console->tic->cart);
 | 
				
			||||||
				onCartLoaded(console, name);
 | 
									onCartLoaded(console, name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				SDL_free(data);
 | 
									SDL_free(data);
 | 
				
			||||||
@@ -1865,9 +1878,9 @@ static CartSaveResult saveCartName(Console* console, const char* name)
 | 
				
			|||||||
				s32 size = 0;
 | 
									s32 size = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(TIC80_PRO)
 | 
					#if defined(TIC80_PRO)
 | 
				
			||||||
				if(hasExt(name, PROJECT_EXT))
 | 
									if(hasProjectExt(name))
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					size = saveProject(console, buffer);
 | 
										size = saveProject(console, buffer, projectComment(name));
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@@ -2613,9 +2626,9 @@ static void cmdLoadCart(Console* console, const char* name)
 | 
				
			|||||||
	if(data)
 | 
						if(data)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
#if defined(TIC80_PRO)
 | 
					#if defined(TIC80_PRO)
 | 
				
			||||||
		if(hasExt(name, PROJECT_EXT))
 | 
							if(hasProjectExt(name))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			loadProject(console, data, size, &embed.file);
 | 
								loadProject(console, name, data, size, &embed.file);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -91,7 +91,7 @@ struct Console
 | 
				
			|||||||
	bool startSurf;
 | 
						bool startSurf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void(*load)(Console*, const char* name);
 | 
						void(*load)(Console*, const char* name);
 | 
				
			||||||
	bool(*loadProject)(Console*, const char* data, s32 size, tic_cartridge* dst);
 | 
						bool(*loadProject)(Console*, const char* name, const char* data, s32 size, tic_cartridge* dst);
 | 
				
			||||||
	void(*updateProject)(Console*);
 | 
						void(*updateProject)(Console*);
 | 
				
			||||||
	void(*error)(Console*, const char*);
 | 
						void(*error)(Console*, const char*);
 | 
				
			||||||
	void(*trace)(Console*, const char*, u8 color);
 | 
						void(*trace)(Console*, const char*, u8 color);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,7 +61,9 @@
 | 
				
			|||||||
#define KEYMAP_DAT_PATH TIC_LOCAL KEYMAP_DAT
 | 
					#define KEYMAP_DAT_PATH TIC_LOCAL KEYMAP_DAT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CART_EXT ".tic"
 | 
					#define CART_EXT ".tic"
 | 
				
			||||||
#define PROJECT_EXT ".ticp"
 | 
					#define PROJECT_LUA_EXT ".lua"
 | 
				
			||||||
 | 
					#define PROJECT_MOON_EXT ".moon"
 | 
				
			||||||
 | 
					#define PROJECT_JS_EXT ".js"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct
 | 
					typedef struct
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								src/surf.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								src/surf.c
									
									
									
									
									
								
							@@ -388,12 +388,13 @@ static bool addMenuItem(const char* name, const char* info, s32 id, void* ptr, b
 | 
				
			|||||||
	AddMenuItem* data = (AddMenuItem*)ptr;
 | 
						AddMenuItem* data = (AddMenuItem*)ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static const char CartExt[] = CART_EXT;
 | 
						static const char CartExt[] = CART_EXT;
 | 
				
			||||||
	static const char ProjectExt[] = PROJECT_EXT;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(dir 
 | 
						if(dir 
 | 
				
			||||||
		|| hasExt(name, CartExt)
 | 
							|| hasExt(name, CartExt)
 | 
				
			||||||
#if defined(TIC80_PRO)		
 | 
					#if defined(TIC80_PRO)		
 | 
				
			||||||
		|| hasExt(name, ProjectExt)
 | 
							|| hasExt(name, PROJECT_LUA_EXT)
 | 
				
			||||||
 | 
							|| hasExt(name, PROJECT_MOON_EXT)
 | 
				
			||||||
 | 
							|| hasExt(name, PROJECT_JS_EXT)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		)
 | 
							)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -416,7 +417,6 @@ static bool addMenuItem(const char* name, const char* info, s32 id, void* ptr, b
 | 
				
			|||||||
				cutExt(item->label, CartExt);
 | 
									cutExt(item->label, CartExt);
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				cutExt(item->label, ProjectExt);
 | 
					 | 
				
			||||||
				project = true;
 | 
									project = true;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -535,8 +535,8 @@ static void loadCover(Surf* surf)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			if(cart)
 | 
								if(cart)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if(hasExt(item->name, PROJECT_EXT))
 | 
									if(hasExt(item->name, PROJECT_LUA_EXT))
 | 
				
			||||||
					surf->console->loadProject(surf->console, data, size, cart);
 | 
										surf->console->loadProject(surf->console, item->name, data, size, cart);
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
					tic->api.load(cart, data, size, true);
 | 
										tic->api.load(cart, data, size, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -655,7 +655,7 @@ static void onPlayCart(Surf* surf)
 | 
				
			|||||||
			s32 size = 0;
 | 
								s32 size = 0;
 | 
				
			||||||
			void* data = fsLoadFile(surf->fs, item->name, &size);
 | 
								void* data = fsLoadFile(surf->fs, item->name, &size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			surf->console->loadProject(surf->console, data, size, cart);
 | 
								surf->console->loadProject(surf->console, item->name, data, size, cart);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			SDL_memcpy(&surf->tic->cart, cart, sizeof(tic_cartridge));
 | 
								SDL_memcpy(&surf->tic->cart, cart, sizeof(tic_cartridge));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user