/*
 *	dpvnthps - P/VNSスクリプト to PGD [ToHeart PSE]
 *
 *	P/VNSスクリプトの「bg」「ld」コマンドで使われている画像ファイル名を抽出して、
 *	pthpse.exeを呼び出し、必要なPGDファイルを作成します。
 *	同じフォルダにpthpse.exeが必要です。
 *
 *	このプログラムが行うのは、PGDの作成までです。
 *	ファイルパックにはdfpck.exeを利用してください。
 *
 *	* Sat Jul 5 01:01:00 JST 2003 Naoyuki Sawa
 *	- 作成開始。
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>

#define MAX_ITEMS			100	/* 最大アイテム数 */
#define DELIM			" ,\"\t\r\n"	/* 簡単のために、「,」と「"」もデリミタにしてしまいます */

char* items[MAX_ITEMS];		/* アイテムリスト   */
char  types[MAX_ITEMS];		/* bgなら0、ldなら1 */
int n_items;			/* アイテム数       */

int
main(int argc, char* argv[])
{
	int i, j, len;
	char str[1024], *p1, *p2;

	/* 標準入力はP/VNSスクリプトからのリダイレクトでなければいけません。 */
	if(isatty(fileno(stdin))) {
		fprintf(stderr, "P/VNSスクリプト to PGD [ToHeart PSE]\n");
		fprintf(stderr, "USAGE: dpvnthps [pthpse.exeへのオプション] < P/VNSスクリプト.pvn\n");
		exit(1);
	}

	/* P/VNSスクリプトの全行を走査して... */
	while(gets(str) != NULL) {
		/* コメント以降を切り捨てます。 */
		p1 = strchr(str, ';');
		if(p1 != NULL) *p1 = '\0';

		/* この行の各トークンについて... */
		p1 = strtok(str, DELIM);
		while(p1 != NULL) {
			/* 「bg」または「ld」コマンド？ */
			if(strcmp(p1, "bg") == 0 || strcmp(p1, "ld") == 0) {
				/* 次のトークンが画像ファイル名？ */
				p2 = strtok(NULL, DELIM);
				if(p2 == NULL) break; /* もうトークンがない */
				len = strlen(p2);
				if(len < 1/*少なくとも1文字のfname*/ + 4/*.pgd*/) continue; /* 〜.pgdじゃない */
				if(strcmp(&p2[len - 4], ".pgd") != 0) continue;             /* 〜.pgdじゃない */
				p2[len - 4] = '\0'; /* 拡張子切り捨て */

				/* アイテム数がいっぱいでなく、新しく出現したアイテムなら、登録。 */
				if(n_items < MAX_ITEMS) {
					for(i = 0; i < n_items; i++) {
						if(strcmp(items[i], p2) == 0) break; /* もうある */
					}
					if(i == n_items) { /* 登録 */
						items[n_items] = strdup(p2);
						types[n_items] = strcmp(p1, "ld") == 0 ? 1 : 0;	/* 0:bg/1:ld */
						n_items++;
					}
				}
			}

			/* 次のトークンへ。 */
			p1 = strtok(NULL, DELIM);
		}
	}

	/* アイテムリスト出力。 */
	if(n_items != 0) {
		for(i = 0; i < n_items; i++) {
			/* コマンドライン作成。 */
			strcpy(str, "pthpse ");
			for(j = 1; j < argc; j++) { /* 全てのオプションをパススルー */
				strcat(str, argv[j]);
				strcat(str, " ");
			}
			if(types[i]) strcat(str, "-c "); /* 「ld」なら立ち絵モード */
			strcat(str, items[i]); /* アイテム指定 */
			if(system(str) != 0) {
				fprintf(stderr, "\"%s\"の実行中にエラーが発生しました。\n", str);
				abort();
			}
		}
	}

	return 0;
}
