packcr 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +21 -0
  3. data/README.md +73 -0
  4. data/lib/packcr/cli.rb +18 -16
  5. data/lib/packcr/code_block.rb +0 -1
  6. data/lib/packcr/context.rb +20 -18
  7. data/lib/packcr/generated/context.rb +483 -0
  8. data/lib/packcr/generated/node/action_node.rb +60 -0
  9. data/lib/packcr/generated/node/alternate_node.rb +98 -0
  10. data/lib/packcr/generated/node/capture_node.rb +39 -0
  11. data/lib/packcr/generated/node/charclass_node.rb +372 -0
  12. data/lib/packcr/generated/node/eof_node.rb +20 -0
  13. data/lib/packcr/generated/node/error_node.rb +67 -0
  14. data/lib/packcr/generated/node/expand_node.rb +30 -0
  15. data/lib/packcr/generated/node/predicate_node.rb +140 -0
  16. data/lib/packcr/generated/node/quantity_node.rb +166 -0
  17. data/lib/packcr/generated/node/reference_node.rb +70 -0
  18. data/lib/packcr/generated/node/rule_node.rb +63 -0
  19. data/lib/packcr/generated/node/sequence_node.rb +42 -0
  20. data/lib/packcr/generated/node/string_node.rb +60 -0
  21. data/lib/packcr/generator.rb +2 -1
  22. data/lib/packcr/node/action_node.rb +4 -2
  23. data/lib/packcr/node/alternate_node.rb +3 -1
  24. data/lib/packcr/node/capture_node.rb +3 -1
  25. data/lib/packcr/node/charclass_node.rb +24 -28
  26. data/lib/packcr/node/eof_node.rb +4 -2
  27. data/lib/packcr/node/error_node.rb +3 -1
  28. data/lib/packcr/node/expand_node.rb +8 -5
  29. data/lib/packcr/node/predicate_node.rb +4 -2
  30. data/lib/packcr/node/quantity_node.rb +12 -10
  31. data/lib/packcr/node/reference_node.rb +11 -5
  32. data/lib/packcr/node/root_node.rb +1 -0
  33. data/lib/packcr/node/rule_node.rb +7 -4
  34. data/lib/packcr/node/sequence_node.rb +3 -1
  35. data/lib/packcr/node/string_node.rb +9 -6
  36. data/lib/packcr/node.rb +3 -5
  37. data/lib/packcr/parser.rb +4389 -4064
  38. data/lib/packcr/stream.rb +17 -12
  39. data/lib/packcr/templates/context/header.c.erb +3 -3
  40. data/lib/packcr/templates/context/source.c.erb +481 -690
  41. data/lib/packcr/templates/context/source.rb.erb +123 -171
  42. data/lib/packcr/templates/node/action.c.erb +5 -5
  43. data/lib/packcr/templates/node/action.rb.erb +2 -2
  44. data/lib/packcr/templates/node/alternate.c.erb +9 -9
  45. data/lib/packcr/templates/node/alternate.rb.erb +4 -5
  46. data/lib/packcr/templates/node/capture.c.erb +7 -7
  47. data/lib/packcr/templates/node/capture.rb.erb +4 -4
  48. data/lib/packcr/templates/node/charclass.c.erb +12 -12
  49. data/lib/packcr/templates/node/charclass.rb.erb +6 -6
  50. data/lib/packcr/templates/node/charclass_any.c.erb +3 -3
  51. data/lib/packcr/templates/node/charclass_any.rb.erb +2 -2
  52. data/lib/packcr/templates/node/charclass_fail.c.erb +1 -1
  53. data/lib/packcr/templates/node/charclass_one.c.erb +10 -10
  54. data/lib/packcr/templates/node/charclass_one.rb.erb +6 -6
  55. data/lib/packcr/templates/node/charclass_utf8.c.erb +8 -8
  56. data/lib/packcr/templates/node/charclass_utf8.rb.erb +3 -3
  57. data/lib/packcr/templates/node/charclass_utf8_reverse.rb.erb +5 -5
  58. data/lib/packcr/templates/node/eof.c.erb +1 -1
  59. data/lib/packcr/templates/node/error.c.erb +11 -11
  60. data/lib/packcr/templates/node/error.rb.erb +2 -2
  61. data/lib/packcr/templates/node/expand.c.erb +5 -5
  62. data/lib/packcr/templates/node/expand.rb.erb +3 -3
  63. data/lib/packcr/templates/node/predicate.c.erb +10 -10
  64. data/lib/packcr/templates/node/predicate.rb.erb +6 -6
  65. data/lib/packcr/templates/node/predicate_neg.c.erb +8 -8
  66. data/lib/packcr/templates/node/predicate_neg.rb.erb +6 -6
  67. data/lib/packcr/templates/node/quantity_many.c.erb +47 -0
  68. data/lib/packcr/templates/node/{quantify_many.rb.erb → quantity_many.rb.erb} +9 -9
  69. data/lib/packcr/templates/node/quantity_one.c.erb +23 -0
  70. data/lib/packcr/templates/node/{quantify_one.rb.erb → quantity_one.rb.erb} +8 -8
  71. data/lib/packcr/templates/node/reference.c.erb +14 -2
  72. data/lib/packcr/templates/node/reference.rb.erb +16 -4
  73. data/lib/packcr/templates/node/reference_reverse.rb.erb +16 -4
  74. data/lib/packcr/templates/node/rule.c.erb +14 -7
  75. data/lib/packcr/templates/node/rule.rb.erb +26 -19
  76. data/lib/packcr/templates/node/string_many.c.erb +6 -6
  77. data/lib/packcr/templates/node/string_many.rb.erb +3 -3
  78. data/lib/packcr/templates/node/string_one.c.erb +5 -5
  79. data/lib/packcr/templates/node/string_one.rb.erb +3 -3
  80. data/lib/packcr/util.rb +21 -16
  81. data/lib/packcr/version.rb +1 -1
  82. data/lib/packcr.rb +8 -11
  83. metadata +40 -10
  84. data/lib/packcr/templates/node/quantify_many.c.erb +0 -45
  85. data/lib/packcr/templates/node/quantify_one.c.erb +0 -21
  86. data/lib/packcr/tokenizer.rb +0 -2948
@@ -16,14 +16,14 @@
16
16
 
17
17
  #ifndef _MSC_VER
18
18
  #if defined __GNUC__ && defined _WIN32 /* MinGW */
