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: }