#include uint64_t file_save(const char * filename, void * buf, uint64_t len) { FILE * out; int r; if(strcmp(filename, "-") == 0) out = stdout; else out = fopen(filename, "wb"); if(!out) { perror("Failed to open output file"); exit(-1); } r = fwrite(buf, len, 1, out); if(out != stdout) fclose(out); return r; } void * file_load(const char * filename, uint64_t * len) { uint64_t offset = 0, bufsize = 8192; char * buf = malloc(bufsize); FILE * in; if(strcmp(filename, "-") == 0) in = stdin; else in = fopen(filename, "rb"); if(!in) { perror("Failed to open input file"); exit(-1); } while(1) { uint64_t len = bufsize - offset; uint64_t n = fread(buf + offset, 1, len, in); offset += n; if(n < len) break; bufsize *= 2; buf = realloc(buf, bufsize); if(!buf) { perror("Failed to resize load_file() buffer"); exit(-1); } } if(len) *len = offset; if(in != stdin) fclose(in); return buf; } static inline unsigned char hex_to_bin(char c) { if((c >= 'a') && (c <= 'f')) return c - 'a' + 10; if((c >= '0') && (c <= '9')) return c - '0'; if((c >= 'A') && (c <= 'F')) return c - 'A' + 10; return 0; } unsigned char hex_string(const char * s, int o) { return (hex_to_bin(s[o]) << 4) | hex_to_bin(s[o + 1]); } void hexdump(uint32_t addr, void * buf, size_t len) { unsigned char * p = buf; size_t i, j; for(j = 0; j < len; j += 16) { printf("%08x: ", (uint32_t)(addr + j)); for(i = 0; i < 16; i++) { if(j + i < len) printf("%02x ", p[j + i]); else printf(" "); } putchar(' '); for(i = 0; i < 16; i++) { if(j + i >= len) putchar(' '); else putchar(isprint(p[j + i]) ? p[j + i] : '.'); } printf("\r\n"); } }