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

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

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

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

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

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

readstat_copy:
    5|  12.9k|void readstat_copy(char *buf, size_t buf_len, const char *str_start, size_t str_len) {
    6|  12.9k|    size_t this_len = str_len;
    7|  12.9k|    if (this_len >= buf_len) {
  ------------------
  |  Branch (7:9): [True: 1.07k, False: 11.8k]
  ------------------
    8|  1.07k|        this_len = buf_len - 1;
    9|  1.07k|    }
   10|  12.9k|    memcpy(buf, str_start, this_len);
   11|  12.9k|    buf[this_len] = '\0';
   12|  12.9k|}
readstat_copy_lower:
   14|  3.28k|void readstat_copy_lower(char *buf, size_t buf_len, const char *str_start, size_t str_len) {
   15|  3.28k|    int i;
   16|  3.28k|    readstat_copy(buf, buf_len, str_start, str_len);
   17|  19.1k|    for (i=0; i<buf_len && buf[i]; i++)
  ------------------
  |  Branch (17:15): [True: 19.1k, False: 0]
  |  Branch (17:28): [True: 15.8k, False: 3.28k]
  ------------------
   18|  15.8k|        buf[i] = tolower(buf[i]);
  ------------------
  |  Branch (18:18): [True: 0, False: 0]
  |  Branch (18:18): [True: 0, False: 0]
  |  Branch (18:18): [Folded, False: 15.8k]
  ------------------
   19|  3.28k|}

