// created by momotaro
/*------------------------------------------------------------------------------
= uniqもどき

  :run uniq -h
  とすると使い方が参照できます。

------------------------------------------------------------------------------*/

/**
 * 結果出力
 *
 * @param str 出力文字列
 * @param count 出現回数
 * @param lineNo 行番号
 * @param option オプション
 */
function output(str, count, lineNo, option) {
	if ((count > 1 && option.repeated) || (count == 1 && option.unique)) {
		if (option.jump) {
			console.write(lineNo + ":");
		}
		if (option.count) {
			console.write(count + " ");
		}
		console.writeln(str);
	}
}

/**
 * uniqのメイン処理
 *
 * @param option オプション
 */
function uniq(option) {
	var count = 1;
	var i = __range.from;
	var lineNo = i;
	var prev = thisView.getLineString(i++);
	for (; i <= __range.to; i++) {
		var str = thisView.getLineString(i);
		if (prev == str) {
			count++;
		} else {
			output(prev, count, lineNo, option);
			lineNo = i;
			prev = str;
			count = 1;
		}
	}
	output(prev, count, lineNo, option);
}

/**
 * ヘルプを表示する。
 */
function help() {
	console.writeln("usage:   :<range>run uniq [option]...");
	console.writeln("オプション");
	console.writeln("  -c 入力中に続けて出現した行の回数を表示");
	console.writeln("  -d 重複した行のみを表示");
	console.writeln("  -u 重複がなかった行のみを出力");
	console.writeln("  -j タグジャンプができる形式で出力");
	console.writeln("  -h この使い方を表示して終了");
}
/*

"C:\home\tool\vvs\vs/uniq.vvs"
20:

*/

/**
 * 引数解析
 *
 * @return オプション情報
 */
function parseArg() {
	var result = {
		help    : 0, //ヘルプはオフ
		count   : 0, //カウントを表示するか
		unique  : 1, //重複がなかった行を出力するか
		repeated: 1, //重複した行を表示するか
		jump    : 0  //タグジャンプができる形式で出力
	};
	for (var i = 1; i < __argv.getCount(); i++) {
		if (__argv[i] == "-c") {
			result.count = 1;
		} else if (__argv[i] == "-d") {
			result.repeated = 1;
			result.unique = 0;
		} else  if (__argv[i] == "-u") {
			result.repeated = 0;
			result.unique = 1;
		} else if (__argv[i] == "-j") {
			result.jump = 1;
		} else if (__argv[i] == "-h") {
			result.help = 1;
		}
	}

	return result;
}

/**
 * メイン処理
 */
function main() {
	var option = parseArg();
	if (option.help) {
		help();
	} else {
		if (option.jump) {
			console.writeln("\"" + thisDocument.getPathName() + "\"");
		}
		uniq(option);
	}
}