fuzzer_parser_init:
   33|  1.04k|readstat_parser_t *fuzzer_parser_init(const uint8_t *Data, size_t Size) {
   34|  1.04k|    readstat_parser_t *parser = readstat_parser_init();
   35|  1.04k|    readstat_set_open_handler(parser, rt_open_handler);
   36|  1.04k|    readstat_set_close_handler(parser, rt_close_handler);
   37|  1.04k|    readstat_set_seek_handler(parser, rt_seek_handler);
   38|  1.04k|    readstat_set_read_handler(parser, rt_read_handler);
   39|  1.04k|    readstat_set_update_handler(parser, rt_update_handler);
   40|       |
   41|  1.04k|    readstat_set_metadata_handler(parser, &handle_metadata);
   42|  1.04k|    readstat_set_note_handler(parser, &handle_note);
   43|  1.04k|    readstat_set_variable_handler(parser, &handle_variable);
   44|  1.04k|    readstat_set_fweight_handler(parser, &handle_fweight);
   45|  1.04k|    readstat_set_value_handler(parser, &handle_value);
   46|  1.04k|    readstat_set_value_label_handler(parser, &handle_value_label);
   47|       |
   48|  1.04k|    return parser;
   49|  1.04k|}
fuzz_format.c:handle_variable:
   21|  1.20k|                           const char *val_labels, void *ctx) {
   22|  1.20k|    return READSTAT_HANDLER_OK;
   23|  1.20k|}
fuzz_format.c:handle_value_label:
   29|  8.32M|static int handle_value_label(const char *val_labels, readstat_value_t value, const char *label, void *ctx) {
   30|  8.32M|    return READSTAT_HANDLER_OK;
   31|  8.32M|}

LLVMFuzzerTestOneInput:
   11|  1.04k|int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
   12|  1.04k|    rt_buffer_t buffer = { .bytes = (char *)Data, .size = Size, .used = Size };
   13|  1.04k|    rt_buffer_ctx_t buffer_ctx = { .buffer = &buffer };
   14|       |
   15|  1.04k|    readstat_parser_t *parser = fuzzer_parser_init(Data, Size);
   16|  1.04k|    readstat_set_io_ctx(parser, &buffer_ctx);
   17|       |
   18|  1.04k|    readstat_schema_t *schema = readstat_parse_spss_commands(parser, NULL, NULL, NULL);
   19|  1.04k|    if (schema)
  ------------------
  |  Branch (19:9): [True: 232, False: 811]
  ------------------
   20|    232|        readstat_schema_free(schema);
   21|  1.04k|    readstat_parser_free(parser);
   22|       |
   23|  1.04k|    return 0;
   24|  1.04k|}

unistd_io_init:
  121|  1.04k|readstat_error_t unistd_io_init(readstat_parser_t *parser) {
  122|  1.04k|    readstat_error_t retval = READSTAT_OK;
  123|  1.04k|    unistd_io_ctx_t *io_ctx = NULL;
  124|       |
  125|  1.04k|    if ((retval = readstat_set_open_handler(parser, unistd_open_handler)) != READSTAT_OK)
  ------------------
  |  Branch (125:9): [True: 0, False: 1.04k]
  ------------------
  126|      0|        return retval;
  127|       |
  128|  1.04k|    if ((retval = readstat_set_close_handler(parser, unistd_close_handler)) != READSTAT_OK)
  ------------------
  |  Branch (128:9): [True: 0, False: 1.04k]
  ------------------
  129|      0|        return retval;
  130|       |
  131|  1.04k|    if ((retval = readstat_set_seek_handler(parser, unistd_seek_handler)) != READSTAT_OK)
  ------------------
  |  Branch (131:9): [True: 0, False: 1.04k]
  ------------------
  132|      0|        return retval;
  133|       |
  134|  1.04k|    if ((retval = readstat_set_read_handler(parser, unistd_read_handler)) != READSTAT_OK)
  ------------------
  |  Branch (134:9): [True: 0, False: 1.04k]
  ------------------
  135|      0|        return retval;
  136|       |
  137|  1.04k|    if ((readstat_set_update_handler(parser, unistd_update_handler)) != READSTAT_OK)
  ------------------
  |  Branch (137:9): [True: 0, False: 1.04k]
  ------------------
  138|      0|        return retval;
  139|       |
  140|  1.04k|    io_ctx = calloc(1, sizeof(unistd_io_ctx_t));
  141|  1.04k|    io_ctx->fd = -1;
  142|       |
  143|  1.04k|    retval = readstat_set_io_ctx(parser, (void*) io_ctx);
  144|  1.04k|    parser->io->io_ctx_needs_free = 1;
  145|       |
  146|  1.04k|    return retval;
  147|  1.04k|}

readstat_parser_init:
    6|  1.04k|readstat_parser_t *readstat_parser_init(void) {
    7|  1.04k|    readstat_parser_t *parser = calloc(1, sizeof(readstat_parser_t));
    8|  1.04k|    parser->io = calloc(1, sizeof(readstat_io_t));
    9|  1.04k|    if (unistd_io_init(parser) != READSTAT_OK) {
  ------------------
  |  Branch (9:9): [True: 0, False: 1.04k]
  ------------------
   10|      0|        readstat_parser_free(parser);
   11|      0|        return NULL;
   12|      0|    }
   13|  1.04k|    parser->output_encoding = "UTF-8";
   14|  1.04k|    return parser;
   15|  1.04k|}
readstat_parser_free:
   17|  1.04k|void readstat_parser_free(readstat_parser_t *parser) {
   18|  1.04k|    if (parser) {
  ------------------
  |  Branch (18:9): [True: 1.04k, False: 0]
  ------------------
   19|  1.04k|        if (parser->io) {
  ------------------
  |  Branch (19:13): [True: 1.04k, False: 0]
  ------------------
   20|       |            readstat_set_io_ctx(parser, NULL);
   21|  1.04k|            free(parser->io);
   22|  1.04k|        }
   23|  1.04k|        free(parser);
   24|  1.04k|    }
   25|  1.04k|}
readstat_set_metadata_handler:
   27|  1.04k|readstat_error_t readstat_set_metadata_handler(readstat_parser_t *parser, readstat_metadata_handler metadata_handler) {
   28|  1.04k|    parser->handlers.metadata = metadata_handler;
   29|  1.04k|    return READSTAT_OK;
   30|  1.04k|}
readstat_set_note_handler:
   32|  1.04k|readstat_error_t readstat_set_note_handler(readstat_parser_t *parser, readstat_note_handler note_handler) {
   33|  1.04k|    parser->handlers.note = note_handler;
   34|  1.04k|    return READSTAT_OK;
   35|  1.04k|}
readstat_set_variable_handler:
   37|  1.04k|readstat_error_t readstat_set_variable_handler(readstat_parser_t *parser, readstat_variable_handler variable_handler) {
   38|  1.04k|    parser->handlers.variable = variable_handler;
   39|  1.04k|    return READSTAT_OK;
   40|  1.04k|}
readstat_set_value_handler:
   42|  1.04k|readstat_error_t readstat_set_value_handler(readstat_parser_t *parser, readstat_value_handler value_handler) {
   43|  1.04k|    parser->handlers.value = value_handler;
   44|  1.04k|    return READSTAT_OK;
   45|  1.04k|}
