// // main.c // H64E-2 // // Created by dianshi on 3/13/20. // Copyright © 2020 dianshi. All rights reserved. // #include #include #include #include #include #include #include #include "h64e.h" #include #include #include int file_open( const char *fname ) { int fd; fd = open( fname, O_RDONLY ); if ( fd == -1 ) { printf("Couldn open file %s\n", fname); return -1; } return fd; } int file_read( int fd, char *buf, int size ) { int ret; if ( size < 1 ) return -1; ret = (int)read( fd, buf, size ); return ret; } int file_seek( int fd, off_t pos ) { off_t rc; if (fd<1) { return -1; } rc = lseek( fd, pos, SEEK_SET ); if (rc == -1) return -1; return 0; } int file_close( int fd ) { close( fd ); return 0; } int group_name2int( char *name ) { if ( 0 == strncmp( name, "byte", 4 ) ) { return H64E_G_BYTE; } if ( 0 == strncmp( name, "word", 4 ) ) { return H64E_G_WORD; } if ( 0 == strncmp( name, "dword", 5 ) ) { return H64E_G_DWORD; } if ( 0 == strncmp( name, "qword", 5 ) ) { return H64E_G_QWORD; } return 1; } int output_name2int( char *name ) { if ( 0 == strncmp( name, "str", 3) ) { return H64E_O_STRING; } if ( 0 == strncmp( name, "i8", 2) ) { return H64E_O_INT8; } if ( 0 == strncmp( name, "u8", 2) ) { return H64E_O_UINT8; } if ( 0 == strncmp( name, "i16", 3) ) { return H64E_O_INT16; } if ( 0 == strncmp( name, "u16", 3) ) { return H64E_O_UINT16; } if ( 0 == strncmp( name, "i32", 3) ) { return H64E_O_INT32; } if ( 0 == strncmp( name, "u32", 3) ) { return H64E_O_UINT32; } if ( 0 == strncmp( name, "i64", 3) ) { return H64E_O_INT64; } if ( 0 == strncmp( name, "u64", 3) ) { return H64E_O_UINT64; } return 0; } void helper( char *progname ) { printf("Usage: %s [OPTS] \n\n" " -a - asciimode\n" " -b - show offset adress\n" " -o - file offset\n" " -i - output hex\n" " -l - length of output\n" " -c - column size in byts\n" " -g - datatype output: byte,word,dword\n" " -e - interp data: u8,i8,u16,i16,u32,i32,u64,i64" "\nVersion: 0.1 \n" "\n" , progname); } void version() { printf("???\n"); } int main(int argc, const char * argv[]) { // insert code here... int c; int param_length = -1; int param_offset = -1; char *fname = NULL; int fd; int in_bytes = 0; uint8_t buf[128]; printf("H64E-2 Project started 1\n"); //initialise structure H64E_t h64e; H64E_stream_in sin; H64E_stream_out sout; h64e_init(&h64e); h64e_si_init(&sin, 128); h64e_so_init(&sout, 128); h64e_set_input(&h64e, &sin); h64e_set_output(&h64e, &sout); //set all params from arguments /*get cmd args and set options */ while ( (c = getopt(argc, argv, "abo:il:vc:g:e:")) != -1 ) { switch(c) { case 'a': h64e.fmt.group = H64E_G_BYTE; h64e.fmt.flag_output = 1; h64e.fmt.output_type = H64E_O_STRING; break; case 'b': h64e.fmt.flag_offset = 1; break; case 'o': param_offset = atoi( optarg ); break; case 'i': h64e.fmt.group = H64E_G_BYTE; h64e.fmt.flag_output = 0; h64e.fmt.flag_offset = 1; break; case 'l': param_length = atoi( optarg ); break; case 'c': h64e.fmt.column_size = atoi(optarg); break; case 'g': h64e.fmt.group = group_name2int(optarg); break; case 'e': h64e.fmt.flag_output = 1; h64e.fmt.output_type = output_name2int(optarg); break; case 'v': version(); exit(1); break; default: helper( argv[0] ); exit(1); } } if ( argc < 2 ) { printf("At least one argument needed now\n"); helper( argv[0] ); return 1; } /* last argument is file name */ fname = argv[argc-1]; /* check params */ h64e_check_param( &h64e ); /* open file */ fd = file_open( fname ); if ( fd == -1 ) { printf("Cannot open file %s\n", fname); return -1; } //register formats //do conversation, reading input and outputing while ((in_bytes = file_read(fd,(char *)&buf,128)) != -1) { printf("Reading %d bytes\n",in_bytes); } //deinit all structures h64e_destroy(&h64e); file_close(fd); printf("Ending Execution\n"); return 0; }