/*****************************************************************************\ * * * Name : dump_bytes * * Author : Chris Koeritz * * * * Purpose: * * * * Prints the files specified out in terms of their hex bytes. * * * ******************************************************************************* * Copyright (c) 1991-$now By Author. This program is free software; you can * * redistribute it and/or modify it under the terms of the GNU General Public * * License as published by the Free Software Foundation; either version 2 of * * the License or (at your option) any later version. This is online at: * * http://www.fsf.org/copyleft/gpl.html * * Please send any updates to: fred@gruntose.com * \*****************************************************************************/ #include #include #include #include #include #include using namespace application; using namespace basis; using namespace loggers; using namespace filesystem; using namespace structures; using namespace textual; ///HOOPLE_STARTUP_CODE; const int MAXIMUM_BYTEDUMP_BUFFER_SIZE = 32768; // this is the size of the chunk we read from the files at a time. it is // important to make this a multiple of 16, since that's the size of the line // we use in the byte dumping. #define console program_wide_logger::get() int print_instructions_and_exit(char *program_name) { console.log(astring(astring::SPRINTF, "\n\ Usage:\n\t%s filename [filename]\n\n\ Prints out (on standard output) a abyte dump of the files specified.\n\n", program_name), ALWAYS_PRINT); return 12; } int main(int argc, char *argv[]) { SETUP_CONSOLE_LOGGER; if (argc <= 1) return print_instructions_and_exit(argv[0]); else { int current_parameter = 0; /* if (argv[1][0] == '-') { if (argv[1][1] == 't') { current_parameter++; open_file_as_text = true; } else if (argv[1][1] == 'b') { current_parameter++; open_file_as_text = false; } else print_instructions_and_exit(argv[0]); } */ bool past_first_file = false; while (++current_parameter < argc) { if (past_first_file) { // we're into the second file so start using some white space. console.log(astring::empty_string(), ALWAYS_PRINT); console.log(astring::empty_string(), ALWAYS_PRINT); } past_first_file = true; // set condition for next time. astring name = argv[current_parameter]; byte_filer current(name, "rb"); if (!current.good()) { console.log(astring("Cannot find the file named \"") + name + astring("\"."), ALWAYS_PRINT); continue; } abyte buff[MAXIMUM_BYTEDUMP_BUFFER_SIZE + 10]; // buffer plus some extra room. bool printed_header = false; int current_label = 0; while (true) { int bytes_read = current.read(buff, MAXIMUM_BYTEDUMP_BUFFER_SIZE); if (bytes_read <= 0) break; // no contents. //console.log(astring(astring::SPRINTF, "read %d bytes", bytes_read)); if (!printed_header) { console.log(name + ":", ALWAYS_PRINT); console.log(astring::empty_string(), ALWAYS_PRINT); // blank line. printed_header = true; } astring to_log = byte_formatter::text_dump(buff, bytes_read, current_label); if (to_log[to_log.end()] == '\n') to_log.zap(to_log.end(), to_log.end()); console.log(to_log, ALWAYS_PRINT); current_label += bytes_read; } } } return 0; }