readstat_set_value_label_handler:
   47|  1.04k|readstat_error_t readstat_set_value_label_handler(readstat_parser_t *parser, readstat_value_label_handler label_handler) {
   48|  1.04k|    parser->handlers.value_label = label_handler;
   49|  1.04k|    return READSTAT_OK;
   50|  1.04k|}
readstat_set_fweight_handler:
   62|  1.04k|readstat_error_t readstat_set_fweight_handler(readstat_parser_t *parser, readstat_fweight_handler fweight_handler) {
   63|  1.04k|    parser->handlers.fweight = fweight_handler;
   64|  1.04k|    return READSTAT_OK;
   65|  1.04k|}
readstat_set_open_handler:
   67|  2.08k|readstat_error_t readstat_set_open_handler(readstat_parser_t *parser, readstat_open_handler open_handler) {
   68|  2.08k|    parser->io->open = open_handler;
   69|  2.08k|    return READSTAT_OK;
   70|  2.08k|}
readstat_set_close_handler:
   72|  2.08k|readstat_error_t readstat_set_close_handler(readstat_parser_t *parser, readstat_close_handler close_handler) {
   73|  2.08k|    parser->io->close = close_handler;
   74|  2.08k|    return READSTAT_OK;
   75|  2.08k|}
readstat_set_seek_handler:
   77|  2.08k|readstat_error_t readstat_set_seek_handler(readstat_parser_t *parser, readstat_seek_handler seek_handler) {
   78|  2.08k|    parser->io->seek = seek_handler;
   79|  2.08k|    return READSTAT_OK;
   80|  2.08k|}
readstat_set_read_handler:
   82|  2.08k|readstat_error_t readstat_set_read_handler(readstat_parser_t *parser, readstat_read_handler read_handler) {
   83|  2.08k|    parser->io->read = read_handler;
   84|  2.08k|    return READSTAT_OK;
   85|  2.08k|}
readstat_set_update_handler:
   87|  2.08k|readstat_error_t readstat_set_update_handler(readstat_parser_t *parser, readstat_update_handler update_handler) {
   88|  2.08k|    parser->io->update = update_handler;
   89|  2.08k|    return READSTAT_OK;
   90|  2.08k|}
readstat_set_io_ctx:
   92|  3.12k|readstat_error_t readstat_set_io_ctx(readstat_parser_t *parser, void *io_ctx) {
   93|  3.12k|    if (parser->io->io_ctx_needs_free) {
  ------------------
  |  Branch (93:9): [True: 1.04k, False: 2.08k]
  ------------------
   94|  1.04k|        free(parser->io->io_ctx);
   95|  1.04k|    }
   96|       |
   97|  3.12k|    parser->io->io_ctx = io_ctx;
   98|  3.12k|    parser->io->io_ctx_needs_free = 0;
   99|       |
  100|  3.12k|    return READSTAT_OK;
  101|  3.12k|}

rt_open_handler:
    8|  1.04k|int rt_open_handler(const char *path, void *io_ctx) {
    9|  1.04k|    return 0;
   10|  1.04k|}
rt_close_handler:
   12|  1.04k|int rt_close_handler(void *io_ctx) {
   13|  1.04k|    return 0;
   14|  1.04k|}
rt_seek_handler:
   17|  2.08k|        readstat_io_flags_t whence, void *io_ctx) {
   18|  2.08k|    rt_buffer_ctx_t *buffer_ctx = (rt_buffer_ctx_t *)io_ctx;
   19|  2.08k|    readstat_off_t newpos = -1;
   20|  2.08k|    if (whence == READSTAT_SEEK_SET) {
  ------------------
  |  Branch (20:9): [True: 1.04k, False: 1.04k]
  ------------------
   21|  1.04k|        newpos = offset;
   22|  1.04k|    } else if (whence == READSTAT_SEEK_CUR) {
  ------------------
  |  Branch (22:16): [True: 0, False: 1.04k]
  ------------------
   23|      0|        newpos = buffer_ctx->pos + offset;
   24|  1.04k|    } else if (whence == READSTAT_SEEK_END) {
  ------------------
  |  Branch (24:16): [True: 1.04k, False: 0]
  ------------------
   25|  1.04k|        newpos = buffer_ctx->buffer->used + offset;
   26|  1.04k|    }
   27|       |
   28|  2.08k|    if (newpos < 0)
  ------------------
  |  Branch (28:9): [True: 0, False: 2.08k]
  ------------------
   29|      0|        return -1;
   30|       |
   31|  2.08k|    if (newpos > buffer_ctx->buffer->used)
  ------------------
  |  Branch (31:9): [True: 0, False: 2.08k]
  ------------------
   32|      0|        return -1;
   33|       |
   34|  2.08k|    buffer_ctx->pos = newpos;
   35|  2.08k|    return newpos;
   36|  2.08k|}
rt_read_handler:
   38|  1.04k|ssize_t rt_read_handler(void *buf, size_t nbytes, void *io_ctx) {
   39|  1.04k|    rt_buffer_ctx_t *buffer_ctx = (rt_buffer_ctx_t *)io_ctx;
   40|  1.04k|    ssize_t bytes_copied = 0;
   41|  1.04k|    ssize_t bytes_left = buffer_ctx->buffer->used - buffer_ctx->pos;
   42|  1.04k|    if (nbytes <= bytes_left) {
  ------------------
  |  Branch (42:9): [True: 1.04k, False: 0]
  ------------------
   43|  1.04k|        memcpy(buf, buffer_ctx->buffer->bytes + buffer_ctx->pos, nbytes);
   44|  1.04k|        bytes_copied = nbytes;
   45|  1.04k|    } else if (bytes_left > 0) {
  ------------------
  |  Branch (45:16): [True: 0, False: 0]
  ------------------
   46|      0|        memcpy(buf, buffer_ctx->buffer->bytes + buffer_ctx->pos, bytes_left);
   47|      0|        bytes_copied = bytes_left;
   48|      0|    }
   49|  1.04k|    buffer_ctx->pos += bytes_copied;
   50|  1.04k|    return bytes_copied;
   51|  1.04k|}

