diff --git a/hawk/bin/main.c b/hawk/bin/main.c index 018d8fb7..e09ffdee 100644 --- a/hawk/bin/main.c +++ b/hawk/bin/main.c @@ -356,7 +356,7 @@ static hawk_htb_walk_t print_awk_value (hawk_htb_t* map, hawk_htb_pair_t* pair, return HAWK_HTB_WALK_FORWARD; } -static int add_gvs_to_awk (hawk_t* awk, arg_t* arg) +static int add_gvs_to_awk (hawk_t* hawk, arg_t* arg) { if (arg->gvm.size > 0) { @@ -364,7 +364,8 @@ static int add_gvs_to_awk (hawk_t* awk, arg_t* arg) for (i = 0; i < arg->gvm.size; i++) { - arg->gvm.ptr[i].idx = hawk_addgbl(awk, arg->gvm.ptr[i].name); + arg->gvm.ptr[i].idx = arg->gvm.ptr[i].uc? hawk_addgblwithucstr(hawk, arg->gvm.ptr[i].name): + hawk_addgblwithbcstr(hawk, arg->gvm.ptr[i].name); } } @@ -398,7 +399,7 @@ static int apply_fs_and_gvs_to_rtx (hawk_rtx_t* rtx, arg_t* arg) for (i = 0; i < arg->gvm.size; i++) { hawk_val_t* v; - + v = (arg->gvm.ptr[i].uc)? hawk_rtx_makenstrvalwithuchars(rtx, arg->gvm.ptr[i].value.ptr, arg->gvm.ptr[i].value.len): hawk_rtx_makenstrvalwithbchars(rtx, arg->gvm.ptr[i].value.ptr, arg->gvm.ptr[i].value.len); if (!v) return -1; @@ -1012,20 +1013,6 @@ static void print_hawk_rtx_error (hawk_rtx_t* rtx) ); } -hawk_htb_walk_t add_global (hawk_htb_t* map, hawk_htb_pair_t* pair, void* arg) -{ - hawk_t* awk = (hawk_t*)arg; - struct gv_t* gvmv = (struct gv_t*)HAWK_HTB_VPTR(pair); - - /* the key was inserted to the table with a null at the end - * and the key length was even incremetned for that. - * so i can pass the pointer without other adjustments. */ - gvmv->idx = hawk_addgbl(awk, HAWK_HTB_KPTR(pair)); - if (gvmv->idx <= -1) return HAWK_HTB_WALK_STOP; - return HAWK_HTB_WALK_FORWARD; -} - - #if 0 static void* xma_alloc (hawk_mmgr_t* mmgr, hawk_oow_t size) { diff --git a/hawk/lib/hawk.h b/hawk/lib/hawk.h index f516d7f2..bfe64c5c 100644 --- a/hawk/lib/hawk.h +++ b/hawk/lib/hawk.h @@ -1737,13 +1737,13 @@ HAWK_EXPORT int hawk_findgblwithucstr ( ); #if defined(HAWK_OOCH_IS_BCH) -# define hawk_addgbl hawk_addgblwithbcstr -# define hawk_delgbl hawk_delgblwithbcstr -# define hawk_findgbl hawk_findgblwithbcstr +# define hawk_addgblwithoocstr hawk_addgblwithbcstr +# define hawk_delgblwithoocstr hawk_delgblwithbcstr +# define hawk_findgblwithoocstr hawk_findgblwithbcstr #else -# define hawk_addgbl hawk_addgblwithucstr -# define hawk_delgbl hawk_delgblwithucstr -# define hawk_findgbl hawk_findgblwithucstr +# define hawk_addgblwithoocstr hawk_addgblwithucstr +# define hawk_delgblwithoocstr hawk_delgblwithucstr +# define hawk_findgblwithoocstr hawk_findgblwithucstr #endif /** diff --git a/hawk/lib/parse.c b/hawk/lib/parse.c index 7f5c92bc..b9b3282b 100644 --- a/hawk/lib/parse.c +++ b/hawk/lib/parse.c @@ -4174,8 +4174,8 @@ static hawk_nde_t* parse_concat (hawk_t* awk, const hawk_loc_t* xloc) hawk_nde_t* right = HAWK_NULL; hawk_loc_t rloc; - left = parse_additive (awk, xloc); - if (left == HAWK_NULL) goto oops; + left = parse_additive(awk, xloc); + if (HAWK_UNLIKELY(!left)) goto oops; do { @@ -4187,10 +4187,17 @@ static hawk_nde_t* parse_concat (hawk_t* awk, const hawk_loc_t* xloc) } else if (awk->opt.trait & HAWK_BLANKCONCAT) { + /* + * [NOTE] + * TOK_TILDE has been commented out in the if condition below because + * BINOP_MA has lower precedence than concatenation and it is not certain + * the tilde is an unary bitwise negation operator at this phase. + * You may use (~10) rather than ~10 after concatenation to avoid confusion. + */ if (MATCH(awk,TOK_LPAREN) || MATCH(awk,TOK_DOLLAR) || /* unary operators */ MATCH(awk,TOK_PLUS) || MATCH(awk,TOK_MINUS) || - MATCH(awk,TOK_LNOT) ||/* MATCH(awk,TOK_TILDE) ||*/ + MATCH(awk,TOK_LNOT) ||/* MATCH(awk,TOK_TILDE) ||*/ /* increment operators */ MATCH(awk,TOK_PLUSPLUS) || MATCH(awk,TOK_MINUSMINUS) || ((awk->opt.trait & HAWK_TOLERANT) && @@ -4205,11 +4212,11 @@ static hawk_nde_t* parse_concat (hawk_t* awk, const hawk_loc_t* xloc) else break; rloc = awk->tok.loc; - right = parse_additive (awk, &rloc); - if (right == HAWK_NULL) goto oops; + right = parse_additive(awk, &rloc); + if (HAWK_UNLIKELY(!right)) goto oops; - tmp = new_exp_bin_node (awk, xloc, HAWK_BINOP_CONCAT, left, right); - if (tmp == HAWK_NULL) goto oops; + tmp = new_exp_bin_node(awk, xloc, HAWK_BINOP_CONCAT, left, right); + if (HAWK_UNLIKELY(!tmp)) goto oops; left = tmp; right = HAWK_NULL; } while (1); @@ -4262,8 +4269,8 @@ static hawk_nde_t* parse_unary (hawk_t* awk, const hawk_loc_t* xloc) (MATCH(awk,TOK_LNOT))? HAWK_UNROP_LNOT: (MATCH(awk,TOK_TILDE))? HAWK_UNROP_BNOT: -1; - /*if (opcode <= -1) return parse_increment (awk);*/ - if (opcode <= -1) return parse_exponent (awk, xloc); + /*if (opcode <= -1) return parse_increment(awk);*/ + if (opcode <= -1) return parse_exponent(awk, xloc); if (awk->opt.depth.s.expr_parse > 0 && awk->parse.depth.expr >= awk->opt.depth.s.expr_parse) diff --git a/hawk/lib/std.c b/hawk/lib/std.c index c4342ba7..464b7ab2 100644 --- a/hawk/lib/std.c +++ b/hawk/lib/std.c @@ -3081,13 +3081,11 @@ static int add_globals (hawk_t* awk) { xtn_t* xtn = GET_XTN(awk); - xtn->gbl_argc = hawk_addgbl(awk, HAWK_T("ARGC")); - xtn->gbl_argv = hawk_addgbl(awk, HAWK_T("ARGV")); - xtn->gbl_environ = hawk_addgbl(awk, HAWK_T("ENVIRON")); + xtn->gbl_argc = hawk_addgblwithoocstr(awk, HAWK_T("ARGC")); + xtn->gbl_argv = hawk_addgblwithoocstr(awk, HAWK_T("ARGV")); + xtn->gbl_environ = hawk_addgblwithoocstr(awk, HAWK_T("ENVIRON")); - return (xtn->gbl_argc <= -1 || - xtn->gbl_argv <= -1 || - xtn->gbl_environ <= -1)? -1: 0; + return (HAWK_UNLIKELY(xtn->gbl_argc <= -1 || xtn->gbl_argv <= -1 || xtn->gbl_environ <= -1))? -1: 0; } struct fnctab_t