{
GElf_Addr addr;
int *prefixes;
- const char *op1str;
size_t opoff1;
size_t opoff2;
size_t opoff3;
data = begin + 1;
++addr;
- /* The string definitely fits. */
- buf[bufcnt++] = '\0';
-
goto out;
}
{
case suffix_none:
break;
+
case suffix_w:
if ((codep[-1] & 0xc0) != 0xc0)
{
ADD_CHAR (ch);
}
break;
+
case suffix_w0:
if ((codep[-1] & 0xc0) != 0xc0)
ADD_CHAR ('l');
break;
+
case suffix_w1:
if ((data[0] & 0x4) == 0)
ADD_CHAR ('l');
break;
+
case suffix_W:
if (prefixes & has_data16)
{
ADD_CHAR ('q');
#endif
break;
+
case suffix_W1:
if (prefixes & has_data16)
{
};
ADD_STRING (tttn[codep[-1 - instrtab[cnt].modrm] & 0x0f]);
break;
+
case suffix_D:
if ((codep[-1] & 0xc0) != 0xc0)
ADD_CHAR ((data[0] & 0x04) == 0 ? 's' : 'l');
break;
+
default:
printf("unknown suffix %d\n", instrtab[cnt].suffix);
abort ();
if (instrtab[cnt].str1 != 0)
ADD_STRING (op1_str[instrtab[cnt].str1]);
- output_data.op1str = op1_str[instrtab[cnt].str1];
output_data.opoff1 = (instrtab[cnt].off1_1
+ OFF1_1_BIAS - opoff);
output_data.opoff2 = (instrtab[cnt].off1_2
if (r > 0)
goto enomem;
- string_end_idx = ~0ul;
+ string_end_idx = bufcnt;
}
else if (prec == 2 && instrtab[cnt].fct2 != 0)
{
if (instrtab[cnt].str2 != 0)
ADD_STRING (op2_str[instrtab[cnt].str2]);
- output_data.op1str = op2_str[instrtab[cnt].str2];
output_data.opoff1 = (instrtab[cnt].off2_1
+ OFF2_1_BIAS - opoff);
output_data.opoff2 = (instrtab[cnt].off2_2
if (r > 0)
goto enomem;
- string_end_idx = ~0ul;
+ string_end_idx = bufcnt;
}
else if (prec == 3 && instrtab[cnt].fct3 != 0)
{
if (instrtab[cnt].str3 != 0)
ADD_STRING (op3_str[instrtab[cnt].str3]);
- output_data.op1str = op3_str[instrtab[cnt].str3];
output_data.opoff1 = (instrtab[cnt].off3_1
+ OFF3_1_BIAS - opoff);
output_data.opoff2 = (instrtab[cnt].off3_2
if (r > 0)
goto enomem;
- string_end_idx = ~0ul;
+ string_end_idx = bufcnt;
}
break;
-
- case 'e':
- /* String end marker. */
- if (string_end_idx == ~0ul)
- string_end_idx = bufcnt;
- /* No padding. */
- width = 0;
- break;
}
/* Pad according to the specified width. */
if ((prefixes & SEGMENT_PREFIXES) != 0)
goto print_prefix;
- if (string_end_idx != ~0ul)
- buf[string_end_idx] = '\0';
+ assert (string_end_idx != ~0ul);
+ bufcnt = string_end_idx;
addr += param_start - begin;
data = param_start;
ADD_STRING ("(bad)");
addr += data - begin;
- buf[bufcnt++] = '\0';
-
out:
+ if (bufcnt == bufsize)
+ goto enomem;
+ buf[bufcnt] = '\0';
+
*startp = data;
- retval = outcb (buf, strlen (buf), outcbarg);
+ retval = outcb (buf, bufcnt, outcbarg);
if (retval != 0)
goto do_ret;
}
info.last_end = info.cur = data->d_buf;
disasm_cb (ctx, &info.cur, info.cur + data->d_size, info.addr,
- "%7m%e %.1o%e,%.2o%e,%.3o%e", disasm_output, &info,
+ //"%7m%e %.1o%e,%.2o%e,%.3o%e", disasm_output, &info,
+ "%7m %.1o,%.2o,%.3o", disasm_output, &info,
NULL /* XXX */);
}
}