/* radare - LGPL - Copyright 2021 - pancake */

#include <r_util.h>

typedef struct {
	char ch;
	const char *l[3];
} SevenSegments;

// seven segment ascii-art text
static const SevenSegments ss_lc[] = {
	{ '0', { " __ ",
		"| /|",
		"|/_|" }
	},
	{ '1', { "    ",
		"  | ",
		"  | " }
	},
	{ '2', { " __ ",
		" __|",
		"|__ " }
	},
	{ '3', { " __ ",
		" __|",
		" __|" }
	},
	{ '4', { "    ",
		"|__|",
		"   |" }
	},
	{ '5', { " __ ",
		"|__ ",
		" __|" }
	},
	{ '6', { " __ ",
		"|__ ",
		"|__|" }
	},
	{ '7', { " __ ",
		"   |",
		"   |" }
	},
	{ '8', { " __ ",
		"|__|",
		"|__|" }
	},
	{ '9', { " __ ",
		"|__|",
		" __|" }
	},
	{ '$', { " __ ",
		"||_ ",
		" _||" }
	},
	{ '_', { "    ",
		"    ",
		" __ " }
	},
	{ '.', { "    ",
		"    ",
		"  _ " }
	},
	{ ',', { "    ",
		"    ",
		" _  " }
	},
	{ '/', { "    ",
		"  / ",
		" /  " }
	},
	{ '%', { "    ",
		" O/ ",
		" /O " }
	},
	{ '=', { "    ",
		" __ ",
		" __ " }
	},
	{ '"', { " __ ",
		"    ",
		"    " }
	},
	{ '?', { " __ ",
		"  _|",
		" _\\ " }
	},
	{ '+', { "    ",
		" _|_",
		"  | " }
	},
	{ '-', { "    ",
		" __ ",
		"    " }
	},
	{ '*', { "    ",
		"_\\/_",
		" /\\ " }
	},
	{ '(', { " _  ",
		"|   ",
		"|_  " }
	},
	{ ')', { "  _ ",
		"   |",
		"  _|" }
	},
	{ '[', { " _  ",
		"|   ",
		"|_  " }
	},
	{ ']', { "  _ ",
		"   |",
		"  _|" }
	},
	{ '>', { "    ",
		"  \\ ",
		"  / " }
	},
	{ ' ', { "    ",
		"    ",
		"    " }
	},
	{ 'a', { "  _ ",
		"  _|",
		" /_|" }
	},
	{ 'b', { "    ",
		"|_  ",
		"|_\\ " }
	},
	{ 'c', { "    ",
		" __ ",
		"|__ " }
	},
	{ 'd', { "    ",
		"  _|",
		" /_|" }
	},
	{ 'e', { " _  ",
		"|_\\ ",
		"|__ " }
	},
	{ 'f', { " __ ",
		"|_  ",
		"|   " }
	},
	{ 'g', { " __ ",
		" \\_|",
		"|__|" }
	},
	{ 'h', { "    ",
		"|_  ",
		"| \\ " }
	},
	{ 'i', { "   ",
		" _ ",
		" | " }
	},
	{ 'j', { " __ ",
		"  | ",
		"|_| " }
	},
	{ 'k', { "    ",
		"|_/ ",
		"| \\ " }
	},
	{ 'l', { "    ",
		"    ",
		"|___" }
	},
	{ 'm', { "    ",
		"    ",
		"|\\/|" }
	},
	{ 'n', { "    ",
		" __ ",
		"|  |" }
	},
	{ 'o', { "    ",
		" __ ",
		"|__|" }
	},
	{ 'p', { " __ ",
		"|__|",
		"|   " }
	},
	{ 'q', { " __ ",
		"|__|",
		"  \\ " }
	},
	{ 'r', { " __ ",
		"|__|",
		"| \\ " }
	},
	{ 's', { "    ",
		"  _ ",
		" _\\" }
	},
	{ 't', { "    ",
		"_|_ ",
		" |__" }
	},
	{ 'u', { "    ",
		"    ",
		"|__|" }
	},
	{ 'v', { "    ",
		"|  |",
		" \\/ " }
	},
	{ 'w', { "    ",
		"    ",
		"|/\\|" }
	},
	{ 'x', { "    ",
		" \\/ ",
		" /\\ " }
	},
	{ 'y', { "    ",
		" \\_|",
		"  _|" }
	},
	{ 'z', { "    ",
		" _  ",
		" /_ " }
	},
	{ '\0', {0}}
};

