00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <iostream>
00018 #include <iomanip>
00019 #include <sstream>
00020 #include <string.h>
00021 #include <stdlib.h>
00022 #include <limits.h>
00023 #include "i18n.h"
00024
00025 using namespace std;
00026
00027 bool IsHexData(const char *str)
00028 {
00029 for( int i = 0; i < 4 && *str; str++, i++ )
00030 if( *str != ' ' )
00031 return false;
00032
00033 for( int i = 0; i < 8 && *str; str++, i++ )
00034 if( !isdigit(*str) && !(*str >= 'a' && *str <= 'f') )
00035 return false;
00036
00037 if( *str != ':' )
00038 return false;
00039
00040 return true;
00041 }
00042
00043 void PrintHex(const char *str)
00044 {
00045 cout << setiosflags(ios::left) << setw(14 + 16 * 3 + 1) << str;
00046 cout << setw(0);
00047 str += 14;
00048 char *endpos = (char*) str;
00049 while( *endpos ) {
00050 long c = strtol(str, &endpos, 16);
00051 if( c == LONG_MIN || c == LONG_MAX )
00052 break;
00053 if( isprint(c) )
00054 cout << (char)c;
00055 else
00056 cout << '.';
00057 str = endpos;
00058 }
00059 cout << '\n';
00060 }
00061
00062 int main()
00063 {
00064 INIT_I18N(PACKAGE);
00065
00066 cout.sync_with_stdio(false);
00067
00068 while( cin ) {
00069 char buff[1024];
00070 cin.getline(buff, sizeof(buff));
00071 if( IsHexData(buff) ) {
00072
00073 size_t sln = strlen(buff);
00074 while( sln && (buff[sln] == 0 || isspace(buff[sln])) ){
00075 buff[sln--] = 0;
00076 }
00077 PrintHex(buff);
00078 }
00079 else {
00080 cout << buff << "\n";
00081 }
00082
00083 if( cin.fail() && !cin.eof() ) {
00084
00085
00086 while( cin.fail() && !cin.eof() ) {
00087 cin.clear();
00088 cin.getline(buff, sizeof(buff));
00089 }
00090 }
00091 }
00092 }
00093