GString *parse_script_str(const char *enc) { char **tokens = g_strsplit_set(enc, " \t\n", 0); assert (tokens != NULL); GString *script = g_string_sized_new(64); unsigned int idx; for (idx = 0; tokens[idx] != NULL; idx++) { char *token = tokens[idx]; if (is_digitstr(token)) { int64_t v = strtoll(token, NULL, 10); bsp_push_int64(script, v); } else if (is_hexstr(token, true)) { GString *raw = hex2str(token); g_string_append_len(script, raw->str, raw->len); g_string_free(raw, TRUE); } else if ((strlen(token) >= 2) && (token[0] == '\'') && (token[strlen(token) - 1] == '\'')) bsp_push_data(script, &token[1], strlen(token) - 2); else if (GetOpType(token) != OP_INVALIDOPCODE) bsp_push_op(script, GetOpType(token)); else assert(!"parse error"); } g_strfreev(tokens); return script; }
static error_t parse_opt (int key, char *arg, struct argp_state *state) { switch(key) { case 1001: // --locktime=NNNNN opt_locktime = arg; break; case 1002: // --nversion=NNNNN opt_version = arg; break; case 1003: // --blank opt_blank = true; break; case 1030: // --output-json opt_decode_json = true; break; case 1040: // --strict-free opt_strict_free = true; break; case 1010: { // --txin=TXID:VOUT char *colon = strchr(arg, ':'); if (!colon) return ARGP_ERR_UNKNOWN; if ((colon - arg) != 64) return ARGP_ERR_UNKNOWN; if (!is_digitstr(colon + 1)) return ARGP_ERR_UNKNOWN; char hexstr[65]; memcpy(hexstr, arg, 64); hexstr[64] = 0; if (!is_hexstr(hexstr, false)) return ARGP_ERR_UNKNOWN; opt_txin = clist_append(opt_txin, strdup(arg)); break; } case 1011: { // --delete-txin=INDEX if (!is_digitstr(arg)) return ARGP_ERR_UNKNOWN; opt_del_txin = clist_append(opt_del_txin, int_to_ptr(atoi(arg))); break; } case 1020: { // --txout=ADDRESS:AMOUNT char *colon = strchr(arg, ':'); if (!colon) return ARGP_ERR_UNKNOWN; unsigned int partlen = colon - arg; if (!is_digitstr(colon + 1)) return ARGP_ERR_UNKNOWN; char addrstr[partlen + 1]; memcpy(addrstr, arg, partlen); addrstr[partlen] = 0; cstring *payload = base58_decode_check(NULL, addrstr); bool payload_invalid = (!payload || (payload->len != 21)); cstr_free(payload, true); if (payload_invalid) return ARGP_ERR_UNKNOWN; opt_txout = clist_append(opt_txout, strdup(arg)); break; } case 1021: { // --delete-txout=INDEX if (!is_digitstr(arg)) return ARGP_ERR_UNKNOWN; opt_del_txout = clist_append(opt_del_txout, int_to_ptr(atoi(arg))); break; } case ARGP_KEY_ARG: if (opt_hexdata) return ARGP_ERR_UNKNOWN; opt_hexdata = arg; break; default: return ARGP_ERR_UNKNOWN; } return 0; }