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

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

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

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

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

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

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

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

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

