/************************************
 *     PFxx key manager : pfset     *
 *     Program made by  K,Ajima     *
 *   Copyright ajiyan soft l.t.d.   *
 ************************************/



#if 0
/*** pfset ***************************************************************

  ファンクションキーに文字を割り当てるプログラム。

**************************************************************************/
#endif



#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <bios.h>
#include <string.h>
#include <ctype.h>

#include <str.h>
#include <err.h>

#include "pfset.dtv"



									/* エラーコード */
#define ERR_PARAMETER		0x01		/* Illegal parameter : xxxxx */
#define ERR_PROFILE_OPEN	0x02		/* Can't open : xxxx */



#define READBUFF_SIZE	128			/* ファイル読み込みバッファサイズ */



									/* キーコードへ変換 */
#define num2code(_x)	( _x<12 ? _x+0x8000 : ( _x==12 ? 0x801d : _x+0x8014 ) )



/********************************************************************
 *	前振り
 ********************************************************************/
void _cdecl start_up(void)
{
	static const char * msg[] = {
		"PFxx key manager : pfset   ver. " DTV_ADDVER(),
		"Program made by K,Ajima",
		"Copyright ajiyan soft l.t.d.   " DTV_ADDTS(),
		" ",
		NULL
	};

	int i;

	for(i=0;msg[i]!=NULL;i++) {
		cputs(msg[i]); cputs("\x0d\x0a");
	}
}



/********************************************************************
 *	ヘルプ
 ********************************************************************/
void _cdecl help(void)
{
	static const char * msg[] = {
		"Syntax : pfset < option > ...",
		"         pfset /?",
		" ",
		"Options",
		"   pfxx[=yyyyy]",
		"   @< profile >",
		" ",
		NULL
	};

	int i;

	for(i=0;msg[i]!=NULL;i++) {
		cputs(msg[i]); cputs("\x0d\x0a");
	}

	exit(0);
}



/********************************************************************
 *	PFxx 表示
 *		xx
 ********************************************************************/
void _fastcall pfxx_out(int num)
{
	char buff[17];
	int i;

	struct kbd_info kbd_data;						/* キー BIOS データ */

	kbd_data.data   = num2code(num);
	kbd_data.buffer = buff;
	_bios_keybrd(_KBD_GETKEYALLOC,& kbd_data);		/* BIOS コール */

	printf("PF%d=",num);							/* 表示 */
	for(i=1;i<=(int)kbd_data.count;i++) {
		if(iscntrl(buff[i])) {
			printf("\\x%x",buff[i]);
		}
		else {
			putchar(buff[i]);
		}
	}
	cputs("\x0d\x0a");
}



/********************************************************************
 *	全 PFxx 表示
 ********************************************************************/
void _cdecl pfxx_out_all(void)
{
	int i;

	for(i=1;i<=20;i++) {
		pfxx_out(i);
	}

	exit(0);
}



/********************************************************************
 *	PFxx 設定
 *		1. xx
 *		2. 文字列
 ********************************************************************/
void _fastcall pfxx_set(int num,char *str)
{
	struct kbd_info kbd_data;						/* キー BIOS データ */

	kbd_data.flag   = 1;
	kbd_data.data   = num2code(num);
	kbd_data.count  = strlen(str);
	kbd_data.buffer = str;

	_bios_keybrd(_KBD_SETKEYALLOC,& kbd_data);		/* BIOS コール */
}



/********************************************************************
 *	PFxx 実行
 *		文字列
 ********************************************************************/
void _fastcall pfxx(char * str)
{
	char buff[32];
	int num=0,i=0;

	if(strnicmp(str,"pf",2)) {						/* PF チェック */
														/* エラー */
		out_err(ERR_PARAMETER,"Illegal parameter : ",str,NULL);
	}

	if(isdigit(str[2])) {							/* PFxx 数値化 */
		if(isdigit(str[3])) {
			num=(str[2]-'0')*10+(str[3]-'0');
			i=4;
		}
		else {
			num=(str[2]-'0');
			i=3;
		}
	}
	else {
		out_err(ERR_PARAMETER,"Illegal parameter : ",str,NULL);
	}

	if(num<1 || num>20) {							/* オーバーフローチェック */
		out_err(ERR_PARAMETER,"Illegal parameter : ",str,NULL);
	}

	if(str[i]=='=') {								/* = 判定 */
		str_c_str_to_str(buff,str+i+1);				/* C-strings > str */
		if(strlen(buff)>15U) {							/* 15文字以内 ? */
			out_err(ERR_PARAMETER,"Illegal parameter : ",str,NULL);
		}
		pfxx_set(num,buff);								/* PFxx=yyyy */
		pfxx_out(num);									/* 表示 */
	}
	else if(str[i]=='\x00') {
		pfxx_out(num);									/* PFxx 表示 */
	}
	else {
														/* エラー */
		out_err(ERR_PARAMETER,"Illegal parameter : ",str,NULL);
	}
}



/********************************************************************
 *	プロファイルオープン
 *		ファイル名
 ********************************************************************/
FILE * _fastcall profile_open(char *name)
{
	FILE * fp;

	if((fp=fopen(name,"rb"))==NULL) {
		out_err(ERR_PROFILE_OPEN,"Can\'t open : ",name,NULL);
	}

	return(fp);
}



/********************************************************************
 *	プロファイル処理
 *		ファイル名
 ********************************************************************/
void _fastcall profile(char *name)
{
	char rbuff[READBUFF_SIZE];
	FILE *fp;

	fp=profile_open(name);							/* プロファイルオープン */

	for(;;) {
		if(fgets(rbuff,READBUFF_SIZE,fp)==NULL) {		/* 1行読み込み */
			break;
		}

		if(rbuff[strlen(rbuff)-2]=='\x0d') {
			rbuff[strlen(rbuff)-2]='\x00';
		}
		pfxx(rbuff);									/* 実行 */
	}

	fclose(fp);										/* クローズ */
}



/********************************************************************
 *	pfkey メイン処理
 *		1. argc
 *		2. argv
 ********************************************************************/
void _fastcall pfkey_main(int argc,char **argv)
{
	int i;

	for(i=1;i<argc;i++) {
		if(argv[i][0]=='@') {
			profile((char *)(argv[i])+1);					/* プロファイル処理 */
		}
		else {
			pfxx(argv[i]);									/* 1行実行 */
		}
	}

	exit(0);
}



/********************************************************************
 *	main
 ********************************************************************/
void _cdecl main(int argc,char **argv)
{
	start_up();										/* 前振り */

	if(argc==2 && !strcmp(argv[1],"/?")) {
		help();											/* ヘルプ */
	}

	if(argc==1) {
		pfxx_out_all();									/* 全 PFxx 表示 */
	}

	pfkey_main(argc,argv);							/* メイン処理 */
}

