static int mov__parse(struct ins_operands *ops) { char *s = strchr(ops->raw, ','), *target, *comment, prev; if (s == NULL) return -1; *s = '\0'; ops->source.raw = strdup(ops->raw); *s = ','; if (ops->source.raw == NULL) return -1; target = ++s; #ifdef __arm__ comment = strchr(s, ';'); #else comment = strchr(s, '#'); #endif if (comment != NULL) s = comment - 1; else s = strchr(s, '\0') - 1; while (s > target && isspace(s[0])) --s; s++; prev = *s; *s = '\0'; ops->target.raw = strdup(target); *s = prev; if (ops->target.raw == NULL) goto out_free_source; if (comment == NULL) return 0; while (comment[0] != '\0' && isspace(comment[0])) ++comment; comment__symbol(ops->source.raw, comment, &ops->source.addr, &ops->source.name); comment__symbol(ops->target.raw, comment, &ops->target.addr, &ops->target.name); return 0; out_free_source: zfree(&ops->source.raw); return -1; }
static int dec__parse(struct ins_operands *ops) { char *target, *comment, *s, prev; target = s = ops->raw; while (s[0] != '\0' && !isspace(s[0])) ++s; prev = *s; *s = '\0'; ops->target.raw = strdup(target); *s = prev; if (ops->target.raw == NULL) return -1; comment = strchr(s, '#'); if (comment == NULL) return 0; while (comment[0] != '\0' && isspace(comment[0])) ++comment; comment__symbol(ops->target.raw, comment, &ops->target.addr, &ops->target.name); return 0; }
static int mov__parse(struct ins_operands *ops) { char *s = strchr(ops->raw, ','), *target, *comment, prev; if (s == NULL) return -1; *s = '\0'; ops->source.raw = strdup(ops->raw); *s = ','; if (ops->source.raw == NULL) return -1; target = ++s; while (s[0] != '\0' && !isspace(s[0])) ++s; prev = *s; *s = '\0'; ops->target.raw = strdup(target); *s = prev; if (ops->target.raw == NULL) goto out_free_source; comment = strchr(s, '#'); if (comment == NULL) return 0; while (comment[0] != '\0' && isspace(comment[0])) ++comment; comment__symbol(ops->source.raw, comment, &ops->source.addr, &ops->source.name); comment__symbol(ops->target.raw, comment, &ops->target.addr, &ops->target.name); return 0; out_free_source: free(ops->source.raw); ops->source.raw = NULL; return -1; }