static const SevenSegments ss[] = {
	{ '0', { " __ ",
		"|  |",
		"|__|" }
	},
	{ '1', { "    ",
		"  | ",
		"  | " }
	},
	{ '2', { " __ ",
		" __|",
		"|__ " }
	},
	{ '3', { " __ ",
		" __|",
		" __|" }
	},
	{ '4', { "    ",
		"|__|",
		"   |" }
	},
	{ '5', { " __ ",
		"|__ ",
		" __|" }
	},
	{ '6', { " __ ",
		"|__ ",
		"|__|" }
	},
	{ '7', { " __ ",
		"   |",
		"   |" }
	},
	{ '8', { " __ ",
		"|__|",
		"|__|" }
	},
	{ '9', { " __ ",
		"|__|",
		" __|" }
	},
	{ '$', { " __ ",
		"||_ ",
		" _||" }
	},
	{ '_', { "    ",
		"    ",
		" __ " }
	},
	{ '.', { "    ",
		"    ",
		"  _ " }
	},
	{ ',', { "    ",
		"    ",
		" _  " }
	},
	{ '/', { "    ",
		"  / ",
		" /  " }
	},
	{ '%', { "    ",
		" O/ ",
		" /O " }
	},
	{ '=', { "    ",
		" __ ",
		" __ " }
	},
	{ '"', { " __ ",
		"    ",
		"    " }
	},
	{ '?', { " __ ",
		"  _|",
		" _\\ " }
	},
	{ '+', { "    ",
		" _|_",
		"  | " }
	},
	{ '-', { "    ",
		" __ ",
		"    " }
	},
	{ '*', { "    ",
		"_\\/_",
		" /\\ " }
	},
	{ '(', { " _  ",
		"|   ",
		"|_  " }
	},
	{ ')', { "  _ ",
		"   |",
		"  _|" }
	},
	{ '[', { " _  ",
		"|   ",
		"|_  " }
	},
	{ ']', { "  _ ",
		"   |",
		"  _|" }
	},
	{ '>', { "    ",
		"  \\ ",
		"  / " }
	},
	{ ' ', { "    ",
		"    ",
		"    " }
	},
	{ 'a', { " __ ",
		"|__|",
		"|  |" }
	},
	{ 'b', { "    ",
		"|__ ",
		"|__|" }
	},
	{ 'c', { "    ",
		" __ ",
		"|__ " }
	},
	{ 'd', { "    ",
		" __|",
		"|__|" }
	},
	{ 'e', { " __ ",
		"|_  ",
		"|__ " }
	},
	{ 'f', { " __ ",
		"|_  ",
		"|   " }
	},
	{ 'g', { " __ ",
		"| _ ",
		"|__|" }
	},
	{ 'h', { "    ",
		"|__|",
		"|  |" }
	},
	{ 'i', { " ___",
		"  | ",
		" _|_" }
	},
	{ 'j', { " __ ",
		"  | ",
		"|_| " }
	},
	{ 'k', { "    ",
		"|_/ ",
		"| \\ " }
	},
	{ 'l', { "    ",
		"|   ",
		"|__ " }
	},
	{ 'm', { "    ",
		"|\\/|",
		"|  |" }
	},
	{ 'n', { "    ",
		"|\\ |",
		"| \\|" }
	},
	{ 'o', { " __ ",
		"|  |",
		"|__|" }
	},
	{ 'p', { " __ ",
		"|__|",
		"|   " }
	},
	{ 'q', { " __ ",
		"|__|",
		"  \\ " }
	},
	{ 'r', { " __ ",
		"|__|",
		"| \\ " }
	},
	{ 's', { " __ ",
		"|__ ",
		" __\\" }
	},
	{ 't', { "    ",
		"_|_ ",
		" |_ " }
	},
	{ 'u', { "    ",
		"    ",
		"|__|" }
	},
	{ 'v', { "    ",
		"|  |",
		" \\/ " }
	},
	{ 'w', { "    ",
		"|  |",
		"|/\\|" }
	},
	{ 'x', { "    ",
		" \\/ ",
		" /\\ " }
	},
	{ 'y', { "    ",
		"|__|",
		" __|" }
	},
	{ 'z', { " __ ",
		"  / ",
		" /_ " }
	},
	{ '&', { "    ",
		"    ",
		" &  " }
	},
	{ '@', { "    ",
		"    ",
		" @  " }
	},
	{ '\0', {0}}
};

R_API char *r_str_ss(const char * R_NONNULL msg, const char * R_NULLABLE nl, int cs) {
	R_RETURN_VAL_IF_FAIL (msg, NULL);
	if (!nl) {
		nl = "\n";
	}
	int i, j, n;
	RStrBuf *sb = r_strbuf_new ("");
	char *omsg = strdup (msg);
	RList *lines = r_str_split_list (omsg, "\n", 0);
	RListIter *iter;
	r_list_foreach (lines, iter, msg) {
		for (i = 0; i < 3; i++) {
			for (n = 0; msg[n]; n++) {
				char ch = tolower (msg[n]);
				if (cs && ch == msg[n]) {
					for (j = 0; ss_lc[j].ch; j++) {
						if (ss_lc[j].ch == ch) {
							r_strbuf_append (sb, ss_lc[j].l[i]);
							break;
						}
					}
				} else {
					for (j = 0; ss[j].ch; j++) {
						if (ss[j].ch == ch) {
							r_strbuf_append (sb, ss[j].l[i]);
							break;
						}
					}
				}
			}
			r_strbuf_append (sb, nl);
		}
		r_strbuf_append (sb, nl);
	}
	char *res = r_strbuf_drain (sb);
	r_list_free (lines);
	free (omsg);
	return res;
}
