import System;
import System.IO;

var args : String[] = Environment.GetCommandLineArgs();
if(args.length != 4) {		//引数がない場合
	System.Console.Error.WriteLine(
				"usage : colorchange ingif old_color new_color.");
	System.Console.Error.WriteLine("\tcolor : RRGGBB.");
	Environment.Exit(1);
}

//色を変換
var old_color : byte[] = new byte[3];
var new_color : byte[] = new byte[3];
try {
	if(args[2].Length != 6 || args[3].Length != 6)
		throw(1);
	for(var i = 0; i < 3; i++) {
		old_color[i] = parseInt("0x" + args[2].Substring(i * 2, 2));
		new_color[i] = parseInt("0x" + args[3].Substring(i * 2, 2));
	}
}
catch(e) {
	System.Console.Error.WriteLine("color : RRGGBB.");
	Environment.Exit(1);
}

//入出力ストリームを開く
var fs : FileStream;
try {
	fs = new FileStream(args[1], FileMode.Open, FileAccess.ReadWrite);
}
catch(e) {
	System.Console.Error.WriteLine("error : can't open " + args[1] + ".");
	Environment.Exit(1);
}

var p_size : int;
var b : byte;
var color : byte[] = new byte[3];
try {
	//10バイト分進む
	fs.Seek(10, SeekOrigin.Current);
	//パレットのサイズを得る
	b = byte(fs.ReadByte());
	p_size = 2 << (b & 7);
	//2バイト分進む
	fs.Seek(2, SeekOrigin.Current);
	//パレットを読んで
	//もしold_colorだったらnew_colorで書く
	for(i = 0; i < p_size; i++) {
		fs.Read(color, 0, 3);
		if(color[0] == old_color[0]
				&& color[1] == old_color[1] && color[2] == old_color[2]) {
			fs.Seek(-3, SeekOrigin.Current);
			fs.Write(new_color, 0, 3);
		}
	}
}
catch(e) {
	System.Console.Error.WriteLine("error : " + args[1] + " not GIF.");
	Environment.Exit(1);
}

fs.Close();
