diff --git a/c/containers/mlr_dsl_ast.c b/c/containers/mlr_dsl_ast.c index 5ad67d11a..d8438da5d 100644 --- a/c/containers/mlr_dsl_ast.c +++ b/c/containers/mlr_dsl_ast.c @@ -169,10 +169,20 @@ char* mlr_dsl_ast_node_describe_type(mlr_dsl_ast_node_type_t type) { case MD_AST_NODE_TYPE_FILTER: return "filter"; break; case MD_AST_NODE_TYPE_UNSET: return "unset"; break; case MD_AST_NODE_TYPE_EMITF: return "emitf"; break; + case MD_AST_NODE_TYPE_EMITF_WRITE: return "emitf_write"; break; + case MD_AST_NODE_TYPE_EMITF_APPEND: return "emitf_append"; break; case MD_AST_NODE_TYPE_EMITP: return "emitp"; break; + case MD_AST_NODE_TYPE_EMITP_WRITE: return "emitp_write"; break; + case MD_AST_NODE_TYPE_EMITP_APPEND: return "emitp_append"; break; case MD_AST_NODE_TYPE_EMIT: return "emit"; break; + case MD_AST_NODE_TYPE_EMIT_WRITE: return "emit_write"; break; + case MD_AST_NODE_TYPE_EMIT_APPEND: return "emit_append"; break; case MD_AST_NODE_TYPE_EMITP_LASHED: return "emitp_lashed"; break; + case MD_AST_NODE_TYPE_EMITP_LASHED_WRITE: return "emitp_lashed_write"; break; + case MD_AST_NODE_TYPE_EMITP_LASHED_APPEND: return "emitp_lashed_append"; break; case MD_AST_NODE_TYPE_EMIT_LASHED: return "emit_lashed"; break; + case MD_AST_NODE_TYPE_EMIT_LASHED_WRITE: return "emit_lashed_write"; break; + case MD_AST_NODE_TYPE_EMIT_LASHED_APPEND: return "emit_lashed_append"; break; case MD_AST_NODE_TYPE_DUMP: return "dump"; break; case MD_AST_NODE_TYPE_DUMP_WRITE: return "dump_write"; break; case MD_AST_NODE_TYPE_DUMP_APPEND: return "dump_append"; break; diff --git a/c/containers/mlr_dsl_ast.h b/c/containers/mlr_dsl_ast.h index 2d7dfcbc3..0ca973568 100644 --- a/c/containers/mlr_dsl_ast.h +++ b/c/containers/mlr_dsl_ast.h @@ -34,10 +34,20 @@ typedef enum _mlr_dsl_ast_node_type_t { MD_AST_NODE_TYPE_FILTER, MD_AST_NODE_TYPE_UNSET, MD_AST_NODE_TYPE_EMITF, + MD_AST_NODE_TYPE_EMITF_WRITE, + MD_AST_NODE_TYPE_EMITF_APPEND, MD_AST_NODE_TYPE_EMITP, + MD_AST_NODE_TYPE_EMITP_WRITE, + MD_AST_NODE_TYPE_EMITP_APPEND, MD_AST_NODE_TYPE_EMIT, + MD_AST_NODE_TYPE_EMIT_WRITE, + MD_AST_NODE_TYPE_EMIT_APPEND, MD_AST_NODE_TYPE_EMITP_LASHED, + MD_AST_NODE_TYPE_EMITP_LASHED_WRITE, + MD_AST_NODE_TYPE_EMITP_LASHED_APPEND, MD_AST_NODE_TYPE_EMIT_LASHED, + MD_AST_NODE_TYPE_EMIT_LASHED_WRITE, + MD_AST_NODE_TYPE_EMIT_LASHED_APPEND, MD_AST_NODE_TYPE_DUMP, MD_AST_NODE_TYPE_DUMP_WRITE, MD_AST_NODE_TYPE_DUMP_APPEND, diff --git a/c/dsls/mlr_dsl_parse.y b/c/dsls/mlr_dsl_parse.y index c820e1b37..3fbd547ad 100644 --- a/c/dsls/mlr_dsl_parse.y +++ b/c/dsls/mlr_dsl_parse.y @@ -138,11 +138,23 @@ md_statement_not_braced_end ::= md_bare_boolean. md_statement_not_braced_end ::= md_oosvar_assignment. md_statement_not_braced_end ::= md_filter. md_statement_not_braced_end ::= md_unset. + md_statement_not_braced_end ::= md_emitf. +md_statement_not_braced_end ::= md_emitf_write. +md_statement_not_braced_end ::= md_emitf_append. md_statement_not_braced_end ::= md_emitp. +//md_statement_not_braced_end ::= md_emitp_write. +//md_statement_not_braced_end ::= md_emitp_append. md_statement_not_braced_end ::= md_emit. +//md_statement_not_braced_end ::= md_emit_write. +//md_statement_not_braced_end ::= md_emit_append. md_statement_not_braced_end ::= md_emitp_lashed. +//md_statement_not_braced_end ::= md_emitp_lashed_write. +//md_statement_not_braced_end ::= md_emitp_lashed_append. md_statement_not_braced_end ::= md_emit_lashed. +//md_statement_not_braced_end ::= md_emit_lashed_write. +//md_statement_not_braced_end ::= md_emit_lashed_append. + md_statement_not_braced_end ::= md_dump. md_statement_not_braced_end ::= md_dump_write. md_statement_not_braced_end ::= md_dump_append. @@ -601,6 +613,15 @@ md_emitf_args(A) ::= md_emitf_args(B) MD_TOKEN_COMMA md_oosvar_keylist(C). { A = mlr_dsl_ast_node_append_arg(B, C); } +md_emitf_write(A) ::= MD_TOKEN_EMITF(O) MD_TOKEN_GT md_rhs(F) MD_TOKEN_COMMA md_emitf_args(B). { + B = mlr_dsl_ast_node_set_function_name(B, O->text); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITF_WRITE, B, F); +} +md_emitf_append(A) ::= MD_TOKEN_EMITF(O) MD_TOKEN_BITWISE_RSH md_rhs(F) MD_TOKEN_COMMA md_emitf_args(B). { + B = mlr_dsl_ast_node_set_function_name(B, O->text); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITF_APPEND, B, F); +} + // ---------------------------------------------------------------- md_emitp(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_ALL(B). { A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP, B); diff --git a/c/mapping/mlr_dsl_cst.c b/c/mapping/mlr_dsl_cst.c index 62a606fe9..f15ccf551 100644 --- a/c/mapping/mlr_dsl_cst.c +++ b/c/mapping/mlr_dsl_cst.c @@ -1948,6 +1948,12 @@ static void handle_emit( sllmv_free(pmvkeys); } +// xxx if to file: +// * mlhmmv_to_lrecs not to pcsv_outputs->poutrecs but to local list +// * hand those off to multi_lrec_writer keyed by filename. +// * multi_lrec_writer needs to have open fp (from write/append) as well as lrec_writer object. +// * multi_lrec_writer needs drain-all on its close method, invokved from mapper_put. + // ---------------------------------------------------------------- static void handle_emitp_lashed( mlr_dsl_cst_statement_t* pnode,