mirror of
https://github.com/xboot/xrock.git
synced 2024-11-30 13:23:31 +08:00
101 lines
1.7 KiB
C
101 lines
1.7 KiB
C
#include <misc.h>
|
|
|
|
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");
|
|
}
|
|
}
|