Added a peek() helper

This commit is contained in:
Pierre Pronchery 2011-09-03 20:23:14 +00:00
parent cfe1768474
commit d7832d1072

View File

@ -67,7 +67,9 @@ struct _Arch
static char const * _arch_get_filename(Arch * arch); static char const * _arch_get_filename(Arch * arch);
static AsmFunction * _arch_get_function_by_id(Arch * arch, AsmId id); static AsmFunction * _arch_get_function_by_id(Arch * arch, AsmId id);
static AsmString * _arch_get_string_by_id(Arch * arch, AsmId id); static AsmString * _arch_get_string_by_id(Arch * arch, AsmId id);
static ssize_t _arch_peek(Arch * arch, void * buf, size_t size);
static ssize_t _arch_read(Arch * arch, void * buf, size_t size); static ssize_t _arch_read(Arch * arch, void * buf, size_t size);
static ssize_t _arch_peek_buffer(Arch * arch, void * buf, size_t size);
static ssize_t _arch_read_buffer(Arch * arch, void * buf, size_t size); static ssize_t _arch_read_buffer(Arch * arch, void * buf, size_t size);
static off_t _arch_seek(Arch * arch, off_t offset, int whence); static off_t _arch_seek(Arch * arch, off_t offset, int whence);
static off_t _arch_seek_buffer(Arch * arch, off_t offset, int whence); static off_t _arch_seek_buffer(Arch * arch, off_t offset, int whence);
@ -461,7 +463,7 @@ int arch_decode(Arch * arch, Code * code, ArchInstructionCall ** calls,
memset(p, 0, sizeof(*p)); memset(p, 0, sizeof(*p));
p->base = base + offset; p->base = base + offset;
p->offset = arch->buffer_pos; p->offset = arch->buffer_pos;
if(arch->plugin->decode(arch->plugin, p, base) != 0) if(arch->plugin->decode(arch->plugin, p) != 0)
break; break;
p->size = arch->buffer_pos - p->offset; p->size = arch->buffer_pos - p->offset;
offset += p->size; offset += p->size;
@ -539,6 +541,7 @@ int arch_init(Arch * arch, char const * filename, FILE * fp)
arch->helper.get_register_by_id_size = arch_get_register_by_id_size; arch->helper.get_register_by_id_size = arch_get_register_by_id_size;
arch->helper.get_register_by_name_size = arch_get_register_by_name_size; arch->helper.get_register_by_name_size = arch_get_register_by_name_size;
arch->helper.get_string_by_id = _arch_get_string_by_id; arch->helper.get_string_by_id = _arch_get_string_by_id;
arch->helper.peek = _arch_peek;
arch->helper.read = _arch_read; arch->helper.read = _arch_read;
arch->helper.seek = _arch_seek; arch->helper.seek = _arch_seek;
arch->helper.write = _arch_write; arch->helper.write = _arch_write;
@ -567,6 +570,7 @@ int arch_init_buffer(Arch * arch, char const * buffer, size_t size)
arch->helper.get_register_by_name_size = arch_get_register_by_name_size; arch->helper.get_register_by_name_size = arch_get_register_by_name_size;
arch->helper.get_string_by_id = _arch_get_string_by_id; arch->helper.get_string_by_id = _arch_get_string_by_id;
arch->helper.write = NULL; arch->helper.write = NULL;
arch->helper.peek = _arch_peek_buffer;
arch->helper.read = _arch_read_buffer; arch->helper.read = _arch_read_buffer;
arch->helper.seek = _arch_seek_buffer; arch->helper.seek = _arch_seek_buffer;
arch->plugin->helper = &arch->helper; arch->plugin->helper = &arch->helper;
@ -626,6 +630,36 @@ static AsmString * _arch_get_string_by_id(Arch * arch, AsmId id)
} }
/* arch_peek */
static ssize_t _arch_peek(Arch * arch, void * buf, size_t size)
{
size_t pos = arch->buffer_pos;
ssize_t s;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s(arch, %p, %zu)\n", __func__, buf, size);
#endif
if((s = _arch_read(arch, buf, size)) == -1)
return -1;
if(_arch_seek(arch, -s, SEEK_CUR) == -1)
return -1;
return s;
}
/* arch_peek_buffer */
static ssize_t _arch_peek_buffer(Arch * arch, void * buf, size_t size)
{
ssize_t s;
if((s = _arch_read_buffer(arch, buf, size)) == -1)
return -1;
if(_arch_seek_buffer(arch, -s, SEEK_CUR) == -1)
return -1;
return s;
}
/* arch_read */ /* arch_read */
static ssize_t _arch_read(Arch * arch, void * buf, size_t size) static ssize_t _arch_read(Arch * arch, void * buf, size_t size)
{ {
@ -665,9 +699,12 @@ static ssize_t _arch_read_buffer(Arch * arch, void * buf, size_t size)
/* arch_seek */ /* arch_seek */
static off_t _arch_seek(Arch * arch, off_t offset, int whence) static off_t _arch_seek(Arch * arch, off_t offset, int whence)
{ {
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s(arch, %ld, %d)\n", __func__, offset, whence);
#endif
if(fseek(arch->fp, offset, whence) != 0) if(fseek(arch->fp, offset, whence) != 0)
return -error_set_code(1, "%s: %s", arch->filename, return -error_set_code(1, "%s: %s", arch->filename, strerror(
strerror(errno)); errno));
arch->buffer_pos = ftello(arch->fp); arch->buffer_pos = ftello(arch->fp);
return arch->buffer_pos; return arch->buffer_pos;
} }