#include <u.h>
#include <libc.h>
#include <draw.h>
#include <html.h>
#include "impl.h"

Rune **runeconsttab;
char *_runeconsttab[] = {
	"        ",
	" ",
	"",
	"#",
	"+",
	", ",
	"-",
	"-->",
	"1",
	"<",
	">",
	"?",
	"Index search terms:",
	"Reset",
	"Submit",
	"^0-9",
	"_ISINDEX_",
	"_blank",
	"_fr",
	"_no_name_submit_",
	"_parent",
	"_self",
	"_top",
	"application/x-www-form-urlencoded",
	"circle",
	"cm",
	"content-script-type",
	"disc",
	"em",
	"in",
	"javascript",
	"jscript",
	"jscript1.1",
	"mm",
	"none",
	"pi",
	"pt",
	"refresh",
	"select",
	"square",
	"textarea",
};

Rune**
cvtstringtab(char **tab, int n)
{
	int i;
	Rune **rtab;

	rtab = emalloc(n*sizeof(rtab[0]));
	for(i=0; i<n; i++)
		rtab[i] = toStr((uchar*)tab[i], strlen(tab[i]), US_Ascii);
	return rtab;
}

StringInt*
cvtstringinttab(AsciiInt *tab, int n)
{
	int i;
	StringInt *stab;

	stab = emalloc(n*sizeof(stab[0]));
	for(i=0; i<n; i++){
		stab[i].key = toStr((uchar*)tab[i].key, strlen(tab[i].key), US_Ascii);
		stab[i].val = tab[i].val;
	}
	return stab;
}

void
runetabinit(void)
{
	runeconsttab = cvtstringtab(_runeconsttab, nelem(_runeconsttab));
	return;
}
