/*
 *	durlenc - URL encode/decode tool
 *	Copyright (C) 2008 Naoyuki Sawa
 *
 *	* Mon Nov 17 13:25:08 JST 2008 Naoyuki Sawa
 *	- 1st リリース。
 *	* Tue Nov 18 02:09:30 JST 2008 Naoyuki Sawa
 *	- 「dbase64enc.exe」が入力ストリーム中の改行や空白を無視するように変更したことに伴い、本ツールは、一行ごとの処理に変更しました。
 *	  これまでは、「dbase64enc.exe」が途中の改行をエラーとしていたため、パイプで連結して使うために、本ツールも改行無しで全データをまとめて一括変換していました。
 *	  今回の変更により、一行ごとの処理の方が、使い易くなったと思います。
 *	- <例> data.binをBase64エンコードし、さらにURLエンコードして、encoded.txtを生成する。読み易さのために、Base64エンコード時に80桁ごとと末尾で改行する。
 *		dbase64enc -c80 data.bin | durlenc > encoded.txt
 *	- <例> 上記エンコード例の逆の、デコードを行う。
 *		durlenc -d < encoded.txt | dbase64enc -d data.bin
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define DIE() abort()
#define __CLIP_H__
#include "../../clipcode.h"
#include "../../clipcode.c"

#define VERSION "20081118"

/////////////////////////////////////////////////////////////////////////////

void
usage()
{
	printf("durlenc - URL encode/decode tool (%s) Naoyuki Sawa\n", VERSION);
	printf("Usage: [-d/-e] < input-text-stream > output-text-stream\n");
	printf("Options:\n");
	printf("  -e : encode input text (default)\n");
	printf("  -d : decode input text\n");
	exit(1);
}

int mode; /* 'd' or 'e' */

#define BUFFER_SIZE	(16 * 1024 * 1024)	/* 調整可 */
unsigned char srcbuf[BUFFER_SIZE];
unsigned char dstbuf[BUFFER_SIZE];

int
main(int argc, char* argv[])
{
	int i;

	/* コマンドライン解析。 */
	for(i = 1; i < argc; i++) {
		switch(argv[i][0]) {
		case '-':
		case '/':
			switch(tolower(argv[i][1])) {
			case 'd':
			case 'e':
				if(!mode) {
					mode = tolower(argv[i][1]);
					break;
				}
				usage();
				break;
			default:
				usage();
				break;
			}
			break;
		default:
			usage();
			break;
		}
	}
	/* "-d"も"-e"も指定されていなければ、"-e"とします。 */
	if(!mode) {
		mode = 'e';
	}

	/* 一行読み込みます。 */
	while(gets(srcbuf)) {
		switch(mode) {
		case 'e':
			/* エンコードします。 */
			url_encode(dstbuf, BUFFER_SIZE, srcbuf);
			break;
		case 'd':
			/* デコードします。 */
			url_decode(dstbuf, BUFFER_SIZE, srcbuf);
			break;
		default:
			DIE();
		}
		/* 一行出力します。 */
		puts(dstbuf);
	}

	return 0;
}
