/* Merged parser stuff for translate plugin
 */

%{
#include "translate.h"
#include "dosemu_charset.h"
	/* for translate plugin */

static void set_internal_charset(char *charset_name);
static void set_external_charset(char *charset_name);

%}

	/* charset */
%token INTERNAL EXTERNAL

%%

line:		CHARSET '{' charset_flags '}' {}
		;

		/* charset flags */
charset_flags	: charset_flag
		| charset_flags charset_flag
		;

charset_flag	: INTERNAL STRING { set_internal_charset ($2); }
		| EXTERNAL STRING { set_external_charset ($2); }
		;

%%

	/* charset */
struct char_set *get_charset(char *name)
{
	struct char_set *charset;

	charset = lookup_charset(name);
	if (!charset) {
		yyerror("Can't find charset %s", name);
	}
	return charset;

}

static void set_external_charset(char *charset_name)
{
	struct char_set *charset;
	charset = get_charset(charset_name);
	charset = get_terminal_charset(charset);
	if (charset) {
		if (!trconfig.output_charset) {
			trconfig.output_charset = charset;
		}
		if (!trconfig.paste_charset) {
			trconfig.paste_charset = charset;
		}
		if (!trconfig.keyb_charset) {
			trconfig.keyb_charset = charset;
		}
	}
	return;
}

static void set_internal_charset(char *charset_name)
{
	struct char_set *charset_video, *charset_config;
	charset_video = get_charset(charset_name);
	if (!is_display_charset(charset_video)) {
		yyerror("%s not suitable as an internal charset", charset_name);
	}
	charset_config = get_terminal_charset(charset_video);
	if (charset_video && !trconfig.video_mem_charset) {
		trconfig.video_mem_charset = charset_video;
	}
	if (charset_config && !trconfig.keyb_config_charset) {
		trconfig.keyb_config_charset = charset_config;
	}
	return;
}

