//hexdump utility //Time-stamp: #include #include typedef enum {false, true} bool; int main(int argc, char *argv[]); void printAscii(unsigned char *p, int len); void errexit(char* s); bool euc = false; //false..print ASCII, true.. print EUC-JP kanji int main(int argc, char *argv[]){ FILE *fin; unsigned long off = 0; //offset from topOfFile (byte) unsigned char b; //byte unsigned char line[16]; bool deci = false; //false..print offset as hexa, true.. as decimal char *fname = NULL; /* * 引数処理 */ if(argc<=1 || argc>=5){ fprintf(stderr, "hd - hexdump utility\n" "usage: hd [option] file\n" "option: -d print offset as decimal (default: hexadecimal)\n" " -e print EUC-JP kanji (default: ASCII)\n" ); exit(EXIT_FAILURE); }else{ int i; for(i=1; i=0xa1 && n<=0xfe){ //EUC-JP if(idx==1){ idx = 2; }else{ //idx==(-1, 0, 2) idx = 1; } }else if(n>=0x20 && n<=0x7e){ //ASCII idx = 0; }else{ //CTRL code idx = -1; } /* * 0x80以降を表示する条件: * * 1) EUC-JP表示が指定されている(euc==true) * 2) i==0 (表示の端)で * EUCの1バイト目 * 3) i==15 && * EUCの2バイト目 * 4)それ以外のi && * EUC-JPの領域である */ if(euc==true && ((i==0&&idx==1) || (i==15&&idx==2) || (i!=0&&i!=15&&idx>=1)) ){ printf("%c", n); }else if(idx==0){ //iが端のときでも ASCII なら表示する printf("%c", n); }else{ printf("."); } } printf("\n"); } void errexit(char* s){ fprintf(stderr, "\nerror: %s\n", s); exit(EXIT_FAILURE); } //end of file