MUSASHI C source: xt2ppm.c
0001: /*============================================================================*/
0002: /* 変更履歴 */
0003: /*----------------------------------------------------------------------------*/
0004: /* 1.0 : 新規作成(2003/08/07) */
0005: /*============================================================================*/
0006: #include <musashi.h>
0007: #include <stdlib.h>
0008: #include <string.h>
0009: #include <limits.h>
0010:
0011: #include <xt2ppmHelp.h>
0012: struct mssComHelp comHelp={
0013: "xt2ppm", /* コマンド名 */
0014: "1.0", /* バージョン */
0015: HELPT, /* コマンドタイトル */
0016: HELPS, /* 要約 */
0017: HELPE, /* 利用例 */
0018: HELPR, /* 参照コマンド */
0019: HELPA, /* 作者情報 */
0020: HELPB, /* バグレポート情報 */
0021: HELPH /* ホームページ */
0022: };
0023:
0024: extern struct mssGlobalVariables mssGV;
0025:
0026: int main(int argc, char *argv[]){
0027: /*============================================================================*/
0028: /* オプション宣言&定義 */
0029: /*============================================================================*/
0030: /*----------------------------------------------------------------------------*/
0031: /* X */
0032: /*----------------------------------------------------------------------------*/
0033: MssOptFLD optX={
0034: OFLD, /* オプションタイプ */
0035: "H", /* キーワード(複数文字は不可) */
0036: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0037: 1, /* 指定可能な最大項目数 */
0038: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0039: 0, /* 正規表現を許可するかどうか(0:不可,1:可) */
0040: 0, /* 新項目名を指定できるかどうか(0:不可,1:可) */
0041: NULL, /* 項目オプション(%以下)で指定可能な文字 */
0042: /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能 */
0043: HOLT, /* このオプションのタイトル(Helpで表示) */
0044: HOLC, /* このオプションのコメント(Helpで表示) */
0045: HOLF /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る */
0046: };
0047:
0048: /*----------------------------------------------------------------------------*/
0049: /* Y */
0050: /*----------------------------------------------------------------------------*/
0051: MssOptFLD optY={
0052: OFLD, /* オプションタイプ */
0053: "V", /* キーワード(複数文字は不可) */
0054: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0055: 1, /* 指定可能な最大項目数 */
0056: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0057: 0, /* 正規表現を許可するかどうか(0:不可,1:可) */
0058: 0, /* 新項目名を指定できるかどうか(0:不可,1:可) */
0059: NULL, /* 項目オプション(%以下)で指定可能な文字 */
0060: /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能 */
0061: HOLT, /* このオプションのタイトル(Helpで表示) */
0062: HOLC, /* このオプションのコメント(Helpで表示) */
0063: HOLF /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る */
0064: };
0065:
0066: /*----------------------------------------------------------------------------*/
0067: /* RGB */
0068: /*----------------------------------------------------------------------------*/
0069: MssOptFLD optRGB={
0070: OFLD, /* オプションタイプ */
0071: "c", /* キーワード(複数文字は不可) */
0072: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0073: 3, /* 指定可能な最大項目数 */
0074: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0075: 0, /* 正規表現を許可するかどうか(0:不可,1:可) */
0076: 0, /* 新項目名を指定できるかどうか(0:不可,1:可) */
0077: NULL, /* 項目オプション(%以下)で指定可能な文字 */
0078: /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能 */
0079: RGBT, /* このオプションのタイトル(Helpで表示) */
0080: RGBC, /* このオプションのコメント(Helpで表示) */
0081: RGBF /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る */
0082: };
0083:
0084: /*----------------------------------------------------------------------------*/
0085: /* 要素の最大値 */
0086: /*----------------------------------------------------------------------------*/
0087: MssOptINT optMAX={
0088: OINT, /* オプションタイプ */
0089: "M", /* キーワード(複数文字は不可) */
0090: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0091: 0, /* デフォルト(数値として指定) */
0092: 1, /* 最小値 */
0093: INT_MAX,/* 最大値 */
0094: MAXT, /* このオプションのタイトル(Helpで表示) */
0095: MAXC /* このオプションのコメント(Helpで表示) */
0096: };
0097:
0098: /*----------------------------------------------------------------------------*/
0099: /* サイズ */
0100: /*----------------------------------------------------------------------------*/
0101: MssOptILS optSIZ={
0102: OILS, /*オプションタイプ*/
0103: "S", /* キーワード(複数文字は不可) */
0104: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0105: NULL, /*デフォルト(文字列で) */
0106: 2, /*リスト要素の最大数 */
0107: 1, /*要素の最小値 */
0108: 3200, /*要素の最大値 */
0109: SIZT, /*パラメータタイトル */
0110: SIZC /*パラメータコメント */
0111: };
0112:
0113: /*----------------------------------------------------------------------------*/
0114: /* NULL */
0115: /*----------------------------------------------------------------------------*/
0116: MssOptILS optNUL={
0117: OILS, /*オプションタイプ*/
0118: "n", /* キーワード(複数文字は不可) */
0119: 0, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0120: "0,0,0",/*デフォルト(文字列で) */
0121: 3, /*リスト要素の最大数 */
0122: 0, /*要素の最小値 */
0123: INT_MAX,/*要素の最大値 */
0124: NULT, /*パラメータタイトル */
0125: NULC /*パラメータコメント */
0126: };
0127:
0128: /*----------------------------------------------------------------------------*/
0129: /* 入力ファイル */
0130: /*----------------------------------------------------------------------------*/
0131: MssOptINF optINF={
0132: OINF, /* オプションタイプ */
0133: "i", /* キーワード(複数文字は不可) */
0134: 0, /* 0:オプション, 1:必須 */
0135: 1, /* 指定可能の最大ファイル数 */
0136: 0, /*1:file not foundのエラーで終了しない 0:する */
0137: INFT, /* このオプションのタイトル(Helpで表示) */
0138: INFC /* このオプションのコメント(Helpで表示) */
0139: };
0140:
0141: /*----------------------------------------------------------------------------*/
0142: /* 出力ファイル */
0143: /*----------------------------------------------------------------------------*/
0144: MssOptOTF optOTF={
0145: OOTF, /* オプションタイプ */
0146: "o", /* キーワード(複数文字は不可) */
0147: 0, /* 0:オプション, 1:必須 */
0148: OTFT, /* このオプションのタイトル(Helpで表示) */
0149: OTFC /* このオプションのコメント(Helpで表示) */
0150: };
0151:
0152: /*----------------------------------------------------------------------------*/
0153: /* ワークファイル用ディレクトリ名 */
0154: /*----------------------------------------------------------------------------*/
0155: MssOptSTR optTMP={
0156: OSTR, /* オプションタイプ */
0157: "T", /* キーワード(複数文字は不可) */
0158: 0, /* 0:オプション, 1:必須 */
0159: MssTempDir, /* デフォルト */
0160: 1, /* 文字列の最小長 */
0161: MssFileNameMaxLen, /* 文字列の最大長 */
0162: TMPT, /* このオプションのタイトル(Helpで表示) */
0163: TMPC /* このオプションのコメント(Helpで表示) */
0164: };
0165:
0166: /*----------------------------------------------------------------------------*/
0167: /* オプションをまとめる */
0168: /*----------------------------------------------------------------------------*/
0169: void *opt[]={&optX,&optY,&optRGB,&optMAX,&optSIZ,&optNUL,
0170: &optINF,&optOTF,&optTMP,NULL};
0171:
0172: /*============================================================================*/
0173: /* 変数宣言&定義 */
0174: /*============================================================================*/
0175: struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/
0176:
0177: struct mssFPR *fpr; /*入力ファイル構造体*/
0178: struct mssFPW *fpw; /*出力ファイル構造体*/
0179: struct mssFldRec *fr; /*項目-行バッファ構造体*/
0180: struct mssFields *sf; /*ソート項目構造体 */
0181: int sorted; /*ソート済チェック用 */
0182:
0183: int depthMax;
0184: int xSize,ySize;
0185: int x,y;
0186: int xv,yv,rv,gv,bv;
0187: int xNo,yNo,rNo,gNo,bNo;
0188: int readNext;
0189:
0190: /*------------------------------------------------------------------------------
0191: パラメータ処理
0192: ------------------------------------------------------------------------------*/
0193: mssInit(argc,argv,&comHelp); /* シグナル処理などの初期化 */
0194: mssHelpDoc(opt,&comHelp,argc,argv); /* ヘルプ */
0195: mssSetOption(opt,argc,argv); /* コマンドオプションの設定 */
0196:
0197: if(optRGB.cnt!=3){
0198: mssShowErrMsg("-c must have three fields");
0199: mssEnd(mssErrorNoDefault);
0200: }
0201:
0202: if(optSIZ.cnt!=2){
0203: mssShowErrMsg("-M must have two values (X size,Y size)");
0204: mssEnd(mssErrorNoDefault);
0205: }
0206:
0207: if(optNUL.set){
0208: if(optNUL.cnt!=3){
0209: mssShowErrMsg("-n must have three values");
0210: mssEnd(mssErrorNoDefault);
0211: }
0212: }
0213:
0214: depthMax=optMAX.val;
0215: xSize=*(optSIZ.val+0);
0216: ySize=*(optSIZ.val+1);
0217:
0218: fpr=mssOpenFPR(optINF.str,4); /* 入力ファイルオープン */
0219: hdi=mssReadHeader(fpr); /* ヘッダの読み込み */
0220: mssSetOptFld(&optX, hdi); /* -H 項目をヘッダー項目に関連づける */
0221: mssSetOptFld(&optY, hdi); /* -V 項目をヘッダー項目に関連づける */
0222: mssSetOptFld(&optRGB, hdi); /* -c 項目をヘッダー項目に関連づける */
0223:
0224: /*ソート項目の作成*/
0225: sf=mssInitFields();
0226: mssAddFieldsByFields(sf,optY.flds); /* -V 項目をソート項目としてセット */
0227: mssAddFieldsByFields(sf,optX.flds); /* -H 項目をソート項目としてセット */
0228: mssSetFldInfoSort(*(sf->fi+0),1,0,1); /*数値ソートとして*/
0229: mssSetFldInfoSort(*(sf->fi+1),2,0,1); /*数値ソートとして*/
0230: sorted=mssChkSorted(sf,hdi); /* ソート済かチェック */
0231:
0232: /*----------------------------------------------------------------------------*/
0233: /*出力ヘッダーの作成と出力 */
0234: /*----------------------------------------------------------------------------*/
0235: /*標準出力オープン+ヘッダーの出力*/
0236: fpw=mssOpenFPW(optOTF.str,0,0);
0237:
0238: /*----------------------------------------------------------------------------*/
0239: /*メインルーチン */
0240: /*----------------------------------------------------------------------------*/
0241: /*ソートが必用ならばソートしてソート済みファイルとしてオープン*/
0242: if(sorted!=2){
0243: fpr=mssReopenFPRsort(fpr,4,sf,hdi->flds->cnt,optTMP.str);
0244: }
0245:
0246: /*x,y,r,g,bの項目番号をセット*/
0247: xNo=MssFlds2num(optX .flds,0);
0248: yNo=MssFlds2num(optY .flds,0);
0249: rNo=MssFlds2num(optRGB.flds,0);
0250: gNo=MssFlds2num(optRGB.flds,1);
0251: bNo=MssFlds2num(optRGB.flds,2);
0252:
0253: /*ppm ヘッダー*/
0254: mssWriteStr("P3",fpw);
0255: mssWriteRet(fpw);
0256: mssGV.outCnt++;
0257: mssWriteInt(xSize,fpw);
0258: mssWriteStr(" ",fpw);
0259: mssWriteInt(ySize,fpw);
0260: mssWriteRet(fpw);
0261: mssGV.outCnt++;
0262: mssWriteInt(depthMax,fpw);
0263: mssWriteRet(fpw);
0264: mssGV.outCnt++;
0265:
0266: fr=mssInitFldRec(hdi->flds->cnt);
0267:
0268: readNext=1;
0269: xv=yv=rv=gv=bv=0; /* to avoid waring message */
0270: for(y=0; y<ySize; y++){
0271: for(x=0; x<xSize; x++){
0272: if(readNext){
0273: if( EOF != mssReadFldRec(fpr,fr) ){
0274: mssGV.inCnt++;
0275: xv=atoi( *(fr->pnt+xNo) );
0276: yv=atoi( *(fr->pnt+yNo) );
0277: rv=atoi( *(fr->pnt+rNo) );
0278: gv=atoi( *(fr->pnt+gNo) );
0279: bv=atoi( *(fr->pnt+bNo) );
0280: }else{
0281: xv=-1;
0282: yv=-1;
0283: }
0284: }
0285: if(x==xv && y==yv && rv<=depthMax && gv<=depthMax && bv<=depthMax){
0286: mssWriteInt(rv,fpw);
0287: mssWriteStr(" ",fpw);
0288: mssWriteInt(gv,fpw);
0289: mssWriteStr(" ",fpw);
0290: mssWriteInt(bv,fpw);
0291: mssWriteRet(fpw);
0292: mssGV.outCnt++;
0293: readNext=1;
0294: }else{
0295: mssWriteInt(*(optNUL.val+0),fpw);
0296: mssWriteStr(" ",fpw);
0297: mssWriteInt(*(optNUL.val+1),fpw);
0298: mssWriteStr(" ",fpw);
0299: mssWriteInt(*(optNUL.val+2),fpw);
0300: mssWriteRet(fpw);
0301: mssGV.outCnt++;
0302: readNext=0;
0303: }
0304: }
0305: }
0306:
0307: mssFreeFldRec(fr);
0308:
0309: /*----------------------------------------------------------------------------*/
0310: /*フッター出力&終了処理 */
0311: /*----------------------------------------------------------------------------*/
0312: mssCloseFPR(fpr); /*入力ファイルのクローズ*/
0313: mssCloseFPW(fpw); /*出力ファイルのクローズ*/
0314: mssFreeHeader(hdi); /*入力ヘッダ領域開放*/
0315: mssFreeOption(opt); /*オプション領域開放*/
0316: mssShowEndMsg(); /*完了メッセージ*/
0317: mssEnd(mssExitSuccess); /*終了*/
0318: return(0); /* to avoid warning message*/
0319: }