diff --git a/src/hex.c b/src/hex.c index b9e0748..38001c4 100644 --- a/src/hex.c +++ b/src/hex.c @@ -18,7 +18,11 @@ void init_flags(struct flags* flags) flags->offset = 0; + flags->littleendian = false; + flags->octets = 2; + flags->customoctets = false; + flags->len = -1; // -1 means til EOF flags->uppercase = false; flags->decimaloffset = false; @@ -30,19 +34,37 @@ void init_flags(struct flags* flags) flags->cap_c_style = false; } -void init_cols(struct flags* flags) +static void init_octets(struct flags* flags) +{ + if (flags->customoctets) + return; + + if (flags->littleendian) + flags->octets = 4; + else + flags->octets = 2;; +} + +static void init_cols(struct flags* flags) { if (flags->customcols) return; - if (flags->postscript == true) + if (flags->postscript) flags->cols = 30; - else if (flags->c_style == true) + else if (flags->c_style) flags->cols = 12; else flags->cols = 16; } +void init_var_defaults(struct flags* flags) +{ + init_octets(flags); + init_cols(flags); +} + + void free_hex_chunk(hex_chunk_t* chunk) { free(chunk->text); @@ -124,13 +146,20 @@ static void write_octet(char a, char b, FILE* stream) a, b, (newline ? green_str : "")); } +static void display_octet(char* text, FILE* stream) +{ + uint i; + for (i = 0; i < (flags.octets * 2); i += 2) + write_octet(((text) + i)[0], ((text) + i)[1], stream); +} + static void standard_output(char** text, FILE* stream) { - uint i, j; + uint i; for (i = 0; i < (flags.cols * 2); i += (flags.octets * 2)) { - for (j = 0; j < (flags.octets * 2); j += 2) - write_octet(((*text) + i + j)[0], ((*text) + i + j)[1], stream); + display_octet(((*text) + i), stream); + if (!flags.postscript) fprintf(stream, " "); } diff --git a/src/include/hex.h b/src/include/hex.h index 64da916..5766682 100644 --- a/src/include/hex.h +++ b/src/include/hex.h @@ -27,9 +27,13 @@ struct flags { uint cols; // choose the amount of columns to display (default 16) // done bool customcols; + bool littleendian; + uint offset; uint octets; // number of octets per line (default 2) // done + bool customoctets; + int len; // max len to stop at //done bool uppercase; // do uppercase hex chars // done bool decimaloffset; // do decimal offset instead of hex // done @@ -44,7 +48,7 @@ struct flags { // TODO: implement flags and stuff void init_flags(struct flags* flags); -void init_cols(struct flags* flags); +void init_var_defaults(struct flags* flags); void free_hex_chunk(hex_chunk_t* chunk); void add_text_to_chunk(char* src, char** dst); diff --git a/src/main.c b/src/main.c index c871d5a..4866623 100644 --- a/src/main.c +++ b/src/main.c @@ -23,6 +23,7 @@ static struct argp_option options[] = { {0, 'C', 0, 0, "capitalize variable names in C include file style (-i).", 0}, {0, 'n', "name", 0, "set the variable name used in C include output (-i).", 0}, {0, 'o', "off", 0, "add to the displayed file position.", 0}, + {0, 'e', 0, 0, "little-endian dump (incompatible with -ps,-i,-r).", 0}, {0} }; @@ -42,10 +43,14 @@ static error_t parse_opt(int key, char* arg, struct argp_state* state) break; case 'g': flags->octets = atoi(arg); + flags->customoctets = true; break; case 'o': flags->offset = atoi(arg); break; + case 'e': + flags->littleendian = true; + break; case 'R': if (strcmp(arg, "none") == 0) flags->coloured = false; @@ -204,7 +209,7 @@ int main(int argc, char* argv[]) argp_parse(&argp, argc, argv, 0, 0, &flags); - init_cols(&flags); + init_var_defaults(&flags); do_text_parse(&lines, (flags.files[0] == NULL ? true : false));