From e91be3f6f7f209275645cf7fef30a602b45da9e5 Mon Sep 17 00:00:00 2001 From: John Kerl Date: Sat, 23 Jul 2016 09:01:33 -0400 Subject: [PATCH] write/append code-dedupe iterate --- c/dsls/mlr_dsl_parse.y | 6 ++++-- c/mapping/mlr_dsl_cst.c | 38 ++++++++++++++------------------------ c/todo.txt | 1 + 3 files changed, 19 insertions(+), 26 deletions(-) diff --git a/c/dsls/mlr_dsl_parse.y b/c/dsls/mlr_dsl_parse.y index 4fa9b3ad6..aa5d0d475 100644 --- a/c/dsls/mlr_dsl_parse.y +++ b/c/dsls/mlr_dsl_parse.y @@ -969,10 +969,12 @@ md_dump_append(A) ::= MD_TOKEN_DUMP(O) MD_TOKEN_BITWISE_RSH md_rhs(B). { } md_print(A) ::= MD_TOKEN_PRINT(O) md_rhs(B). { - A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_PRINT, B); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT_WRITE, B, + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); } md_eprint(A) ::= MD_TOKEN_EPRINT(O) md_rhs(B). { - A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EPRINT, B); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT_WRITE, B, + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDERR)); } md_print_write(A) ::= MD_TOKEN_PRINT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA md_rhs(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT_WRITE, C, F); diff --git a/c/mapping/mlr_dsl_cst.c b/c/mapping/mlr_dsl_cst.c index 2b5affde1..e82edc907 100644 --- a/c/mapping/mlr_dsl_cst.c +++ b/c/mapping/mlr_dsl_cst.c @@ -53,7 +53,6 @@ static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_a static mlr_dsl_cst_statement_t* alloc_edump(mlr_dsl_ast_node_t* p, int ti, int cf); static mlr_dsl_cst_statement_t* alloc_dump_write(mlr_dsl_ast_node_t* p, int ti, int cf); static mlr_dsl_cst_statement_t* alloc_dump_append(mlr_dsl_ast_node_t* p, int ti, int cf); -static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* p, int ti, int cf); static mlr_dsl_cst_statement_t* alloc_eprint(mlr_dsl_ast_node_t* p, int ti, int cf); static mlr_dsl_cst_statement_t* alloc_print_write(mlr_dsl_ast_node_t* p, int ti, int cf); static mlr_dsl_cst_statement_t* alloc_print_append(mlr_dsl_ast_node_t* p, int ti, int cf); @@ -514,9 +513,6 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i return alloc_dump_append(pnode, type_inferencing, context_flags); break; - case MD_AST_NODE_TYPE_PRINT: - return alloc_print(pnode, type_inferencing, context_flags); - break; case MD_AST_NODE_TYPE_EPRINT: return alloc_eprint(pnode, type_inferencing, context_flags); break; @@ -1686,21 +1682,6 @@ static mlr_dsl_cst_statement_t* alloc_dump_append(mlr_dsl_ast_node_t* pnode, int } // ---------------------------------------------------------------- -static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, int type_inferencing, - int context_flags) -{ - if ((pnode->pchildren == NULL) || (pnode->pchildren->length != 1)) { - fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n", - MLR_GLOBALS.bargv0, __FILE__, __LINE__); - exit(1); - } - mlr_dsl_cst_statement_t* pstatement = alloc_blank(); - mlr_dsl_ast_node_t* pvalue_node = pnode->pchildren->phead->pvvalue; - pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pvalue_node, type_inferencing, context_flags); - pstatement->pnode_handler = handle_print; - return pstatement; -} - static mlr_dsl_cst_statement_t* alloc_eprint(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags) { @@ -1726,12 +1707,21 @@ static mlr_dsl_cst_statement_t* alloc_print_write(mlr_dsl_ast_node_t* pnode, int } mlr_dsl_cst_statement_t* pstatement = alloc_blank(); mlr_dsl_ast_node_t* pvalue_node = pnode->pchildren->phead->pvvalue; - mlr_dsl_ast_node_t* pfilename_node = pnode->pchildren->phead->pnext->pvvalue; pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pvalue_node, type_inferencing, context_flags); - pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, - type_inferencing, context_flags); - pstatement->pmulti_out = multi_out_alloc(); - pstatement->pnode_handler = handle_print_write; + + // xxx replicate x all + mlr_dsl_ast_node_t* pfilename_node = pnode->pchildren->phead->pnext->pvvalue; + if (pfilename_node->type == MD_AST_NODE_TYPE_STDOUT) { + pstatement->pnode_handler = handle_print; + } else if (pfilename_node->type == MD_AST_NODE_TYPE_STDERR) { + pstatement->pnode_handler = handle_eprint; + } else { + pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, + type_inferencing, context_flags); + pstatement->pmulti_out = multi_out_alloc(); + pstatement->pnode_handler = handle_print_write; + } + return pstatement; } diff --git a/c/todo.txt b/c/todo.txt index 7d6a85c1d..b8e7756de 100644 --- a/c/todo.txt +++ b/c/todo.txt @@ -31,6 +31,7 @@ COOKBOOK: * mlr --from ../data/small put -q '@v=$*; emit > "foo".$a.".dat", @v'; etc. COMMON: +* coalesce write & append @ cst; rm non-write/append * lrec_reader/writer take sub-bagged cliopts pstructs * put/tee --output flags * put/tee --no-flush flags