aboutsummaryrefslogtreecommitdiff
path: root/project/dclib/dclib-xdump.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--project/dclib/dclib-xdump.h348
1 files changed, 348 insertions, 0 deletions
diff --git a/project/dclib/dclib-xdump.h b/project/dclib/dclib-xdump.h
new file mode 100644
index 0000000..2943cb4
--- /dev/null
+++ b/project/dclib/dclib-xdump.h
@@ -0,0 +1,348 @@
+
+/***************************************************************************
+ * *
+ * _____ ____ *
+ * | __ \ / __ \ _ _ _____ *
+ * | | \ \ / / \_\ | | | | _ \ *
+ * | | \ \| | | | | | |_| | *
+ * | | | || | | | | | ___/ *
+ * | | / /| | __ | | | | _ \ *
+ * | |__/ / \ \__/ / | |___| | |_| | *
+ * |_____/ \____/ |_____|_|_____/ *
+ * *
+ * Wiimms source code library *
+ * *
+ ***************************************************************************
+ * *
+ * Copyright (c) 2012-2020 by Dirk Clemens <wiimm@wiimm.de> *
+ * *
+ ***************************************************************************
+ * *
+ * 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 program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * See file gpl-2.0.txt or http://www.gnu.org/licenses/gpl-2.0.txt *
+ * *
+ ***************************************************************************/
+
+#ifndef DCLIB_XDUMP_H
+#define DCLIB_XDUMP_H 1
+
+#include "dclib-basics.h"
+
+//
+///////////////////////////////////////////////////////////////////////////////
+/////////////// consts and structs ///////////////
+///////////////////////////////////////////////////////////////////////////////
+
+#define XDUMP_MAX_BYTES_PER_LINE 600
+#define XDUMP_GOOD_NUM_BUF_SIZE (6*XDUMP_MAX_BYTES_PER_LINE+1)
+#define XDUMP_GOOD_TEXT_BUF_SIZE (XDUMP_MAX_BYTES_PER_LINE+1)
+
+#define XDUMP_MAX_LINE_WIDTH (XDUMP_GOOD_NUM_BUF_SIZE+XDUMP_GOOD_TEXT_BUF_SIZE+30)
+
+///////////////////////////////////////////////////////////////////////////////
+// [[XDumpCommand_t]]
+
+typedef enum XDumpCommand_t
+{
+ XDUMPC_DUMP,
+ XDUMPC_DIFF,
+ XDUMPC_SCAN,
+ XDUMPC__N
+}
+__attribute__ ((packed)) XDumpCommand_t;
+
+extern const ccp XDumpCommandName[XDUMPC__N];
+
+///////////////////////////////////////////////////////////////////////////////
+// [[XDumpFormat_t]]
+
+typedef enum XDumpFormat_t
+{
+ XDUMPF_AUTO,
+ XDUMPF_INT_1,
+ XDUMPF_INT_2,
+ XDUMPF_INT_3,
+ XDUMPF_INT_4,
+ XDUMPF_INT_5,
+ XDUMPF_INT_6,
+ XDUMPF_INT_7,
+ XDUMPF_INT_8,
+ XDUMPF_FLOAT,
+ XDUMPF_DOUBLE,
+ XDUMPF__N,
+}
+__attribute__ ((packed)) XDumpFormat_t;
+
+extern const ccp XDumpFormatName[XDUMPF__N];
+extern const char XDumpFormatOption[XDUMPF__N+1];
+
+///////////////////////////////////////////////////////////////////////////////
+// [[XDumpOutputFunc]]
+
+struct XDump_t;
+typedef int (*XDumpOutputFunc)
+(
+ struct XDump_t *xd, // internal copy of params
+ ccp prefix, // NULL or additional prefix (used by diff)
+ ccp dump, // dump to print
+ ccp text // text to print
+);
+
+int XDumpStandardOutput
+(
+ struct XDump_t *xd, // internal copy of params
+ ccp prefix, // NULL or additional prefix (used by diff)
+ ccp dump, // dump to print
+ ccp text // text to print
+);
+
+///////////////////////////////////////////////////////////////////////////////
+// [[XDumpDumpFunc]]
+
+typedef int (*XDumpDumpFunc)
+(
+ // returns <0 on error, or number of dumped bytes
+
+ struct XDump_t *xd, // current params
+ const void *data, // data to dump
+ uint size, // size of 'data'
+ bool term // false: print only whole lines
+ // true: print complete data
+);
+
+///////////////////////////////////////////////////////////////////////////////
+// [[XDump_t]]
+
+typedef struct XDump_t
+{
+ //--- options
+
+ XDumpCommand_t cmd; // command
+ XDumpFormat_t format; // scan or output format
+ dcEndian_t endian; // endian
+
+ bool mode_dec; // print integers as decimal instead of hex
+ bool mode_zero; // print leading zeros
+ bool mode_c; // print in c format
+ bool mode_align; // align addresses by 'addr % bytes_per_line'
+ bool mode_ignore; // ignore lines with NULL bytes only
+
+ bool print_format; // print an info line about the format
+ bool print_addr; // print address field
+ bool print_number; // print number field
+ bool print_endmarker;// print "/" as end of data marker
+ bool print_text; // print ascii text field
+ bool print_summary; // print a summary at end of dump
+ bool print_diff_sep; // print an empty line after differ lines
+
+ bool have_trigger; // true: trigger is active
+ u64 trigger; // the trigger value
+
+ u64 start_addr; // start address
+ u64 assumed_size; // assumed output size, used for 'addr_fw'
+ uint min_addr_fw; // min field width of address
+ uint max_addr_fw; // max field width of address; 0=AUTO
+ uint min_number_fw; // >0: minimal field width for number dump
+ uint min_width; // minimal output width in bytes per line
+ uint max_width; // maximal output width in bytes per line
+ int extra_space; // >0: print an extra space after each # column
+ // =0: auto
+
+ FILE *f; // not NULL: output file
+ int indent; // indention before 'prefix'
+ ccp prefix; // not NULL: prefix each line by this
+ ccp eol; // NULL or eol
+
+ XDumpOutputFunc out_func; // NULL or a private function
+
+
+ //--- user parameters, not used, not changed
+
+ int user_int;
+ void *user_ptr;
+
+
+ //--- runtime parameters
+
+ ccp num_format1; // pointer to first numeric format
+ ccp num_format2; // pointer to second numeric format
+ uint num_format_fw; // current field width of a number
+ uint max_format_fw; // max possible fw for format
+ ccp format_name; // name of the format
+
+ u64 written; // total written bytes
+ u64 addr; // current address
+ uint addr_fw; // field width of address
+ const u64 *addr_break; // NULL or null terminated list:
+ // break line at this addresses
+
+ uint bytes_per_col; // bytes per column
+ uint cols_per_line; // columns per line
+ uint bytes_per_line; // bytes per line
+ uint col_space; // >0: print an extra space after each # column
+ uint null_lines; // number of currently skipped NULL lines
+
+ bool format_printed; // true: format line printed
+ uint last_number_fw; // last field with of number column
+ uint diff_count; // number of lines with differences
+ uint diff_size; // <0: size1>size2 / >0: size1>size2
+
+ //--- functions
+
+ XDumpDumpFunc dump_func; // dump processing function
+ const endian_func_t *endian_func; // endian functions
+}
+XDump_t;
+
+//-----------------------------------------------------------------------------
+
+void InitializeXDump ( XDump_t *xd );
+void SetupXDump ( XDump_t *xd, XDumpCommand_t cmd );
+
+static inline void ResetXDump ( XDump_t *xd ) {}
+
+void PrintXDumpParam
+(
+ FILE *f, // output file, abort if NULL
+ int indent, // indention
+ const ColorSet_t *colset, // NULL or color set
+ const XDump_t *xd // data to print
+);
+
+//
+///////////////////////////////////////////////////////////////////////////////
+/////////////// dump interface ///////////////
+///////////////////////////////////////////////////////////////////////////////
+
+int XDump
+(
+ // returns <0 on error, or number of dumped bytes
+ XDump_t *xd, // params; if NULL: use local version
+ const void *data, // data to dump
+ uint size, // size of 'data'
+ bool term // false: print only whole lines
+ // true: print complete data
+);
+
+///////////////////////////////////////////////////////////////////////////////
+
+int XDumpByFile
+(
+ // returns <0 on error, or number of dumped bytes
+ XDump_t *xd, // params; if NULL: use local version
+ FILE *f, // input file
+ u64 max_size // >0: limit size to print
+);
+
+///////////////////////////////////////////////////////////////////////////////
+
+int XDump16 // wrapper for a standard hexdump
+(
+ // returns <0 on error, or number of dumped bytes
+
+ FILE *f_out, // output file
+ int indent, // indention
+ u64 addr, // start address
+ const void *data, // data
+ uint size // size of 'data'
+);
+
+//
+///////////////////////////////////////////////////////////////////////////////
+/////////////// diff interface ///////////////
+///////////////////////////////////////////////////////////////////////////////
+
+int XDiff
+(
+ // returns <0 on error, or number of dumped bytes
+ XDump_t *xd, // params; if NULL: use local version
+
+ const void *data1, // data1 to compare
+ uint size1, // size of 'data1'
+ bool term1, // true: 'data1' completed
+
+ const void *data2, // data2 to compare
+ uint size2, // size of 'data2'
+ bool term2, // true: 'data2' completed
+
+ uint limit_lines, // >0: limit number of differ-lines
+ bool colorize // true: use red and green on output
+);
+
+///////////////////////////////////////////////////////////////////////////////
+
+int XDiffByFile
+(
+ // returns <0 on error, or number of dumped bytes
+ XDump_t *xd, // params; if NULL: use local version
+ FILE *f1, // first input file
+ FILE *f2, // second input file
+ u64 max_size, // >0: limit comparing size
+ uint limit_lines, // >0: limit number of differ-lines
+ bool colorize // true: use red and green on output
+);
+
+///////////////////////////////////////////////////////////////////////////////
+
+int XDiff16
+(
+ // returns <0 on error, or number of dumped bytes
+
+ FILE *f_out, // output file
+ int indent, // indention
+ u64 addr, // start address
+
+ const void *data1, // data
+ uint size1, // size of 'data'
+
+ const void *data2, // data
+ uint size2, // size of 'data'
+
+ uint limit_lines, // >0: limit number of differ-lines
+ bool colorize // true: use red and green on output
+);
+
+//
+///////////////////////////////////////////////////////////////////////////////
+/////////////// scan interface ///////////////
+///////////////////////////////////////////////////////////////////////////////
+
+int XScan
+(
+ // returns <0 on error, or number of dumped bytes
+ XDump_t *xd, // params; if NULL: use local version
+ FastBuf_t *dest, // not NULL: append scanned data here
+
+ const void *data, // data to scan
+ uint size, // size of 'data'
+ bool term, // true: accept uncomplete last line
+ u64 max_size // >0: limit output size
+);
+
+///////////////////////////////////////////////////////////////////////////////
+
+s64 XScanByFile
+(
+ // returns <0 on error, or number of written bytes
+ XDump_t *xd, // params; if NULL: use local version
+ FastBuf_t *dest, // not NULL: append scanned data here
+ FILE *f, // input file
+ u64 max_size // >0: limit output size
+);
+
+//
+///////////////////////////////////////////////////////////////////////////////
+/////////////// E N D ///////////////
+///////////////////////////////////////////////////////////////////////////////
+
+#endif // DCLIB_XDUMP_H
+