From 37af4c31eddc90369cb98fbdd0e71dc0785dcc93 Mon Sep 17 00:00:00 2001 From: John Kerl Date: Sat, 14 May 2016 23:21:57 -0400 Subject: [PATCH] do-while feature complete --- c/mapping/mlr_dsl_cst.c | 80 +++++++++++++++++++++++++++++++++++++++++ c/todo.txt | 4 +-- 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/c/mapping/mlr_dsl_cst.c b/c/mapping/mlr_dsl_cst.c index d795fb2ba..bafe9848f 100644 --- a/c/mapping/mlr_dsl_cst.c +++ b/c/mapping/mlr_dsl_cst.c @@ -18,6 +18,7 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_emit_or_emitp(mlr_dsl_ast_no int do_full_prefixing); static mlr_dsl_cst_statement_t* cst_statement_alloc_conditional_block(mlr_dsl_ast_node_t* past, int type_inferencing); static mlr_dsl_cst_statement_t* cst_statement_alloc_while(mlr_dsl_ast_node_t* past, int type_inferencing); +static mlr_dsl_cst_statement_t* cst_statement_alloc_do_while(mlr_dsl_ast_node_t* past, int type_inferencing); static mlr_dsl_cst_statement_t* cst_statement_alloc_for_srec(mlr_dsl_ast_node_t* past, int type_inferencing); static mlr_dsl_cst_statement_t* cst_statement_alloc_if_head(mlr_dsl_ast_node_t* past, int type_inferencing); static mlr_dsl_cst_statement_t* cst_statement_alloc_if_item(mlr_dsl_ast_node_t* pexprnode, @@ -220,6 +221,28 @@ static void mlr_dsl_cst_node_handle_while( sllv_t* poutrecs, char* oosvar_flatten_separator); +static void mlr_dsl_cst_node_handle_do_while( + mlr_dsl_cst_statement_t* pnode, + mlhmmv_t* poosvars, + lrec_t* pinrec, + lhmsv_t* ptyped_overlay, + string_array_t** ppregex_captures, + context_t* pctx, + int* pshould_emit_rec, + sllv_t* poutrecs, + char* oosvar_flatten_separator); + +static void mlr_dsl_cst_node_handle_do_while( + mlr_dsl_cst_statement_t* pnode, + mlhmmv_t* poosvars, + lrec_t* pinrec, + lhmsv_t* ptyped_overlay, + string_array_t** ppregex_captures, + context_t* pctx, + int* pshould_emit_rec, + sllv_t* poutrecs, + char* oosvar_flatten_separator); + static void mlr_dsl_cst_node_handle_for_srec( mlr_dsl_cst_statement_t* pnode, mlhmmv_t* poosvars, @@ -452,6 +475,9 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc(mlr_dsl_ast_node_t* pnode, case MD_AST_NODE_TYPE_WHILE: return cst_statement_alloc_while(pnode, type_inferencing); break; + case MD_AST_NODE_TYPE_DO_WHILE: + return cst_statement_alloc_do_while(pnode, type_inferencing); + break; case MD_AST_NODE_TYPE_FOR_SREC: printf("FOR SREC STUB\n"); return cst_statement_alloc_for_srec(pnode, type_inferencing); @@ -784,6 +810,28 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_while(mlr_dsl_ast_node_t* pa return pstatement; } +static mlr_dsl_cst_statement_t* cst_statement_alloc_do_while(mlr_dsl_ast_node_t* past, int type_inferencing) { + mlr_dsl_cst_statement_t* pstatement = cst_statement_alloc_blank(); + + // Left child node is the list of statements in the body. + // Right child node is the AST for the boolean expression. + mlr_dsl_ast_node_t* pleft = past->pchildren->phead->pvvalue; + mlr_dsl_ast_node_t* pright = past->pchildren->phead->pnext->pvvalue; + sllv_t* pblock_statements = sllv_alloc(); + + for (sllve_t* pe = pleft->pchildren->phead; pe != NULL; pe = pe->pnext) { + mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue; + mlr_dsl_cst_statement_t *pstatement = cst_statement_alloc(pbody_ast_node, type_inferencing, FALSE); // xxx stub + ////printf("BODY %s\n", mlr_dsl_ast_node_describe_type(pbody_ast_node->type)); + sllv_append(pblock_statements, pstatement); + } + + pstatement->phandler = mlr_dsl_cst_node_handle_do_while; + pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, type_inferencing); + pstatement->pblock_statements = pblock_statements; + return pstatement; +} + static mlr_dsl_cst_statement_t* cst_statement_alloc_for_srec(mlr_dsl_ast_node_t* past, int type_inferencing) { mlr_dsl_cst_statement_t* pstatement = cst_statement_alloc_blank(); @@ -1515,6 +1563,38 @@ static void mlr_dsl_cst_node_handle_while( } } +// ---------------------------------------------------------------- +static void mlr_dsl_cst_node_handle_do_while( + mlr_dsl_cst_statement_t* pnode, + mlhmmv_t* poosvars, + lrec_t* pinrec, + lhmsv_t* ptyped_overlay, + string_array_t** ppregex_captures, + context_t* pctx, + int* pshould_emit_rec, + sllv_t* poutrecs, + char* oosvar_flatten_separator) +{ + rval_evaluator_t* prhs_evaluator = pnode->prhs_evaluator; + + while (TRUE) { + mlr_dsl_cst_handle(pnode->pblock_statements, + poosvars, pinrec, ptyped_overlay, ppregex_captures, pctx, pshould_emit_rec, poutrecs, + oosvar_flatten_separator); + + mv_t val = prhs_evaluator->pprocess_func(pinrec, ptyped_overlay, poosvars, + ppregex_captures, pctx, prhs_evaluator->pvstate); + if (mv_is_non_null(&val)) { + mv_set_boolean_strict(&val); + if (!val.u.boolv) { + break; + } + } else { + break; + } + } +} + // ---------------------------------------------------------------- static void mlr_dsl_cst_node_handle_for_srec( mlr_dsl_cst_statement_t* pnode, diff --git a/c/todo.txt b/c/todo.txt index 1755d271f..43174ab61 100644 --- a/c/todo.txt +++ b/c/todo.txt @@ -27,14 +27,14 @@ TOP-OF-LIST SUMMARY UT/olh/mld: * UT for empty statement for put * UT for empty statement for filter -* UT if-chaining: put -v's as well as contentful @ abixy +* UT if-chaining, while, do-while: put -v's as well as contentful @ abixy * olh comment-stripping for put & filter * UT comment-stripping for put & filter * doc re oosvar keyed mean solvable with `for`. * let newlines replace semicolons? no, and make it clear why: no need for \ continuations that way. 4.1.0 release notes: -* new forx2, while, if-chains +* new forx2, while/do-while, if-chains * recursivity of existing conds * pound-to-EOL commenting for filter & put ! don't release 4.1 w/o implicit semicolon after closing curly brace