// 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);
}
}