/********************************************************************** *** HexDump.bat - Hexidecimal dump of the contents of a file. This *** *** examples program uses the CEnvi file routines. *** *** It calls upon NotePad to display the results of *** *** the dump. *** **********************************************************************/ #include #include main(argc,argv) { // prompt for file name if file wasn't passed in if ( argc == 1 ) { FileName = PromptForFile(); } else { if ( argc != 2 ) Instructions(); FileName = argv[1]; } if ( NULL == FileName || 0 == FileName[0] ) Instructions(); // get the name of the temporary destination file to write to DumpFileName = tmpnam(); // perform the dump operation. True for success else false if ( FileDump(FileName,DumpFileName) ) { // dump worked OK, so spawn notepad to view the result spawn(P_WAIT,"NotePad.exe",DumpFileName); } // remove the temporary file, whether it exists or not remove(DumpFileName); return(EXIT_SUCCESS); } FileDump(SrcFile,DstFile) { success = FALSE; // assume failure srcFP = fopen(SrcFile,"rb"); if ( NULL == srcFP ) Error("Could not open file %s for reading.",SrcFile); else { dstFP = fopen(DstFile,"wt"); if ( NULL == dstFP ) Error("Could not open file %s for writing."); else { fprintf(dstFP,"Hexidecimal dump of %s\n",SrcFile); Unprintables = "\a\b\t\r\n\032\033" success = TRUE; for ( offset = 0; 0 < (count = fread(data,16,srcFP)); offset += 16 ) { // display hex offset in file fprintf(dstFP,"%06X ",offset) // display hex value for each number for ( i = 0; i < count; i++ ) fprintf(dstFP,"%02X ",data[i]) // fill in any extra gaps if count < 16 while( i++ < 16 ) fprintf(dstFP," ") // display ascii value for each printable character // substitute a period for unprintable characters data[count] = 0; // string must be null-terminated while( (UnprintableIndex = strcspn(data,Unprintables)) < count ) data[UnprintableIndex] = '.'; fprintf(dstFP," %s\n",data) if ( count < 16 ) break } fclose(dstFP); } fclose(srcFP); } return(success); } PromptForFile() { return(GetOpenFileName(NULL,"HexDump File Selection")); } Error(FormatString,arg1,arg2,arg3/*etc...*/) { va_start(valist,FormatString); vsprintf(message,FormatString,valist); va_end(valist); MessageBox(message); } Instructions() { MessageBox( "HexDump.cmm - This is a Cmm program to display a hexidecimal dump of\n" " any file. Either execute with one argument, whcih is the\n" " name of the file to view, or with no arguments to be\n" " prompted for a file name." ); exit(EXIT_FAILURE); }