Skip to content

Commit 65b0c57

Browse files
committed
fix: empty subvariables
1 parent 230e1ef commit 65b0c57

2 files changed

Lines changed: 32 additions & 28 deletions

File tree

src/spss/readstat_sav_parse_mr_name.c

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,53 +15,57 @@ static const char _mr_extractor_actions[] = {
1515

1616
static const char _mr_extractor_key_offsets[] = {
1717
0, 0, 8, 17, 20, 23, 25, 28,
18-
37, 49, 50, 51, 53, 54
18+
40, 41, 42, 44, 45, 57, 61
1919
};
2020

2121
static const char _mr_extractor_trans_keys[] = {
2222
46, 95, 48, 57, 65, 90, 97, 122,
2323
46, 61, 95, 48, 57, 65, 90, 97,
2424
122, 69, 67, 68, 32, 48, 57, 48,
25-
57, 32, 48, 57, 32, 46, 95, 48,
26-
57, 65, 90, 97, 122, 0, 32, 46,
25+
57, 32, 48, 57, 0, 32, 46, 95,
26+
9, 13, 48, 57, 65, 90, 97, 122,
27+
32, 49, 32, 49, 32, 0, 32, 46,
2728
95, 9, 13, 48, 57, 65, 90, 97,
28-
122, 32, 49, 32, 49, 32, 46, 95,
29-
48, 57, 65, 90, 97, 122, 0
29+
122, 0, 32, 9, 13, 0, 32, 46,
30+
95, 9, 13, 48, 57, 65, 90, 97,
31+
122, 0
3032
};
3133

3234
static const char _mr_extractor_single_lengths[] = {
33-
0, 2, 3, 1, 1, 0, 1, 3,
34-
4, 1, 1, 2, 1, 2
35+
0, 2, 3, 1, 1, 0, 1, 4,
36+
1, 1, 2, 1, 4, 2, 4
3537
};
3638

3739
static const char _mr_extractor_range_lengths[] = {
38-
0, 3, 3, 1, 1, 1, 1, 3,
39-
4, 0, 0, 0, 0, 3
40+
0, 3, 3, 1, 1, 1, 1, 4,
41+
0, 0, 0, 0, 4, 1, 4
4042
};
4143

4244
static const char _mr_extractor_index_offsets[] = {
4345
0, 0, 6, 13, 16, 19, 21, 24,
44-
31, 40, 42, 44, 47, 49
46+
33, 35, 37, 40, 42, 51, 55
4547
};
4648

4749
static const char _mr_extractor_indicies[] = {
4850
0, 0, 0, 0, 0, 1, 0, 2,
4951
0, 0, 0, 0, 1, 4, 3, 1,
5052
5, 6, 1, 7, 1, 8, 7, 1,
51-
9, 10, 10, 10, 10, 10, 1, 11,
52-
11, 10, 10, 11, 10, 10, 10, 1,
53-
12, 1, 13, 1, 6, 14, 1, 6,
54-
1, 10, 10, 10, 10, 10, 1, 0
53+
9, 9, 10, 10, 9, 10, 10, 10,
54+
1, 11, 1, 12, 1, 6, 13, 1,
55+
6, 1, 14, 15, 10, 10, 14, 10,
56+
10, 10, 1, 14, 14, 14, 1, 14,
57+
14, 10, 10, 14, 10, 10, 10, 1,
58+
0
5559
};
5660

5761
static const char _mr_extractor_trans_targs[] = {
58-
2, 0, 3, 4, 9, 5, 4, 6,
59-
7, 7, 8, 13, 10, 11, 12
62+
2, 0, 3, 4, 8, 5, 4, 6,
63+
12, 14, 7, 9, 10, 11, 13, 12
6064
};
6165

6266
static const char _mr_extractor_trans_actions[] = {
6367
0, 0, 1, 3, 3, 5, 0, 0,
64-
7, 0, 0, 9, 0, 0, 0
68+
7, 9, 0, 0, 0, 0, 0, 0
6569
};
6670

6771
static const int mr_extractor_start = 1;
@@ -91,14 +95,14 @@ readstat_error_t extract_mr_data(const char *line, mr_set_t *result) {
9195

9296
// Execute Ragel finite state machine (FSM)
9397

94-
#line 95 "src/spss/readstat_sav_parse_mr_name.c"
98+
#line 99 "src/spss/readstat_sav_parse_mr_name.c"
9599
{
96100
cs = mr_extractor_start;
97101
}
98102

99103
#line 142 "src/spss/readstat_sav_parse_mr_name.rl"
100104

101-
#line 102 "src/spss/readstat_sav_parse_mr_name.c"
105+
#line 106 "src/spss/readstat_sav_parse_mr_name.c"
102106
{
103107
int _klen;
104108
unsigned int _trans;
@@ -267,7 +271,7 @@ readstat_error_t extract_mr_data(const char *line, mr_set_t *result) {
267271
mr_subvariables[mr_subvar_count++] = subvar;
268272
}
269273
break;
270-
#line 271 "src/spss/readstat_sav_parse_mr_name.c"
274+
#line 275 "src/spss/readstat_sav_parse_mr_name.c"
271275
}
272276
}
273277

@@ -283,7 +287,7 @@ readstat_error_t extract_mr_data(const char *line, mr_set_t *result) {
283287
#line 143 "src/spss/readstat_sav_parse_mr_name.rl"
284288

285289
// Check if FSM finished successfully
286-
if (cs < 13 || p != pe) {
290+
if (cs < 12 || p != pe) {
287291
retval = READSTAT_ERROR_BAD_MR_STRING;
288292
goto cleanup;
289293
}
@@ -322,7 +326,7 @@ readstat_error_t parse_mr_line(const char *line, mr_set_t *result) {
322326
}
323327

324328

325-
#line 326 "src/spss/readstat_sav_parse_mr_name.c"
329+
#line 330 "src/spss/readstat_sav_parse_mr_name.c"
326330
static const char _mr_parser_actions[] = {
327331
0, 1, 0
328332
};
@@ -378,14 +382,14 @@ readstat_error_t parse_mr_string(const char *line, mr_set_t **mr_sets, size_t *n
378382
*n_mr_lines = 0;
379383

380384

381-
#line 382 "src/spss/readstat_sav_parse_mr_name.c"
385+
#line 386 "src/spss/readstat_sav_parse_mr_name.c"
382386
{
383387
cs = mr_parser_start;
384388
}
385389

386390
#line 228 "src/spss/readstat_sav_parse_mr_name.rl"
387391

388-
#line 389 "src/spss/readstat_sav_parse_mr_name.c"
392+
#line 393 "src/spss/readstat_sav_parse_mr_name.c"
389393
{
390394
int _klen;
391395
unsigned int _trans;
@@ -485,7 +489,7 @@ readstat_error_t parse_mr_string(const char *line, mr_set_t **mr_sets, size_t *n
485489
start = p + 1;
486490
}
487491
break;
488-
#line 489 "src/spss/readstat_sav_parse_mr_name.c"
492+
#line 493 "src/spss/readstat_sav_parse_mr_name.c"
489493
}
490494
}
491495

src/spss/readstat_sav_parse_mr_name.rl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,9 @@
110110
subvariable = (nc+ end >extract_subvar);
111111

112112
# Define patterns for each type
113-
c_pattern = c_type counted_value label subvariable+;
114-
d_pattern = d_type counted_value label subvariable+;
115-
e_pattern = e_type e_params counted_value label subvariable+;
113+
c_pattern = c_type counted_value label subvariable* end*;
114+
d_pattern = d_type counted_value label subvariable* end*;
115+
e_pattern = e_type e_params counted_value label subvariable* end*;
116116

117117
# Main pattern is one of the type patterns
118118
main := name (c_pattern | d_pattern | e_pattern);

0 commit comments

Comments
 (0)