Newer
Older
ddhx / src / Menu.d
module menu;

import std.stdio : readln, write;
import core.stdc.stdio : printf;
import ddcon, ddhx, searcher;

/**
 * Internal command prompt.
 * Params: prepend = Initial command
 */
void hxmenu(string prepend = null) {
	import std.array : split;
	import std.algorithm.iteration : splitter;
	import std.algorithm.sorting : merge;
	import std.range : chain;
	import std.algorithm : joiner;
	import std.format : sformat;

	conpos(0, 0);
	printf("%*s", conwidth - 1, cast(char*)" ");
	conpos(0, 0);
	printf(">");
	if (prepend)
		write(prepend);

//	size_t argc;
//	char[1024] inbuf = void;
//	string[12] argv  = void;
//	const size_t inbufl = readln(inbuf);

	//TODO: GC-free merge prepend and readln(buf), then split
	string[] argv = cast(string[])(prepend ~ readln[0..$-1]).split; // split ' ', no empty entries

	ddhx_update_offsetbar;

	const size_t argc = argv.length;
	if (argc == 0) return;

	switch (argv[0]) {
	case "g", "goto":
		if (argc <= 1) {
			ddhx_msglow("Missing position (number)");
			break;
		}
		switch (argv[1]) {
		case "e", "end":
			ddhx_seek_unsafe(g_fsize - g_screenl);
			break;
		case "h", "home":
			ddhx_seek_unsafe(0);
			break;
		default:
			ddhx_seek(argv[1]);
		}
		break;
	case "s", "search": // Search
		if (argc <= 1) {
			ddhx_msglow("Missing data type");
			break;
		}
		if (argc <= 2) {
			ddhx_msglow("Missing data argument");
			break;
		}

		string value = argv[2];
		switch (argv[1]) {
		case "u8", "byte":
			argv[1] = value;
			goto SEARCH_BYTE;
		case "u16", "short":
			search_u16(value);
			break;
		case "u32", "int":
			search_u32(value);
			break;
		case "u64", "long":
			search_u64(value);
			break;
		case "utf8", "string":
			search_utf8(value);
			break;
		case "utf16", "wstring":
			search_utf16(value);
			break;
		case "utf32", "dstring":
			search_utf32(value);
			break;
		default:
			ddhx_msglow("Invalid type (%s)", argv[1]);
			break;
		}
		break; // "search"
	case "ss": // Search ASCII/UTF-8 string
		if (argc > 1)
			search_utf8(argv[1]);
		else
			ddhx_msglow("Missing argument (utf8)");
		break;
	case "sw": // Search UTF-16 string
		if (argc > 1)
			search_utf16(argv[1]);
		else
			ddhx_msglow("Missing argument (utf16)");
		break;
	case "sd": // Search UTF-32 string
		if (argc > 1)
			search_utf32(argv[1]);
		else
			ddhx_msglow("Missing argument (utf16)");
		break;
	case "sb": // Search byte
SEARCH_BYTE:
		if (argc <= 1) {
			ddhx_msglow("Missing argument (u8)");
			break;
		}
		search_u8(argv[1]);
		break;
	case "i", "info": ddhx_fileinfo; break;
	case "o", "offset":
		if (argc <= 1) {
			ddhx_msglow("Missing offset");
			break;
		}
		if (ddhx_setting_output(argv[1])) {
			ddhx_msglow(ddhx_exception.msg);
			break;
		}
		ddhx_update_offsetbar;
		ddhx_render_raw;
		break;
	case "refresh": ddhx_refresh; break;
	case "quit": ddhx_exit; break;
	case "about":
		enum C = "Written by dd86k. " ~ COPYRIGHT;
		ddhx_msglow(C);
		break;
	case "version":
		enum V = "ddhx " ~ APP_VERSION ~ ", " ~ __TIMESTAMP__;
		ddhx_msglow(V);
		break;
	//
	// Setting manager
	//
	case "set":
		if (argc <= 2) {
			ddhx_msglow(argc <= 1 ?
				"Missing setting" :
				"Missing setting option");
			break;
		}
		switch (argv[1]) {
		case "width", "w":
			if (ddhx_setting_width(argv[2])) {
				ddhx_msglow(ddhx_exception.msg);
				break;
			}
			ddhx_prep;
			ddhx_refresh;
			break;
		case "offset", "o":
			if (ddhx_setting_output(argv[2])) {
				ddhx_msglow(ddhx_exception.msg);
				break;
			}
			conclear;
			ddhx_refresh;
			break;
		default:
			ddhx_msglow("Unknown setting: %s", argv[1]);
			break;
		}
		break;
	default: ddhx_msglow("Unknown command: %s", argv[0]); break;
	}
}