submit_value_label:
    9|  2.85k|        double double_value, const char *string_value, const char *buf, void *user_ctx) {
   10|  2.85k|    if (!parser->handlers.value_label)
  ------------------
  |  Branch (10:9): [True: 0, False: 2.85k]
  ------------------
   11|      0|        return READSTAT_OK;
   12|       |
   13|  2.85k|    int cb_retval = READSTAT_HANDLER_OK;
   14|  2.85k|    if (label_type == LABEL_TYPE_RANGE) {
  ------------------
  |  Branch (14:9): [True: 862, False: 1.99k]
  ------------------
   15|    862|        int64_t i;
   16|  8.32M|        for (i=first_integer; i<=last_integer; i++) {
  ------------------
  |  Branch (16:31): [True: 8.32M, False: 862]
  ------------------
   17|  8.32M|            readstat_value_t value = { 
   18|  8.32M|                .type = READSTAT_TYPE_DOUBLE,
   19|  8.32M|                .v = { .double_value = i } };
   20|  8.32M|            cb_retval = parser->handlers.value_label(labelset, value, buf, user_ctx);
   21|  8.32M|            if (cb_retval != READSTAT_HANDLER_OK)
  ------------------
  |  Branch (21:17): [True: 0, False: 8.32M]
  ------------------
   22|      0|                goto cleanup;
   23|  8.32M|        }
   24|  1.99k|    } else if (label_type != LABEL_TYPE_OTHER) {
  ------------------
  |  Branch (24:16): [True: 1.99k, False: 0]
  ------------------
   25|  1.99k|        readstat_value_t value = { { 0 } };
   26|  1.99k|        if (label_type == LABEL_TYPE_DOUBLE) {
  ------------------
  |  Branch (26:13): [True: 488, False: 1.50k]
  ------------------
   27|    488|            value.type = READSTAT_TYPE_DOUBLE;
   28|    488|            value.v.double_value = double_value;
   29|  1.50k|        } else if (label_type == LABEL_TYPE_STRING) {
  ------------------
  |  Branch (29:20): [True: 720, False: 789]
  ------------------
   30|    720|            value.type = READSTAT_TYPE_STRING;
   31|    720|            value.v.string_value = string_value;
   32|    789|        } else if (label_type == LABEL_TYPE_NAN) {
  ------------------
  |  Branch (32:20): [True: 789, False: 0]
  ------------------
   33|    789|            value.type = READSTAT_TYPE_DOUBLE;
   34|    789|            value.v.double_value = NAN;
   35|    789|        }
   36|       |
   37|  1.99k|        cb_retval = parser->handlers.value_label(labelset, value, buf, user_ctx);
   38|  1.99k|    }
   39|       |
   40|  2.85k|cleanup:
   41|  2.85k|    return (cb_retval == READSTAT_HANDLER_OK) ? READSTAT_OK : READSTAT_ERROR_USER_ABORT;
  ------------------
  |  Branch (41:12): [True: 2.85k, False: 0]
  ------------------
   42|  2.85k|}
submit_columns:
   44|    232|readstat_error_t submit_columns(readstat_parser_t *parser, readstat_schema_t *dct, void *user_ctx) {
   45|    232|    int i;
   46|    232|    int partial_entry_count = 0;
   47|  1.43k|    for (i=0; i<dct->entry_count; i++) {
  ------------------
  |  Branch (47:15): [True: 1.20k, False: 232]
  ------------------
   48|  1.20k|        readstat_schema_entry_t *entry = &dct->entries[i];
   49|  1.20k|        if (dct->rows_per_observation < entry->row + 1) {
  ------------------
  |  Branch (49:13): [True: 82, False: 1.12k]
  ------------------
   50|     82|            dct->rows_per_observation = entry->row + 1;
   51|     82|        }
   52|  1.20k|    }
   53|       |
   54|    232|    if (!parser->handlers.variable)
  ------------------
  |  Branch (54:9): [True: 0, False: 232]
  ------------------
   55|      0|        return READSTAT_OK;
   56|       |
   57|  1.43k|    for (i=0; i<dct->entry_count; i++) {
  ------------------
  |  Branch (57:15): [True: 1.20k, False: 232]
  ------------------
   58|  1.20k|        readstat_schema_entry_t *entry = &dct->entries[i];
   59|  1.20k|        entry->variable.index = i;
   60|  1.20k|        entry->variable.index_after_skipping = partial_entry_count;
   61|  1.20k|        if (entry->variable.type == READSTAT_TYPE_STRING)
  ------------------
  |  Branch (61:13): [True: 796, False: 408]
  ------------------
   62|    796|            entry->variable.storage_width = entry->len;
   63|  1.20k|        int cb_retval = parser->handlers.variable(i, &entry->variable,
   64|  1.20k|            entry->labelset[0] ? entry->labelset : NULL, user_ctx);
  ------------------
  |  Branch (64:13): [True: 113, False: 1.09k]
  ------------------
   65|  1.20k|        if (cb_retval == READSTAT_HANDLER_SKIP_VARIABLE) {
  ------------------
  |  Branch (65:13): [True: 0, False: 1.20k]
  ------------------
   66|      0|            entry->skip = 1;
   67|  1.20k|        } else if (cb_retval == READSTAT_HANDLER_ABORT) {
  ------------------
  |  Branch (67:20): [True: 0, False: 1.20k]
  ------------------
   68|      0|            return READSTAT_ERROR_USER_ABORT;
   69|  1.20k|        } else {
   70|  1.20k|            partial_entry_count++;
   71|  1.20k|        }
   72|  1.20k|    }
   73|    232|    return READSTAT_OK;
   74|    232|}

readstat_copy:
    5|  29.8k|void readstat_copy(char *buf, size_t buf_len, const char *str_start, size_t str_len) {
    6|  29.8k|    size_t this_len = str_len;
    7|  29.8k|    if (this_len >= buf_len) {
  ------------------
  |  Branch (7:9): [True: 4.15k, False: 25.6k]
  ------------------
    8|  4.15k|        this_len = buf_len - 1;
    9|  4.15k|    }
   10|  29.8k|    memcpy(buf, str_start, this_len);
   11|  29.8k|    buf[this_len] = '\0';
   12|  29.8k|}
readstat_copy_quoted:
   21|  5.92k|void readstat_copy_quoted(char *buf, size_t buf_len, const char *str_start, size_t str_len) {
   22|  5.92k|    size_t this_len = str_len;
   23|  5.92k|    if (this_len >= buf_len) {
  ------------------
  |  Branch (23:9): [True: 302, False: 5.62k]
  ------------------
   24|    302|        this_len = buf_len - 1;
   25|    302|    }
   26|  5.92k|    size_t i=0;
   27|  5.92k|    size_t j=0;
   28|  5.92k|    int slash = 0;
   29|  59.2k|    for (i=0; i<this_len; i++) {
  ------------------
  |  Branch (29:15): [True: 53.3k, False: 5.92k]
  ------------------
   30|  53.3k|        if (slash) {
  ------------------
  |  Branch (30:13): [True: 1.83k, False: 51.4k]
  ------------------
   31|  1.83k|            if (str_start[i] == 't') {
  ------------------
  |  Branch (31:17): [True: 290, False: 1.54k]
  ------------------
   32|    290|                buf[j++] = '\t';
   33|  1.54k|            } else {
   34|  1.54k|                buf[j++] = str_start[i];
   35|  1.54k|            }
   36|  1.83k|            slash = 0;
   37|  51.4k|        } else {
   38|  51.4k|            if (str_start[i] == '\\') {
  ------------------
  |  Branch (38:17): [True: 1.89k, False: 49.5k]
  ------------------
   39|  1.89k|                slash = 1;
   40|  49.5k|            } else {
   41|  49.5k|                buf[j++] = str_start[i];
   42|  49.5k|            }
   43|  51.4k|        }
   44|  53.3k|    }
   45|  5.92k|    buf[j] = '\0';
   46|  5.92k|}

readstat_schema_free:
    7|  1.04k|void readstat_schema_free(readstat_schema_t *schema) {
    8|  1.04k|    if (schema) {
  ------------------
  |  Branch (8:9): [True: 1.04k, False: 0]
  ------------------
    9|  1.04k|        free(schema->entries);
   10|  1.04k|        free(schema);
   11|  1.04k|    }
   12|  1.04k|}
