static bool gb_parse_ld1 (ut8 *buf, const int minlen, char *buf_asm) { int i; r_str_replace_in (buf_asm, strlen(buf_asm), ", ", ",", R_TRUE); if ((i = strlen(buf_asm)) < minlen) return false; r_str_do_until_token (str_op, buf_asm, '\0'); if (buf_asm[4] == ',') { i = gb_reg_idx (buf_asm[3]); if (i == (-1)) return false; buf[0] = (ut8)(0x40 + (i * 8)); if ((i = gb_reg_idx (buf_asm[5])) == (-1)) return false; buf[0] |= (ut8)i; } else if (buf_asm[3] == '[' && buf_asm[4] == 'h' && buf_asm[5] == 'l' && buf_asm[6] == ']' && buf_asm[7] == ',') { if ((i = gb_reg_idx (buf_asm[8])) == (-1)) return false; buf[0] = 0x70 | (ut8)i; } return true; }
static int gb_parse_arith1 (ut8 *buf, const int minlen, char *buf_asm, ut8 base, ut8 alt) { int i; ut64 num; if (strlen (buf_asm) < minlen) return 0; buf[0] = base; i = strlen (&buf_asm[minlen - 1]); r_str_replace_in (&buf_asm[minlen - 1], (ut32)i, "[ ", "[", R_TRUE); r_str_replace_in (&buf_asm[minlen - 1], (ut32)i, " ]", "]", R_TRUE); r_str_do_until_token (str_op, buf_asm, ' '); i = gb_reg_idx (buf_asm[minlen-1]); if (i != (-1)) buf[0] |= (ut8)i; else if (buf_asm[minlen - 1] == '[' && buf_asm[minlen] == 'h' && buf_asm[minlen + 1] == 'l' && buf_asm[minlen + 2] == ']' ) buf[0] |= 6; else { buf[0] = alt; num = r_num_get (NULL, &buf_asm[minlen - 1]); buf[1] = (ut8)(num & 0xff); return 2; } return 1; }
static bool gb_parse_ld2 (ut8 *buf, char *buf_asm) { int i; ut64 num; if (strlen (buf_asm) < 6) return false; if (buf_asm[4] == ',') { if ((i = gb_reg_idx (buf_asm[3])) == (-1)) return false; buf[0] = 0x6 + (ut8)(i * 8); num = r_num_get (NULL, &buf_asm[5]); buf[1] = (ut8)(num & 0xff); return true; } else if (buf_asm[3] == '[' && buf_asm[4] == 'h' && buf_asm[5] == 'l' && buf_asm[6] == ']' && buf_asm[7] == ',' && buf_asm[8] != '\0') { buf[0] = 0x36; num = r_num_get (NULL, &buf_asm[8]); buf[1] = (ut8)(num & 0xff); return true; } return false; }
static bool gb_parse_cb1 (ut8 *buf, const int minlen, char *buf_asm, ut8 base) { int i; if (strlen (buf_asm) < minlen) return false; buf[0] = base; i = strlen (&buf_asm[minlen - 1]); r_str_replace_in (&buf_asm[minlen - 1], (ut32)i, "[ ", "[", R_TRUE); r_str_replace_in (&buf_asm[minlen - 1], (ut32)i, " ]", "]", R_TRUE); r_str_do_until_token (str_op, buf_asm, ' '); i = gb_reg_idx (buf_asm[minlen-1]); if (i != (-1)) { buf[0] |= (ut8)i; return true; } else if (buf_asm[minlen - 1] == '[' && buf_asm[minlen] == 'h' && buf_asm[minlen + 1] == 'l' && buf_asm[minlen + 2] == ']' ) { buf[0] |= 6; return true; } else return false; }
static bool gb_parse_cb2 (ut8 *buf, const int minlen, char *buf_asm, ut8 base) { ut64 num; int i; char *p, *q; if ((i = strlen (buf_asm)) < minlen) return false; r_str_replace_in (buf_asm, (ut32)i, "[ ", "[", R_TRUE); r_str_replace_in (buf_asm, (ut32)i, " ]", "]", R_TRUE); r_str_replace_in (buf_asm, (ut32)i, ", ", ",", R_TRUE); p = strchr (buf_asm, (int)' '); if (!p) return false; q = strchr (p, (int)','); if (!q) return false; q[0] = '\0'; if (p[1] == '\0' || q[1] == '\0') { q[0] = ','; return false; } num = r_num_get (NULL, &p[1]); q[0] = ','; if (num > 7) return false; buf[0] = base + (ut8)num * 8; i = gb_reg_idx (q[1]); if (i != (-1)) { buf[0] |= (ut8)i; return true; } if (strlen(&q[1]) < 4) return false; if (q[1] == '[' && q[2] == 'h' && q[3] == 'l' && q[4] == ']') { buf[0] |= 6; return true; } return false; }