diff options
-rw-r--r-- | H64E-2/h64e-model.h | 2 | ||||
-rw-r--r-- | H64E-2/h64e.c | 706 | ||||
-rw-r--r-- | H64E-2/h64e.h | 14 | ||||
-rw-r--r-- | H64E-2/main.c | 99 |
4 files changed, 745 insertions, 76 deletions
diff --git a/H64E-2/h64e-model.h b/H64E-2/h64e-model.h index 6e5e32b..3692a26 100644 --- a/H64E-2/h64e-model.h +++ b/H64E-2/h64e-model.h @@ -44,4 +44,6 @@ int h64e_so_data_out(H64E_stream_out *out, uint8_t *data, int32_t size); int h64e_so_ready(H64E_stream_out *out); int h64e_so_len(H64E_stream_out *out); + + #endif /* h64e_model_h */ diff --git a/H64E-2/h64e.c b/H64E-2/h64e.c index a508fd3..39884ca 100644 --- a/H64E-2/h64e.c +++ b/H64E-2/h64e.c @@ -11,13 +11,14 @@ int h64e_init(H64E_t *s) { printf("init structure\n"); - s->fmt.column_size = 16; - s->fmt.offset_addr = 0; - s->fmt.flag_offset = 0; - s->fmt.flag_no_group = 0; - s->fmt.group = H64E_G_BYTE; + s->fmt.column_size = 16; + s->fmt.offset_addr = 0; + s->fmt.flag_offset = 0; + s->fmt.flag_no_group = 0; + s->fmt.flag_hex = 1; + s->fmt.group = H64E_G_BYTE; s->fmt.flag_output_types = 0; - s->fmt.output_type = H64E_O_NONE; + s->fmt.output_type = H64E_O_NONE; s->sin = NULL; s->sout = NULL; @@ -27,6 +28,11 @@ int h64e_init(H64E_t *s) int h64e_check_param( H64E_t *fmt ) { printf("Check parametrs set\n"); + if ((fmt->fmt.column_size % h64e_data_sz(fmt)) != 0) + { + printf("Column size %d vc data size %d should be congurent\n", fmt->fmt.column_size, h64e_data_sz(fmt)); + return -1; + } return 0; } @@ -40,6 +46,42 @@ int h64e_set_output(H64E_t *s, H64E_stream_out *sout) return 0; } +int h64e_data_sz(H64E_t *s) +{ + switch (s->fmt.group) + { + case H64E_G_BYTE: + return 1; + case H64E_G_WORD: + return 2; + case H64E_G_DWORD: + return 4; + case H64E_G_QWORD: + return 8; + default: + return -1; + } + return -1; +} + +int h64e_space_width(H64E_t *s) +{ + switch (s->fmt.group) + { + case H64E_G_BYTE: + return 2; + case H64E_G_WORD: + return 4; + case H64E_G_DWORD: + return 8; + case H64E_G_QWORD: + return 16; + default: + return -1; + } + return -1; +} + int h64e_convert(H64E_t *s) { return 0; @@ -162,14 +204,20 @@ int h64e_fmt_byte_align16(H64E_format *fs, uint8_t *in_data, int32_t in_size, ui */ const int OUT_SZ=1024; //offset values in hex , spaces, number of hex values, second ascii characters const int BUF_SZ=64; + uint8_t buf_offset[BUF_SZ+1]; uint8_t buf1[BUF_SZ+1]; uint8_t buf2[BUF_SZ+1]; + uint8_t buf3[BUF_SZ+1]; uint8_t out_part1[OUT_SZ+1]; uint8_t out_part2[OUT_SZ+1]; + uint8_t out_part3[OUT_SZ+1]; int out_part1_sz=0; int out_part2_sz=0; + int out_part3_sz=0; + int buf_offset_sz=0; int buf1_sz=0; int buf2_sz=0; + int buf3_sz=0; int loop_size=0; int trail_size=0; @@ -178,10 +226,7 @@ int h64e_fmt_byte_align16(H64E_format *fs, uint8_t *in_data, int32_t in_size, ui { //printf("Print offset\n"); int offset = fs->start_offset + fs->total_output; - buf1_sz = snprintf((char *)&buf1[0], BUF_SZ, "%08x: ",offset); - //no error check - memcpy(out_part1,buf1,buf1_sz); - out_part1_sz += buf1_sz; + buf_offset_sz = snprintf((char *)&buf_offset[0], BUF_SZ, "%08x: ",offset); //make it wider } if (in_size%fs->column_size != 0) @@ -199,56 +244,91 @@ int h64e_fmt_byte_align16(H64E_format *fs, uint8_t *in_data, int32_t in_size, ui { if (i<in_size) { - //group byte output string - if (((fs->group_fmt == H64E_G_BYTE)||(fs->group_fmt == H64E_G_NONE)) && (fs->output_fmt == H64E_O_STRING)) + //group byte output + if (fs->f_hex) + { + buf1_sz = snprintf((char *)&buf1[0], BUF_SZ, "%02x",in_data[i]); + } + + //ascii output + if (fs->f_ascii) { if (isprint(in_data[i])) { - buf1_sz = snprintf((char *)&buf1[0], BUF_SZ, "%c",(unsigned char)in_data[i]); + buf2_sz = snprintf((char *)&buf2[0], BUF_SZ, "%c",(unsigned char)in_data[i]); } else { - buf1_sz = snprintf((char *)&buf1[0], BUF_SZ, "."); + buf2_sz = snprintf((char *)&buf2[0], BUF_SZ, "."); } - } else { - //group byte output - buf1_sz = snprintf((char *)&buf1[0], BUF_SZ, "%02x",in_data[i]); } + if (fs->f_space) { //printf("Space enabled\n"); - if (buf1_sz<BUF_SZ) + if (fs->f_ascii) + { + if (buf2_sz<BUF_SZ) + { + buf2[buf2_sz] = ' '; + buf2_sz += 1; + } + } + if (fs->f_hex) { - buf1[buf1_sz] = ' '; - buf1_sz += 1; + if (buf1_sz<BUF_SZ) + { + buf1[buf1_sz] = ' '; + buf1_sz += 1; + } } } + if (fs->f_output_types) { if (fs->output_fmt == H64E_O_INT8) { - buf2_sz = snprintf((char *)&buf2[0], BUF_SZ, "%4d ", (int8_t)in_data[i]); + int ii = in_data[i]; + buf3_sz = snprintf((char *)&buf3[0], BUF_SZ, "%4d ", (int8_t)ii); } else if (fs->output_fmt == H64E_O_UINT8) { - buf2_sz = snprintf((char *)&buf2[0], BUF_SZ, "%4u ", (uint8_t)in_data[i]); + unsigned int uu = in_data[i]; + buf3_sz = snprintf((char *)&buf3[0], BUF_SZ, "%4u ", uu); } } - + } else { - printf("Empty spaces\n"); + //printf("Empty spaces\n"); //group byte output string - if (((fs->group_fmt == H64E_G_BYTE)||(fs->group_fmt == H64E_G_NONE)) && (fs->output_fmt == H64E_O_STRING)) + if (fs->f_hex) { - buf1_sz = snprintf((char *)&buf1[0], BUF_SZ, " "); - } else { - //group byte output buf1_sz = snprintf((char *)&buf1[0], BUF_SZ, " "); } + + if (fs->f_ascii) + { + buf2_sz = snprintf((char *)&buf2[0], BUF_SZ, " "); + } + if (fs->f_space) { - if (buf1_sz<BUF_SZ) + //printf("Space enabled\n"); + if (fs->f_ascii) + { + if (buf2_sz<BUF_SZ) + { + buf2[buf2_sz] = ' '; + buf2_sz += 1; + } + } + if (fs->f_hex) { - buf1[buf1_sz] = ' '; - buf1_sz += 1; + if (buf1_sz<BUF_SZ) + { + buf1[buf1_sz] = ' '; + buf1_sz += 1; + } } } + + } //count converted chars per line fs->column_pos += 1; @@ -260,51 +340,409 @@ int h64e_fmt_byte_align16(H64E_format *fs, uint8_t *in_data, int32_t in_size, ui //set triger to newline fs->t_new_line = 1; fs->column_pos = 0; - //set new line to buffer - if (buf1_sz+1<BUF_SZ) + //set new line to hex buffer + //printf("%d %d %d\n",fs->f_ascii,fs->f_hex,fs->f_output_types); + if ((fs->f_ascii==1) && (fs->f_output_types==0) ) { - buf1[buf1_sz] = '\n'; - buf1_sz += 1; + if (buf2_sz+1<BUF_SZ) + { + buf2[buf2_sz] = '\n'; + buf2_sz += 1; + } + } + + if ((fs->f_hex==1) && (fs->f_ascii==0) && (fs->f_output_types==0) ) + { + if (buf1_sz+1<BUF_SZ) + { + buf1[buf1_sz] = '\n'; + buf1_sz += 1; + } + } + + if (fs->f_output_types==1) + { + if (fs->f_output_types) + { + if (buf3_sz+1<BUF_SZ) + { + buf3[buf3_sz] = '\n'; + buf3_sz += 1; + } + } } } } + //copy data to buffer after each iteration + for (j=0; j<buf1_sz; j++) + { + out_part1[out_part1_sz+j] = buf1[j]; + } + out_part1_sz += buf1_sz; + buf1_sz = 0; + + for (j=0; j<buf2_sz; j++) + { + out_part2[out_part2_sz+j] = buf2[j]; + } + out_part2_sz += buf2_sz; + buf2_sz = 0; + + for (j=0; j<buf3_sz; j++) + { + out_part3[out_part3_sz+j] = buf3[j]; + } + out_part3_sz += buf3_sz; + buf3_sz = 0; + } + + //printf("buf_offset_sz %d\n",buf_offset_sz); + //printf("out_part1_sz %d\n",out_part1_sz); + //printf("out_part2_sz %d\n",out_part2_sz); + //printf("out_part3_sz %d\n",out_part3_sz); + + //concat all data from 3 buffers + for (i=0;i<buf_offset_sz;i++) + { + if (i<out_size) + { + out_data[i] = buf_offset[i]; + trail_size += 1; + } + } + + for (i=0,j=trail_size;i<out_part1_sz;i++) + { + if (j+i<out_size) + { + out_data[j+i] = out_part1[i]; + trail_size += 1; + } + } + + //if space between sapce disabled then put one space between ascii&hex output + //printf("%d %d %d\n",fs->f_ascii,fs->f_hex,fs->f_space); + if ((fs->f_ascii==1) && (fs->f_hex==1) && (fs->f_space==0)) + { + if (trail_size<out_size) + { + out_data[trail_size] = ' '; + trail_size += 1; + } + } + + for (i=0,j=trail_size;i<out_part2_sz;i++) + { + if (j+i<out_size) + { + out_data[j+i] = out_part2[i]; + trail_size += 1; + } + } + + + for (i=0,j=trail_size;i<out_part3_sz;i++) + { + if (j+i<out_size) + { + out_data[j+i] = out_part3[i]; + trail_size += 1; + } + } + + + ret = trail_size; + //printf("ret %d\n",ret); + +#if 0 + printf("D:["); + for (i=0;i<ret;i++) + { + printf("%c",(unsigned char)out_data[i]); + } + printf("]\n"); +#endif + + return ret; +} + +int h64e_fmt_align( H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size, int32_t data_sz) +{ + //printf("h64e_fmt_byte in %d out %d\n",in_size,out_size); + int ret=0; + int cur_size=0; + int i, j=0; + /* + offset - max size 64bit = 0x(2bytes)+0000_0000_0000_0000(16bytes)+ ":"1(bytes) + whitespace(1byte) = 19bytes + hex values - 00(2bytes)*32+whitespace(1byte)*32+space_between_columns(1byte)+asciichar(1byte)*32+sapce_betweeen_ascii_columns(1byte)*32 = 1121 + new line - 1byte + total = 19 + 1121 + 1 = 1141 + */ + const int OUT_SZ=1024; //offset values in hex , spaces, number of hex values, second ascii characters + const int BUF_SZ=64; + uint8_t buf_offset[BUF_SZ+1]; + uint8_t buf1[BUF_SZ+1]; + uint8_t buf2[BUF_SZ+1]; + uint8_t buf3[BUF_SZ+1]; + uint8_t out_part1[OUT_SZ+1]; + uint8_t out_part2[OUT_SZ+1]; + uint8_t out_part3[OUT_SZ+1]; + int out_part1_sz=0; + int out_part2_sz=0; + int out_part3_sz=0; + int buf_offset_sz=0; + int buf1_sz=0; + int buf2_sz=0; + int buf3_sz=0; + int loop_size=0; + int trail_size=0; + + //set offset to output + if (fs->f_offset) + { + //printf("Print offset\n"); + int offset = fs->start_offset + fs->total_output; + buf_offset_sz = snprintf((char *)&buf_offset[0], BUF_SZ, "%08x: ",offset); //make it wider + } + + if (in_size%fs->column_size != 0) + { + loop_size = (in_size/fs->column_size+1)*fs->column_size; + } else { + loop_size = in_size; + } + + + //size shout be allways matching (size mod columnsize == 0) + //non matching size should be used at the end, on last line of output + //printf("Loop_size %d\n",loop_size); + for (i=0; i<loop_size; i+=data_sz) + { + if (i<in_size) + { + //group byte output + if (fs->f_hex) + { + //buf1_sz = snprintf((char *)&buf1[0], BUF_SZ, "!%02x",in_data[i]); + //int h64e_fmt_hex(H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size, int32_t data_sz, int32_t type); + buf1_sz = h64e_fmt_hex(fs, &in_data[i], in_size-i, buf1, BUF_SZ, data_sz); + } + + //ascii output + if (fs->f_ascii) + { + + /* + if (isprint(in_data[i])) + { + buf2_sz = snprintf((char *)&buf2[0], BUF_SZ, "!%c",(unsigned char)in_data[i]); + } else { + buf2_sz = snprintf((char *)&buf2[0], BUF_SZ, "."); + } + */ + + buf2_sz = h64e_fmt_ascii(fs, &in_data[i], in_size-i, buf2, BUF_SZ, data_sz); + //printf("!buf2_sz %d\n", buf2_sz); + } + + if (fs->f_space) + { + //printf("Space enabled\n"); + if (fs->f_ascii) + { + if (buf2_sz<BUF_SZ) + { + buf2[buf2_sz] = ' '; + buf2_sz += 1; + } + } + if (fs->f_hex) + { + if (buf1_sz<BUF_SZ) + { + buf1[buf1_sz] = ' '; + buf1_sz += 1; + } + } + } + + if (fs->f_output_types) + { + /* + if (fs->output_fmt == H64E_O_INT8) + { + int ii = in_data[i]; + buf3_sz = snprintf((char *)&buf3[0], BUF_SZ, "%4d ", (int8_t)ii); + } else if (fs->output_fmt == H64E_O_UINT8) { + unsigned int uu = in_data[i]; + buf3_sz = snprintf((char *)&buf3[0], BUF_SZ, "%4u ", uu); + } + */ + buf3_sz = h64e_fmt_type(fs, &in_data[i], in_size-i, buf3, BUF_SZ); + //printf("buf3_sz %d\n",buf3_sz); + } + + } else { + //printf("Empty spaces\n"); + //group byte output string + if (fs->f_hex) + { + //buf1_sz = snprintf((char *)&buf1[0], BUF_SZ, " "); + buf1_sz = h64e_fmt_space(fs, &buf1[0], BUF_SZ, data_sz, fs->output_fmt); + } + + if (fs->f_ascii) + { + buf2_sz = snprintf((char *)&buf2[0], BUF_SZ, "! "); + //buf2_sz = h64e_fmt_ascii(fs, &buf2[0], BUF_SZ, data_sz); + } + + if (fs->f_space) + { + //printf("Space enabled\n"); + if (fs->f_ascii) + { + if (buf2_sz<BUF_SZ) + { + buf2[buf2_sz] = ' '; + buf2_sz += 1; + } + } + if (fs->f_hex) + { + if (buf1_sz<BUF_SZ) + { + buf1[buf1_sz] = ' '; + buf1_sz += 1; + } + } + } + + } + //count converted chars per line + fs->column_pos += data_sz; + fs->total_output += data_sz; //potential bug + + if (fs->column_pos == fs->column_size) + { + if (fs->f_new_line) { + //set triger to newline + fs->t_new_line = 1; + fs->column_pos = 0; + //set new line to hex buffer + //printf("%d %d %d\n",fs->f_ascii,fs->f_hex,fs->f_output_types); + if ((fs->f_ascii==1) && (fs->f_output_types==0) ) + { + if (buf2_sz+1<BUF_SZ) + { + buf2[buf2_sz] = '\n'; + buf2_sz += 1; + } + } + + if ((fs->f_hex==1) && (fs->f_ascii==0) && (fs->f_output_types==0) ) + { + if (buf1_sz+1<BUF_SZ) + { + buf1[buf1_sz] = '\n'; + buf1_sz += 1; + } + } + + if (fs->f_output_types==1) + { + if (fs->f_output_types) + { + if (buf3_sz+1<BUF_SZ) + { + buf3[buf3_sz] = '\n'; + buf3_sz += 1; + } + } + } + } + } + //copy data to buffer after each iteration for (j=0; j<buf1_sz; j++) { out_part1[out_part1_sz+j] = buf1[j]; } out_part1_sz += buf1_sz; + buf1_sz = 0; for (j=0; j<buf2_sz; j++) { out_part2[out_part2_sz+j] = buf2[j]; } out_part2_sz += buf2_sz; + buf2_sz = 0; + + for (j=0; j<buf3_sz; j++) + { + out_part3[out_part3_sz+j] = buf3[j]; + } + out_part3_sz += buf3_sz; + buf3_sz = 0; } + //printf("buf_offset_sz %d\n",buf_offset_sz); //printf("out_part1_sz %d\n",out_part1_sz); //printf("out_part2_sz %d\n",out_part2_sz); + //printf("out_part3_sz %d\n",out_part3_sz); - //concat all data from 2 buffers - for (i=0;i<out_part1_sz;i++) + //concat all data from 3 buffers + for (i=0;i<buf_offset_sz;i++) { if (i<out_size) { - out_data[i] = out_part1[i]; + out_data[i] = buf_offset[i]; trail_size += 1; } } - for (i=0;i<out_part2_sz;i++) + for (i=0,j=trail_size;i<out_part1_sz;i++) { - if (out_part1_sz+i<out_size) + if (j+i<out_size) { - out_data[i] = out_part2[i]; + out_data[j+i] = out_part1[i]; trail_size += 1; } } + + //if space between sapce disabled then put one space between ascii&hex output + //printf("%d %d %d\n",fs->f_ascii,fs->f_hex,fs->f_space); + if ((fs->f_ascii==1) && (fs->f_hex==1) && (fs->f_space==0)) + { + if (trail_size<out_size) + { + out_data[trail_size] = ' '; + trail_size += 1; + } + } + + for (i=0,j=trail_size;i<out_part2_sz;i++) + { + if (j+i<out_size) + { + out_data[j+i] = out_part2[i]; + trail_size += 1; + } + } + + + for (i=0,j=trail_size;i<out_part3_sz;i++) + { + if (j+i<out_size) + { + out_data[j+i] = out_part3[i]; + trail_size += 1; + } + } + + ret = trail_size; //printf("ret %d\n",ret); @@ -320,28 +758,196 @@ int h64e_fmt_byte_align16(H64E_format *fs, uint8_t *in_data, int32_t in_size, ui return ret; } -int h64e_fmt_word( H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size) +int h64e_fmt_finish(H64E_format *fs) { + + return 0; } -int h64e_fmt_dword( H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size) +int h64e_fmt_space(H64E_format *fs, uint8_t *out_data, int32_t out_size, int32_t data_sz, int32_t type) { - return 0; + int buf_sz=-1; + + int i; + int ttl_sz = data_sz; + int trail_sz=0; + switch (type) + { + case H64E_O_INT8: + case H64E_O_INT16: + case H64E_O_INT32: + case H64E_O_INT64: + ttl_sz += 1; + } + + for (i=0;i<ttl_sz;i++) + { + if (i<out_size) + { + out_data[i] = ' '; + trail_sz += 1; + } + } + + return trail_sz; } -int h64e_fmt_qword( H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size) + +int h64e_fmt_ascii(H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size, int32_t data_sz) { - return 0; + int buf_sz=-1; + int ttl_sz = data_sz; + int i=0; + int trail_sz=0; + + for (i=0;i<ttl_sz;i++) + { + if ((i<out_size) && (i<in_size)) + { + //printf("[%c]",in_data[i]); + if (isprint(in_data[i])) + { + out_data[i] = in_data[i]; + } else { + out_data[i] = '.'; + } + trail_sz += 1; + //printf("[%c]\n",out_data[i]); + } + } + + return trail_sz; } -int h64e_fmt_string( H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size) + + +int h64e_fmt_hex(H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size, int32_t data_sz) { - return 0; + int buf_sz=-1; + + if (data_sz == 1) + { + buf_sz = snprintf((char*)out_data, out_size, "%02x", in_data[0]); + } else if (data_sz == 2) + { + buf_sz = snprintf((char*)out_data, out_size, "%02x%02x", in_data[0], in_data[1]); + } else if (data_sz == 4) + { + buf_sz = snprintf((char*)out_data, out_size, "%02x%02x%02x%02x", in_data[0], in_data[1], in_data[2], in_data[3]); + } else if (data_sz == 8) + { + buf_sz = snprintf((char*)out_data, out_size, "%02x%02x%02x%02x%02x%02x%02x%02x", in_data[0], in_data[1], in_data[2],in_data[3],in_data[4], in_data[5], in_data[6], in_data[7]); + } + + return buf_sz; } -int h64e_fmt_finish(H64E_format *fs) +int h64e_fmt_type(H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size) { + int buf_sz = -1; + int data_sz = -1; + int type = fs->output_fmt; + //printf("!!!type %d\n",type); + switch (type) + { + case H64E_O_UINT8: + case H64E_O_INT8: + //data_sz = 1; + data_sz = 3; + break; + case H64E_O_UINT16: + case H64E_O_INT16: + //data_sz = 2; + data_sz = 5; + break; + case H64E_O_UINT32: + case H64E_O_INT32: + //data_sz = 4; + data_sz = 10; + break; + case H64E_O_UINT64: + case H64E_O_INT64: + //data_sz = 8; + data_sz = 19; + break; + } - return 0; + switch(type) + { + case H64E_O_INT8: + case H64E_O_INT16: + case H64E_O_INT32: + case H64E_O_INT64: + data_sz += 1; + break; + } + + if (out_size < data_sz) + { + printf("Output buffer too small h64e_fmt_type\n"); + return -1; + } + + switch (type) + { + case H64E_O_UINT8: + { + //printf("H64E_O_UINT8\n"); + uint8_t *u8 = (uint8_t *)in_data; + buf_sz = snprintf((char *)out_data, out_size, "%3u ", *u8); + break; + } + case H64E_O_INT8: + { + //printf("H64E_O_INT8\n"); + int8_t *i8 = (int8_t *)in_data; + buf_sz = snprintf((char *)out_data, out_size, "%4i ", *i8); + break; + } + case H64E_O_UINT16: + { + //printf("H64E_O_UINT16\n"); + uint16_t *u16 = (uint16_t *)in_data; + buf_sz = snprintf((char *)out_data, out_size, "%5hu ", *u16); + break; + } + case H64E_O_INT16: + { + //printf("H64E_O_INT16\n"); + int16_t *i16 = (int16_t *)in_data; + buf_sz = snprintf((char *)out_data, out_size, "%6hd ", *i16); + break; + } + case H64E_O_UINT32: + { + //printf("H64E_O_UINT32\n"); + uint32_t *u32 = (uint32_t *)in_data; + buf_sz = snprintf((char *)out_data, out_size, "%10u ", *u32); + break; + } + case H64E_O_INT32: + { + //printf("H64E_O_INT32\n"); + int32_t *i32 = (int32_t *)in_data; + buf_sz = snprintf((char *)out_data, out_size, "%11d ", *i32); + break; + } + case H64E_O_UINT64: + { + //printf("H64E_O_UINT64\n"); + uint64_t *u64 = (uint64_t *)in_data; + buf_sz = snprintf((char *)out_data, out_size, "%20llu ", *u64); + break; + } + case H64E_O_INT64: + { + //printf("H64E_O_INT64\n"); + int64_t *i64 = (int64_t *)in_data; + buf_sz = snprintf((char *)out_data, out_size, "%20lld ", *i64); + break; + } + } + + return buf_sz; } diff --git a/H64E-2/h64e.h b/H64E-2/h64e.h index 7cc2d41..7871d21 100644 --- a/H64E-2/h64e.h +++ b/H64E-2/h64e.h @@ -48,6 +48,7 @@ typedef struct H64E_params uint8_t output_type; /* output in many different ways */ int flag_space; /*space between columns **/ int flag_ascii; + int flag_hex; /* hex outout */ } H64E_params; typedef struct H64E_t @@ -63,6 +64,8 @@ int h64e_init(H64E_t *s); int h64e_check_param( H64E_t *s ); int h64e_set_input(H64E_t *s, H64E_stream_in *sin); int h64e_set_output(H64E_t *s, H64E_stream_out *sout); +int h64e_data_sz(H64E_t *s); +int h64e_space_width(H64E_t *s); int h64e_convert(H64E_t *s); int h64e_destroy(H64E_t *s); @@ -90,16 +93,19 @@ typedef struct H64E_format { int f_nw_pos; // if new line then save place where new line is int f_ascii; int f_offset; + int f_hex; int total_output; } H64E_format; int h64e_fmt_init( H64E_format *fs); int h64e_fmt_byte( H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size); int h64e_fmt_byte_align16( H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size); -int h64e_fmt_word( H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size); -int h64e_fmt_dword( H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size); -int h64e_fmt_qword( H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size); -int h64e_fmt_string( H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size); +int h64e_fmt_align( H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size, int32_t data_sz); int h64e_fmt_finish( H64E_format *fs); +int h64e_fmt_space(H64E_format *fs, uint8_t *out_data, int32_t out_size, int32_t data_sz, int32_t type); +int h64e_fmt_ascii(H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size, int32_t data_sz); +int h64e_fmt_hex(H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size, int32_t data_sz); +int h64e_fmt_type(H64E_format *fs, uint8_t *in_data, int32_t in_size, uint8_t *out_data, int32_t out_size); + #endif /* h64e_h */ diff --git a/H64E-2/main.c b/H64E-2/main.c index e83ddf9..57f996a 100644 --- a/H64E-2/main.c +++ b/H64E-2/main.c @@ -132,20 +132,56 @@ int output_name2int( char *name ) return 0; } +int group_typename2int( char *name ) +{ + if ( 0 == strncmp( name, "i8", 2) ) + { + return H64E_G_BYTE; + } + if ( 0 == strncmp( name, "u8", 2) ) + { + return H64E_G_BYTE; + } + if ( 0 == strncmp( name, "i16", 3) ) + { + return H64E_G_WORD; + } + if ( 0 == strncmp( name, "u16", 3) ) + { + return H64E_G_WORD; + } + if ( 0 == strncmp( name, "i32", 3) ) + { + return H64E_G_DWORD; + } + if ( 0 == strncmp( name, "u32", 3) ) + { + return H64E_G_DWORD; + } + if ( 0 == strncmp( name, "i64", 3) ) + { + return H64E_G_QWORD; + } + if ( 0 == strncmp( name, "u64", 3) ) + { + return H64E_G_QWORD; + } + return 0; +} + void helper( char *progname ) { printf("Usage: %s [OPTS] <filename>\n\n" - " -a - asciimode\n" + " -a - ascii output\n" " -b - show offset adress\n" " -o - file offset\n" " -i - output hex\n" " -l - length of output\n" " -c - column size in bytes\n" - " -g - datatype output: byte,word,dword,qword\n" - " -e - interp data: u8,i8,u16,i16,u32,i32,u64,i64\n" + " -e - interp data output: u8,i8,u16,i16,u32,i32,u64,i64\n" " -s - disable space between columns\n" - " -t - extra output ascii output\n" - "Version: 2.0.2 \n" + " -h - extra hex output\n" + "Version: 2.0.3 \n" "\n" , progname); } @@ -193,14 +229,12 @@ int main(int argc, const char * argv[]) { //set all params from arguments /*get cmd args and set options */ - while ( (c = getopt(argc, argv, "abo:il:vc:g:e:st")) != -1 ) + while ( (c = getopt(argc, argv, "abo:il:vc:e:sh")) != -1 ) { switch(c) { case 'a': - h64e.fmt.group = H64E_G_BYTE; - h64e.fmt.flag_output_types = 1; - h64e.fmt.output_type = H64E_O_STRING; + h64e.fmt.flag_ascii = 1; break; case 'b': h64e.fmt.flag_offset = 1; @@ -221,18 +255,16 @@ int main(int argc, const char * argv[]) { case 'c': h64e.fmt.column_size = atoi(optarg); break; - case 'g': - h64e.fmt.group = group_name2int(optarg); - break; case 'e': h64e.fmt.flag_output_types = 1; h64e.fmt.output_type = output_name2int(optarg); + h64e.fmt.group = group_typename2int(optarg); break; case 's': h64e.fmt.flag_space = 1; break; - case 't': - h64e.fmt.flag_ascii = 1; + case 'h': + h64e.fmt.flag_hex = 0; break; case 'v': version(); @@ -255,7 +287,12 @@ int main(int argc, const char * argv[]) { fname = argv[argc-1]; /* check params */ - h64e_check_param( &h64e ); + if (-1 == h64e_check_param( &h64e )) + { + return -1; + } + + /* open file */ fd = file_open( fname ); @@ -278,6 +315,8 @@ int main(int argc, const char * argv[]) { int8_fmt.start_offset = h64e.fmt.offset_addr; int8_fmt.f_output_types = h64e.fmt.flag_output_types; int8_fmt.output_fmt = h64e.fmt.output_type; + int8_fmt.f_ascii = h64e.fmt.flag_ascii; + int8_fmt.f_hex = h64e.fmt.flag_hex; @@ -303,7 +342,6 @@ int main(int argc, const char * argv[]) { cnv_bytes = h64e_si_data_out(&sin, &buf_cnv_in[0], int8_fmt.column_size); //cnv_total += cnv_bytes; - //Convert output data to desired format //printf("Start converting to byte8\n"); switch (h64e.fmt.group) @@ -312,13 +350,9 @@ int main(int argc, const char * argv[]) { cnv_num = h64e_fmt_byte_align16(&int8_fmt, &buf_cnv_in[0], cnv_bytes, buf_cnv_out, 2048); break; case H64E_G_WORD: - cnv_num = h64e_fmt_word(&int8_fmt, &buf_cnv_in[0], cnv_bytes, buf_cnv_out, 512); - break; case H64E_G_DWORD: - cnv_num = h64e_fmt_dword(&int8_fmt, &buf_cnv_in[0], cnv_bytes, buf_cnv_out, 512); - break; case H64E_G_QWORD: - cnv_num = h64e_fmt_qword(&int8_fmt, &buf_cnv_in[0], cnv_bytes, buf_cnv_out, 512); + cnv_num = h64e_fmt_align(&int8_fmt, &buf_cnv_in[0], cnv_bytes, buf_cnv_out, 2048, (int32_t)h64e_data_sz(&h64e)); break; default: @@ -355,10 +389,31 @@ int main(int argc, const char * argv[]) { //check and empty all buffers while (h64e_si_len(&sin)>0) { + int cnv_num = -1; if (h64e_si_len(&sin)>int8_fmt.column_size) { - + //printf("Full column buffer\n"); + cnv_bytes = h64e_si_data_out(&sin, &buf_cnv_in[0], int8_fmt.column_size); + cnv_num = h64e_fmt_byte_align16(&int8_fmt, &buf_cnv_in[0], cnv_bytes, buf_cnv_out, 2048); + + cnv_bytes = h64e_so_data_in(&sout, &buf_cnv_out[0], cnv_num); + cnv_total += cnv_num; } else { + //printf("some buffer!!!\n"); + //less then column size + cnv_bytes = h64e_si_data_out(&sin, &buf_cnv_in[0], int8_fmt.column_size); + //printf("cnv_bytes %d\n", cnv_bytes); + cnv_num = h64e_fmt_byte_align16(&int8_fmt, &buf_cnv_in[0], cnv_bytes, buf_cnv_out, 2048); + //printf("cnv_num %d\n", cnv_num); + cnv_bytes = h64e_so_data_in(&sout, &buf_cnv_out[0], cnv_num); + cnv_total += cnv_num; + } + + if ((out_bytes = h64e_so_len(&sout)) > 0) + { + out_bytes = h64e_so_data_out(&sout, &buf_out[0],512); + buf_out[out_bytes] = 0x00; + printf("%s",buf_out); } break; } |