mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-23 16:08:43 +00:00
bind-stack allocate CST iterate
This commit is contained in:
parent
97d6eecda8
commit
bc98f13ee5
2 changed files with 53 additions and 0 deletions
|
|
@ -71,17 +71,26 @@ typedef struct _cst_outputs_t {
|
|||
cli_writer_opts_t* pwriter_opts;
|
||||
} cst_outputs_t;
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
typedef struct _cst_top_level_statement_block_t {
|
||||
local_stack_t* pstack;
|
||||
int max_var_depth;
|
||||
sllv_t* pstatements;
|
||||
} cst_top_level_statement_block_t;
|
||||
|
||||
cst_top_level_statement_block_t* cst_top_level_statement_block_alloc(int max_var_depth);
|
||||
void cst_top_level_statement_block_free(cst_top_level_statement_block_t* pblock);
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
typedef struct _cst_statement_block_t {
|
||||
int frame_var_count;
|
||||
sllv_t* pstatements;
|
||||
} cst_statement_block_t;
|
||||
|
||||
cst_statement_block_t* cst_statement_block_alloc(int frame_var_count);
|
||||
void cst_statement_block_free(cst_statement_block_t* pblock);
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// Generic handler for a statement.
|
||||
typedef void mlr_dsl_cst_node_handler_func_t(
|
||||
struct _mlr_dsl_cst_statement_t* pnode,
|
||||
|
|
|
|||
|
|
@ -222,7 +222,51 @@ static cst_statement_handler_t handle_dump;
|
|||
static cst_statement_handler_t handle_dump_to_file;
|
||||
static cst_statement_handler_t handle_print;
|
||||
|
||||
// ================================================================
|
||||
cst_top_level_statement_block_t* cst_top_level_statement_block_alloc(int max_var_depth) {
|
||||
cst_top_level_statement_block_t* pblock = mlr_malloc_or_die(sizeof(cst_top_level_statement_block_t));
|
||||
|
||||
pblock->max_var_depth = max_var_depth;
|
||||
pblock->pstack = local_stack_alloc(max_var_depth);
|
||||
pblock->pstatements = sllv_alloc();
|
||||
|
||||
return pblock;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
void cst_top_level_statement_block_free(cst_top_level_statement_block_t* pblock) {
|
||||
if (pblock == NULL)
|
||||
return;
|
||||
local_stack_free(pblock->pstack);
|
||||
for (sllve_t* pe = pblock->pstatements->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_cst_statement_free(pe->pvvalue);
|
||||
}
|
||||
sllv_free(pblock->pstatements);
|
||||
free(pblock);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
cst_statement_block_t* cst_statement_block_alloc(int frame_var_count) {
|
||||
cst_statement_block_t* pblock = mlr_malloc_or_die(sizeof(cst_statement_block_t));
|
||||
|
||||
pblock->frame_var_count = frame_var_count;
|
||||
pblock->pstatements = sllv_alloc();
|
||||
|
||||
return pblock;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
void cst_statement_block_free(cst_statement_block_t* pblock) {
|
||||
if (pblock == NULL)
|
||||
return;
|
||||
for (sllve_t* pe = pblock->pstatements->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_cst_statement_free(pe->pvvalue);
|
||||
}
|
||||
sllv_free(pblock->pstatements);
|
||||
free(pblock);
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// The parser accepts many things that are invalid, e.g.
|
||||
// * begin{end{}} -- begin/end not at top level
|
||||
// * begin{$x=1} -- references to stream records at begin/end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue