/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCCEbcdicSinSoutCut
*   ソースファイル名：JCCEbcdicSinSoutCut.java
*   作成者          ：富士通
*   日付            ：2012年09月14日
*＜機能概要＞
*　EBCDICコードで作成されたファイルからシフトイン(0x0e)と
*　シフトアウト(0x0f)コードを取り除く。
*＜修正履歴＞
*   バージョン  修正日       修正者    修正内容
*   v1.00.00    2012/09/14   富士通    新規作成
*   v5.00.00    2013/11/14   FJ        処理時間短縮対応
**********************************************************************/
package eo.common.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * EBCDICコードで作成されたファイルからシフトイン(0x0e)と
 * シフトアウト(0x0f)コードを取り除く。
 * <BR>
 * @author 富士通
 */

public class JCCEbcdicSinSoutCut {

	/**
	 * mainメソッド
	 * @param args 第一引数：変換元ファイルパス、第二引数：変換先ファイルパス
	 * @return 実施結果（0：正常終了、それ以外：エラー終了）
	 */
	private int cutSf(String[] args) {

		InputStream fis = null;
		OutputStream fos = null;

		try
		{
			// パラメタ数のチェック
			if(args.length < 2)
			{
				return 1;
			}
			
			// 変換元ファイルパス
			String befFilePath = args[0];
			// 変換後ファイルパス
			String afFilePath = args[1];
			
			// 変換元ファイルの入力ストリームを生成
			try
			{
				fis = new BufferedInputStream(new FileInputStream(new File(befFilePath)));
			}
			catch (FileNotFoundException e)
			{
				return 2;
			}
			
			// 変換先ファイルの出力ストリームを生成
			try
			{
				fos = new BufferedOutputStream(new FileOutputStream(new File(afFilePath)));
			} catch (FileNotFoundException e)
			{
				return 3;
			}

			// 変換元ファイルを読み込み、変換先ファイルへ出力
			try
			{
				// 変換元ファイルを1バイトづつ読み込み、シフトイン(0x0e)、シフトアウト(0x0f)を取り除く
				int i;
				// 0x0eの開始フラグ
				boolean eFlg = false;
				// 0x0e開始からの文字数カウンタ
				int ecount = 0;
				while((i = fis.read()) != -1)
				{
					String sinsout = Integer.toHexString(i);
					
					// 0x0eからの文字数カウンタをカウントアップ
					if(eFlg)
					{
						ecount++;
					}
					// 0x0eの開始フラグを設定し、次バイトへ処理を進める。
					if("e".equals(sinsout) && ecount == 0)
					{
						eFlg = true;
						continue;
					}
					// 0x0eからのカウンタが偶数もしくは0x0e、0x0f以外なら書き込み
					if((ecount != 0 && ecount % 2 == 0) ||
							(!"e".equals(sinsout) && !"f".equals(sinsout)))
					{
						fos.write(i);
						continue;
					}
					// 0x0fが来たらファイルへ書き込まずカウンタ、フラグを初期化
					if("f".equals(sinsout) && ecount != 0)
					{
						eFlg = false;
						ecount = 0;
						continue;
					}
				}
			}
			catch (IOException e)
			{
				return 4;
			}
			
			// 正常終了
			return 0;
		}
		finally
		{
			try
			{
				// リソースの解放
				if(fis != null)
				{
					fis.close();
				}
				if(fos != null)
				{
					fos.close();
				}
			}
			catch (IOException e)
			{
				return 5;
			}
		}

	}

	/**
	 * mainメソッド
	 * @param args 第一引数：変換元ファイルパス、第二引数：変換先ファイルパス
	 */
	public static void main(String[] args) {
		int result = (new JCCEbcdicSinSoutCut()).cutSf(args);
		if (result > 0) {
			System.exit(result);
		}
	}
}