19
- #ifndef PCC_USE_SYSTEM_STRNLEN
20
- #define strnlen(str, maxlen) pcc_strnlen(str, maxlen)
21
- static size_t pcc_strnlen(const char *str, size_t maxlen) {
19
+ #ifndef PACKCR_USE_SYSTEM_STRNLEN
20
+ #define strnlen(str, maxlen) packcr_strnlen(str, maxlen)
21
+ static size_t packcr_strnlen(const char *str, size_t maxlen) {
22
22
  size_t i;
23
23
  for (i = 0; i < maxlen && str[i]; i++);
24
24
  return i;
25
25
  }
26
- #endif /* !PCC_USE_SYSTEM_STRNLEN */
26
+ #endif /* !PACKCR_USE_SYSTEM_STRNLEN */
27
27
  #endif /* defined __GNUC__ && defined _WIN32 */
28
28
  #endif /* !_MSC_VER */
29
29
 
@@ -48,260 +48,221 @@ static size_t pcc_strnlen(const char *str, size_t maxlen) {
48
48
  #define MARK_FUNC_AS_USED __attribute__((__unused__))
49
49
  #endif
50
50
 
51
- #ifndef PCC_BUFFER_MIN_SIZE
52
- #define PCC_BUFFER_MIN_SIZE 256
53
- #endif /* !PCC_BUFFER_MIN_SIZE */
51
+ #ifndef PACKCR_BUFFER_MIN_SIZE
52
+ #define PACKCR_BUFFER_MIN_SIZE 256
53
+ #endif /* !PACKCR_BUFFER_MIN_SIZE */
54
54
 
55
- #ifndef PCC_ARRAY_MIN_SIZE
56
- #define PCC_ARRAY_MIN_SIZE 2
57
- #endif /* !PCC_ARRAY_MIN_SIZE */
55
+ #ifndef PACKCR_ARRAY_MIN_SIZE
56
+ #define PACKCR_ARRAY_MIN_SIZE 2
57
+ #endif /* !PACKCR_ARRAY_MIN_SIZE */
58
58
 
59
- #ifndef PCC_POOL_MIN_SIZE
60
- #define PCC_POOL_MIN_SIZE 65536
61
- #endif /* !PCC_POOL_MIN_SIZE */
59
+ #ifndef PACKCR_POOL_MIN_SIZE
60
+ #define PACKCR_POOL_MIN_SIZE 65536
61
+ #endif /* !PACKCR_POOL_MIN_SIZE */
62
62
 
63
- #define PCC_DBG_EVALUATE 0
64
- #define PCC_DBG_MATCH 1
65
- #define PCC_DBG_NOMATCH 2
63
+ #define PACKCR_DBG_EVALUATE 0
64
+ #define PACKCR_DBG_MATCH 1
65
+ #define PACKCR_DBG_NOMATCH 2
66
66
 
67
- #define PCC_VOID_VALUE (~(size_t)0)
67
+ #define PACKCR_VOID_VALUE (~(size_t)0)
68
68
 
69
- typedef enum pcc_bool_tag {
70
- PCC_FALSE = 0,
71
- PCC_TRUE
72
- } pcc_bool_t;
69
+ typedef enum packcr_bool_tag {
70
+ PACKCR_FALSE = 0,
71
+ PACKCR_TRUE
72
+ } packcr_bool_t;
73
73
 
74
- typedef struct pcc_char_array_tag {
74
+ typedef struct packcr_char_array_tag {
75
75
  char *buf;
76
76
  size_t max;
77
77
  size_t len;
78
- } pcc_char_array_t;
78
+ } packcr_char_array_t;
79
79
 
80
- typedef struct pcc_range_tag {
80
+ typedef struct packcr_range_tag {
81
81
  size_t start;
82
82
  size_t end;
83
83
  <%- if @location -%>
84
- pcc_location_t *start_loc_ptr;
85
- pcc_location_t *end_loc_ptr;
84
+ packcr_location_t start_loc;
85
+ packcr_location_t end_loc;
86
86
  <%- end -%>
87
- } pcc_range_t;
87
+ } packcr_range_t;
88
88
 
89
- typedef <%= value_def %>pcc_value_t;
89
+ typedef <%= value_def %>packcr_value_t;
90
90
 
91
- typedef <%= auxil_def %>pcc_auxil_t;
91
+ typedef <%= auxil_def %>packcr_auxil_t;
92
92
 
93
- <% if prefix != "pcc" -%>
94
- typedef <%= prefix%>_context_t pcc_context_t;
93
+ <% if prefix != "packcr" -%>
94
+ typedef <%= prefix%>_context_t packcr_context_t;
95
95
 
96
96
  <% end -%>
97
- typedef struct pcc_value_table_tag {
98
- pcc_value_t *buf;
97
+ typedef struct packcr_value_table_tag {
98
+ packcr_value_t *buf;
99
99
  size_t max;
100
100
  size_t len;
101
- } pcc_value_table_t;
101
+ } packcr_value_table_t;
102
102
 
103
- typedef struct pcc_value_refer_table_tag {
104
- pcc_value_t **buf;
103
+ typedef struct packcr_value_refer_table_tag {
104
+ packcr_value_t **buf;
105
105
  size_t max;
106
106
  size_t len;
107
- } pcc_value_refer_table_t;
107
+ } packcr_value_refer_table_t;
108
108
 
109
- typedef struct pcc_capture_tag {
110
- pcc_range_t range;
109
+ typedef struct packcr_capture_tag {
110
+ packcr_range_t range;
111
111
  char *string; /* mutable */
112
- } pcc_capture_t;
112
+ } packcr_capture_t;
113
113
 
114
- typedef struct pcc_capture_table_tag {
115
- pcc_capture_t *buf;
114
+ typedef struct packcr_capture_table_tag {
115
+ packcr_capture_t *buf;
116
116
  size_t max;
117
117
  size_t len;
118
- } pcc_capture_table_t;
118
+ } packcr_capture_table_t;
119
119
 
120
- typedef struct pcc_capture_const_table_tag {
121
- const pcc_capture_t **buf;
120
+ typedef struct packcr_capture_const_table_tag {
121
+ const packcr_capture_t **buf;
122
122
  size_t max;
123
123
  size_t len;
124
- } pcc_capture_const_table_t;
125
-
126
- typedef struct pcc_thunk_tag pcc_thunk_t;
127
- typedef struct pcc_thunk_array_tag pcc_thunk_array_t;
128
-
129
- typedef void (*pcc_action_t)(pcc_context_t *, pcc_thunk_t *, pcc_value_t *);
130
-
131
- typedef enum pcc_thunk_type_tag {
132
- PCC_THUNK_LEAF,
133
- PCC_THUNK_NODE
134
- } pcc_thunk_type_t;
135
-
136
- typedef struct pcc_thunk_leaf_tag {
137
- pcc_value_refer_table_t values;
138
- pcc_capture_const_table_t capts;
139
- pcc_capture_t capt0;
140
- pcc_action_t action;
141
- } pcc_thunk_leaf_t;
142
-
143
- typedef struct pcc_thunk_node_tag {
144
- const pcc_thunk_array_t *thunks; /* just a reference */
145
- pcc_value_t *value; /* just a reference */
146
- } pcc_thunk_node_t;
147
-
148
- typedef union pcc_thunk_data_tag {
149
- pcc_thunk_leaf_t leaf;
150
- pcc_thunk_node_t node;
151
- } pcc_thunk_data_t;
152
-
153
- struct pcc_thunk_tag {
154
- pcc_thunk_type_t type;
155
- pcc_thunk_data_t data;
124
+ } packcr_capture_const_table_t;
125
+
126
+ typedef struct packcr_thunk_tag packcr_thunk_t;
127
+ typedef struct packcr_thunk_array_tag packcr_thunk_array_t;
128
+
129
+ typedef void (*packcr_action_t)(packcr_context_t *, packcr_thunk_t *, packcr_value_t *);
130
+
131
+ typedef enum packcr_thunk_type_tag {
132
+ PACKCR_THUNK_LEAF,
133
+ PACKCR_THUNK_NODE
134
+ } packcr_thunk_type_t;
135
+
136
+ typedef struct packcr_thunk_leaf_tag {
137
+ packcr_value_refer_table_t values;
138
+ packcr_capture_const_table_t capts;
139
+ packcr_capture_t capt0;
140
+ packcr_action_t action;
141
+ } packcr_thunk_leaf_t;
142
+
143
+ typedef struct packcr_thunk_node_tag {
144
+ const packcr_thunk_array_t *thunks; /* just a reference */
145
+ packcr_value_t *value; /* just a reference */
146
+ } packcr_thunk_node_t;
147
+
148
+ typedef union packcr_thunk_data_tag {
149
+ packcr_thunk_leaf_t leaf;
150
+ packcr_thunk_node_t node;
151
+ } packcr_thunk_data_t;
152
+
153
+ struct packcr_thunk_tag {
154
+ packcr_thunk_type_t type;
155
+ packcr_thunk_data_t data;
156
156
  };
157
157
 
158
- struct pcc_thunk_array_tag {
159
- pcc_thunk_t **buf;
158
+ struct packcr_thunk_array_tag {
159
+ packcr_thunk_t **buf;
160
160
  size_t max;
161
161
  size_t len;
162
162
  };
163
163
 
164
- typedef struct pcc_thunk_chunk_tag {
165
- pcc_value_table_t values;
166
- pcc_capture_table_t capts;
167
- pcc_thunk_array_t thunks;
164
+ typedef struct packcr_thunk_chunk_tag {
165
+ packcr_value_table_t values;
166
+ packcr_capture_table_t capts;
167
+ packcr_thunk_array_t thunks;
168
168
  size_t pos; /* the starting position in the character buffer */
169
169
  <%- if @location -%>
170
- pcc_location_t pos_loc;
170
+ packcr_location_t pos_loc;
171
171
  <%- end -%>
172
- } pcc_thunk_chunk_t;
172
+ } packcr_thunk_chunk_t;
173
173
 
174
- typedef struct pcc_lr_entry_tag pcc_lr_entry_t;
174
+ typedef struct packcr_lr_memo_tag packcr_lr_memo_t;
175
175
 
176
- typedef enum pcc_lr_answer_type_tag {
177
- PCC_LR_ANSWER_LR,
178
- PCC_LR_ANSWER_CHUNK
179
- } pcc_lr_answer_type_t;
180
-
181
- typedef union pcc_lr_answer_data_tag {
182
- pcc_lr_entry_t *lr;
183
- pcc_thunk_chunk_t *chunk;
184
- } pcc_lr_answer_data_t;
185
-
186
- typedef struct pcc_lr_answer_tag pcc_lr_answer_t;
187
-
188
- struct pcc_lr_answer_tag {
189
- pcc_lr_answer_type_t type;
190
- pcc_lr_answer_data_t data;
191
- size_t pos; /* the absolute position in the input */
176
+ struct packcr_lr_memo_tag {
177
+ size_t offset;
192
178
  <%- if @location -%>
193
- pcc_location_t pos_loc;
179
+ packcr_location_t offset_loc;
194
180
  <%- end -%>
195
- pcc_lr_answer_t *hold;
181
+ packcr_lr_memo_t *hold;
182
+ packcr_thunk_chunk_t *chunk;
183
+ packcr_bool_t fail;
184
+ packcr_bool_t grow;
196
185
  };
197
186
 
198
- typedef pcc_thunk_chunk_t *(*pcc_rule_t)(pcc_context_t *);
199
-
200
- typedef struct pcc_rule_set_tag {
201
- pcc_rule_t *buf;
202
- size_t max;
203
- size_t len;
204
- } pcc_rule_set_t;
205
-
206
- typedef struct pcc_lr_head_tag pcc_lr_head_t;
207
-
208
- struct pcc_lr_head_tag {
209
- pcc_rule_t rule;
210
- pcc_rule_set_t invol;
211
- pcc_rule_set_t eval;
212
- pcc_lr_head_t *hold;
213
- };
187
+ typedef struct packcr_rule_set_tag packcr_rule_set_t;
214
188
 
215
- typedef struct pcc_lr_memo_tag {
216
- pcc_rule_t rule;
217
- pcc_lr_answer_t *answer;
218
- } pcc_lr_memo_t;
189
+ typedef packcr_thunk_chunk_t *(*packcr_rule_t)(packcr_context_t *, size_t<% if @location %>, packcr_location_t<% end %>, packcr_rule_set_t*);
219
190
 
220
- typedef struct pcc_lr_memo_map_tag {
221
- pcc_lr_memo_t *buf;
191
+ typedef struct packcr_rule_set_tag {
192
+ packcr_rule_t *buf;
222
193
  size_t max;
223
194
  size_t len;
224
- } pcc_lr_memo_map_t;
195
+ } packcr_rule_set_t;
225
196
 
226
- typedef struct pcc_lr_table_entry_tag {
227
- pcc_lr_head_t *head; /* just a reference */
228
- pcc_lr_memo_map_t memos;
229
- pcc_lr_answer_t *hold_a;
230
- pcc_lr_head_t *hold_h;
231
- } pcc_lr_table_entry_t;
197
+ typedef struct packcr_lr_memo_map_entry_tag {
198
+ packcr_rule_t rule;
199
+ packcr_lr_memo_t *memo;
200
+ } packcr_lr_memo_map_entry_t;
232
201
 
233
- typedef struct pcc_lr_table_tag {
234
- pcc_lr_table_entry_t **buf;
202
+ typedef struct packcr_lr_memo_map_tag {
203
+ packcr_lr_memo_map_entry_t *buf;
235
204
  size_t max;
236
205
  size_t len;
237
- size_t ofs;
238
- } pcc_lr_table_t;
239
-
240
- struct pcc_lr_entry_tag {
241
- pcc_rule_t rule;
242
- pcc_thunk_chunk_t *seed; /* just a reference */
243
- pcc_lr_head_t *head; /* just a reference */
244
- };
206
+ } packcr_lr_memo_map_t;
245
207
 
246
- typedef struct pcc_lr_stack_tag {
247
- pcc_lr_entry_t **buf;
208
+ typedef struct packcr_lr_table_tag {
209
+ packcr_lr_memo_map_t **buf;
248
210
  size_t max;
249
211
  size_t len;
250
- } pcc_lr_stack_t;
212
+ size_t ofs;
213
+ } packcr_lr_table_t;
251
214
 
252
- typedef struct pcc_memory_entry_tag pcc_memory_entry_t;
253
- typedef struct pcc_memory_pool_tag pcc_memory_pool_t;
215
+ typedef struct packcr_memory_entry_tag packcr_memory_entry_t;
216
+ typedef struct packcr_memory_pool_tag packcr_memory_pool_t;
254
217
 
255
- struct pcc_memory_entry_tag {
256
- pcc_memory_entry_t *next;
218
+ struct packcr_memory_entry_tag {
219
+ packcr_memory_entry_t *next;
257
220
  };
258
221
 
259
- struct pcc_memory_pool_tag {
260
- pcc_memory_pool_t *next;
222
+ struct packcr_memory_pool_tag {
223
+ packcr_memory_pool_t *next;
261
224
  size_t allocated;
262
225
  size_t unused;
263
226
  };
264
227
 
265
- typedef struct pcc_memory_recycler_tag {
266
- pcc_memory_pool_t *pool_list;
267
- pcc_memory_entry_t *entry_list;
228
+ typedef struct packcr_memory_recycler_tag {
229
+ packcr_memory_pool_t *pool_list;
230
+ packcr_memory_entry_t *entry_list;
268
231
  size_t element_size;
269
- } pcc_memory_recycler_t;
232
+ } packcr_memory_recycler_t;
270
233
 
271
234
  struct <%= prefix %>_context_tag {
272
- size_t pos; /* the position in the input of the first character currently buffered */
273
- size_t cur; /* the current parsing position in the character buffer */
235
+ size_t buffer_start_position; /* the position in the input of the first character currently buffered */
236
+ size_t position_offset; /* the current parsing position in the character buffer */
274
237
  <%- if @location -%>
275
- pcc_location_t pos_loc;
276
- pcc_location_t cur_loc;
238
+ packcr_location_t buffer_start_position_loc;
239
+ packcr_location_t position_offset_loc;
277
240
  <%- end -%>
278
241
  size_t level;
279
- pcc_char_array_t buffer;
280
- pcc_lr_table_t lrtable;
281
- pcc_lr_stack_t lrstack;
282
- pcc_thunk_array_t thunks;
283
- pcc_auxil_t auxil;
284
- pcc_memory_recycler_t thunk_chunk_recycler;
285
- pcc_memory_recycler_t lr_head_recycler;
286
- pcc_memory_recycler_t lr_answer_recycler;
242
+ packcr_char_array_t buffer;
243
+ packcr_lr_table_t lrtable;
244
+ packcr_thunk_array_t thunks;
245
+ packcr_auxil_t auxil;
246
+ packcr_memory_recycler_t thunk_chunk_recycler;
247
+ packcr_memory_recycler_t lr_memo_recycler;
287
248
  };
288
249
 
289
- #ifndef PCC_ERROR
290
- #define PCC_ERROR(auxil) pcc_error()
250
+ #ifndef PACKCR_ERROR
251
+ #define PACKCR_ERROR(auxil) packcr_error()
291
252
  MARK_FUNC_AS_USED
292
- static void pcc_error(void) {
253
+ static void packcr_error(void) {
293
254
  fprintf(stderr, "Syntax error\n");
294
255
  exit(1);
295
256
  }
296
- #endif /* !PCC_ERROR */
257
+ #endif /* !PACKCR_ERROR */
297
258
 
298
- #ifndef PCC_GETCHAR
299
- #define PCC_GETCHAR(auxil) getchar()
300
- #endif /* !PCC_GETCHAR */
259
+ #ifndef PACKCR_GETCHAR
260
+ #define PACKCR_GETCHAR(auxil) getchar()
261
+ #endif /* !PACKCR_GETCHAR */
301
262
 
302
- #ifndef PCC_MALLOC
303
- #define PCC_MALLOC(auxil, size) pcc_malloc_e(size)
304
- static void *pcc_malloc_e(size_t size) {
263
+ #ifndef PACKCR_MALLOC
264
+ #define PACKCR_MALLOC(auxil, size) packcr_malloc_e(size)
265
+ static void *packcr_malloc_e(size_t size) {
305
266
  void *const p = malloc(size);
306
267
  if (p == NULL) {
307
268
  fprintf(stderr, "Out of memory\n");
@@ -309,11 +270,11 @@ static void *pcc_malloc_e(size_t size) {
309
270
  }
310
271
  return p;
311
272
  }
312
- #endif /* !PCC_MALLOC */
273
+ #endif /* !PACKCR_MALLOC */
313
274
 
314
- #ifndef PCC_REALLOC
315
- #define PCC_REALLOC(auxil, ptr, size) pcc_realloc_e(ptr, size)
316
- static void *pcc_realloc_e(void *ptr, size_t size) {
275
+ #ifndef PACKCR_REALLOC
276
+ #define PACKCR_REALLOC(auxil, ptr, size) packcr_realloc_e(ptr, size)
277
+ static void *packcr_realloc_e(void *ptr, size_t size) {
317
278
  void *const p = realloc(ptr, size);
318
279
  if (p == NULL) {
319
280
  fprintf(stderr, "Out of memory\n");
@@ -321,267 +282,259 @@ static void *pcc_realloc_e(void *ptr, size_t size) {
321
282
  }
322
283
  return p;
323
284
  }
324
- #endif /* !PCC_REALLOC */
285
+ #endif /* !PACKCR_REALLOC */
325
286
 
326
- #ifndef PCC_FREE
327
- #define PCC_FREE(auxil, ptr) free(ptr)
328
- #endif /* !PCC_FREE */
287
+ #ifndef PACKCR_FREE
288
+ #define PACKCR_FREE(auxil, ptr) free(ptr)
289
+ #endif /* !PACKCR_FREE */
329
290
 
330
- #ifndef PCC_DEBUG
331
- #define PCC_DEBUG(auxil, event, rule, level, pos, buffer, length) ((void)0)
332
- #endif /* !PCC_DEBUG */
291
+ #ifndef PACKCR_DEBUG
292
+ #define PACKCR_DEBUG(auxil, event, rule, level, pos, buffer, length) ((void)0)
293
+ #endif /* !PACKCR_DEBUG */
333
294
 
334
- static char *pcc_strndup_e(pcc_auxil_t auxil, const char *str, size_t len) {
295
+ static char *packcr_strndup_e(packcr_auxil_t auxil, const char *str, size_t len) {
335
296
  const size_t m = strnlen(str, len);
336
- char *const s = (char *)PCC_MALLOC(auxil, m + 1);
297
+ char *const s = (char *)PACKCR_MALLOC(auxil, m + 1);
337
298
  memcpy(s, str, m);
338
299
  s[m] = '\0';
339
300
  return s;
340
301
  }
341
302
 
342
- static void pcc_char_array__init(pcc_auxil_t auxil, pcc_char_array_t *array) {
303
+ static void packcr_char_array__init(packcr_auxil_t auxil, packcr_char_array_t *array) {
343
304
  array->len = 0;
344
305
  array->max = 0;
345
306
  array->buf = NULL;
346
307
  }
347
308
 
348
- static void pcc_char_array__add(pcc_auxil_t auxil, pcc_char_array_t *array, char ch) {
309
+ static void packcr_char_array__add(packcr_auxil_t auxil, packcr_char_array_t *array, char ch) {
349
310
  if (array->max <= array->len) {
350
311
  const size_t n = array->len + 1;
351
312
  size_t m = array->max;
352
- if (m == 0) m = PCC_BUFFER_MIN_SIZE;
313
+ if (m == 0) m = PACKCR_BUFFER_MIN_SIZE;
353
314
  while (m < n && m != 0) m <<= 1;
354
315
  if (m == 0) m = n;
355
- array->buf = (char *)PCC_REALLOC(auxil, array->buf, m);
316
+ array->buf = (char *)PACKCR_REALLOC(auxil, array->buf, m);
356
317
  array->max = m;
357
318
  }
358
319
  array->buf[array->len++] = ch;
359
320
  }
360
321
 
361
- static void pcc_char_array__term(pcc_auxil_t auxil, pcc_char_array_t *array) {
362
- PCC_FREE(auxil, array->buf);
322
+ static void packcr_char_array__term(packcr_auxil_t auxil, packcr_char_array_t *array) {
323
+ PACKCR_FREE(auxil, array->buf);
363
324
  }
364
325
 
365
- static void pcc_value_table__init(pcc_auxil_t auxil, pcc_value_table_t *table) {
326
+ static void packcr_value_table__init(packcr_auxil_t auxil, packcr_value_table_t *table) {
366
327
  table->len = 0;
367
328
  table->max = 0;
368
329
  table->buf = NULL;
369
330
  }
370
331
 
371
332
  MARK_FUNC_AS_USED
372
- static void pcc_value_table__resize(pcc_auxil_t auxil, pcc_value_table_t *table, size_t len) {
333
+ static void packcr_value_table__resize(packcr_auxil_t auxil, packcr_value_table_t *table, size_t len) {
373
334
  if (table->max < len) {
374
335
  size_t m = table->max;
375
- if (m == 0) m = PCC_ARRAY_MIN_SIZE;
336
+ if (m == 0) m = PACKCR_ARRAY_MIN_SIZE;
376
337
  while (m < len && m != 0) m <<= 1;
377
338
  if (m == 0) m = len;
378
- table->buf = (pcc_value_t *)PCC_REALLOC(auxil, table->buf, sizeof(pcc_value_t) * m);
339
+ table->buf = (packcr_value_t *)PACKCR_REALLOC(auxil, table->buf, sizeof(packcr_value_t) * m);
379
340
  table->max = m;
380
341
  }
381
342
  table->len = len;
382
343
  }
383
344
 
384
345
  MARK_FUNC_AS_USED
385
- static void pcc_value_table__clear(pcc_auxil_t auxil, pcc_value_table_t *table) {
386
- memset(table->buf, 0, sizeof(pcc_value_t) * table->len);
346
+ static void packcr_value_table__clear(packcr_auxil_t auxil, packcr_value_table_t *table) {
347
+ memset(table->buf, 0, sizeof(packcr_value_t) * table->len);
387
348
  }
388
349
 
389
- static void pcc_value_table__term(pcc_auxil_t auxil, pcc_value_table_t *table) {
390
- PCC_FREE(auxil, table->buf);
350
+ static void packcr_value_table__term(packcr_auxil_t auxil, packcr_value_table_t *table) {
351
+ PACKCR_FREE(auxil, table->buf);
391
352
  }
392
353
 
393
- static void pcc_value_refer_table__init(pcc_auxil_t auxil, pcc_value_refer_table_t *table) {
354
+ static void packcr_value_refer_table__init(packcr_auxil_t auxil, packcr_value_refer_table_t *table) {
394
355
  table->len = 0;
395
356
  table->max = 0;
396
357
  table->buf = NULL;
397
358
  }
398
359
 
399
- static void pcc_value_refer_table__resize(pcc_auxil_t auxil, pcc_value_refer_table_t *table, size_t len) {
360
+ static void packcr_value_refer_table__resize(packcr_auxil_t auxil, packcr_value_refer_table_t *table, size_t len) {
400
361
  size_t i;
401
362
  if (table->max < len) {
402
363
  size_t m = table->max;
403
- if (m == 0) m = PCC_ARRAY_MIN_SIZE;
364
+ if (m == 0) m = PACKCR_ARRAY_MIN_SIZE;
404
365
  while (m < len && m != 0) m <<= 1;
405
366
  if (m == 0) m = len;
406
- table->buf = (pcc_value_t **)PCC_REALLOC(auxil, table->buf, sizeof(pcc_value_t *) * m);
367
+ table->buf = (packcr_value_t **)PACKCR_REALLOC(auxil, table->buf, sizeof(packcr_value_t *) * m);
407
368
  table->max = m;
408
369
  }
409
370
  for (i = table->len; i < len; i++) table->buf[i] = NULL;
410
371
  table->len = len;
411
372
  }
412
373
 
413
- static void pcc_value_refer_table__term(pcc_auxil_t auxil, pcc_value_refer_table_t *table) {
414
- PCC_FREE(auxil, table->buf);
374
+ static void packcr_value_refer_table__term(packcr_auxil_t auxil, packcr_value_refer_table_t *table) {
375
+ PACKCR_FREE(auxil, table->buf);
415
376
  }
416
377
 
417
- static void pcc_capture_table__init(pcc_auxil_t auxil, pcc_capture_table_t *table) {
378
+ static void packcr_capture_table__init(packcr_auxil_t auxil, packcr_capture_table_t *table) {
418
379
  table->len = 0;
419
380
  table->max = 0;
420
381
  table->buf = NULL;
421
382
  }
422
383
 
423
384
  MARK_FUNC_AS_USED
424
- static void pcc_capture_table__resize(pcc_auxil_t auxil, pcc_capture_table_t *table, size_t len) {
385
+ static void packcr_capture_table__resize(packcr_auxil_t auxil, packcr_capture_table_t *table, size_t len) {
425
386
  size_t i;
426
- for (i = len; i < table->len; i++) PCC_FREE(auxil, table->buf[i].string);
427
- <%- if @location -%>
428
- for (i = len; i < table->len; i++) {
429
- PCC_FREE(auxil, table->buf[i].range.start_loc_ptr);
430
- PCC_FREE(auxil, table->buf[i].range.end_loc_ptr);
431
- }
432
- <%- end -%>
387
+ for (i = len; i < table->len; i++) PACKCR_FREE(auxil, table->buf[i].string);
433
388
  if (table->max < len) {
434
389
  size_t m = table->max;
435
- if (m == 0) m = PCC_ARRAY_MIN_SIZE;
390
+ if (m == 0) m = PACKCR_ARRAY_MIN_SIZE;
436
391
  while (m < len && m != 0) m <<= 1;
437
392
  if (m == 0) m = len;
438
- table->buf = (pcc_capture_t *)PCC_REALLOC(auxil, table->buf, sizeof(pcc_capture_t) * m);
393
+ table->buf = (packcr_capture_t *)PACKCR_REALLOC(auxil, table->buf, sizeof(packcr_capture_t) * m);
439
394
  table->max = m;
440
395
  }
441
396
  for (i = table->len; i < len; i++) {
442
397
  table->buf[i].range.start = 0;
443
398
  table->buf[i].range.end = 0;
444
399
  <%- if @location -%>
445
- table->buf[i].range.start_loc_ptr = (pcc_location_t *)PCC_MALLOC(auxil, sizeof(pcc_location_t));
446
- table->buf[i].range.end_loc_ptr = (pcc_location_t *)PCC_MALLOC(auxil, sizeof(pcc_location_t));
447
- pcc_location_init(table->buf[i].range.start_loc_ptr);
448
- pcc_location_init(table->buf[i].range.end_loc_ptr);
400
+ packcr_location_init(&table->buf[i].range.start_loc);
401
+ packcr_location_init(&table->buf[i].range.end_loc);
449
402
  <%- end -%>
450
403
  table->buf[i].string = NULL;
451
404
  }
452
405
  table->len = len;
453
406
  }
454
407
 
455
- static void pcc_capture_table__term(pcc_auxil_t auxil, pcc_capture_table_t *table) {
408
+ static void packcr_capture_table__term(packcr_auxil_t auxil, packcr_capture_table_t *table) {
456
409
  while (table->len > 0) {
457
410
  table->len--;
458
- PCC_FREE(auxil, table->buf[table->len].string);
459
- <%- if @location -%>
460
- PCC_FREE(auxil, table->buf[table->len].range.start_loc_ptr);
461
- PCC_FREE(auxil, table->buf[table->len].range.end_loc_ptr);
462
- <%- end -%>
411
+ PACKCR_FREE(auxil, table->buf[table->len].string);
463
412
  }
464
- PCC_FREE(auxil, table->buf);
413
+ PACKCR_FREE(auxil, table->buf);
465
414
  }
466
415
 
467
- static void pcc_capture_const_table__init(pcc_auxil_t auxil, pcc_capture_const_table_t *table) {
416
+ static void packcr_capture_const_table__init(packcr_auxil_t auxil, packcr_capture_const_table_t *table) {
468
417
  table->len = 0;
469
418
  table->max = 0;
470
419
  table->buf = NULL;
471
420
  }
472
421
 
473
- static void pcc_capture_const_table__resize(pcc_auxil_t auxil, pcc_capture_const_table_t *table, size_t len) {
422
+ static void packcr_capture_const_table__resize(packcr_auxil_t auxil, packcr_capture_const_table_t *table, size_t len) {
474
423
  size_t i;
475
424
  if (table->max < len) {
476
425
  size_t m = table->max;
477
- if (m == 0) m = PCC_ARRAY_MIN_SIZE;
426
+ if (m == 0) m = PACKCR_ARRAY_MIN_SIZE;
478
427
  while (m < len && m != 0) m <<= 1;
479
428
  if (m == 0) m = len;
480
- table->buf = (const pcc_capture_t **)PCC_REALLOC(auxil, (pcc_capture_t **)table->buf, sizeof(const pcc_capture_t *) * m);
429
+ table->buf = (const packcr_capture_t **)PACKCR_REALLOC(auxil, (packcr_capture_t **)table->buf, sizeof(const packcr_capture_t *) * m);
481
430
  table->max = m;
482
431
  }
483
432
  for (i = table->len; i < len; i++) table->buf[i] = NULL;
484
433
  table->len = len;
485
434
  }
486
435
 
487
- static void pcc_capture_const_table__term(pcc_auxil_t auxil, pcc_capture_const_table_t *table) {
488
- PCC_FREE(auxil, (void *)table->buf);
436
+ static void packcr_capture_const_table__term(packcr_auxil_t auxil, packcr_capture_const_table_t *table) {
437
+ PACKCR_FREE(auxil, (void *)table->buf);
489
438
  }
490
439
 
491
440
  MARK_FUNC_AS_USED
492
- static pcc_thunk_t *pcc_thunk__create_leaf(pcc_auxil_t auxil, pcc_action_t action, size_t valuec, size_t captc) {
493
- pcc_thunk_t *const thunk = (pcc_thunk_t *)PCC_MALLOC(auxil, sizeof(pcc_thunk_t));
494
- thunk->type = PCC_THUNK_LEAF;
495
- pcc_value_refer_table__init(auxil, &thunk->data.leaf.values);
496
- pcc_value_refer_table__resize(auxil, &thunk->data.leaf.values, valuec);
497
- pcc_capture_const_table__init(auxil, &thunk->data.leaf.capts);
498
- pcc_capture_const_table__resize(auxil, &thunk->data.leaf.capts, captc);
441
+ static packcr_thunk_t *packcr_thunk__create_leaf(packcr_auxil_t auxil, packcr_action_t action, size_t valuec, size_t captc) {
442
+ packcr_thunk_t *const thunk = (packcr_thunk_t *)PACKCR_MALLOC(auxil, sizeof(packcr_thunk_t));
443
+ thunk->type = PACKCR_THUNK_LEAF;
444
+ packcr_value_refer_table__init(auxil, &thunk->data.leaf.values);
445
+ packcr_value_refer_table__resize(auxil, &thunk->data.leaf.values, valuec);
446
+ packcr_capture_const_table__init(auxil, &thunk->data.leaf.capts);
447
+ packcr_capture_const_table__resize(auxil, &thunk->data.leaf.capts, captc);
499
448
  thunk->data.leaf.capt0.range.start = 0;
500
449
  thunk->data.leaf.capt0.range.end = 0;
450
+ <%- if @location -%>
451
+ packcr_location_init(&thunk->data.leaf.capt0.range.start_loc);
452
+ packcr_location_init(&thunk->data.leaf.capt0.range.end_loc);
453
+ <%- end -%>
501
454
  thunk->data.leaf.capt0.string = NULL;
502
455
  thunk->data.leaf.action = action;
503
456
  return thunk;
504
457
  }
505
458
 
506
- static pcc_thunk_t *pcc_thunk__create_node(pcc_auxil_t auxil, const pcc_thunk_array_t *thunks, pcc_value_t *value) {
507
- pcc_thunk_t *const thunk = (pcc_thunk_t *)PCC_MALLOC(auxil, sizeof(pcc_thunk_t));
508
- thunk->type = PCC_THUNK_NODE;
459
+ static packcr_thunk_t *packcr_thunk__create_node(packcr_auxil_t auxil, const packcr_thunk_array_t *thunks, packcr_value_t *value) {
460
+ packcr_thunk_t *const thunk = (packcr_thunk_t *)PACKCR_MALLOC(auxil, sizeof(packcr_thunk_t));
461
+ thunk->type = PACKCR_THUNK_NODE;
509
462
  thunk->data.node.thunks = thunks;
510
463
  thunk->data.node.value = value;
511
464
  return thunk;
512
465
  }
513
466
 
514
- static void pcc_thunk__destroy(pcc_auxil_t auxil, pcc_thunk_t *thunk) {
467
+ static void packcr_thunk__destroy(packcr_auxil_t auxil, packcr_thunk_t *thunk) {
515
468
  if (thunk == NULL) return;
516
469
  switch (thunk->type) {
517
- case PCC_THUNK_LEAF:
518
- PCC_FREE(auxil, thunk->data.leaf.capt0.string);
519
- pcc_capture_const_table__term(auxil, &thunk->data.leaf.capts);
520
- pcc_value_refer_table__term(auxil, &thunk->data.leaf.values);
470
+ case PACKCR_THUNK_LEAF:
471
+ PACKCR_FREE(auxil, thunk->data.leaf.capt0.string);
472
+ packcr_capture_const_table__term(auxil, &thunk->data.leaf.capts);
473
+ packcr_value_refer_table__term(auxil, &thunk->data.leaf.values);
521
474
  break;
522
- case PCC_THUNK_NODE:
475
+ case PACKCR_THUNK_NODE:
523
476
  break;
524
477
  default: /* unknown */
525
478
  break;
526
479
  }
527
- PCC_FREE(auxil, thunk);
480
+ PACKCR_FREE(auxil, thunk);
528
481
  }
529
482
 
530
- static void pcc_thunk_array__init(pcc_auxil_t auxil, pcc_thunk_array_t *array) {
483
+ static void packcr_thunk_array__init(packcr_auxil_t auxil, packcr_thunk_array_t *array) {
531
484
  array->len = 0;
532
485
  array->max = 0;
533
486
  array->buf = NULL;
534
487
  }
535
488
 
536
- static void pcc_thunk_array__add(pcc_auxil_t auxil, pcc_thunk_array_t *array, pcc_thunk_t *thunk) {
489
+ static void packcr_thunk_array__add(packcr_auxil_t auxil, packcr_thunk_array_t *array, packcr_thunk_t *thunk) {
537
490
  if (array->max <= array->len) {
538
491
  const size_t n = array->len + 1;
539
492
  size_t m = array->max;
540
- if (m == 0) m = PCC_ARRAY_MIN_SIZE;
493
+ if (m == 0) m = PACKCR_ARRAY_MIN_SIZE;
541
494
  while (m < n && m != 0) m <<= 1;
542
495
  if (m == 0) m = n;
543
- array->buf = (pcc_thunk_t **)PCC_REALLOC(auxil, array->buf, sizeof(pcc_thunk_t *) * m);
496
+ array->buf = (packcr_thunk_t **)PACKCR_REALLOC(auxil, array->buf, sizeof(packcr_thunk_t *) * m);
544
497
  array->max = m;
545
498
  }
546
499
  array->buf[array->len++] = thunk;
547
500
  }
548
501
 
549
- static void pcc_thunk_array__revert(pcc_auxil_t auxil, pcc_thunk_array_t *array, size_t len) {
502
+ static void packcr_thunk_array__revert(packcr_auxil_t auxil, packcr_thunk_array_t *array, size_t len) {
550
503
  while (array->len > len) {
551
504
  array->len--;
552
- pcc_thunk__destroy(auxil, array->buf[array->len]);
505
+ packcr_thunk__destroy(auxil, array->buf[array->len]);
553
506
  }
554
507
  }
555
508
 
556
- static void pcc_thunk_array__term(pcc_auxil_t auxil, pcc_thunk_array_t *array) {
509
+ static void packcr_thunk_array__term(packcr_auxil_t auxil, packcr_thunk_array_t *array) {
557
510
  while (array->len > 0) {
558
511
  array->len--;
559
- pcc_thunk__destroy(auxil, array->buf[array->len]);
512
+ packcr_thunk__destroy(auxil, array->buf[array->len]);
560
513
  }
561
- PCC_FREE(auxil, array->buf);
514
+ PACKCR_FREE(auxil, array->buf);
562
515
  }
563
516
 
564
- static void pcc_memory_recycler__init(pcc_auxil_t auxil, pcc_memory_recycler_t *recycler, size_t element_size) {
517
+ static void packcr_memory_recycler__init(packcr_auxil_t auxil, packcr_memory_recycler_t *recycler, size_t element_size) {
565
518
  recycler->pool_list = NULL;
566
519
  recycler->entry_list = NULL;
567
520
  recycler->element_size = element_size;
568
521
  }
569
522
 
570
- static void *pcc_memory_recycler__supply(pcc_auxil_t auxil, pcc_memory_recycler_t *recycler) {
523
+ static void *packcr_memory_recycler__supply(packcr_auxil_t auxil, packcr_memory_recycler_t *recycler) {
571
524
  if (recycler->entry_list) {
572
- pcc_memory_entry_t *const tmp = recycler->entry_list;
525
+ packcr_memory_entry_t *const tmp = recycler->entry_list;
573
526
  recycler->entry_list = tmp->next;
574
527
  return tmp;
575
528
  }
576
529
  if (!recycler->pool_list || recycler->pool_list->unused == 0) {
577
- size_t size = PCC_POOL_MIN_SIZE;
530
+ size_t size = PACKCR_POOL_MIN_SIZE;
578
531
  if (recycler->pool_list) {
579
532
  size = recycler->pool_list->allocated << 1;
580
533
  if (size == 0) size = recycler->pool_list->allocated;
581
534
  }
582
535
  {
583
- pcc_memory_pool_t *const pool = (pcc_memory_pool_t *)PCC_MALLOC(
584
- auxil, sizeof(pcc_memory_pool_t) + recycler->element_size * size
536
+ packcr_memory_pool_t *const pool = (packcr_memory_pool_t *)PACKCR_MALLOC(
537
+ auxil, sizeof(packcr_memory_pool_t) + recycler->element_size * size
585
538
  );
586
539
  pool->allocated = size;
587
540
  pool->unused = size;
@@ -590,464 +543,324 @@ static void *pcc_memory_recycler__supply(pcc_auxil_t auxil, pcc_memory_recycler_
590
543
  }
591
544
  }
592
545
  recycler->pool_list->unused--;
593
- return (char *)recycler->pool_list + sizeof(pcc_memory_pool_t) + recycler->element_size * recycler->pool_list->unused;
546
+ return (char *)recycler->pool_list + sizeof(packcr_memory_pool_t) + recycler->element_size * recycler->pool_list->unused;
594
547
  }
595
548
 
596
- static void pcc_memory_recycler__recycle(pcc_auxil_t auxil, pcc_memory_recycler_t *recycler, void *ptr) {
597
- pcc_memory_entry_t *const tmp = (pcc_memory_entry_t *)ptr;
549
+ static void packcr_memory_recycler__recycle(packcr_auxil_t auxil, packcr_memory_recycler_t *recycler, void *ptr) {
550
+ packcr_memory_entry_t *const tmp = (packcr_memory_entry_t *)ptr;
598
551
  tmp->next = recycler->entry_list;
599
552
  recycler->entry_list = tmp;
600
553
  }
601
554
 
602
- static void pcc_memory_recycler__term(pcc_auxil_t auxil, pcc_memory_recycler_t *recycler) {
555
+ static void packcr_memory_recycler__term(packcr_auxil_t auxil, packcr_memory_recycler_t *recycler) {
603
556
  while (recycler->pool_list) {
604
- pcc_memory_pool_t *const tmp = recycler->pool_list;
557
+ packcr_memory_pool_t *const tmp = recycler->pool_list;
605
558
  recycler->pool_list = tmp->next;
606
- PCC_FREE(auxil, tmp);
559
+ PACKCR_FREE(auxil, tmp);
607
560
  }
608
561
  }
609
562
 
610
563
  MARK_FUNC_AS_USED
611
- static pcc_thunk_chunk_t *pcc_thunk_chunk__create(pcc_context_t *ctx) {
612
- pcc_thunk_chunk_t *const chunk = (pcc_thunk_chunk_t *)pcc_memory_recycler__supply(ctx->auxil, &ctx->thunk_chunk_recycler);
613
- pcc_value_table__init(ctx->auxil, &chunk->values);
614
- pcc_capture_table__init(ctx->auxil, &chunk->capts);
615
- pcc_thunk_array__init(ctx->auxil, &chunk->thunks);
564
+ static packcr_thunk_chunk_t *packcr_thunk_chunk__create(packcr_context_t *ctx) {
565
+ packcr_thunk_chunk_t *const chunk = (packcr_thunk_chunk_t *)packcr_memory_recycler__supply(ctx->auxil, &ctx->thunk_chunk_recycler);
566
+ packcr_value_table__init(ctx->auxil, &chunk->values);
567
+ packcr_capture_table__init(ctx->auxil, &chunk->capts);
568
+ packcr_thunk_array__init(ctx->auxil, &chunk->thunks);
616
569
  chunk->pos = 0;
617
570
  return chunk;
618
571
  }
619
572
 
620
- static void pcc_thunk_chunk__destroy(pcc_context_t *ctx, pcc_thunk_chunk_t *chunk) {
573
+ static void packcr_thunk_chunk__destroy(packcr_context_t *ctx, packcr_thunk_chunk_t *chunk) {
621
574
  if (chunk == NULL) return;
622
- pcc_thunk_array__term(ctx->auxil, &chunk->thunks);
623
- pcc_capture_table__term(ctx->auxil, &chunk->capts);
624
- pcc_value_table__term(ctx->auxil, &chunk->values);
625
- pcc_memory_recycler__recycle(ctx->auxil, &ctx->thunk_chunk_recycler, chunk);
575
+ packcr_thunk_array__term(ctx->auxil, &chunk->thunks);
576
+ packcr_capture_table__term(ctx->auxil, &chunk->capts);
577
+ packcr_value_table__term(ctx->auxil, &chunk->values);
578
+ packcr_memory_recycler__recycle(ctx->auxil, &ctx->thunk_chunk_recycler, chunk);
626
579
  }
627
580
 
628
- static void pcc_rule_set__init(pcc_auxil_t auxil, pcc_rule_set_t *set) {
581
+ static void packcr_rule_set__init(packcr_auxil_t auxil, packcr_rule_set_t *set) {
629
582
  set->len = 0;
630
583
  set->max = 0;
631
584
  set->buf = NULL;
632
585
  }
633
586
 
634
- static size_t pcc_rule_set__index(pcc_auxil_t auxil, const pcc_rule_set_t *set, pcc_rule_t rule) {
587
+ static size_t packcr_rule_set__index(packcr_auxil_t auxil, const packcr_rule_set_t *set, packcr_rule_t rule) {
635
588
  size_t i;
636
589
  for (i = 0; i < set->len; i++) {
637
590
  if (set->buf[i] == rule) return i;
638
591
  }
639
- return PCC_VOID_VALUE;
592
+ return PACKCR_VOID_VALUE;
640
593
  }
641
594
 
642
- static pcc_bool_t pcc_rule_set__add(pcc_auxil_t auxil, pcc_rule_set_t *set, pcc_rule_t rule) {
643
- const size_t i = pcc_rule_set__index(auxil, set, rule);
644
- if (i != PCC_VOID_VALUE) return PCC_FALSE;
595
+ static packcr_bool_t packcr_rule_set__add(packcr_auxil_t auxil, packcr_rule_set_t *set, packcr_rule_t rule) {
596
+ const size_t i = packcr_rule_set__index(auxil, set, rule);
597
+ if (i != PACKCR_VOID_VALUE) return PACKCR_FALSE;
645
598
  if (set->max <= set->len) {
646
599
  const size_t n = set->len + 1;
647
600
  size_t m = set->max;
648
- if (m == 0) m = PCC_ARRAY_MIN_SIZE;
601
+ if (m == 0) m = PACKCR_ARRAY_MIN_SIZE;
649
602
  while (m < n && m != 0) m <<= 1;
650
603
  if (m == 0) m = n;
651
- set->buf = (pcc_rule_t *)PCC_REALLOC(auxil, set->buf, sizeof(pcc_rule_t) * m);
604
+ set->buf = (packcr_rule_t *)PACKCR_REALLOC(auxil, set->buf, sizeof(packcr_rule_t) * m);
652
605
  set->max = m;
653
606
  }
654
607
  set->buf[set->len++] = rule;
655
- return PCC_TRUE;
656
- }
657
-
658
- static pcc_bool_t pcc_rule_set__remove(pcc_auxil_t auxil, pcc_rule_set_t *set, pcc_rule_t rule) {
659
- const size_t i = pcc_rule_set__index(auxil, set, rule);
660
- if (i == PCC_VOID_VALUE) return PCC_FALSE;
661
- memmove(set->buf + i, set->buf + (i + 1), sizeof(pcc_rule_t) * (set->len - (i + 1)));
662
- return PCC_TRUE;
608
+ return PACKCR_TRUE;
663
609
  }
664
610
 
665
- static void pcc_rule_set__clear(pcc_auxil_t auxil, pcc_rule_set_t *set) {
666
- set->len = 0;
611
+ static void packcr_rule_set__term(packcr_auxil_t auxil, packcr_rule_set_t *set) {
612
+ PACKCR_FREE(auxil, set->buf);
667
613
  }
668
614
 
669
- static void pcc_rule_set__copy(pcc_auxil_t auxil, pcc_rule_set_t *set, const pcc_rule_set_t *src) {
670
- size_t i;
671
- pcc_rule_set__clear(auxil, set);
672
- for (i = 0; i < src->len; i++) {
673
- pcc_rule_set__add(auxil, set, src->buf[i]);
674
- }
675
- }
676
-
677
- static void pcc_rule_set__term(pcc_auxil_t auxil, pcc_rule_set_t *set) {
678
- PCC_FREE(auxil, set->buf);
679
- }
680
-
681
- static pcc_lr_head_t *pcc_lr_head__create(pcc_context_t *ctx, pcc_rule_t rule) {
682
- pcc_lr_head_t *const head = (pcc_lr_head_t *)pcc_memory_recycler__supply(ctx->auxil, &ctx->lr_head_recycler);
683
- head->rule = rule;
684
- pcc_rule_set__init(ctx->auxil, &head->invol);
685
- pcc_rule_set__init(ctx->auxil, &head->eval);
686
- head->hold = NULL;
687
- return head;
688
- }
689
-
690
- static void pcc_lr_head__destroy(pcc_context_t *ctx, pcc_lr_head_t *head) {
691
- if (head == NULL) return;
692
- pcc_lr_head__destroy(ctx, head->hold);
693
- pcc_rule_set__term(ctx->auxil, &head->eval);
694
- pcc_rule_set__term(ctx->auxil, &head->invol);
695
- pcc_memory_recycler__recycle(ctx->auxil, &ctx->lr_head_recycler, head);
696
- }
697
-
698
- static void pcc_lr_entry__destroy(pcc_auxil_t auxil, pcc_lr_entry_t *lr);
699
-
700
- static pcc_lr_answer_t *pcc_lr_answer__create(pcc_context_t *ctx, pcc_lr_answer_type_t type, size_t pos<% if @location %>, pcc_location_t pos_loc<% end %>) {
701
- pcc_lr_answer_t *answer = (pcc_lr_answer_t *)pcc_memory_recycler__supply(ctx->auxil, &ctx->lr_answer_recycler);
702
- answer->type = type;
703
- answer->pos = pos;
615
+ static packcr_lr_memo_t *packcr_lr_memo__create(packcr_context_t *ctx, size_t offset<% if @location %>, packcr_location_t offset_loc<% end %>) {
616
+ packcr_lr_memo_t *memo = (packcr_lr_memo_t *)packcr_memory_recycler__supply(ctx->auxil, &ctx->lr_memo_recycler);
617
+ memo->offset = offset;
704
618
  <%- if @location -%>
705
- answer->pos_loc = pos_loc;
619
+ memo->offset_loc = offset_loc;
706
620
  <%- end -%>
707
- answer->hold = NULL;
708
- switch (answer->type) {
709
- case PCC_LR_ANSWER_LR:
710
- answer->data.lr = NULL;
711
- break;
712
- case PCC_LR_ANSWER_CHUNK:
713
- answer->data.chunk = NULL;
714
- break;
715
- default: /* unknown */
716
- PCC_FREE(ctx->auxil, answer);
717
- answer = NULL;
621
+ memo->chunk = NULL;
622
+ memo->fail = PACKCR_TRUE;
623
+ memo->grow = PACKCR_FALSE;
624
+ memo->hold = NULL;
625
+ return memo;
626
+ }
627
+
628
+ static void packcr_lr_memo__set_chunk(packcr_context_t *ctx, packcr_lr_memo_t *memo, packcr_thunk_chunk_t *chunk) {
629
+ if (memo->chunk) {
630
+ packcr_lr_memo_t *const new_hold_memo = packcr_lr_memo__create(ctx, memo->offset<% if @location %>, memo->offset_loc<% end %>);
631
+ new_hold_memo->chunk = memo->chunk;
632
+ new_hold_memo->hold = memo->hold;
633
+ memo->hold = new_hold_memo;
718
634
  }
719
- return answer;
635
+ memo->chunk = chunk;
636
+ memo->fail = PACKCR_FALSE;
720
637
  }
721
638
 
722
- static void pcc_lr_answer__set_chunk(pcc_context_t *ctx, pcc_lr_answer_t *answer, pcc_thunk_chunk_t *chunk) {
723
- pcc_lr_answer_t *const a = pcc_lr_answer__create(ctx, answer->type, answer->pos<% if @location %>, answer->pos_loc<% end %>);
724
- switch (answer->type) {
725
- case PCC_LR_ANSWER_LR:
726
- a->data.lr = answer->data.lr;
727
- break;
728
- case PCC_LR_ANSWER_CHUNK:
729
- a->data.chunk = answer->data.chunk;
730
- break;
731
- default: /* unknown */
732
- break;
733
- }
734
- a->hold = answer->hold;
735
- answer->hold = a;
736
- answer->type = PCC_LR_ANSWER_CHUNK;
737
- answer->data.chunk = chunk;
738
- }
739
-
740
- static void pcc_lr_answer__destroy(pcc_context_t *ctx, pcc_lr_answer_t *answer) {
741
- while (answer != NULL) {
742
- pcc_lr_answer_t *const a = answer->hold;
743
- switch (answer->type) {
744
- case PCC_LR_ANSWER_LR:
745
- pcc_lr_entry__destroy(ctx->auxil, answer->data.lr);
746
- break;
747
- case PCC_LR_ANSWER_CHUNK:
748
- pcc_thunk_chunk__destroy(ctx, answer->data.chunk);
749
- break;
750
- default: /* unknown */
751
- break;
752
- }
753
- pcc_memory_recycler__recycle(ctx->auxil, &ctx->lr_answer_recycler, answer);
754
- answer = a;
639
+ static void packcr_lr_memo__destroy(packcr_context_t *ctx, packcr_lr_memo_t *memo) {
640
+ while (memo != NULL) {
641
+ packcr_lr_memo_t *const hold_memo = memo->hold;
642
+ packcr_thunk_chunk__destroy(ctx, memo->chunk);
643
+ packcr_memory_recycler__recycle(ctx->auxil, &ctx->lr_memo_recycler, memo);
644
+ memo = hold_memo;
755
645
  }
756
646
  }
757
647
 
758
- static void pcc_lr_memo_map__init(pcc_auxil_t auxil, pcc_lr_memo_map_t *map) {
648
+ static void packcr_lr_memo_map__init(packcr_auxil_t auxil, packcr_lr_memo_map_t *map) {
759
649
  map->len = 0;
760
650
  map->max = 0;
761
651
  map->buf = NULL;
762
652
  }
763
653
 
764
- static size_t pcc_lr_memo_map__index(pcc_context_t *ctx, pcc_lr_memo_map_t *map, pcc_rule_t rule) {
654
+ static size_t packcr_lr_memo_map__index(packcr_context_t *ctx, packcr_lr_memo_map_t *map, packcr_rule_t rule) {
765
655
  size_t i;
766
656
  for (i = 0; i < map->len; i++) {
767
657
  if (map->buf[i].rule == rule) return i;
768
658
  }
769
- return PCC_VOID_VALUE;
659
+ return PACKCR_VOID_VALUE;
770
660
  }
771
661
 
772
- static void pcc_lr_memo_map__put(pcc_context_t *ctx, pcc_lr_memo_map_t *map, pcc_rule_t rule, pcc_lr_answer_t *answer) {
773
- const size_t i = pcc_lr_memo_map__index(ctx, map, rule);
774
- if (i != PCC_VOID_VALUE) {
775
- pcc_lr_answer__destroy(ctx, map->buf[i].answer);
776
- map->buf[i].answer = answer;
662
+ static void packcr_lr_memo_map__put(packcr_context_t *ctx, packcr_lr_memo_map_t *map, packcr_rule_t rule, packcr_lr_memo_t *memo) {
663
+ const size_t i = packcr_lr_memo_map__index(ctx, map, rule);
664
+ if (i != PACKCR_VOID_VALUE) {
665
+ packcr_lr_memo__destroy(ctx, map->buf[i].memo);
666
+ map->buf[i].memo = memo;
777
667
  }
778
668
  else {
779
669
  if (map->max <= map->len) {
780
670
  const size_t n = map->len + 1;
781
671
  size_t m = map->max;
782
- if (m == 0) m = PCC_ARRAY_MIN_SIZE;
672
+ if (m == 0) m = PACKCR_ARRAY_MIN_SIZE;
783
673
  while (m < n && m != 0) m <<= 1;
784
674
  if (m == 0) m = n;
785
- map->buf = (pcc_lr_memo_t *)PCC_REALLOC(ctx->auxil, map->buf, sizeof(pcc_lr_memo_t) * m);
675
+ map->buf = (packcr_lr_memo_map_entry_t *)PACKCR_REALLOC(ctx->auxil, map->buf, sizeof(packcr_lr_memo_map_entry_t) * m);
786
676
  map->max = m;
787
677
  }
788
678
  map->buf[map->len].rule = rule;
789
- map->buf[map->len].answer = answer;
679
+ map->buf[map->len].memo = memo;
790
680
  map->len++;
791
681
  }
792
682
  }
793
683
 
794
- static pcc_lr_answer_t *pcc_lr_memo_map__get(pcc_context_t *ctx, pcc_lr_memo_map_t *map, pcc_rule_t rule) {
795
- const size_t i = pcc_lr_memo_map__index(ctx, map, rule);
796
- return (i != PCC_VOID_VALUE) ? map->buf[i].answer : NULL;
684
+ static packcr_lr_memo_t *packcr_lr_memo_map__get(packcr_context_t *ctx, packcr_lr_memo_map_t *map, packcr_rule_t rule) {
685
+ const size_t i = packcr_lr_memo_map__index(ctx, map, rule);
686
+ return (i != PACKCR_VOID_VALUE) ? map->buf[i].memo : NULL;
797
687
  }
798
688
 
799
- static void pcc_lr_memo_map__term(pcc_context_t *ctx, pcc_lr_memo_map_t *map) {
689
+ static void packcr_lr_memo_map__term(packcr_context_t *ctx, packcr_lr_memo_map_t *map) {
800
690
  while (map->len > 0) {
801
691
  map->len--;
802
- pcc_lr_answer__destroy(ctx, map->buf[map->len].answer);
692
+ packcr_lr_memo__destroy(ctx, map->buf[map->len].memo);
803
693
  }
804
- PCC_FREE(ctx->auxil, map->buf);
694
+ PACKCR_FREE(ctx->auxil, map->buf);
805
695
  }
806
696
 
807
- static pcc_lr_table_entry_t *pcc_lr_table_entry__create(pcc_context_t *ctx) {
808
- pcc_lr_table_entry_t *const entry = (pcc_lr_table_entry_t *)PCC_MALLOC(ctx->auxil, sizeof(pcc_lr_table_entry_t));
809
- entry->head = NULL;
810
- pcc_lr_memo_map__init(ctx->auxil, &entry->memos);
811
- entry->hold_a = NULL;
812
- entry->hold_h = NULL;
813
- return entry;
697
+ static packcr_lr_memo_map_t *packcr_lr_memo_map__create(packcr_context_t *ctx) {
698
+ packcr_lr_memo_map_t *const memo = (packcr_lr_memo_map_t *)PACKCR_MALLOC(ctx->auxil, sizeof(packcr_lr_memo_map_t));
699
+ packcr_lr_memo_map__init(ctx->auxil, memo);
700
+ return memo;
814
701
  }
815
702
 
816
- static void pcc_lr_table_entry__destroy(pcc_context_t *ctx, pcc_lr_table_entry_t *entry) {
817
- if (entry == NULL) return;
818
- pcc_lr_head__destroy(ctx, entry->hold_h);
819
- pcc_lr_answer__destroy(ctx, entry->hold_a);
820
- pcc_lr_memo_map__term(ctx, &entry->memos);
821
- PCC_FREE(ctx->auxil, entry);
703
+ static void packcr_lr_memo_map__destroy(packcr_context_t *ctx, packcr_lr_memo_map_t *memo) {
704
+ if (memo == NULL) return;
705
+ packcr_lr_memo_map__term(ctx, memo);
706
+ PACKCR_FREE(ctx->auxil, memo);
822
707
  }
823
708
 
824
- static void pcc_lr_table__init(pcc_auxil_t auxil, pcc_lr_table_t *table) {
709
+ static void packcr_lr_table__init(packcr_auxil_t auxil, packcr_lr_table_t *table) {
825
710
  table->ofs = 0;
826
711
  table->len = 0;
827
712
  table->max = 0;
828
713
  table->buf = NULL;
829
714
  }
830
715
 
831
- static void pcc_lr_table__resize(pcc_context_t *ctx, pcc_lr_table_t *table, size_t len) {
716
+ static void packcr_lr_table__resize(packcr_context_t *ctx, packcr_lr_table_t *table, size_t len) {
832
717
  size_t i;
833
- for (i = len; i < table->len; i++) pcc_lr_table_entry__destroy(ctx, table->buf[i]);
718
+ for (i = len; i < table->len; i++) packcr_lr_memo_map__destroy(ctx, table->buf[i]);
834
719
  if (table->max < len) {
835
720
  size_t m = table->max;
836
- if (m == 0) m = PCC_ARRAY_MIN_SIZE;
721
+ if (m == 0) m = PACKCR_ARRAY_MIN_SIZE;
837
722
  while (m < len && m != 0) m <<= 1;
838
723
  if (m == 0) m = len;
839
- table->buf = (pcc_lr_table_entry_t **)PCC_REALLOC(ctx->auxil, table->buf, sizeof(pcc_lr_table_entry_t *) * m);
724
+ table->buf = (packcr_lr_memo_map_t **)PACKCR_REALLOC(ctx->auxil, table->buf, sizeof(packcr_lr_memo_map_t *) * m);
840
725
  table->max = m;
841
726
  }
842
727
  for (i = table->len; i < len; i++) table->buf[i] = NULL;
843
728
  table->len = len;
844
729
  }
845
730
 
846
- static void pcc_lr_table__set_head(pcc_context_t *ctx, pcc_lr_table_t *table, size_t index, pcc_lr_head_t *head) {
731
+ static void packcr_lr_table__set_memo(packcr_context_t *ctx, packcr_lr_table_t *table, size_t index, packcr_rule_t rule, packcr_lr_memo_t *memo) {
847
732
  index += table->ofs;
848
- if (index >= table->len) pcc_lr_table__resize(ctx, table, index + 1);
849
- if (table->buf[index] == NULL) table->buf[index] = pcc_lr_table_entry__create(ctx);
850
- table->buf[index]->head = head;
733
+ if (index >= table->len) packcr_lr_table__resize(ctx, table, index + 1);
734
+ if (table->buf[index] == NULL) table->buf[index] = packcr_lr_memo_map__create(ctx);
735
+ packcr_lr_memo_map__put(ctx, table->buf[index], rule, memo);
851
736
  }
852
737
 
853
- static void pcc_lr_table__hold_head(pcc_context_t *ctx, pcc_lr_table_t *table, size_t index, pcc_lr_head_t *head) {
854
- index += table->ofs;
855
- if (index >= table->len) pcc_lr_table__resize(ctx, table, index + 1);
856
- if (table->buf[index] == NULL) table->buf[index] = pcc_lr_table_entry__create(ctx);
857
- head->hold = table->buf[index]->hold_h;
858
- table->buf[index]->hold_h = head;
859
- }
860
-
861
- static void pcc_lr_table__set_answer(pcc_context_t *ctx, pcc_lr_table_t *table, size_t index, pcc_rule_t rule, pcc_lr_answer_t *answer) {
862
- index += table->ofs;
863
- if (index >= table->len) pcc_lr_table__resize(ctx, table, index + 1);
864
- if (table->buf[index] == NULL) table->buf[index] = pcc_lr_table_entry__create(ctx);
865
- pcc_lr_memo_map__put(ctx, &table->buf[index]->memos, rule, answer);
866
- }
867
-
868
- static void pcc_lr_table__hold_answer(pcc_context_t *ctx, pcc_lr_table_t *table, size_t index, pcc_lr_answer_t *answer) {
869
- index += table->ofs;
870
- if (index >= table->len) pcc_lr_table__resize(ctx, table, index + 1);
871
- if (table->buf[index] == NULL) table->buf[index] = pcc_lr_table_entry__create(ctx);
872
- answer->hold = table->buf[index]->hold_a;
873
- table->buf[index]->hold_a = answer;
874
- }
875
-
876
- static pcc_lr_head_t *pcc_lr_table__get_head(pcc_context_t *ctx, pcc_lr_table_t *table, size_t index) {
877
- index += table->ofs;
878
- if (index >= table->len || table->buf[index] == NULL) return NULL;
879
- return table->buf[index]->head;
880
- }
881
-
882
- static pcc_lr_answer_t *pcc_lr_table__get_answer(pcc_context_t *ctx, pcc_lr_table_t *table, size_t index, pcc_rule_t rule) {
738
+ static packcr_lr_memo_t *packcr_lr_table__get_memo(packcr_context_t *ctx, packcr_lr_table_t *table, size_t index, packcr_rule_t rule) {
883
739
  index += table->ofs;
884
740
  if (index >= table->len || table->buf[index] == NULL) return NULL;
885
- return pcc_lr_memo_map__get(ctx, &table->buf[index]->memos, rule);
741
+ return packcr_lr_memo_map__get(ctx, table->buf[index], rule);
886
742
  }
887
743
 
888
- static void pcc_lr_table__shift(pcc_context_t *ctx, pcc_lr_table_t *table, size_t count) {
744
+ static void packcr_lr_table__shift(packcr_context_t *ctx, packcr_lr_table_t *table, size_t count) {
889
745
  size_t i;
890
746
  if (count > table->len - table->ofs) count = table->len - table->ofs;
891
- for (i = 0; i < count; i++) pcc_lr_table_entry__destroy(ctx, table->buf[table->ofs++]);
747
+ for (i = 0; i < count; i++) packcr_lr_memo_map__destroy(ctx, table->buf[table->ofs++]);
892
748
  if (table->ofs > (table->max >> 1)) {
893
- memmove(table->buf, table->buf + table->ofs, sizeof(pcc_lr_table_entry_t *) * (table->len - table->ofs));
749
+ memmove(table->buf, table->buf + table->ofs, sizeof(packcr_lr_memo_map_t *) * (table->len - table->ofs));
894
750
  table->len -= table->ofs;
895
751
  table->ofs = 0;
896
752
  }
897
753
  }
898
754
 
899
- static void pcc_lr_table__term(pcc_context_t *ctx, pcc_lr_table_t *table) {
755
+ static void packcr_lr_table__term(packcr_context_t *ctx, packcr_lr_table_t *table) {
900
756
  while (table->len > table->ofs) {
901
757
  table->len--;
902
- pcc_lr_table_entry__destroy(ctx, table->buf[table->len]);
903
- }
904
- PCC_FREE(ctx->auxil, table->buf);
905
- }
906
-
907
- static pcc_lr_entry_t *pcc_lr_entry__create(pcc_auxil_t auxil, pcc_rule_t rule) {
908
- pcc_lr_entry_t *const lr = (pcc_lr_entry_t *)PCC_MALLOC(auxil, sizeof(pcc_lr_entry_t));
909
- lr->rule = rule;
910
- lr->seed = NULL;
911
- lr->head = NULL;
912
- return lr;
913
- }
914
-
915
- static void pcc_lr_entry__destroy(pcc_auxil_t auxil, pcc_lr_entry_t *lr) {
916
- PCC_FREE(auxil, lr);
917
- }
918
-
919
- static void pcc_lr_stack__init(pcc_auxil_t auxil, pcc_lr_stack_t *stack) {
920
- stack->len = 0;
921
- stack->max = 0;
922
- stack->buf = NULL;
923
- }
924
-
925
- static void pcc_lr_stack__push(pcc_auxil_t auxil, pcc_lr_stack_t *stack, pcc_lr_entry_t *lr) {
926
- if (stack->max <= stack->len) {
927
- const size_t n = stack->len + 1;
928
- size_t m = stack->max;
929
- if (m == 0) m = PCC_ARRAY_MIN_SIZE;
930
- while (m < n && m != 0) m <<= 1;
931
- if (m == 0) m = n;
932
- stack->buf = (pcc_lr_entry_t **)PCC_REALLOC(auxil, stack->buf, sizeof(pcc_lr_entry_t *) * m);
933
- stack->max = m;
758
+ packcr_lr_memo_map__destroy(ctx, table->buf[table->len]);
934
759
  }
935
- stack->buf[stack->len++] = lr;
760
+ PACKCR_FREE(ctx->auxil, table->buf);
936
761
  }
937
762
 
938
- static pcc_lr_entry_t *pcc_lr_stack__pop(pcc_auxil_t auxil, pcc_lr_stack_t *stack) {
939
- return stack->buf[--stack->len];
940
- }
941
-
942
- static void pcc_lr_stack__term(pcc_auxil_t auxil, pcc_lr_stack_t *stack) {
943
- PCC_FREE(auxil, stack->buf);
944
- }
945
-
946
- static pcc_context_t *pcc_context__create(pcc_auxil_t auxil) {
947
- pcc_context_t *const ctx = (pcc_context_t *)PCC_MALLOC(auxil, sizeof(pcc_context_t));
948
- ctx->pos = 0;
949
- ctx->cur = 0;
763
+ static packcr_context_t *packcr_context__create(packcr_auxil_t auxil) {
764
+ packcr_context_t *const ctx = (packcr_context_t *)PACKCR_MALLOC(auxil, sizeof(packcr_context_t));
765
+ ctx->buffer_start_position = 0;
766
+ ctx->position_offset = 0;
950
767
  <%- if @location -%>
951
- pcc_location_init(&ctx->pos_loc);
952
- pcc_location_init(&ctx->cur_loc);
768
+ packcr_location_init(&ctx->buffer_start_position_loc);
769
+ packcr_location_init(&ctx->position_offset_loc);
953
770
  <%- end -%>
954
771
  ctx->level = 0;
955
- pcc_char_array__init(auxil, &ctx->buffer);
956
- pcc_lr_table__init(auxil, &ctx->lrtable);
957
- pcc_lr_stack__init(auxil, &ctx->lrstack);
958
- pcc_thunk_array__init(auxil, &ctx->thunks);
959
- pcc_memory_recycler__init(auxil, &ctx->thunk_chunk_recycler, sizeof(pcc_thunk_chunk_t));
960
- pcc_memory_recycler__init(auxil, &ctx->lr_head_recycler, sizeof(pcc_lr_head_t));
961
- pcc_memory_recycler__init(auxil, &ctx->lr_answer_recycler, sizeof(pcc_lr_answer_t));
772
+ packcr_char_array__init(auxil, &ctx->buffer);
773
+ packcr_lr_table__init(auxil, &ctx->lrtable);
774
+ packcr_thunk_array__init(auxil, &ctx->thunks);
775
+ packcr_memory_recycler__init(auxil, &ctx->thunk_chunk_recycler, sizeof(packcr_thunk_chunk_t));
776
+ packcr_memory_recycler__init(auxil, &ctx->lr_memo_recycler, sizeof(packcr_lr_memo_t));
962
777
  ctx->auxil = auxil;
963
778
  return ctx;
964
779
  }
965
780
 
966
- static void pcc_context__destroy(pcc_context_t *ctx) {
781
+ static void packcr_context__destroy(packcr_context_t *ctx) {
967
782
  if (ctx == NULL) return;
968
- pcc_thunk_array__term(ctx->auxil, &ctx->thunks);
969
- pcc_lr_stack__term(ctx->auxil, &ctx->lrstack);
970
- pcc_lr_table__term(ctx, &ctx->lrtable);
971
- pcc_char_array__term(ctx->auxil, &ctx->buffer);
972
- pcc_memory_recycler__term(ctx->auxil, &ctx->thunk_chunk_recycler);
973
- pcc_memory_recycler__term(ctx->auxil, &ctx->lr_head_recycler);
974
- pcc_memory_recycler__term(ctx->auxil, &ctx->lr_answer_recycler);
975
- PCC_FREE(ctx->auxil, ctx);
976
- }
977
-
978
- static size_t pcc_refill_buffer(pcc_context_t *ctx, size_t num) {
979
- if (ctx->buffer.len >= ctx->cur + num) return ctx->buffer.len - ctx->cur;
980
- while (ctx->buffer.len < ctx->cur + num) {
981
- const int c = PCC_GETCHAR(ctx->auxil);
783
+ packcr_thunk_array__term(ctx->auxil, &ctx->thunks);
784
+ packcr_lr_table__term(ctx, &ctx->lrtable);
785
+ packcr_char_array__term(ctx->auxil, &ctx->buffer);
786
+ packcr_memory_recycler__term(ctx->auxil, &ctx->thunk_chunk_recycler);
787
+ packcr_memory_recycler__term(ctx->auxil, &ctx->lr_memo_recycler);
788
+ PACKCR_FREE(ctx->auxil, ctx);
789
+ }
790
+
791
+ static size_t packcr_refill_buffer(packcr_context_t *ctx, size_t num) {
792
+ if (ctx->buffer.len >= ctx->position_offset + num) return ctx->buffer.len - ctx->position_offset;
793
+ while (ctx->buffer.len < ctx->position_offset + num) {
794
+ const int c = PACKCR_GETCHAR(ctx->auxil);
982
795
  if (c < 0) break;
983
- pcc_char_array__add(ctx->auxil, &ctx->buffer, (char)c);
796
+ packcr_char_array__add(ctx->auxil, &ctx->buffer, (char)c);
984
797
  }
985
- return ctx->buffer.len - ctx->cur;
798
+ return ctx->buffer.len - ctx->position_offset;
986
799
  }
987
800
 
988
801
  MARK_FUNC_AS_USED
989
- static void pcc_commit_buffer(pcc_context_t *ctx) {
990
- memmove(ctx->buffer.buf, ctx->buffer.buf + ctx->cur, ctx->buffer.len - ctx->cur);
991
- ctx->buffer.len -= ctx->cur;
992
- ctx->pos += ctx->cur;
993
- pcc_lr_table__shift(ctx, &ctx->lrtable, ctx->cur);
994
- ctx->cur = 0;
802
+ static void packcr_commit_buffer(packcr_context_t *ctx) {
803
+ memmove(ctx->buffer.buf, ctx->buffer.buf + ctx->position_offset, ctx->buffer.len - ctx->position_offset);
804
+ ctx->buffer.len -= ctx->position_offset;
805
+ ctx->buffer_start_position += ctx->position_offset;
806
+ packcr_lr_table__shift(ctx, &ctx->lrtable, ctx->position_offset);
807
+ ctx->position_offset = 0;
995
808
  <%- if @location -%>
996
- ctx->pos_loc = pcc_location_add(ctx->pos_loc, ctx->cur_loc);
997
- pcc_location_init(&ctx->cur_loc);
809
+ ctx->buffer_start_position_loc = packcr_location_add(ctx->buffer_start_position_loc, ctx->position_offset_loc);
810
+ packcr_location_init(&ctx->position_offset_loc);
998
811
  <%- end -%>
999
812
  }
1000
813
 
1001
814
  MARK_FUNC_AS_USED
1002
- static const char *pcc_get_capture_string(pcc_context_t *ctx, const pcc_capture_t *capt) {
815
+ static const char *packcr_get_capture_string(packcr_context_t *ctx, const packcr_capture_t *capt) {
1003
816
  if (capt->string == NULL)
1004
- ((pcc_capture_t *)capt)->string =
1005
- pcc_strndup_e(ctx->auxil, ctx->buffer.buf + capt->range.start, capt->range.end - capt->range.start);
817
+ ((packcr_capture_t *)capt)->string =
818
+ packcr_strndup_e(ctx->auxil, ctx->buffer.buf + capt->range.start, capt->range.end - capt->range.start);
1006
819
  return capt->string;
1007
820
  }
1008
821
 
1009
822
  <% if @utf8 -%>
1010
- static size_t pcc_get_char_as_utf32(pcc_context_t *ctx, int *out) { /* with checking UTF-8 validity */
823
+ static size_t packcr_get_char_as_utf32(packcr_context_t *ctx, int *out) { /* with checking UTF-8 validity */
1011
824
  int c, u;
1012
825
  size_t n;
1013
- if (pcc_refill_buffer(ctx, 1) < 1) return 0;
1014
- c = (int)(unsigned char)ctx->buffer.buf[ctx->cur];
826
+ if (packcr_refill_buffer(ctx, 1) < 1) return 0;
827
+ c = (int)(unsigned char)ctx->buffer.buf[ctx->position_offset];
1015
828
  n = (c < 0x80) ? 1 :
1016
829
  ((c & 0xe0) == 0xc0) ? 2 :
1017
830
  ((c & 0xf0) == 0xe0) ? 3 :
1018
831
  ((c & 0xf8) == 0xf0) ? 4 : 0;
1019
832
  if (n < 1) return 0;
1020
- if (pcc_refill_buffer(ctx, n) < n) return 0;
833
+ if (packcr_refill_buffer(ctx, n) < n) return 0;
1021
834
  switch (n) {
1022
835
  case 1:
1023
836
  u = c;
1024
837
  break;
1025
838
  case 2:
1026
839
  u = c & 0x1f;
1027
- c = (int)(unsigned char)ctx->buffer.buf[ctx->cur + 1];
840
+ c = (int)(unsigned char)ctx->buffer.buf[ctx->position_offset + 1];
1028
841
  if ((c & 0xc0) != 0x80) return 0;
1029
842
  u <<= 6; u |= c & 0x3f;
1030
843
  if (u < 0x80) return 0;
1031
844
  break;
1032
845
  case 3:
1033
846
  u = c & 0x0f;
1034
- c = (int)(unsigned char)ctx->buffer.buf[ctx->cur + 1];
847
+ c = (int)(unsigned char)ctx->buffer.buf[ctx->position_offset + 1];
1035
848
  if ((c & 0xc0) != 0x80) return 0;
1036
849
  u <<= 6; u |= c & 0x3f;
1037
- c = (int)(unsigned char)ctx->buffer.buf[ctx->cur + 2];
850
+ c = (int)(unsigned char)ctx->buffer.buf[ctx->position_offset + 2];
1038
851
  if ((c & 0xc0) != 0x80) return 0;
1039
852
  u <<= 6; u |= c & 0x3f;
1040
853
  if (u < 0x800) return 0;
1041
854
  break;
1042
855
  case 4:
1043
856
  u = c & 0x07;
1044
- c = (int)(unsigned char)ctx->buffer.buf[ctx->cur + 1];
857
+ c = (int)(unsigned char)ctx->buffer.buf[ctx->position_offset + 1];
1045
858
  if ((c & 0xc0) != 0x80) return 0;
1046
859
  u <<= 6; u |= c & 0x3f;
1047
- c = (int)(unsigned char)ctx->buffer.buf[ctx->cur + 2];
860
+ c = (int)(unsigned char)ctx->buffer.buf[ctx->position_offset + 2];
1048
861
  if ((c & 0xc0) != 0x80) return 0;
1049
862
  u <<= 6; u |= c & 0x3f;
1050
- c = (int)(unsigned char)ctx->buffer.buf[ctx->cur + 3];
863
+ c = (int)(unsigned char)ctx->buffer.buf[ctx->position_offset + 3];
1051
864
  if ((c & 0xc0) != 0x80) return 0;
1052
865
  u <<= 6; u |= c & 0x3f;
1053
866
  if (u < 0x10000 || u > 0x10ffff) return 0;
@@ -1060,135 +873,120 @@ static size_t pcc_get_char_as_utf32(pcc_context_t *ctx, int *out) { /* with chec
1060
873
  }
1061
874
 
1062
875
  <% end -%>
1063
- MARK_FUNC_AS_USED
1064
- static pcc_bool_t pcc_apply_rule(pcc_context_t *ctx, pcc_rule_t rule, pcc_thunk_array_t *thunks, pcc_value_t *value) {
1065
- static pcc_value_t null;
1066
- pcc_thunk_chunk_t *c = NULL;
1067
- const size_t p = ctx->pos + ctx->cur;
876
+ static void packcr_grow_lr(packcr_context_t *ctx, packcr_rule_t rule, size_t offset<% if @location %>, packcr_location_t offset_loc<% end %>) {
877
+ while(1) {
878
+ const size_t old_offset = ctx->position_offset;
879
+ packcr_thunk_chunk_t *chunk;
880
+ packcr_lr_memo_t *memo;
881
+ packcr_rule_set_t limits;
882
+ ctx->position_offset = offset;
1068
883
  <%- if @location -%>
1069
- const pcc_location_t p_loc = pcc_location_add(ctx->pos_loc, ctx->cur_loc);
884
+ ctx->position_offset_loc = offset_loc;
1070
885
  <%- end -%>
1071
- pcc_bool_t b = PCC_TRUE;
1072
- pcc_lr_answer_t *a = pcc_lr_table__get_answer(ctx, &ctx->lrtable, p, rule);
1073
- pcc_lr_head_t *h = pcc_lr_table__get_head(ctx, &ctx->lrtable, p);
1074
- if (h != NULL) {
1075
- if (a == NULL && rule != h->rule && pcc_rule_set__index(ctx->auxil, &h->invol, rule) == PCC_VOID_VALUE) {
1076
- b = PCC_FALSE;
1077
- c = NULL;
1078
- }
1079
- else if (pcc_rule_set__remove(ctx->auxil, &h->eval, rule)) {
1080
- b = PCC_FALSE;
1081
- c = rule(ctx);
1082
- a = pcc_lr_answer__create(ctx, PCC_LR_ANSWER_CHUNK, ctx->pos + ctx->cur<% if @location %>, pcc_location_add(ctx->pos_loc, ctx->cur_loc)<% end %>);
1083
- a->data.chunk = c;
1084
- pcc_lr_table__hold_answer(ctx, &ctx->lrtable, p, a);
886
+ packcr_rule_set__init(ctx->auxil, &limits);
887
+ packcr_rule_set__add(ctx->auxil, &limits, rule);
888
+ chunk = rule(ctx, offset<% if @location %>, offset_loc<% end %>, &limits);
889
+ packcr_rule_set__term(ctx->auxil, &limits);
890
+ if (!chunk)
891
+ break;
892
+ if (ctx->position_offset <= old_offset) {
893
+ packcr_thunk_chunk__destroy(ctx, chunk);
894
+ break;
1085
895
  }
896
+ memo = packcr_lr_table__get_memo(ctx, &ctx->lrtable, offset, rule);
897
+ packcr_lr_memo__set_chunk(ctx, memo, chunk);
898
+ memo->offset = ctx->position_offset;
899
+ <%- if @location -%>
900
+ memo->offset_loc = ctx->position_offset_loc;
901
+ <%- end -%>
1086
902
  }
1087
- if (b) {
1088
- if (a != NULL) {
1089
- ctx->cur = a->pos - ctx->pos;
1090
- <%- if @location -%>
1091
- ctx->cur_loc = pcc_location_sub(a->pos_loc, ctx->pos_loc);
1092
- <%- end -%>
1093
- switch (a->type) {
1094
- case PCC_LR_ANSWER_LR:
1095
- if (a->data.lr->head == NULL) {
1096
- a->data.lr->head = pcc_lr_head__create(ctx, rule);
1097
- pcc_lr_table__hold_head(ctx, &ctx->lrtable, p, a->data.lr->head);
1098
- }
1099
- {
1100
- size_t i = ctx->lrstack.len;
1101
- while (i > 0) {
1102
- i--;
1103
- if (ctx->lrstack.buf[i]->head == a->data.lr->head) break;
1104
- ctx->lrstack.buf[i]->head = a->data.lr->head;
1105
- pcc_rule_set__add(ctx->auxil, &a->data.lr->head->invol, ctx->lrstack.buf[i]->rule);
1106
- }
1107
- }
1108
- c = a->data.lr->seed;
1109
- break;
1110
- case PCC_LR_ANSWER_CHUNK:
1111
- c = a->data.chunk;
1112
- break;
1113
- default: /* unknown */
1114
- break;
1115
- }
1116
- }
1117
- else {
1118
- pcc_lr_entry_t *const e = pcc_lr_entry__create(ctx->auxil, rule);
1119
- pcc_lr_stack__push(ctx->auxil, &ctx->lrstack, e);
1120
- a = pcc_lr_answer__create(ctx, PCC_LR_ANSWER_LR, p<% if @location %>, p_loc<% end %>);
1121
- a->data.lr = e;
1122
- pcc_lr_table__set_answer(ctx, &ctx->lrtable, p, rule, a);
1123
- c = rule(ctx);
1124
- pcc_lr_stack__pop(ctx->auxil, &ctx->lrstack);
1125
- a->pos = ctx->pos + ctx->cur;
903
+ }
904
+
905
+ MARK_FUNC_AS_USED
906
+ static packcr_thunk_chunk_t *packcr_get_rule_thunk_chunk(packcr_context_t *ctx, packcr_rule_t rule) {
907
+ packcr_thunk_chunk_t *c = NULL;
908
+ size_t offset = ctx->position_offset;
1126
909
  <%- if @location -%>
1127
- a->pos_loc = pcc_location_add(ctx->pos_loc, ctx->cur_loc);
910
+ packcr_location_t offset_loc = ctx->position_offset_loc;
1128
911
  <%- end -%>
1129
- if (e->head == NULL) {
1130
- pcc_lr_answer__set_chunk(ctx, a, c);
1131
- }
1132
- else {
1133
- e->seed = c;
1134
- h = a->data.lr->head;
1135
- if (h->rule != rule) {
1136
- c = a->data.lr->seed;
1137
- a = pcc_lr_answer__create(ctx, PCC_LR_ANSWER_CHUNK, ctx->pos + ctx->cur<% if @location %>, pcc_location_add(ctx->pos_loc, ctx->cur_loc)<% end %>);
1138
- a->data.chunk = c;
1139
- pcc_lr_table__hold_answer(ctx, &ctx->lrtable, p, a);
1140
- }
1141
- else {
1142
- pcc_lr_answer__set_chunk(ctx, a, a->data.lr->seed);
1143
- if (a->data.chunk == NULL) {
1144
- c = NULL;
1145
- }
1146
- else {
1147
- pcc_lr_table__set_head(ctx, &ctx->lrtable, p, h);
1148
- for (;;) {
1149
- ctx->cur = p - ctx->pos;
912
+ packcr_lr_memo_t *memo = packcr_lr_table__get_memo(ctx, &ctx->lrtable, offset, rule);
913
+
914
+ if (memo == NULL) {
915
+ memo = packcr_lr_memo__create(ctx, offset<% if @location %>, offset_loc<% end %>);
916
+ packcr_lr_table__set_memo(ctx, &ctx->lrtable, offset, rule, memo);
917
+ c = rule(ctx, offset<% if @location %>, offset_loc<% end %>, NULL);
918
+ packcr_lr_memo__set_chunk(ctx, memo, c);
919
+ memo->offset = ctx->position_offset;
1150
920
  <%- if @location -%>
1151
- ctx->cur_loc = pcc_location_sub(p_loc, ctx->pos_loc);
921
+ memo->offset_loc = ctx->position_offset_loc;
1152
922
  <%- end -%>
1153
- pcc_rule_set__copy(ctx->auxil, &h->eval, &h->invol);
1154
- c = rule(ctx);
1155
- if (c == NULL || ctx->pos + ctx->cur <= a->pos) break;
1156
- pcc_lr_answer__set_chunk(ctx, a, c);
1157
- a->pos = ctx->pos + ctx->cur;
923
+ if (memo->grow) {
924
+ packcr_grow_lr(ctx, rule, offset<% if @location %>, offset_loc<% end %>);
925
+ memo->grow = PACKCR_FALSE;
926
+ ctx->position_offset = memo->offset;
1158
927
  <%- if @location -%>
1159
- a->pos_loc = pcc_location_add(ctx->pos_loc, ctx->cur_loc);
928
+ ctx->position_offset_loc = memo->offset_loc;
1160
929
  <%- end -%>
1161
- }
1162
- pcc_thunk_chunk__destroy(ctx, c);
1163
- pcc_lr_table__set_head(ctx, &ctx->lrtable, p, NULL);
1164
- ctx->cur = a->pos - ctx->pos;
930
+ return memo->chunk;
931
+ }
932
+ return c;
933
+ } else if (memo->fail) {
934
+ packcr_lr_memo__set_chunk(ctx, memo, NULL);
935
+ memo->grow = PACKCR_TRUE;
936
+ return NULL;
937
+ }
938
+ ctx->position_offset = memo->offset;
1165
939
  <%- if @location -%>
1166
- ctx->cur_loc = pcc_location_sub(a->pos_loc, ctx->pos_loc);
940
+ ctx->position_offset_loc = memo->offset_loc;
1167
941
  <%- end -%>
1168
- c = a->data.chunk;
1169
- }
1170
- }
942
+ return memo->chunk;
943
+ }
944
+
945
+ MARK_FUNC_AS_USED
946
+ static packcr_bool_t packcr_apply_rule(packcr_context_t *ctx, packcr_rule_t rule, packcr_thunk_array_t *thunks, packcr_value_t *value, size_t offset<% if @location %>, packcr_location_t offset_loc<% end %>, packcr_rule_set_t *limits) {
947
+ static packcr_value_t null;
948
+ packcr_thunk_chunk_t *c;
949
+ if (limits != NULL) {
950
+ packcr_lr_memo_t *memo;
951
+ packcr_rule_set__add(ctx->auxil, limits, rule);
952
+ c = rule(ctx, offset<% if @location %>, offset_loc<% end %>, limits);
953
+ memo = packcr_lr_table__get_memo(ctx, &ctx->lrtable, offset, rule);
954
+ if (memo == NULL || ctx->position_offset <= memo->offset) {
955
+ if (memo) {
956
+ c = memo->chunk;
957
+ ctx->position_offset = memo->offset;
958
+ <%- if @location -%>
959
+ ctx->position_offset_loc = memo->offset_loc;
960
+ <%- end -%>
1171
961
  }
962
+ } else {
963
+ packcr_lr_memo__set_chunk(ctx, memo, c);
964
+ memo->offset = ctx->position_offset;
965
+ <%- if @location -%>
966
+ memo->offset_loc = ctx->position_offset_loc;
967
+ <%- end -%>
1172
968
  }
969
+ } else {
970
+ c = packcr_get_rule_thunk_chunk(ctx, rule);
1173
971
  }
1174
- if (c == NULL) return PCC_FALSE;
972
+ if (c == NULL) return PACKCR_FALSE;
1175
973
  if (value == NULL) value = &null;
1176
- memset(value, 0, sizeof(pcc_value_t)); /* in case */
1177
- pcc_thunk_array__add(ctx->auxil, thunks, pcc_thunk__create_node(ctx->auxil, &c->thunks, value));
1178
- return PCC_TRUE;
974
+ memset(value, 0, sizeof(packcr_value_t)); /* in case */
975
+ packcr_thunk_array__add(ctx->auxil, thunks, packcr_thunk__create_node(ctx->auxil, &c->thunks, value));
976
+ return PACKCR_TRUE;
1179
977
  }
1180
978
 
1181
979
  MARK_FUNC_AS_USED
1182
- static void pcc_do_action(pcc_context_t *ctx, const pcc_thunk_array_t *thunks, pcc_value_t *value) {
980
+ static void packcr_do_action(packcr_context_t *ctx, const packcr_thunk_array_t *thunks, packcr_value_t *value) {
1183
981
  size_t i;
1184
982
  for (i = 0; i < thunks->len; i++) {
1185
- pcc_thunk_t *const thunk = thunks->buf[i];
983
+ packcr_thunk_t *const thunk = thunks->buf[i];
1186
984
  switch (thunk->type) {
1187
- case PCC_THUNK_LEAF:
985
+ case PACKCR_THUNK_LEAF:
1188
986
  thunk->data.leaf.action(ctx, thunk, value);
1189
987
  break;
1190
- case PCC_THUNK_NODE:
1191
- pcc_do_action(ctx, thunk->data.node.thunks, thunk->data.node.value);
988
+ case PACKCR_THUNK_NODE:
989
+ packcr_do_action(ctx, thunk->data.node.thunks, thunk->data.node.value);
1192
990
  break;
1193
991
  default: /* unknown */
1194
992
  break;
@@ -1198,32 +996,32 @@ static void pcc_do_action(pcc_context_t *ctx, const pcc_thunk_array_t *thunks, p
1198
996
 
1199
997
  <%- @root.rules.each do |rule| -%>
1200
998
  <%- rule.codes.each do |code| -%>
1201
- static void pcc_action_<%= rule.name %>_<%= code.index %>(<%= prefix %>_context_t *__pcc_ctx, pcc_thunk_t *__pcc_in, pcc_value_t *__pcc_out) {
1202
- #define auxil (__pcc_ctx->auxil)
1203
- #define __ (*__pcc_out)
999
+ static void packcr_action_<%= rule.name %>_<%= code.index %>(<%= prefix %>_context_t *__packcr_ctx, packcr_thunk_t *__packcr_in, packcr_value_t *__packcr_out) {
1000
+ #define auxil (__packcr_ctx->auxil)
1001
+ #define __ (*__packcr_out)
1204
1002
  <%- code.vars.each do |ref| -%>
1205
- #define <%= ref.var %> (*__pcc_in->data.leaf.values.buf[<%= ref.index %>])
1003
+ #define <%= ref.var %> (*__packcr_in->data.leaf.values.buf[<%= ref.index %>])
1206
1004
  <% end -%>
1207
- #define _0 pcc_get_capture_string(__pcc_ctx, &__pcc_in->data.leaf.capt0)
1208
- #define _0s ((const size_t)(__pcc_ctx->pos + __pcc_in->data.leaf.capt0.range.start))
1209
- #define _0e ((const size_t)(__pcc_ctx->pos + __pcc_in->data.leaf.capt0.range.end))
1005
+ #define _0 packcr_get_capture_string(__packcr_ctx, &__packcr_in->data.leaf.capt0)
1006
+ #define _0s ((const size_t)(__packcr_ctx->buffer_start_position + __packcr_in->data.leaf.capt0.range.start))
1007
+ #define _0e ((const size_t)(__packcr_ctx->buffer_start_position + __packcr_in->data.leaf.capt0.range.end))
1210
1008
  <%- if @location -%>
1211
- #define _0sl ((const pcc_location_t)(pcc_location_add(__pcc_ctx->pos_loc, *__pcc_in->data.leaf.capt0.range.start_loc_ptr)))
1212
- #define _0el ((const pcc_location_t)(pcc_location_add(__pcc_ctx->pos_loc, *__pcc_in->data.leaf.capt0.range.end_loc_ptr)))
1009
+ #define _0sl ((const packcr_location_t)(packcr_location_add(__packcr_ctx->buffer_start_position_loc, __packcr_in->data.leaf.capt0.range.start_loc)))
1010
+ #define _0el ((const packcr_location_t)(packcr_location_add(__packcr_ctx->buffer_start_position_loc, __packcr_in->data.leaf.capt0.range.end_loc)))
1213
1011
  <%- end -%>
1214
1012
  <%- if @capture_in_code -%>
1215
- #define _0c __pcc_in->data.leaf.capt0
1013
+ #define _0c __packcr_in->data.leaf.capt0
1216
1014
  <%- end -%>
1217
1015
  <% code.capts.each do |capture| -%>
1218
- #define _<%= capture.index + 1 %> pcc_get_capture_string(__pcc_ctx, __pcc_in->data.leaf.capts.buf[<%= capture.index %>])
1219
- #define _<%= capture.index + 1 %>s ((const size_t)(__pcc_ctx->pos + __pcc_in->data.leaf.capts.buf[<%= capture.index %>]->range.start))
1220
- #define _<%= capture.index + 1 %>e ((const size_t)(__pcc_ctx->pos + __pcc_in->data.leaf.capts.buf[<%= capture.index %>]->range.end))
1016
+ #define _<%= capture.index + 1 %> packcr_get_capture_string(__packcr_ctx, __packcr_in->data.leaf.capts.buf[<%= capture.index %>])
1017
+ #define _<%= capture.index + 1 %>s ((const size_t)(__packcr_ctx->buffer_start_position + __packcr_in->data.leaf.capts.buf[<%= capture.index %>]->range.start))
1018
+ #define _<%= capture.index + 1 %>e ((const size_t)(__packcr_ctx->buffer_start_position + __packcr_in->data.leaf.capts.buf[<%= capture.index %>]->range.end))
1221
1019
  <%- if @location -%>
1222
- #define _<%= capture.index + 1 %>sl ((const pcc_location_t)(pcc_location_add(__pcc_ctx->pos_loc, *__pcc_in->data.leaf.capts.buf[<%= capture.index %>]->range.start_loc_ptr)))
1223
- #define _<%= capture.index + 1 %>el ((const pcc_location_t)(pcc_location_add(__pcc_ctx->pos_loc, *__pcc_in->data.leaf.capts.buf[<%= capture.index %>]->range.end_loc_ptr)))
1020
+ #define _<%= capture.index + 1 %>sl ((const packcr_location_t)(packcr_location_add(__packcr_ctx->buffer_start_position_loc, __packcr_in->data.leaf.capts.buf[<%= capture.index %>]->range.start_loc)))
1021
+ #define _<%= capture.index + 1 %>el ((const packcr_location_t)(packcr_location_add(__packcr_ctx->buffer_start_position_loc, __packcr_in->data.leaf.capts.buf[<%= capture.index %>]->range.end_loc)))
1224
1022
  <%- end -%>
1225
1023
  <%- if @capture_in_code -%>
1226
- #define _<%= capture.index + 1 %>c (*__pcc_in->data.leaf.capts.buf[<%= capture.index %>])
1024
+ #define _<%= capture.index + 1 %>c (*__packcr_in->data.leaf.capts.buf[<%= capture.index %>])
1227
1025
  <%- end -%>
1228
1026
  <%- end -%>
1229
1027
  <%= stream.get_code_block(code.code, 4, @iname) -%>
@@ -1249,40 +1047,33 @@ static void pcc_action_<%= rule.name %>_<%= code.index %>(<%= prefix %>_context_
1249
1047
  <%- end -%>
1250
1048
  <%- end -%>
1251
1049
  <%- @root.rules.each do |rule| -%>
1252
- static pcc_thunk_chunk_t *pcc_evaluate_rule_<%= rule.name %>(pcc_context_t *ctx);
1050
+ static packcr_thunk_chunk_t *packcr_evaluate_rule_<%= rule.name %>(packcr_context_t *ctx, size_t offset<% if @location %>, packcr_location_t offset_loc<% end %>, packcr_rule_set_t *limits);
1253
1051
  <%- end -%>
1254
1052
 
1255
1053
  <%- @root.rules.each do |rule| -%>
1256
- static pcc_thunk_chunk_t *pcc_evaluate_rule_<%= rule.name %>(pcc_context_t *ctx) {
1257
- pcc_thunk_chunk_t *const chunk = pcc_thunk_chunk__create(ctx);
1258
- chunk->pos = ctx->cur;
1259
- <%- if @location -%>
1260
- chunk->pos_loc = ctx->cur_loc;
1261
- <%- end -%>
1262
1054
  <%- gen = ::Packcr::Generator.new(rule, @ascii, @location) -%>
1263
1055
  <%= gen.generate_code(rule, 0, 0, false) -%>
1264
- }
1265
1056
 
1266
1057
  <%- end -%>
1267
1058
  <%= prefix %>_context_t *<%= prefix %>_create(<%= auxil_def %>auxil) {
1268
- return pcc_context__create(auxil);
1059
+ return packcr_context__create(auxil);
1269
1060
  }
1270
1061
 
1271
1062
  int <%= prefix %>_parse(<%= prefix %>_context_t *ctx, <%= value_def %>*ret) {
1272
- size_t pos = ctx->pos;
1063
+ size_t pos = ctx->buffer_start_position;
1273
1064
  <%- if !@root.rules.empty? -%>
1274
- if (pcc_apply_rule(ctx, pcc_evaluate_rule_<%= @root.rules[0].name %>, &ctx->thunks, ret))
1275
- pcc_do_action(ctx, &ctx->thunks, ret);
1065
+ if (packcr_apply_rule(ctx, packcr_evaluate_rule_<%= @root.rules[0].name %>, &ctx->thunks, ret, ctx->position_offset<% if @location %>, ctx->position_offset_loc<% end %>, NULL))
1066
+ packcr_do_action(ctx, &ctx->thunks, ret);
1276
1067
  else
1277
- PCC_ERROR(ctx->auxil);
1278
- pcc_commit_buffer(ctx);
1068
+ PACKCR_ERROR(ctx->auxil);
1069
+ packcr_commit_buffer(ctx);
1279
1070
  <%- end -%>
1280
- pcc_thunk_array__revert(ctx->auxil, &ctx->thunks, 0);
1281
- return pos != ctx->pos && pcc_refill_buffer(ctx, 1) >= 1;
1071
+ packcr_thunk_array__revert(ctx->auxil, &ctx->thunks, 0);
1072
+ return pos != ctx->buffer_start_position && packcr_refill_buffer(ctx, 1) >= 1;
1282
1073
  }
1283
1074
 
1284
1075
  void <%= prefix %>_destroy(<%= prefix %>_context_t *ctx) {
1285
- pcc_context__destroy(ctx);
1076
+ packcr_context__destroy(ctx);
1286
1077
  }
1287
1078
  <%- if !code(:lsource).empty? -%>
1288
1079