readstat_parse_sas_commands:
 3641|  1.08k|const char *filepath, void *user_ctx, readstat_error_t *outError) {
 3642|  1.08k|	if (parser->io->open(filepath, parser->io->io_ctx) == -1) {
  ------------------
  |  Branch (3642:6): [True: 0, False: 1.08k]
  ------------------
 3643|      0|		if (outError)
  ------------------
  |  Branch (3643:7): [True: 0, False: 0]
  ------------------
 3644|      0|			*outError = READSTAT_ERROR_OPEN;
 3645|      0|		return NULL;
 3646|      0|	}
 3647|  1.08k|	readstat_schema_t *schema = NULL;
 3648|  1.08k|	unsigned char *bytes = NULL;
 3649|  1.08k|	readstat_error_t error = READSTAT_OK;
 3650|  1.08k|	ssize_t len = parser->io->seek(0, READSTAT_SEEK_END, parser->io->io_ctx);
 3651|  1.08k|	if (len == -1) {
  ------------------
  |  Branch (3651:6): [True: 0, False: 1.08k]
  ------------------
 3652|      0|		error = READSTAT_ERROR_SEEK;
 3653|      0|		goto cleanup;
 3654|      0|	}
 3655|  1.08k|	parser->io->seek(0, READSTAT_SEEK_SET, parser->io->io_ctx);
 3656|       |	
 3657|  1.08k|	bytes = malloc(len);
 3658|       |	
 3659|  1.08k|	parser->io->read(bytes, len, parser->io->io_ctx);
 3660|       |	
 3661|  1.08k|	unsigned char *p = bytes;
 3662|  1.08k|	unsigned char *pe = bytes + len;
 3663|       |	
 3664|  1.08k|	unsigned char *eof = pe;
 3665|       |	
 3666|  1.08k|	unsigned char *str_start = NULL;
 3667|       |	
 3668|  1.08k|	size_t str_len = 0;
 3669|       |	
 3670|  1.08k|	int cs;
 3671|       |	
 3672|  1.08k|	double double_value = NAN;
 3673|  1.08k|	uint64_t first_integer = 0;
 3674|  1.08k|	uint64_t integer = 0;
 3675|  1.08k|	int line_no = 0;
 3676|  1.08k|	unsigned char *line_start = p;
 3677|       |	
 3678|  1.08k|	char varname[32];
 3679|  1.08k|	char argname[32];
 3680|  1.08k|	char labelset[32];
 3681|  1.08k|	char string_value[32];
 3682|  1.08k|	char buf[1024];
 3683|       |	
 3684|  1.08k|	readstat_type_t var_type = READSTAT_TYPE_DOUBLE;
 3685|  1.08k|	label_type_t label_type = LABEL_TYPE_DOUBLE;
 3686|  1.08k|	int var_row = 0, var_col = 0;
 3687|  1.08k|	int var_len = 0;
 3688|       |	
 3689|  1.08k|	if ((schema = calloc(1, sizeof(readstat_schema_t))) == NULL) {
  ------------------
  |  Branch (3689:6): [True: 0, False: 1.08k]
  ------------------
 3690|      0|		error = READSTAT_ERROR_MALLOC;
 3691|      0|		goto cleanup;
 3692|      0|	}
 3693|       |	
 3694|  1.08k|	schema->rows_per_observation = 1;
 3695|       |	
 3696|       |	
 3697|  1.08k|#line 3698 "src/txt/readstat_sas_commands_read.c"
 3698|  1.08k|	{
 3699|  1.08k|		cs = (int)sas_commands_start;
 3700|  1.08k|	}
 3701|       |	
 3702|  1.08k|#line 3703 "src/txt/readstat_sas_commands_read.c"
 3703|  1.08k|	{
 3704|  1.08k|		int _klen;
 3705|  1.08k|		unsigned int _trans = 0;
 3706|  1.08k|		const char * _keys;
 3707|  1.08k|		const signed char * _acts;
 3708|  1.08k|		unsigned int _nacts;
 3709|  8.04M|		_resume: {}
 3710|  8.04M|		if ( p == pe && p != eof )
  ------------------
  |  Branch (3710:8): [True: 1.02k, False: 8.04M]
  |  Branch (3710:19): [True: 0, False: 1.02k]
  ------------------
 3711|      0|			goto _out;
 3712|  8.04M|		if ( p == eof ) {
  ------------------
  |  Branch (3712:8): [True: 1.02k, False: 8.04M]
  ------------------
 3713|  1.02k|			if ( _sas_commands_eof_trans[cs] > 0 ) {
  ------------------
  |  Branch (3713:9): [True: 1.02k, False: 0]
  ------------------
 3714|  1.02k|				_trans = (unsigned int)_sas_commands_eof_trans[cs] - 1;
 3715|  1.02k|			}
 3716|  1.02k|		}
 3717|  8.04M|		else {
 3718|  8.04M|			_keys = ( _sas_commands_trans_keys + (_sas_commands_key_offsets[cs]));
 3719|  8.04M|			_trans = (unsigned int)_sas_commands_index_offsets[cs];
 3720|       |			
 3721|  8.04M|			_klen = (int)_sas_commands_single_lengths[cs];
 3722|  8.04M|			if ( _klen > 0 ) {
  ------------------
  |  Branch (3722:9): [True: 8.04M, False: 1.13k]
  ------------------
 3723|  8.04M|				const char *_lower = _keys;
 3724|  8.04M|				const char *_upper = _keys + _klen - 1;
 3725|  8.04M|				const char *_mid;
 3726|  25.4M|				while ( 1 ) {
  ------------------
  |  Branch (3726:13): [True: 25.4M, Folded]
  ------------------
 3727|  25.4M|					if ( _upper < _lower ) {
  ------------------
  |  Branch (3727:11): [True: 7.98M, False: 17.4M]
  ------------------
 3728|  7.98M|						_keys += _klen;
 3729|  7.98M|						_trans += (unsigned int)_klen;
 3730|  7.98M|						break;
 3731|  7.98M|					}
 3732|       |					
 3733|  17.4M|					_mid = _lower + ((_upper-_lower) >> 1);
 3734|  17.4M|					if ( ( (*( p))) < (*( _mid)) )
  ------------------
  |  Branch (3734:11): [True: 3.35M, False: 14.1M]
  ------------------
 3735|  3.35M|						_upper = _mid - 1;
 3736|  14.1M|					else if ( ( (*( p))) > (*( _mid)) )
  ------------------
  |  Branch (3736:16): [True: 14.0M, False: 56.1k]
  ------------------
 3737|  14.0M|						_lower = _mid + 1;
 3738|  56.1k|					else {
 3739|  56.1k|						_trans += (unsigned int)(_mid - _keys);
 3740|  56.1k|						goto _match;
 3741|  56.1k|					}
 3742|  17.4M|				}
 3743|  8.04M|			}
 3744|       |			
 3745|  7.98M|			_klen = (int)_sas_commands_range_lengths[cs];
 3746|  7.98M|			if ( _klen > 0 ) {
  ------------------
  |  Branch (3746:9): [True: 4.65M, False: 3.33M]
  ------------------
 3747|  4.65M|				const char *_lower = _keys;
 3748|  4.65M|				const char *_upper = _keys + (_klen<<1) - 2;
 3749|  4.65M|				const char *_mid;
 3750|  9.06M|				while ( 1 ) {
  ------------------
  |  Branch (3750:13): [True: 9.06M, Folded]
  ------------------
 3751|  9.06M|					if ( _upper < _lower ) {
  ------------------
  |  Branch (3751:11): [True: 224, False: 9.06M]
  ------------------
 3752|    224|						_trans += (unsigned int)_klen;
 3753|    224|						break;
 3754|    224|					}
 3755|       |					
 3756|  9.06M|					_mid = _lower + (((_upper-_lower) >> 1) & ~1);
 3757|  9.06M|					if ( ( (*( p))) < (*( _mid)) )
  ------------------
  |  Branch (3757:11): [True: 1.23M, False: 7.83M]
  ------------------
 3758|  1.23M|						_upper = _mid - 2;
 3759|  7.83M|					else if ( ( (*( p))) > (*( _mid + 1)) )
  ------------------
  |  Branch (3759:16): [True: 3.17M, False: 4.65M]
  ------------------
 3760|  3.17M|						_lower = _mid + 2;
 3761|  4.65M|					else {
 3762|  4.65M|						_trans += (unsigned int)((_mid - _keys)>>1);
 3763|  4.65M|						break;
 3764|  4.65M|					}
 3765|  9.06M|				}
 3766|  4.65M|			}
 3767|       |			
 3768|  8.04M|			_match: {}
 3769|  8.04M|		}
 3770|  8.04M|		cs = (int)_sas_commands_cond_targs[_trans];
 3771|       |		
 3772|  8.04M|		if ( _sas_commands_cond_actions[_trans] != 0 ) {
  ------------------
  |  Branch (3772:8): [True: 51.2k, False: 7.99M]
  ------------------
 3773|       |			
 3774|  51.2k|			_acts = ( _sas_commands_actions + (_sas_commands_cond_actions[_trans]));
 3775|  51.2k|			_nacts = (unsigned int)(*( _acts));
 3776|  51.2k|			_acts += 1;
 3777|   139k|			while ( _nacts > 0 ) {
  ------------------
  |  Branch (3777:12): [True: 88.3k, False: 51.2k]
  ------------------
 3778|  88.3k|				switch ( (*( _acts)) )
  ------------------
  |  Branch (3778:14): [True: 88.3k, False: 0]
  ------------------
 3779|  88.3k|				{
 3780|  7.95k|					case 0:  {
  ------------------
  |  Branch (3780:6): [True: 7.95k, False: 80.3k]
  ------------------
 3781|  7.95k|						{
 3782|  7.95k|#line 72 "src/txt/readstat_sas_commands_read.rl"
 3783|       |							
 3784|  7.95k|							integer = 0;
 3785|  7.95k|						}
 3786|       |						
 3787|  7.95k|#line 3788 "src/txt/readstat_sas_commands_read.c"
 3788|       |						
 3789|  7.95k|						break; 
 3790|      0|					}
 3791|  12.0k|					case 1:  {
  ------------------
  |  Branch (3791:6): [True: 12.0k, False: 76.2k]
  ------------------
 3792|  12.0k|						{
 3793|  12.0k|#line 76 "src/txt/readstat_sas_commands_read.rl"
 3794|       |							
 3795|  12.0k|							integer = 10 * integer + ((( (*( p)))) - '0');
 3796|  12.0k|						}
 3797|       |						
 3798|  12.0k|#line 3799 "src/txt/readstat_sas_commands_read.c"
 3799|       |						
 3800|  12.0k|						break; 
 3801|      0|					}
 3802|  2.08k|					case 2:  {
  ------------------
  |  Branch (3802:6): [True: 2.08k, False: 86.2k]
  ------------------
 3803|  2.08k|						{
 3804|  2.08k|#line 80 "src/txt/readstat_sas_commands_read.rl"
 3805|       |							
 3806|  2.08k|							int value = 0;
 3807|  2.08k|							if ((( (*( p)))) >= '0' && (( (*( p)))) <= '9') {
  ------------------
  |  Branch (3807:12): [True: 2.08k, False: 0]
  |  Branch (3807:35): [True: 339, False: 1.74k]
  ------------------
 3808|    339|								value = (( (*( p)))) - '0';
 3809|  1.74k|							} else if ((( (*( p)))) >= 'A' && (( (*( p)))) <= 'F') {
  ------------------
  |  Branch (3809:19): [True: 1.74k, False: 0]
  |  Branch (3809:42): [True: 719, False: 1.02k]
  ------------------
 3810|    719|								value = (( (*( p)))) - 'A' + 10;
 3811|  1.02k|							} else if ((( (*( p)))) >= 'a' && (( (*( p)))) <= 'f') {
  ------------------
  |  Branch (3811:19): [True: 1.02k, False: 0]
  |  Branch (3811:42): [True: 1.02k, False: 0]
  ------------------
 3812|  1.02k|								value = (( (*( p)))) - 'a' + 10;
 3813|  1.02k|							}
 3814|  2.08k|							integer = 16 * integer + value;
 3815|  2.08k|						}
 3816|       |						
 3817|  2.08k|#line 3818 "src/txt/readstat_sas_commands_read.c"
 3818|       |						
 3819|  2.08k|						break; 
 3820|      0|					}
 3821|    427|					case 3:  {
  ------------------
  |  Branch (3821:6): [True: 427, False: 87.8k]
  ------------------
 3822|    427|						{
 3823|    427|#line 92 "src/txt/readstat_sas_commands_read.rl"
 3824|       |							
 3825|    427|							var_col = integer - 1;
 3826|    427|							var_len = 1;
 3827|    427|						}
 3828|       |						
 3829|    427|#line 3830 "src/txt/readstat_sas_commands_read.c"
 3830|       |						
 3831|    427|						break; 
 3832|      0|					}
 3833|    421|					case 4:  {
  ------------------
  |  Branch (3833:6): [True: 421, False: 87.8k]
  ------------------
 3834|    421|						{
 3835|    421|#line 97 "src/txt/readstat_sas_commands_read.rl"
 3836|       |							
 3837|    421|							var_len = integer - var_col;
 3838|    421|						}
 3839|       |						
 3840|    421|#line 3841 "src/txt/readstat_sas_commands_read.c"
 3841|       |						
 3842|    421|						break; 
 3843|      0|					}
 3844|    310|					case 5:  {
  ------------------
  |  Branch (3844:6): [True: 310, False: 87.9k]
  ------------------
 3845|    310|						{
 3846|    310|#line 101 "src/txt/readstat_sas_commands_read.rl"
 3847|       |							
 3848|    310|							var_type = READSTAT_TYPE_STRING;
 3849|    310|						}
 3850|       |						
 3851|    310|#line 3852 "src/txt/readstat_sas_commands_read.c"
 3852|       |						
 3853|    310|						break; 
 3854|      0|					}
 3855|  1.58k|					case 6:  {
  ------------------
  |  Branch (3855:6): [True: 1.58k, False: 86.7k]
  ------------------
 3856|  1.58k|						{
 3857|  1.58k|#line 105 "src/txt/readstat_sas_commands_read.rl"
 3858|       |							
 3859|  1.58k|							var_type = READSTAT_TYPE_DOUBLE;
 3860|  1.58k|						}
 3861|       |						
 3862|  1.58k|#line 3863 "src/txt/readstat_sas_commands_read.c"
 3863|       |						
 3864|  1.58k|						break; 
 3865|      0|					}
 3866|  3.88k|					case 7:  {
  ------------------
  |  Branch (3866:6): [True: 3.88k, False: 84.4k]
  ------------------
 3867|  3.88k|						{
 3868|  3.88k|#line 109 "src/txt/readstat_sas_commands_read.rl"
 3869|       |							
 3870|  3.88k|							readstat_copy(buf, sizeof(buf), (char *)str_start, str_len);
 3871|  3.88k|						}
 3872|       |						
 3873|  3.88k|#line 3874 "src/txt/readstat_sas_commands_read.c"
 3874|       |						
 3875|  3.88k|						break; 
 3876|      0|					}
 3877|    727|					case 8:  {
  ------------------
  |  Branch (3877:6): [True: 727, False: 87.5k]
  ------------------
 3878|    727|						{
 3879|    727|#line 113 "src/txt/readstat_sas_commands_read.rl"
 3880|       |							
 3881|    727|							readstat_copy(labelset, sizeof(labelset), (char *)str_start, str_len);
 3882|    727|						}
 3883|       |						
 3884|    727|#line 3885 "src/txt/readstat_sas_commands_read.c"
 3885|       |						
 3886|    727|						break; 
 3887|      0|					}
 3888|    855|					case 9:  {
  ------------------
  |  Branch (3888:6): [True: 855, False: 87.4k]
  ------------------
 3889|    855|						{
 3890|    855|#line 117 "src/txt/readstat_sas_commands_read.rl"
 3891|       |							
 3892|    855|							readstat_copy(string_value, sizeof(string_value), (char *)str_start, str_len);
 3893|    855|						}
 3894|       |						
 3895|    855|#line 3896 "src/txt/readstat_sas_commands_read.c"
 3896|       |						
 3897|    855|						break; 
 3898|      0|					}
 3899|  2.17k|					case 10:  {
  ------------------
  |  Branch (3899:6): [True: 2.17k, False: 86.1k]
  ------------------
 3900|  2.17k|						{
 3901|  2.17k|#line 121 "src/txt/readstat_sas_commands_read.rl"
 3902|       |							
 3903|  2.17k|							readstat_copy(argname, sizeof(argname), (char *)str_start, str_len);
 3904|  2.17k|						}
 3905|       |						
 3906|  2.17k|#line 3907 "src/txt/readstat_sas_commands_read.c"
 3907|       |						
 3908|  2.17k|						break; 
 3909|      0|					}
 3910|  3.28k|					case 11:  {
  ------------------
  |  Branch (3910:6): [True: 3.28k, False: 85.0k]
  ------------------
 3911|  3.28k|						{
 3912|  3.28k|#line 125 "src/txt/readstat_sas_commands_read.rl"
 3913|       |							
 3914|  3.28k|							readstat_copy_lower(varname, sizeof(varname), (char *)str_start, str_len);
 3915|  3.28k|						}
 3916|       |						
 3917|  3.28k|#line 3918 "src/txt/readstat_sas_commands_read.c"
 3918|       |						
 3919|  3.28k|						break; 
 3920|      0|					}
 3921|  1.80k|					case 12:  {
  ------------------
  |  Branch (3921:6): [True: 1.80k, False: 86.5k]
  ------------------
 3922|  1.80k|						{
 3923|  1.80k|#line 129 "src/txt/readstat_sas_commands_read.rl"
 3924|       |							
 3925|  1.80k|							if (strcasecmp(argname, "firstobs") == 0) {
  ------------------
  |  Branch (3925:12): [True: 194, False: 1.60k]
  ------------------
 3926|    194|								schema->first_line = integer;
 3927|    194|							}
 3928|  1.80k|							if (strcasecmp(argname, "dlm") == 0) {
  ------------------
  |  Branch (3928:12): [True: 732, False: 1.07k]
  ------------------
 3929|    732|								schema->field_delimiter = integer ? integer : buf[0];
  ------------------
  |  Branch (3929:35): [True: 440, False: 292]
  ------------------
 3930|    732|							}
 3931|  1.80k|						}
 3932|       |						
 3933|  1.80k|#line 3934 "src/txt/readstat_sas_commands_read.c"
 3934|       |						
 3935|  1.80k|						break; 
 3936|      0|					}
 3937|    421|					case 13:  {
  ------------------
  |  Branch (3937:6): [True: 421, False: 87.8k]
  ------------------
 3938|    421|						{
 3939|    421|#line 138 "src/txt/readstat_sas_commands_read.rl"
 3940|       |							
 3941|    421|							readstat_schema_entry_t *entry = readstat_schema_find_or_create_entry(schema, varname);
 3942|    421|							entry->variable.type = var_type;
 3943|    421|							entry->variable.storage_width = var_len;
 3944|    421|							entry->row = var_row;
 3945|    421|							entry->col = var_col;
 3946|    421|							entry->len = var_len;
 3947|    421|						}
 3948|       |						
 3949|    421|#line 3950 "src/txt/readstat_sas_commands_read.c"
 3950|       |						
 3951|    421|						break; 
 3952|      0|					}
 3953|  1.47k|					case 14:  {
  ------------------
  |  Branch (3953:6): [True: 1.47k, False: 86.8k]
  ------------------
 3954|  1.47k|						{
 3955|  1.47k|#line 147 "src/txt/readstat_sas_commands_read.rl"
 3956|       |							
 3957|  1.47k|							readstat_schema_entry_t *entry = readstat_schema_find_or_create_entry(schema, varname);
 3958|  1.47k|							entry->variable.storage_width = var_len;
 3959|  1.47k|							entry->len = var_len;
 3960|  1.47k|						}
 3961|       |						
 3962|  1.47k|#line 3963 "src/txt/readstat_sas_commands_read.c"
 3963|       |						
 3964|  1.47k|						break; 
 3965|      0|					}
 3966|    211|					case 15:  {
  ------------------
  |  Branch (3966:6): [True: 211, False: 88.0k]
  ------------------
 3967|    211|						{
 3968|    211|#line 153 "src/txt/readstat_sas_commands_read.rl"
 3969|       |							
 3970|    211|							readstat_schema_entry_t *entry = readstat_schema_find_or_create_entry(schema, varname);
 3971|    211|							readstat_copy(entry->variable.label, sizeof(entry->variable.label), buf, sizeof(buf));
 3972|    211|						}
 3973|       |						
 3974|    211|#line 3975 "src/txt/readstat_sas_commands_read.c"
 3975|       |						
 3976|    211|						break; 
 3977|      0|					}
 3978|    467|					case 16:  {
  ------------------
  |  Branch (3978:6): [True: 467, False: 87.8k]
  ------------------
 3979|    467|						{
 3980|    467|#line 158 "src/txt/readstat_sas_commands_read.rl"
 3981|       |							
 3982|    467|							readstat_schema_entry_t *entry = readstat_schema_find_or_create_entry(schema, varname);
 3983|    467|							readstat_copy(entry->labelset, sizeof(entry->labelset), labelset, sizeof(labelset));
 3984|    467|						}
 3985|       |						
 3986|    467|#line 3987 "src/txt/readstat_sas_commands_read.c"
 3987|       |						
 3988|    467|						break; 
 3989|      0|					}
 3990|  2.79k|					case 17:  {
  ------------------
  |  Branch (3990:6): [True: 2.79k, False: 85.5k]
  ------------------
 3991|  2.79k|						{
 3992|  2.79k|#line 163 "src/txt/readstat_sas_commands_read.rl"
 3993|       |							
 3994|  2.79k|							error = submit_value_label(parser, labelset, label_type,
 3995|  2.79k|							first_integer, integer, double_value, string_value, buf, user_ctx); 
 3996|  2.79k|							if (error != READSTAT_OK)
  ------------------
  |  Branch (3996:12): [True: 0, False: 2.79k]
  ------------------
 3997|      0|							goto cleanup;
 3998|  2.79k|						}
 3999|       |						
 4000|  2.79k|#line 4001 "src/txt/readstat_sas_commands_read.c"
 4001|       |						
 4002|  2.79k|						break; 
 4003|  2.79k|					}
 4004|  3.32k|					case 18:  {
  ------------------
  |  Branch (4004:6): [True: 3.32k, False: 84.9k]
  ------------------
 4005|  3.32k|						{
 4006|  3.32k|#line 170 "src/txt/readstat_sas_commands_read.rl"
 4007|  3.32k|							str_start = p; }
 4008|       |						
 4009|  3.32k|#line 4010 "src/txt/readstat_sas_commands_read.c"
 4010|       |						
 4011|  3.32k|						break; 
 4012|  2.79k|					}
 4013|  3.83k|					case 19:  {
  ------------------
  |  Branch (4013:6): [True: 3.83k, False: 84.4k]
  ------------------
 4014|  3.83k|						{
 4015|  3.83k|#line 170 "src/txt/readstat_sas_commands_read.rl"
 4016|  3.83k|							str_len = p - str_start; }
 4017|       |						
 4018|  3.83k|#line 4019 "src/txt/readstat_sas_commands_read.c"
 4019|       |						
 4020|  3.83k|						break; 
 4021|  2.79k|					}
 4022|    636|					case 20:  {
  ------------------
  |  Branch (4022:6): [True: 636, False: 87.6k]
  ------------------
 4023|    636|						{
 4024|    636|#line 172 "src/txt/readstat_sas_commands_read.rl"
 4025|    636|							str_start = p; }
 4026|       |						
 4027|    636|#line 4028 "src/txt/readstat_sas_commands_read.c"
 4028|       |						
 4029|    636|						break; 
 4030|  2.79k|					}
 4031|  4.58k|					case 21:  {
  ------------------
  |  Branch (4031:6): [True: 4.58k, False: 83.7k]
  ------------------
 4032|  4.58k|						{
 4033|  4.58k|#line 172 "src/txt/readstat_sas_commands_read.rl"
 4034|  4.58k|							str_len = p - str_start; }
 4035|       |						
 4036|  4.58k|#line 4037 "src/txt/readstat_sas_commands_read.c"
 4037|       |						
 4038|  4.58k|						break; 
 4039|  2.79k|					}
 4040|  8.90k|					case 22:  {
  ------------------
  |  Branch (4040:6): [True: 8.90k, False: 79.3k]
  ------------------
 4041|  8.90k|						{
 4042|  8.90k|#line 180 "src/txt/readstat_sas_commands_read.rl"
 4043|  8.90k|							line_no++; line_start = p; }
 4044|       |						
 4045|  8.90k|#line 4046 "src/txt/readstat_sas_commands_read.c"
 4046|       |						
 4047|  8.90k|						break; 
 4048|  2.79k|					}
 4049|  7.59k|					case 23:  {
  ------------------
  |  Branch (4049:6): [True: 7.59k, False: 80.7k]
  ------------------
 4050|  7.59k|						{
 4051|  7.59k|#line 184 "src/txt/readstat_sas_commands_read.rl"
 4052|  7.59k|							str_start = p; }
 4053|       |						
 4054|  7.59k|#line 4055 "src/txt/readstat_sas_commands_read.c"
 4055|       |						
 4056|  7.59k|						break; 
 4057|  2.79k|					}
 4058|  7.64k|					case 24:  {
  ------------------
  |  Branch (4058:6): [True: 7.64k, False: 80.6k]
  ------------------
 4059|  7.64k|						{
 4060|  7.64k|#line 184 "src/txt/readstat_sas_commands_read.rl"
 4061|  7.64k|							str_len = p - str_start; }
 4062|       |						
 4063|  7.64k|#line 4064 "src/txt/readstat_sas_commands_read.c"
 4064|       |						
 4065|  7.64k|						break; 
 4066|  2.79k|					}
 4067|    956|					case 25:  {
  ------------------
  |  Branch (4067:6): [True: 956, False: 87.3k]
  ------------------
 4068|    956|						{
 4069|    956|#line 190 "src/txt/readstat_sas_commands_read.rl"
 4070|    956|							str_start = p; }
 4071|       |						
 4072|    956|#line 4073 "src/txt/readstat_sas_commands_read.c"
 4073|       |						
 4074|    956|						break; 
 4075|  2.79k|					}
 4076|    194|					case 26:  {
  ------------------
  |  Branch (4076:6): [True: 194, False: 88.1k]
  ------------------
 4077|    194|						{
 4078|    194|#line 190 "src/txt/readstat_sas_commands_read.rl"
 4079|    194|							str_len = p - str_start; }
 4080|       |						
 4081|    194|#line 4082 "src/txt/readstat_sas_commands_read.c"
 4082|       |						
 4083|    194|						break; 
 4084|  2.79k|					}
 4085|    417|					case 27:  {
  ------------------
  |  Branch (4085:6): [True: 417, False: 87.8k]
  ------------------
 4086|    417|						{
 4087|    417|#line 227 "src/txt/readstat_sas_commands_read.rl"
 4088|    417|							label_type = -1; }
 4089|       |						
 4090|    417|#line 4091 "src/txt/readstat_sas_commands_read.c"
 4091|       |						
 4092|    417|						break; 
 4093|  2.79k|					}
 4094|    194|					case 28:  {
  ------------------
  |  Branch (4094:6): [True: 194, False: 88.1k]
  ------------------
 4095|    194|						{
 4096|    194|#line 229 "src/txt/readstat_sas_commands_read.rl"
 4097|    194|							label_type = LABEL_TYPE_DOUBLE; double_value = -(double)integer; }
 4098|       |						
 4099|    194|#line 4100 "src/txt/readstat_sas_commands_read.c"
 4100|       |						
 4101|    194|						break; 
 4102|  2.79k|					}
 4103|  1.41k|					case 29:  {
  ------------------
  |  Branch (4103:6): [True: 1.41k, False: 86.8k]
  ------------------
 4104|  1.41k|						{
 4105|  1.41k|#line 230 "src/txt/readstat_sas_commands_read.rl"
 4106|  1.41k|							label_type = LABEL_TYPE_DOUBLE; double_value = integer; }
 4107|       |						
 4108|  1.41k|#line 4109 "src/txt/readstat_sas_commands_read.c"
 4109|       |						
 4110|  1.41k|						break; 
 4111|  2.79k|					}
 4112|  1.17k|					case 30:  {
  ------------------
  |  Branch (4112:6): [True: 1.17k, False: 87.1k]
  ------------------
 4113|  1.17k|						{
 4114|  1.17k|#line 231 "src/txt/readstat_sas_commands_read.rl"
 4115|  1.17k|							first_integer = integer; }
 4116|       |						
 4117|  1.17k|#line 4118 "src/txt/readstat_sas_commands_read.c"
 4118|       |						
 4119|  1.17k|						break; 
 4120|  2.79k|					}
 4121|  1.16k|					case 31:  {
  ------------------
  |  Branch (4121:6): [True: 1.16k, False: 87.1k]
  ------------------
 4122|  1.16k|						{
 4123|  1.16k|#line 231 "src/txt/readstat_sas_commands_read.rl"
 4124|  1.16k|							label_type = LABEL_TYPE_RANGE; }
 4125|       |						
 4126|  1.16k|#line 4127 "src/txt/readstat_sas_commands_read.c"
 4127|       |						
 4128|  1.16k|						break; 
 4129|  2.79k|					}
 4130|    578|					case 32:  {
  ------------------
  |  Branch (4130:6): [True: 578, False: 87.7k]
  ------------------
 4131|    578|						{
 4132|    578|#line 232 "src/txt/readstat_sas_commands_read.rl"
 4133|    578|							label_type = LABEL_TYPE_STRING; }
 4134|       |						
 4135|    578|#line 4136 "src/txt/readstat_sas_commands_read.c"
 4136|       |						
 4137|    578|						break; 
 4138|  2.79k|					}
 4139|    277|					case 33:  {
  ------------------
  |  Branch (4139:6): [True: 277, False: 88.0k]
  ------------------
 4140|    277|						{
 4141|    277|#line 233 "src/txt/readstat_sas_commands_read.rl"
 4142|    277|							label_type = LABEL_TYPE_STRING; }
 4143|       |						
 4144|    277|#line 4145 "src/txt/readstat_sas_commands_read.c"
 4145|       |						
 4146|    277|						break; 
 4147|  2.79k|					}
 4148|    204|					case 34:  {
  ------------------
  |  Branch (4148:6): [True: 204, False: 88.0k]
  ------------------
 4149|    204|						{
 4150|    204|#line 234 "src/txt/readstat_sas_commands_read.rl"
 4151|    204|							label_type = LABEL_TYPE_OTHER; }
 4152|       |						
 4153|    204|#line 4154 "src/txt/readstat_sas_commands_read.c"
 4154|       |						
 4155|    204|						break; 
 4156|  2.79k|					}
 4157|  1.47k|					case 35:  {
  ------------------
  |  Branch (4157:6): [True: 1.47k, False: 86.8k]
  ------------------
 4158|  1.47k|						{
 4159|  1.47k|#line 237 "src/txt/readstat_sas_commands_read.rl"
 4160|  1.47k|							var_len = integer; }
 4161|       |						
 4162|  1.47k|#line 4163 "src/txt/readstat_sas_commands_read.c"
 4163|       |						
 4164|  1.47k|						break; 
 4165|  2.79k|					}
 4166|    448|					case 36:  {
  ------------------
  |  Branch (4166:6): [True: 448, False: 87.8k]
  ------------------
 4167|    448|						{
 4168|    448|#line 340 "src/txt/readstat_sas_commands_read.rl"
 4169|    448|							var_row = integer - 1; }
 4170|       |						
 4171|    448|#line 4172 "src/txt/readstat_sas_commands_read.c"
 4172|       |						
 4173|    448|						break; 
 4174|  2.79k|					}
 4175|    337|					case 37:  {
  ------------------
  |  Branch (4175:6): [True: 337, False: 87.9k]
  ------------------
 4176|    337|						{
 4177|    337|#line 344 "src/txt/readstat_sas_commands_read.rl"
 4178|    337|							var_row = 0; }
 4179|       |						
 4180|    337|#line 4181 "src/txt/readstat_sas_commands_read.c"
 4181|       |						
 4182|    337|						break; 
 4183|  2.79k|					}
 4184|  88.3k|				}
 4185|  88.3k|				_nacts -= 1;
 4186|  88.3k|				_acts += 1;
 4187|  88.3k|			}
 4188|       |			
 4189|  51.2k|		}
 4190|       |		
 4191|  8.04M|		if ( p == eof ) {
  ------------------
  |  Branch (4191:8): [True: 1.02k, False: 8.04M]
  ------------------
 4192|  1.02k|			if ( cs >= 1159 )
  ------------------
  |  Branch (4192:9): [True: 230, False: 796]
  ------------------
 4193|    230|				goto _out;
 4194|  1.02k|		}
 4195|  8.04M|		else {
 4196|  8.04M|			if ( cs != 0 ) {
  ------------------
  |  Branch (4196:9): [True: 8.04M, False: 54]
  ------------------
 4197|  8.04M|				p += 1;
 4198|  8.04M|				goto _resume;
 4199|  8.04M|			}
 4200|  8.04M|		}
 4201|  1.08k|		_out: {}
 4202|  1.08k|	}
 4203|       |	
 4204|      0|#line 403 "src/txt/readstat_sas_commands_read.rl"
 4205|       |	
 4206|       |	
 4207|       |	/* suppress warnings */
 4208|      0|	(void)sas_commands_en_main;
 4209|       |	
 4210|  1.08k|	if (cs < 
  ------------------
  |  Branch (4210:6): [True: 850, False: 230]
  ------------------
 4211|  1.08k|#line 4212 "src/txt/readstat_sas_commands_read.c"
 4212|  1.08k|	1159
 4213|  1.08k|#line 408 "src/txt/readstat_sas_commands_read.rl"
 4214|  1.08k|	) {
 4215|    850|		char error_buf[1024];
 4216|    850|		if (p == pe) {
  ------------------
  |  Branch (4216:7): [True: 796, False: 54]
  ------------------
 4217|    796|			snprintf(error_buf, sizeof(error_buf), "Error parsing SAS command file (end-of-file unexpectedly reached)");
 4218|    796|		} else {
 4219|     54|			snprintf(error_buf, sizeof(error_buf), "Error parsing SAS command file around line #%d, col #%ld (0x%02x = %c)",
 4220|     54|			line_no + 1, (long)(p - line_start + 1), *p, *p);
 4221|     54|		}
 4222|    850|		if (parser->handlers.error) {
  ------------------
  |  Branch (4222:7): [True: 0, False: 850]
  ------------------
 4223|      0|			parser->handlers.error(error_buf, user_ctx);
 4224|      0|		}
 4225|    850|		error = READSTAT_ERROR_PARSE;
 4226|    850|		goto cleanup;
 4227|    850|	}
 4228|       |	
 4229|    230|	error = submit_columns(parser, schema, user_ctx);
 4230|       |	
 4231|  1.08k|	cleanup:
 4232|  1.08k|	parser->io->close(parser->io->io_ctx);
 4233|  1.08k|	free(bytes);
 4234|  1.08k|	if (error != READSTAT_OK) {
  ------------------
  |  Branch (4234:6): [True: 850, False: 230]
  ------------------
 4235|    850|		if (outError)
  ------------------
  |  Branch (4235:7): [True: 0, False: 850]
  ------------------
 4236|      0|			*outError = error;
 4237|    850|		readstat_schema_free(schema);
 4238|    850|		schema = NULL;
 4239|    850|	}
 4240|       |	
 4241|  1.08k|	return schema;
 4242|    230|}

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