readstat_schema_find_or_create_entry:
   14|  6.28k|readstat_schema_entry_t *readstat_schema_find_or_create_entry(readstat_schema_t *dct, const char *var_name) {
   15|  6.28k|    readstat_schema_entry_t *entry = NULL;
   16|  6.28k|    int i;
   17|       |    /* linear search. this is shitty, but whatever */
   18|  42.9k|    for (i=0; i<dct->entry_count; i++) {
  ------------------
  |  Branch (18:15): [True: 41.3k, False: 1.61k]
  ------------------
   19|  41.3k|        if (strcmp(dct->entries[i].variable.name, var_name) == 0) {
  ------------------
  |  Branch (19:13): [True: 4.66k, False: 36.6k]
  ------------------
   20|  4.66k|            entry = &dct->entries[i];
   21|  4.66k|            break;
   22|  4.66k|        }
   23|  41.3k|    }
   24|  6.28k|    if (!entry) {
  ------------------
  |  Branch (24:9): [True: 1.61k, False: 4.66k]
  ------------------
   25|  1.61k|        dct->entries = realloc(dct->entries, sizeof(readstat_schema_entry_t) * (dct->entry_count + 1));
   26|  1.61k|        entry = &dct->entries[dct->entry_count];
   27|  1.61k|        memset(entry, 0, sizeof(readstat_schema_entry_t));
   28|       |        
   29|  1.61k|        readstat_copy(entry->variable.name, sizeof(entry->variable.name), var_name, strlen(var_name));
   30|  1.61k|        entry->decimal_separator = '.';
   31|  1.61k|        entry->variable.index = dct->entry_count++;
   32|  1.61k|    }
   33|  6.28k|    return entry;
   34|  6.28k|}

readstat_parse_spss_commands:
 1927|  1.04k|const char *filepath, void *user_ctx, readstat_error_t *outError) {
 1928|  1.04k|	if (parser->io->open(filepath, parser->io->io_ctx) == -1) {
  ------------------
  |  Branch (1928:6): [True: 0, False: 1.04k]
  ------------------
 1929|      0|		if (outError)
  ------------------
  |  Branch (1929:7): [True: 0, False: 0]
  ------------------
 1930|      0|			*outError = READSTAT_ERROR_OPEN;
 1931|      0|		return NULL;
 1932|      0|	}
 1933|  1.04k|	readstat_schema_t *schema = NULL;
 1934|  1.04k|	unsigned char *bytes = NULL;
 1935|  1.04k|	readstat_error_t error = READSTAT_OK;
 1936|  1.04k|	ssize_t len = parser->io->seek(0, READSTAT_SEEK_END, parser->io->io_ctx);
 1937|  1.04k|	if (len == -1) {
  ------------------
  |  Branch (1937:6): [True: 0, False: 1.04k]
  ------------------
 1938|      0|		error = READSTAT_ERROR_SEEK;
 1939|      0|		goto cleanup;
 1940|      0|	}
 1941|  1.04k|	parser->io->seek(0, READSTAT_SEEK_SET, parser->io->io_ctx);
 1942|       |	
 1943|  1.04k|	bytes = malloc(len);
 1944|       |	
 1945|  1.04k|	parser->io->read(bytes, len, parser->io->io_ctx);
 1946|       |	
 1947|  1.04k|	unsigned char *p = bytes;
 1948|  1.04k|	unsigned char *pe = bytes + len;
 1949|       |	
 1950|  1.04k|	unsigned char *eof = pe;
 1951|       |	
 1952|  1.04k|	unsigned char *str_start = NULL;
 1953|       |	
 1954|  1.04k|	size_t str_len = 0;
 1955|       |	
 1956|  1.04k|	int cs;
 1957|       |	
 1958|  1.04k|	int i;
 1959|  1.04k|	int line_no = 0;
 1960|  1.04k|	uint64_t first_integer = 0, integer = 0;
 1961|  1.04k|	double double_value = NAN;
 1962|  1.04k|	unsigned char *line_start = p;
 1963|       |	
 1964|  1.04k|	char varname[32];
 1965|  1.04k|	char argname[32];
 1966|  1.04k|	char string_value[32];
 1967|  1.04k|	char buf[1024];
 1968|       |	
 1969|  1.04k|	char var_list[1024][32];
 1970|       |	
 1971|  1.04k|	long var_col = 0;
 1972|  1.04k|	long var_row = 0;
 1973|  1.04k|	long var_len = 0;
 1974|  1.04k|	long var_count = 0;
 1975|  1.04k|	readstat_type_t var_type = READSTAT_TYPE_DOUBLE;
 1976|  1.04k|	label_type_t label_type = LABEL_TYPE_DOUBLE;
 1977|       |	
 1978|  1.04k|	int labelset_count = 0;
 1979|       |	
 1980|  1.04k|	if ((schema = calloc(1, sizeof(readstat_schema_t))) == NULL) {
  ------------------
  |  Branch (1980:6): [True: 0, False: 1.04k]
  ------------------
 1981|      0|		error = READSTAT_ERROR_MALLOC;
 1982|      0|		goto cleanup;
 1983|      0|	}
 1984|       |	
 1985|  1.04k|	schema->rows_per_observation = 1;
 1986|       |	
 1987|       |	
 1988|  1.04k|#line 1989 "src/txt/readstat_spss_commands_read.c"
 1989|  1.04k|	{
 1990|  1.04k|		cs = (int)spss_commands_start;
 1991|  1.04k|	}
 1992|       |	
 1993|  1.04k|#line 1994 "src/txt/readstat_spss_commands_read.c"
 1994|  1.04k|	{
 1995|  1.04k|		int _klen;
 1996|  1.04k|		unsigned int _trans = 0;
 1997|  1.04k|		const char * _keys;
 1998|  1.04k|		const signed char * _acts;
 1999|  1.04k|		unsigned int _nacts;
 2000|  6.86M|		_resume: {}
 2001|  6.86M|		if ( p == pe && p != eof )
  ------------------
  |  Branch (2001:8): [True: 982, False: 6.86M]
  |  Branch (2001:19): [True: 0, False: 982]
  ------------------
 2002|      0|			goto _out;
 2003|  6.86M|		if ( p == eof ) {
  ------------------
  |  Branch (2003:8): [True: 982, False: 6.86M]
  ------------------
 2004|    982|			if ( _spss_commands_eof_trans[cs] > 0 ) {
  ------------------
  |  Branch (2004:9): [True: 982, False: 0]
  ------------------
 2005|    982|				_trans = (unsigned int)_spss_commands_eof_trans[cs] - 1;
 2006|    982|			}
 2007|    982|		}
 2008|  6.86M|		else {
 2009|  6.86M|			_keys = ( _spss_commands_trans_keys + (_spss_commands_key_offsets[cs]));
 2010|  6.86M|			_trans = (unsigned int)_spss_commands_index_offsets[cs];
 2011|       |			
 2012|  6.86M|			_klen = (int)_spss_commands_single_lengths[cs];
 2013|  6.86M|			if ( _klen > 0 ) {
  ------------------
  |  Branch (2013:9): [True: 6.86M, False: 949]
  ------------------
 2014|  6.86M|				const char *_lower = _keys;
 2015|  6.86M|				const char *_upper = _keys + _klen - 1;
 2016|  6.86M|				const char *_mid;
 2017|  20.9M|				while ( 1 ) {
  ------------------
  |  Branch (2017:13): [True: 20.9M, Folded]
  ------------------
 2018|  20.9M|					if ( _upper < _lower ) {
  ------------------
  |  Branch (2018:11): [True: 6.79M, False: 14.1M]
  ------------------
 2019|  6.79M|						_keys += _klen;
 2020|  6.79M|						_trans += (unsigned int)_klen;
 2021|  6.79M|						break;
 2022|  6.79M|					}
 2023|       |					
 2024|  14.1M|					_mid = _lower + ((_upper-_lower) >> 1);
 2025|  14.1M|					if ( ( (*( p))) < (*( _mid)) )
  ------------------
  |  Branch (2025:11): [True: 2.74M, False: 11.4M]
  ------------------
 2026|  2.74M|						_upper = _mid - 1;
 2027|  11.4M|					else if ( ( (*( p))) > (*( _mid)) )
  ------------------
  |  Branch (2027:16): [True: 11.3M, False: 67.3k]
  ------------------
 2028|  11.3M|						_lower = _mid + 1;
 2029|  67.3k|					else {
 2030|  67.3k|						_trans += (unsigned int)(_mid - _keys);
 2031|  67.3k|						goto _match;
 2032|  67.3k|					}
 2033|  14.1M|				}
 2034|  6.86M|			}
 2035|       |			
 2036|  6.79M|			_klen = (int)_spss_commands_range_lengths[cs];
 2037|  6.79M|			if ( _klen > 0 ) {
  ------------------
  |  Branch (2037:9): [True: 3.60M, False: 3.18M]
  ------------------
 2038|  3.60M|				const char *_lower = _keys;
 2039|  3.60M|				const char *_upper = _keys + (_klen<<1) - 2;
 2040|  3.60M|				const char *_mid;
 2041|  6.85M|				while ( 1 ) {
  ------------------
  |  Branch (2041:13): [True: 6.85M, Folded]
  ------------------
 2042|  6.85M|					if ( _upper < _lower ) {
  ------------------
  |  Branch (2042:11): [True: 35, False: 6.85M]
  ------------------
 2043|     35|						_trans += (unsigned int)_klen;
 2044|     35|						break;
 2045|     35|					}
 2046|       |					
 2047|  6.85M|					_mid = _lower + (((_upper-_lower) >> 1) & ~1);
 2048|  6.85M|					if ( ( (*( p))) < (*( _mid)) )
  ------------------
  |  Branch (2048:11): [True: 793k, False: 6.05M]
  ------------------
 2049|   793k|						_upper = _mid - 2;
 2050|  6.05M|					else if ( ( (*( p))) > (*( _mid + 1)) )
  ------------------
  |  Branch (2050:16): [True: 2.44M, False: 3.60M]
  ------------------
 2051|  2.44M|						_lower = _mid + 2;
 2052|  3.60M|					else {
 2053|  3.60M|						_trans += (unsigned int)((_mid - _keys)>>1);
 2054|  3.60M|						break;
 2055|  3.60M|					}
 2056|  6.85M|				}
 2057|  3.60M|			}
 2058|       |			
 2059|  6.86M|			_match: {}
 2060|  6.86M|		}
 2061|  6.86M|		cs = (int)_spss_commands_cond_targs[_trans];
 2062|       |		
 2063|  6.86M|		if ( _spss_commands_cond_actions[_trans] != 0 ) {
  ------------------
  |  Branch (2063:8): [True: 82.3k, False: 6.78M]
  ------------------
 2064|       |			
 2065|  82.3k|			_acts = ( _spss_commands_actions + (_spss_commands_cond_actions[_trans]));
 2066|  82.3k|			_nacts = (unsigned int)(*( _acts));
 2067|  82.3k|			_acts += 1;
 2068|   255k|			while ( _nacts > 0 ) {
  ------------------
  |  Branch (2068:12): [True: 172k, False: 82.3k]
  ------------------
 2069|   172k|				switch ( (*( _acts)) )
  ------------------
  |  Branch (2069:14): [True: 172k, False: 0]
  ------------------
 2070|   172k|				{
 2071|  5.97k|					case 0:  {
  ------------------
  |  Branch (2071:6): [True: 5.97k, False: 166k]
  ------------------
 2072|  5.97k|						{
 2073|  5.97k|#line 78 "src/txt/readstat_spss_commands_read.rl"
 2074|       |							
 2075|  5.97k|							integer = 0;
 2076|  5.97k|						}
 2077|       |						
 2078|  5.97k|#line 2079 "src/txt/readstat_spss_commands_read.c"
 2079|       |						
 2080|  5.97k|						break; 
 2081|      0|					}
 2082|  7.62k|					case 1:  {
  ------------------
  |  Branch (2082:6): [True: 7.62k, False: 165k]
  ------------------
 2083|  7.62k|						{
 2084|  7.62k|#line 82 "src/txt/readstat_spss_commands_read.rl"
 2085|       |							
 2086|  7.62k|							integer = 10 * integer + ((( (*( p)))) - '0');
 2087|  7.62k|						}
 2088|       |						
 2089|  7.62k|#line 2090 "src/txt/readstat_spss_commands_read.c"
 2090|       |						
 2091|  7.62k|						break; 
 2092|      0|					}
 2093|  1.69k|					case 2:  {
  ------------------
  |  Branch (2093:6): [True: 1.69k, False: 171k]
  ------------------
 2094|  1.69k|						{
 2095|  1.69k|#line 86 "src/txt/readstat_spss_commands_read.rl"
 2096|       |							
 2097|  1.69k|							var_col = integer - 1;
 2098|  1.69k|							var_len = 1;
 2099|  1.69k|						}
 2100|       |						
 2101|  1.69k|#line 2102 "src/txt/readstat_spss_commands_read.c"
 2102|       |						
 2103|  1.69k|						break; 
 2104|      0|					}
 2105|    211|					case 3:  {
  ------------------
  |  Branch (2105:6): [True: 211, False: 172k]
  ------------------
 2106|    211|						{
 2107|    211|#line 91 "src/txt/readstat_spss_commands_read.rl"
 2108|       |							
 2109|    211|							var_len = integer - var_col;
 2110|    211|						}
 2111|       |						
 2112|    211|#line 2113 "src/txt/readstat_spss_commands_read.c"
 2113|       |						
 2114|    211|						break; 
 2115|      0|					}
 2116|  5.15k|					case 4:  {
  ------------------
  |  Branch (2116:6): [True: 5.15k, False: 167k]
  ------------------
 2117|  5.15k|						{
 2118|  5.15k|#line 95 "src/txt/readstat_spss_commands_read.rl"
 2119|       |							
 2120|  5.15k|							readstat_copy_quoted(buf, sizeof(buf), (char *)str_start, str_len);
 2121|  5.15k|						}
 2122|       |						
 2123|  5.15k|#line 2124 "src/txt/readstat_spss_commands_read.c"
 2124|       |						
 2125|  5.15k|						break; 
 2126|      0|					}
 2127|    775|					case 5:  {
  ------------------
  |  Branch (2127:6): [True: 775, False: 172k]
  ------------------
 2128|    775|						{
 2129|    775|#line 99 "src/txt/readstat_spss_commands_read.rl"
 2130|       |							
 2131|    775|							readstat_copy_quoted(string_value, sizeof(string_value), (char *)str_start, str_len);
 2132|    775|						}
 2133|       |						
 2134|    775|#line 2135 "src/txt/readstat_spss_commands_read.c"
 2135|       |						
 2136|    775|						break; 
 2137|      0|					}
 2138|  22.9k|					case 6:  {
  ------------------
  |  Branch (2138:6): [True: 22.9k, False: 149k]
  ------------------
 2139|  22.9k|						{
 2140|  22.9k|#line 107 "src/txt/readstat_spss_commands_read.rl"
 2141|       |							
 2142|  22.9k|							readstat_copy(varname, sizeof(varname), (char *)str_start, str_len);
 2143|  22.9k|						}
 2144|       |						
 2145|  22.9k|#line 2146 "src/txt/readstat_spss_commands_read.c"
 2146|       |						
 2147|  22.9k|						break; 
 2148|      0|					}
 2149|  1.11k|					case 7:  {
  ------------------
  |  Branch (2149:6): [True: 1.11k, False: 171k]
  ------------------
 2150|  1.11k|						{
 2151|  1.11k|#line 111 "src/txt/readstat_spss_commands_read.rl"
 2152|       |							
 2153|  1.11k|							readstat_copy(argname, sizeof(argname), (char *)str_start, str_len);
 2154|  1.11k|						}
 2155|       |						
 2156|  1.11k|#line 2157 "src/txt/readstat_spss_commands_read.c"
 2157|       |						
 2158|  1.11k|						break; 
 2159|      0|					}
 2160|  2.16k|					case 8:  {
  ------------------
  |  Branch (2160:6): [True: 2.16k, False: 170k]
  ------------------
 2161|  2.16k|						{
 2162|  2.16k|#line 115 "src/txt/readstat_spss_commands_read.rl"
 2163|       |							
 2164|  2.16k|							readstat_schema_entry_t *entry = readstat_schema_find_or_create_entry(schema, varname);
 2165|  2.16k|							entry->variable.type = var_type;
 2166|  2.16k|							entry->variable.storage_width = var_len;
 2167|  2.16k|							entry->row = var_row;
 2168|  2.16k|							entry->col = var_col;
 2169|  2.16k|							entry->len = var_len;
 2170|  2.16k|						}
 2171|       |						
 2172|  2.16k|#line 2173 "src/txt/readstat_spss_commands_read.c"
 2173|       |						
 2174|  2.16k|						break; 
 2175|      0|					}
 2176|  1.00k|					case 9:  {
  ------------------
  |  Branch (2176:6): [True: 1.00k, False: 171k]
  ------------------
 2177|  1.00k|						{
 2178|  1.00k|#line 124 "src/txt/readstat_spss_commands_read.rl"
 2179|       |							
 2180|  1.00k|							readstat_schema_entry_t *entry = readstat_schema_find_or_create_entry(schema, varname);
 2181|  1.00k|							readstat_copy(entry->variable.label, sizeof(entry->variable.label), buf, sizeof(buf));
 2182|  1.00k|						}
 2183|       |						
 2184|  1.00k|#line 2185 "src/txt/readstat_spss_commands_read.c"
 2185|       |						
 2186|  1.00k|						break; 
 2187|      0|					}
 2188|  1.31k|					case 10:  {
  ------------------
  |  Branch (2188:6): [True: 1.31k, False: 171k]
  ------------------
 2189|  1.31k|						{
 2190|  1.31k|#line 129 "src/txt/readstat_spss_commands_read.rl"
 2191|       |							
 2192|  1.31k|							var_count = 0;
 2193|  1.31k|						}
 2194|       |						
 2195|  1.31k|#line 2196 "src/txt/readstat_spss_commands_read.c"
 2196|       |						
 2197|  1.31k|						break; 
 2198|      0|					}
 2199|  19.4k|					case 11:  {
  ------------------
  |  Branch (2199:6): [True: 19.4k, False: 153k]
  ------------------
 2200|  19.4k|						{
 2201|  19.4k|#line 133 "src/txt/readstat_spss_commands_read.rl"
 2202|       |							
 2203|  19.4k|							if (var_count < sizeof(var_list)/sizeof(var_list[0])) {
  ------------------
  |  Branch (2203:12): [True: 19.2k, False: 194]
  ------------------
 2204|  19.2k|								memcpy(var_list[var_count++], varname, sizeof(varname));
 2205|  19.2k|							}
 2206|  19.4k|						}
 2207|       |						
 2208|  19.4k|#line 2209 "src/txt/readstat_spss_commands_read.c"
 2209|       |						
 2210|  19.4k|						break; 
 2211|      0|					}
 2212|  1.07k|					case 12:  {
  ------------------
  |  Branch (2212:6): [True: 1.07k, False: 171k]
  ------------------
 2213|  1.07k|						{
 2214|  1.07k|#line 139 "src/txt/readstat_spss_commands_read.rl"
 2215|       |							
 2216|  1.07k|							if (strcasecmp(argname, "FIRSTCASE") == 0) {
  ------------------
  |  Branch (2216:12): [True: 293, False: 777]
  ------------------
 2217|    293|								schema->first_line = integer;
 2218|    293|							}
 2219|  1.07k|							if (strcasecmp(argname, "DELIMITERS") == 0) {
  ------------------
  |  Branch (2219:12): [True: 203, False: 867]
  ------------------
 2220|    203|								schema->field_delimiter = buf[0];
 2221|    203|							}
 2222|  1.07k|						}
 2223|       |						
 2224|  1.07k|#line 2225 "src/txt/readstat_spss_commands_read.c"
 2225|       |						
 2226|  1.07k|						break; 
 2227|      0|					}
 2228|    841|					case 13:  {
  ------------------
  |  Branch (2228:6): [True: 841, False: 172k]
  ------------------
 2229|    841|						{
 2230|    841|#line 148 "src/txt/readstat_spss_commands_read.rl"
 2231|       |							
 2232|    841|							char labelset_name[256];
 2233|    841|							snprintf(labelset_name, sizeof(labelset_name), "labels%d", labelset_count++);
 2234|  3.95k|							for (i=0; i<var_count; i++) {
  ------------------
  |  Branch (2234:18): [True: 3.11k, False: 841]
  ------------------
 2235|  3.11k|								readstat_schema_entry_t *entry = readstat_schema_find_or_create_entry(schema, varname);
 2236|  3.11k|								readstat_copy(entry->labelset, sizeof(entry->labelset), labelset_name, sizeof(labelset_name));
 2237|  3.11k|							}
 2238|    841|						}
 2239|       |						
 2240|    841|#line 2241 "src/txt/readstat_spss_commands_read.c"
 2241|       |						
 2242|    841|						break; 
 2243|      0|					}
 2244|  2.85k|					case 14:  {
  ------------------
  |  Branch (2244:6): [True: 2.85k, False: 170k]
  ------------------
 2245|  2.85k|						{
 2246|  2.85k|#line 157 "src/txt/readstat_spss_commands_read.rl"
 2247|       |							
 2248|  2.85k|							char labelset_name[256];
 2249|  2.85k|							snprintf(labelset_name, sizeof(labelset_name), "labels%d", labelset_count);
 2250|  2.85k|							error = submit_value_label(parser, labelset_name, label_type,
 2251|  2.85k|							first_integer, integer, double_value, string_value, buf, user_ctx);
 2252|  2.85k|							if (error != READSTAT_OK)
  ------------------
  |  Branch (2252:12): [True: 0, False: 2.85k]
  ------------------
 2253|      0|							goto cleanup;
 2254|  2.85k|						}
 2255|       |						
 2256|  2.85k|#line 2257 "src/txt/readstat_spss_commands_read.c"
 2257|       |						
 2258|  2.85k|						break; 
 2259|  2.85k|					}
 2260|  3.26k|					case 15:  {
  ------------------
  |  Branch (2260:6): [True: 3.26k, False: 169k]
  ------------------
 2261|  3.26k|						{
 2262|  3.26k|#line 166 "src/txt/readstat_spss_commands_read.rl"
 2263|  3.26k|							str_start = p; }
 2264|       |						
 2265|  3.26k|#line 2266 "src/txt/readstat_spss_commands_read.c"
 2266|       |						
 2267|  3.26k|						break; 
 2268|  2.85k|					}
 2269|  3.26k|					case 16:  {
  ------------------
  |  Branch (2269:6): [True: 3.26k, False: 169k]
  ------------------
 2270|  3.26k|						{
 2271|  3.26k|#line 166 "src/txt/readstat_spss_commands_read.rl"
 2272|  3.26k|							str_len = p - str_start; }
 2273|       |						
 2274|  3.26k|#line 2275 "src/txt/readstat_spss_commands_read.c"
 2275|       |						
 2276|  3.26k|						break; 
 2277|  2.85k|					}
 2278|  1.91k|					case 17:  {
  ------------------
  |  Branch (2278:6): [True: 1.91k, False: 171k]
  ------------------
 2279|  1.91k|						{
 2280|  1.91k|#line 168 "src/txt/readstat_spss_commands_read.rl"
 2281|  1.91k|							str_start = p; }
 2282|       |						
 2283|  1.91k|#line 2284 "src/txt/readstat_spss_commands_read.c"
 2284|       |						
 2285|  1.91k|						break; 
 2286|  2.85k|					}
 2287|  1.90k|					case 18:  {
  ------------------
  |  Branch (2287:6): [True: 1.90k, False: 171k]
  ------------------
 2288|  1.90k|						{
 2289|  1.90k|#line 168 "src/txt/readstat_spss_commands_read.rl"
 2290|  1.90k|							str_len = p - str_start; }
 2291|       |						
 2292|  1.90k|#line 2293 "src/txt/readstat_spss_commands_read.c"
 2293|       |						
 2294|  1.90k|						break; 
 2295|  2.85k|					}
 2296|  29.7k|					case 19:  {
  ------------------
  |  Branch (2296:6): [True: 29.7k, False: 143k]
  ------------------
 2297|  29.7k|						{
 2298|  29.7k|#line 172 "src/txt/readstat_spss_commands_read.rl"
 2299|  29.7k|							line_no++; line_start = p; }
 2300|       |						
 2301|  29.7k|#line 2302 "src/txt/readstat_spss_commands_read.c"
 2302|       |						
 2303|  29.7k|						break; 
 2304|  2.85k|					}
 2305|  25.3k|					case 20:  {
  ------------------
  |  Branch (2305:6): [True: 25.3k, False: 147k]
  ------------------
 2306|  25.3k|						{
 2307|  25.3k|#line 174 "src/txt/readstat_spss_commands_read.rl"
 2308|  25.3k|							str_start = p; }
 2309|       |						
 2310|  25.3k|#line 2311 "src/txt/readstat_spss_commands_read.c"
 2311|       |						
 2312|  25.3k|						break; 
 2313|  2.85k|					}
 2314|  25.5k|					case 21:  {
  ------------------
  |  Branch (2314:6): [True: 25.5k, False: 147k]
  ------------------
 2315|  25.5k|						{
 2316|  25.5k|#line 174 "src/txt/readstat_spss_commands_read.rl"
 2317|  25.5k|							str_len = p - str_start; }
 2318|       |						
 2319|  25.5k|#line 2320 "src/txt/readstat_spss_commands_read.c"
 2320|       |						
 2321|  25.5k|						break; 
 2322|  2.85k|					}
 2323|    200|					case 22:  {
  ------------------
  |  Branch (2323:6): [True: 200, False: 172k]
  ------------------
 2324|    200|						{
 2325|    200|#line 192 "src/txt/readstat_spss_commands_read.rl"
 2326|    200|							var_type = READSTAT_TYPE_STRING; }
 2327|       |						
 2328|    200|#line 2329 "src/txt/readstat_spss_commands_read.c"
 2329|       |						
 2330|    200|						break; 
 2331|  2.85k|					}
 2332|    203|					case 23:  {
  ------------------
  |  Branch (2332:6): [True: 203, False: 172k]
  ------------------
 2333|    203|						{
 2334|    203|#line 195 "src/txt/readstat_spss_commands_read.rl"
 2335|    203|							var_type = READSTAT_TYPE_STRING; }
 2336|       |						
 2337|    203|#line 2338 "src/txt/readstat_spss_commands_read.c"
 2338|       |						
 2339|    203|						break; 
 2340|  2.85k|					}
 2341|    195|					case 24:  {
  ------------------
  |  Branch (2341:6): [True: 195, False: 172k]
  ------------------
 2342|    195|						{
 2343|    195|#line 196 "src/txt/readstat_spss_commands_read.rl"
 2344|    195|							var_type = READSTAT_TYPE_DOUBLE; }
 2345|       |						
 2346|    195|#line 2347 "src/txt/readstat_spss_commands_read.c"
 2347|       |						
 2348|    195|						break; 
 2349|  2.85k|					}
 2350|    200|					case 25:  {
  ------------------
  |  Branch (2350:6): [True: 200, False: 172k]
  ------------------
 2351|    200|						{
 2352|    200|#line 197 "src/txt/readstat_spss_commands_read.rl"
 2353|    200|							var_type = READSTAT_TYPE_DOUBLE; }
 2354|       |						
 2355|    200|#line 2356 "src/txt/readstat_spss_commands_read.c"
 2356|       |						
 2357|    200|						break; 
 2358|  2.85k|					}
 2359|    194|					case 26:  {
  ------------------
  |  Branch (2359:6): [True: 194, False: 172k]
  ------------------
 2360|    194|						{
 2361|    194|#line 198 "src/txt/readstat_spss_commands_read.rl"
 2362|    194|							var_type = READSTAT_TYPE_STRING; }
 2363|       |						
 2364|    194|#line 2365 "src/txt/readstat_spss_commands_read.c"
 2365|       |						
 2366|    194|						break; 
 2367|  2.85k|					}
 2368|    301|					case 27:  {
  ------------------
  |  Branch (2368:6): [True: 301, False: 172k]
  ------------------
 2369|    301|						{
 2370|    301|#line 219 "src/txt/readstat_spss_commands_read.rl"
 2371|    301|							var_row = integer - 1; }
 2372|       |						
 2373|    301|#line 2374 "src/txt/readstat_spss_commands_read.c"
 2374|       |						
 2375|    301|						break; 
 2376|  2.85k|					}
 2377|    408|					case 28:  {
  ------------------
  |  Branch (2377:6): [True: 408, False: 172k]
  ------------------
 2378|    408|						{
 2379|    408|#line 220 "src/txt/readstat_spss_commands_read.rl"
 2380|    408|							var_type = READSTAT_TYPE_DOUBLE; }
 2381|       |						
 2382|    408|#line 2383 "src/txt/readstat_spss_commands_read.c"
 2383|       |						
 2384|    408|						break; 
 2385|  2.85k|					}
 2386|  1.28k|					case 29:  {
  ------------------
  |  Branch (2386:6): [True: 1.28k, False: 171k]
  ------------------
 2387|  1.28k|						{
 2388|  1.28k|#line 221 "src/txt/readstat_spss_commands_read.rl"
 2389|  1.28k|							var_type = READSTAT_TYPE_DOUBLE; }
 2390|       |						
 2391|  1.28k|#line 2392 "src/txt/readstat_spss_commands_read.c"
 2392|       |						
 2393|  1.28k|						break; 
 2394|  2.85k|					}
 2395|    797|					case 30:  {
  ------------------
  |  Branch (2395:6): [True: 797, False: 172k]
  ------------------
 2396|    797|						{
 2397|    797|#line 254 "src/txt/readstat_spss_commands_read.rl"
 2398|    797|							label_type = -1; }
 2399|       |						
 2400|    797|#line 2401 "src/txt/readstat_spss_commands_read.c"
 2401|       |						
 2402|    797|						break; 
 2403|  2.85k|					}
 2404|    198|					case 31:  {
  ------------------
  |  Branch (2404:6): [True: 198, False: 172k]
  ------------------
 2405|    198|						{
 2406|    198|#line 260 "src/txt/readstat_spss_commands_read.rl"
 2407|    198|							label_type = LABEL_TYPE_DOUBLE; double_value = -(double)integer; }
 2408|       |						
 2409|    198|#line 2410 "src/txt/readstat_spss_commands_read.c"
 2410|       |						
 2411|    198|						break; 
 2412|  2.85k|					}
 2413|  1.18k|					case 32:  {
  ------------------
  |  Branch (2413:6): [True: 1.18k, False: 171k]
  ------------------
 2414|  1.18k|						{
 2415|  1.18k|#line 261 "src/txt/readstat_spss_commands_read.rl"
 2416|  1.18k|							label_type = LABEL_TYPE_DOUBLE; double_value = integer; }
 2417|       |						
 2418|  1.18k|#line 2419 "src/txt/readstat_spss_commands_read.c"
 2419|       |						
 2420|  1.18k|						break; 
 2421|  2.85k|					}
 2422|    873|					case 33:  {
  ------------------
  |  Branch (2422:6): [True: 873, False: 172k]
  ------------------
 2423|    873|						{
 2424|    873|#line 262 "src/txt/readstat_spss_commands_read.rl"
 2425|    873|							first_integer = integer; }
 2426|       |						
 2427|    873|#line 2428 "src/txt/readstat_spss_commands_read.c"
 2428|       |						
 2429|    873|						break; 
 2430|  2.85k|					}
 2431|    870|					case 34:  {
  ------------------
  |  Branch (2431:6): [True: 870, False: 172k]
  ------------------
 2432|    870|						{
 2433|    870|#line 262 "src/txt/readstat_spss_commands_read.rl"
 2434|    870|							label_type = LABEL_TYPE_RANGE; }
 2435|       |						
 2436|    870|#line 2437 "src/txt/readstat_spss_commands_read.c"
 2437|       |						
 2438|    870|						break; 
 2439|  2.85k|					}
 2440|    775|					case 35:  {
  ------------------
  |  Branch (2440:6): [True: 775, False: 172k]
  ------------------
 2441|    775|						{
 2442|    775|#line 263 "src/txt/readstat_spss_commands_read.rl"
 2443|    775|							label_type = LABEL_TYPE_STRING; }
 2444|       |						
 2445|    775|#line 2446 "src/txt/readstat_spss_commands_read.c"
 2446|       |						
 2447|    775|						break; 
 2448|  2.85k|					}
 2449|   172k|				}
 2450|   172k|				_nacts -= 1;
 2451|   172k|				_acts += 1;
 2452|   172k|			}
 2453|       |			
 2454|  82.3k|		}
 2455|       |		
 2456|  6.86M|		if ( p == eof ) {
  ------------------
  |  Branch (2456:8): [True: 982, False: 6.86M]
  ------------------
 2457|    982|			if ( cs >= 646 )
  ------------------
  |  Branch (2457:9): [True: 232, False: 750]
  ------------------
 2458|    232|				goto _out;
 2459|    982|		}
 2460|  6.86M|		else {
 2461|  6.86M|			if ( cs != 0 ) {
  ------------------
  |  Branch (2461:9): [True: 6.86M, False: 61]
  ------------------
 2462|  6.86M|				p += 1;
 2463|  6.86M|				goto _resume;
 2464|  6.86M|			}
 2465|  6.86M|		}
 2466|  1.04k|		_out: {}
 2467|  1.04k|	}
 2468|       |	
 2469|      0|#line 313 "src/txt/readstat_spss_commands_read.rl"
 2470|       |	
 2471|       |	
 2472|       |	/* suppress warnings */
 2473|      0|	(void)spss_commands_en_main;
 2474|       |	
 2475|  1.04k|	if (cs < 
  ------------------
  |  Branch (2475:6): [True: 811, False: 232]
  ------------------
 2476|  1.04k|#line 2477 "src/txt/readstat_spss_commands_read.c"
 2477|  1.04k|	646
 2478|  1.04k|#line 318 "src/txt/readstat_spss_commands_read.rl"
 2479|  1.04k|	) {
 2480|    811|		char error_buf[1024];
 2481|    811|		if (p == pe) {
  ------------------
  |  Branch (2481:7): [True: 750, False: 61]
  ------------------
 2482|    750|			snprintf(error_buf, sizeof(error_buf), "Error parsing SPSS command file (end-of-file unexpectedly reached)");
 2483|    750|		} else {
 2484|     61|			snprintf(error_buf, sizeof(error_buf), "Error parsing SPSS command file around line #%d, col #%ld (%c)",
 2485|     61|			line_no + 1, (long)(p - line_start + 1), *p);
 2486|     61|		}
 2487|    811|		if (parser->handlers.error) {
  ------------------
  |  Branch (2487:7): [True: 0, False: 811]
  ------------------
 2488|      0|			parser->handlers.error(error_buf, user_ctx);
 2489|      0|		}
 2490|    811|		error = READSTAT_ERROR_PARSE;
 2491|    811|		goto cleanup;
 2492|    811|	}
 2493|       |	
 2494|    232|	error = submit_columns(parser, schema, user_ctx);
 2495|       |	
 2496|  1.04k|	cleanup:
 2497|  1.04k|	parser->io->close(parser->io->io_ctx);
 2498|  1.04k|	free(bytes);
 2499|  1.04k|	if (error != READSTAT_OK) {
  ------------------
  |  Branch (2499:6): [True: 811, False: 232]
  ------------------
 2500|    811|		if (outError)
  ------------------
  |  Branch (2500:7): [True: 0, False: 811]
  ------------------
 2501|      0|			*outError = error;
 2502|    811|		readstat_schema_free(schema);
 2503|    811|		schema = NULL;
 2504|    811|	}
 2505|       |	
 2506|  1.04k|	return schema;
 2507|    232|}

