[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gawk-diffs] [SCM] gawk branch, gawk_mpfr, updated. 67db3f45748d22ff23c0
From: |
Arnold Robbins |
Subject: |
[gawk-diffs] [SCM] gawk branch, gawk_mpfr, updated. 67db3f45748d22ff23c03d1887cb0aac341f81bb |
Date: |
Thu, 26 Apr 2012 20:18:43 +0000 |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gawk".
The branch, gawk_mpfr has been updated
via 67db3f45748d22ff23c03d1887cb0aac341f81bb (commit)
from b1062311a3caab9ec89c0f104bd9b4334174f23c (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=67db3f45748d22ff23c03d1887cb0aac341f81bb
commit 67db3f45748d22ff23c03d1887cb0aac341f81bb
Author: Arnold D. Robbins <address@hidden>
Date: Thu Apr 26 23:18:01 2012 +0300
Cleanups in io.c and improve RS as regexp.
diff --git a/ChangeLog b/ChangeLog
index 848ab3b..fc5eed1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2012-04-24 Arnold D. Robbins <address@hidden>
+
+ io.c cleanup and some speedup for RS as regexp parsing.
+
+ * awk.h (Regexp): New members has_meta and maybe_long.
+ (enum redirval): Add redirect_none as value 0.
+ (remaybelong): Remove function declaration.
+ * awkgram.y: Use redirect_none instead of 0 for no redirect cases.
+ * io.c (go_getline_redir): Second arg now of type enum redirval.
+ Changed intovar into into_variable.
+ (comments and whitespace): Lots of general cleanup.
+ (socket_open): readle changed to read_len.
+ (two_way_open): Add additional calls to os_close_on_exec.
+ (rsrescan): Simplify code a bit and use RS->maybe_long.
+ * re.c (make_regexp): Set up new members in Regexp struct.
+ (remaybelong): Remove function.
+ (reisstring): Simplified code.
+
2012-04-16 Eli Zaretskii <address@hidden>
* io.c (read_with_timeout) [__MINGW32__]: Just call the blocking
diff --git a/awk.h b/awk.h
index a4b8761..44fda9d 100644
--- a/awk.h
+++ b/awk.h
@@ -216,6 +216,8 @@ typedef struct Regexp {
short dfa;
short has_anchor; /* speed up of avoid_dfa kludge, temporary */
short non_empty; /* for use in fpat_parse_field */
+ short has_meta; /* re has meta chars so (probably) isn't simple
string */
+ short maybe_long; /* re has meta chars that can match long text */
} Regexp;
#define RESTART(rp,s) (rp)->regs.start[0]
#define REEND(rp,s) (rp)->regs.end[0]
@@ -683,7 +685,8 @@ typedef enum opcodeval {
enum redirval {
/* I/O redirections */
- redirect_output = 1,
+ redirect_none = 0,
+ redirect_output,
redirect_append,
redirect_pipe,
redirect_pipein,
@@ -1532,7 +1535,7 @@ extern int close_io(int *stdio_problem);
extern int devopen(const char *name, const char *mode);
extern int srcopen(SRCFILE *s);
extern char *find_source(const char *src, struct stat *stb, int *errcode, int
is_extlib);
-extern NODE *do_getline_redir(int intovar, int redirtype);
+extern NODE *do_getline_redir(int intovar, enum redirval redirtype);
extern NODE *do_getline(int intovar, IOBUF *iop);
extern struct redirect *getredirect(const char *str, int len);
extern int inrec(IOBUF *iop, int *errcode);
@@ -1631,7 +1634,6 @@ extern void resyntax(int syntax);
extern void resetup(void);
extern int avoid_dfa(NODE *re, char *str, size_t len);
extern int reisstring(const char *text, size_t len, Regexp *re, const char
*buf);
-extern int remaybelong(const char *text, size_t len);
extern int get_numbase(const char *str, int use_locale);
/* symbol.c */
diff --git a/awkgram.c b/awkgram.c
index 07de29e..761b839 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -2039,7 +2039,7 @@ yyreduce:
{
case 3:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 195 "awkgram.y"
{
rule = 0;
@@ -2049,7 +2049,7 @@ yyreduce:
case 5:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 201 "awkgram.y"
{
next_sourcefile();
@@ -2058,7 +2058,7 @@ yyreduce:
case 6:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 205 "awkgram.y"
{
rule = 0;
@@ -2072,7 +2072,7 @@ yyreduce:
case 7:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 217 "awkgram.y"
{
(void) append_rule((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
@@ -2081,7 +2081,7 @@ yyreduce:
case 8:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 221 "awkgram.y"
{
if (rule != Rule) {
@@ -2097,7 +2097,7 @@ yyreduce:
case 9:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 232 "awkgram.y"
{
in_function = NULL;
@@ -2108,7 +2108,7 @@ yyreduce:
case 10:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 238 "awkgram.y"
{
want_source = FALSE;
@@ -2118,7 +2118,7 @@ yyreduce:
case 11:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 246 "awkgram.y"
{
if (include_source((yyvsp[(1) - (1)])) < 0)
@@ -2131,35 +2131,35 @@ yyreduce:
case 12:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 254 "awkgram.y"
{ (yyval) = NULL; }
break;
case 13:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 256 "awkgram.y"
{ (yyval) = NULL; }
break;
case 14:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 261 "awkgram.y"
{ (yyval) = NULL; rule = Rule; }
break;
case 15:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 263 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); rule = Rule; }
break;
case 16:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 265 "awkgram.y"
{
INSTRUCTION *tp;
@@ -2190,7 +2190,7 @@ yyreduce:
case 17:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 291 "awkgram.y"
{
static int begin_seen = 0;
@@ -2206,7 +2206,7 @@ yyreduce:
case 18:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 302 "awkgram.y"
{
static int end_seen = 0;
@@ -2222,7 +2222,7 @@ yyreduce:
case 19:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 313 "awkgram.y"
{
(yyvsp[(1) - (1)])->in_rule = rule = BEGINFILE;
@@ -2233,7 +2233,7 @@ yyreduce:
case 20:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 319 "awkgram.y"
{
(yyvsp[(1) - (1)])->in_rule = rule = ENDFILE;
@@ -2244,7 +2244,7 @@ yyreduce:
case 21:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 328 "awkgram.y"
{
if ((yyvsp[(2) - (5)]) == NULL)
@@ -2256,21 +2256,21 @@ yyreduce:
case 22:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 338 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 23:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 340 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 24:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 342 "awkgram.y"
{
yyerror(_("`%s' is a built-in function, it cannot be
redefined"),
@@ -2281,14 +2281,14 @@ yyreduce:
case 25:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 348 "awkgram.y"
{ (yyval) = (yyvsp[(2) - (2)]); }
break;
case 28:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 358 "awkgram.y"
{
(yyvsp[(1) - (6)])->source_file = source;
@@ -2304,14 +2304,14 @@ yyreduce:
case 29:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 376 "awkgram.y"
{ ++want_regexp; }
break;
case 30:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 378 "awkgram.y"
{
NODE *n, *exp;
@@ -2345,21 +2345,21 @@ yyreduce:
case 31:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 410 "awkgram.y"
{ bcfree((yyvsp[(1) - (1)])); }
break;
case 33:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 416 "awkgram.y"
{ (yyval) = NULL; }
break;
case 34:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 418 "awkgram.y"
{
if ((yyvsp[(2) - (2)]) == NULL)
@@ -2377,28 +2377,28 @@ yyreduce:
case 35:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 431 "awkgram.y"
{ (yyval) = NULL; }
break;
case 38:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 441 "awkgram.y"
{ (yyval) = NULL; }
break;
case 39:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 443 "awkgram.y"
{ (yyval) = (yyvsp[(2) - (3)]); }
break;
case 40:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 445 "awkgram.y"
{
if (do_pretty_print)
@@ -2410,7 +2410,7 @@ yyreduce:
case 41:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 452 "awkgram.y"
{
INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
@@ -2505,7 +2505,7 @@ yyreduce:
case 42:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 542 "awkgram.y"
{
/*
@@ -2552,7 +2552,7 @@ yyreduce:
case 43:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 584 "awkgram.y"
{
/*
@@ -2599,7 +2599,7 @@ yyreduce:
case 44:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 626 "awkgram.y"
{
INSTRUCTION *ip;
@@ -2717,7 +2717,7 @@ regular_loop:
case 45:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 739 "awkgram.y"
{
(yyval) = mk_for_loop((yyvsp[(1) - (12)]), (yyvsp[(3) - (12)]),
(yyvsp[(6) - (12)]), (yyvsp[(9) - (12)]), (yyvsp[(12) - (12)]));
@@ -2729,7 +2729,7 @@ regular_loop:
case 46:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 746 "awkgram.y"
{
(yyval) = mk_for_loop((yyvsp[(1) - (11)]), (yyvsp[(3) - (11)]),
(INSTRUCTION *) NULL, (yyvsp[(8) - (11)]), (yyvsp[(11) - (11)]));
@@ -2741,7 +2741,7 @@ regular_loop:
case 47:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 753 "awkgram.y"
{
if (do_pretty_print)
@@ -2753,7 +2753,7 @@ regular_loop:
case 48:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 763 "awkgram.y"
{
if (! break_allowed)
@@ -2767,7 +2767,7 @@ regular_loop:
case 49:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 772 "awkgram.y"
{
if (! continue_allowed)
@@ -2781,7 +2781,7 @@ regular_loop:
case 50:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 781 "awkgram.y"
{
/* if inside function (rule = 0), resolve context at run-time */
@@ -2795,7 +2795,7 @@ regular_loop:
case 51:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 790 "awkgram.y"
{
if (do_traditional)
@@ -2815,7 +2815,7 @@ regular_loop:
case 52:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 805 "awkgram.y"
{
/* Initialize the two possible jump targets, the actual target
@@ -2835,7 +2835,7 @@ regular_loop:
case 53:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 820 "awkgram.y"
{
if (! in_function)
@@ -2845,7 +2845,7 @@ regular_loop:
case 54:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 823 "awkgram.y"
{
if ((yyvsp[(3) - (4)]) == NULL) {
@@ -2871,14 +2871,14 @@ regular_loop:
case 56:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 855 "awkgram.y"
{ in_print = TRUE; in_parens = 0; }
break;
case 57:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 856 "awkgram.y"
{
/*
@@ -2927,7 +2927,7 @@ regular_loop:
(yyvsp[(1) - (4)])->expr_count = 0;
(yyvsp[(1) - (4)])->opcode = Op_K_print_rec;
if ((yyvsp[(4) - (4)]) == NULL) { /* no redircetion
*/
- (yyvsp[(1) - (4)])->redir_type = 0;
+ (yyvsp[(1) - (4)])->redir_type = redirect_none;
(yyval) = list_create((yyvsp[(1) - (4)]));
} else {
INSTRUCTION *ip;
@@ -2951,12 +2951,12 @@ regular_print:
if ((yyvsp[(4) - (4)]) == NULL) { /* no
redirection */
if ((yyvsp[(3) - (4)]) == NULL) { /*
printf without arg */
(yyvsp[(1) - (4)])->expr_count = 0;
- (yyvsp[(1) - (4)])->redir_type = 0;
+ (yyvsp[(1) - (4)])->redir_type =
redirect_none;
(yyval) = list_create((yyvsp[(1) -
(4)]));
} else {
INSTRUCTION *t = (yyvsp[(3) - (4)]);
(yyvsp[(1) - (4)])->expr_count =
count_expressions(&t, FALSE);
- (yyvsp[(1) - (4)])->redir_type = 0;
+ (yyvsp[(1) - (4)])->redir_type =
redirect_none;
(yyval) = list_append(t, (yyvsp[(1) -
(4)]));
}
} else {
@@ -2980,14 +2980,14 @@ regular_print:
case 58:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 953 "awkgram.y"
{ sub_counter = 0; }
break;
case 59:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 954 "awkgram.y"
{
char *arr = (yyvsp[(2) - (4)])->lextok;
@@ -3017,7 +3017,7 @@ regular_print:
case 60:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 983 "awkgram.y"
{
static short warned = FALSE;
@@ -3041,35 +3041,35 @@ regular_print:
case 61:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1002 "awkgram.y"
{ (yyval) = optimize_assignment((yyvsp[(1) - (1)])); }
break;
case 62:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1007 "awkgram.y"
{ (yyval) = NULL; }
break;
case 63:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1009 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 64:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1014 "awkgram.y"
{ (yyval) = NULL; }
break;
case 65:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1016 "awkgram.y"
{
if ((yyvsp[(1) - (2)]) == NULL)
@@ -3081,14 +3081,14 @@ regular_print:
case 66:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1023 "awkgram.y"
{ (yyval) = NULL; }
break;
case 67:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1028 "awkgram.y"
{
INSTRUCTION *casestmt = (yyvsp[(5) - (5)]);
@@ -3105,7 +3105,7 @@ regular_print:
case 68:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1040 "awkgram.y"
{
INSTRUCTION *casestmt = (yyvsp[(4) - (4)]);
@@ -3121,14 +3121,14 @@ regular_print:
case 69:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1054 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 70:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1056 "awkgram.y"
{
NODE *n = (yyvsp[(2) - (2)])->memory;
@@ -3141,7 +3141,7 @@ regular_print:
case 71:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1064 "awkgram.y"
{
bcfree((yyvsp[(1) - (2)]));
@@ -3151,14 +3151,14 @@ regular_print:
case 72:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1069 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 73:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1071 "awkgram.y"
{
(yyvsp[(1) - (1)])->opcode = Op_push_re;
@@ -3168,21 +3168,21 @@ regular_print:
case 74:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1079 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 75:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1081 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 77:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1091 "awkgram.y"
{
(yyval) = (yyvsp[(2) - (3)]);
@@ -3191,7 +3191,7 @@ regular_print:
case 78:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1098 "awkgram.y"
{
in_print = FALSE;
@@ -3202,14 +3202,14 @@ regular_print:
case 79:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1103 "awkgram.y"
{ in_print = FALSE; in_parens = 0; }
break;
case 80:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1104 "awkgram.y"
{
if ((yyvsp[(1) - (3)])->redir_type == redirect_twoway
@@ -3222,7 +3222,7 @@ regular_print:
case 81:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1115 "awkgram.y"
{
(yyval) = mk_condition((yyvsp[(3) - (6)]), (yyvsp[(1) - (6)]),
(yyvsp[(6) - (6)]), NULL, NULL);
@@ -3231,7 +3231,7 @@ regular_print:
case 82:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1120 "awkgram.y"
{
(yyval) = mk_condition((yyvsp[(3) - (9)]), (yyvsp[(1) - (9)]),
(yyvsp[(6) - (9)]), (yyvsp[(7) - (9)]), (yyvsp[(9) - (9)]));
@@ -3240,14 +3240,14 @@ regular_print:
case 87:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1137 "awkgram.y"
{ (yyval) = NULL; }
break;
case 88:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1139 "awkgram.y"
{
bcfree((yyvsp[(1) - (2)]));
@@ -3257,21 +3257,21 @@ regular_print:
case 89:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1147 "awkgram.y"
{ (yyval) = NULL; }
break;
case 90:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1149 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]) ; }
break;
case 91:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1154 "awkgram.y"
{
(yyvsp[(1) - (1)])->param_count = 0;
@@ -3281,7 +3281,7 @@ regular_print:
case 92:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1159 "awkgram.y"
{
(yyvsp[(3) - (3)])->param_count = (yyvsp[(1) -
(3)])->lasti->param_count + 1;
@@ -3292,63 +3292,63 @@ regular_print:
case 93:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1165 "awkgram.y"
{ (yyval) = NULL; }
break;
case 94:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1167 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (2)]); }
break;
case 95:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1169 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (3)]); }
break;
case 96:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1175 "awkgram.y"
{ (yyval) = NULL; }
break;
case 97:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1177 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 98:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1182 "awkgram.y"
{ (yyval) = NULL; }
break;
case 99:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1184 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 100:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1189 "awkgram.y"
{ (yyval) = mk_expression_list(NULL, (yyvsp[(1) - (1)])); }
break;
case 101:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1191 "awkgram.y"
{
(yyval) = mk_expression_list((yyvsp[(1) - (3)]), (yyvsp[(3) -
(3)]));
@@ -3358,35 +3358,35 @@ regular_print:
case 102:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1196 "awkgram.y"
{ (yyval) = NULL; }
break;
case 103:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1198 "awkgram.y"
{ (yyval) = NULL; }
break;
case 104:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1200 "awkgram.y"
{ (yyval) = NULL; }
break;
case 105:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1202 "awkgram.y"
{ (yyval) = NULL; }
break;
case 106:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1208 "awkgram.y"
{
if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode ==
Op_match_rec)
@@ -3398,21 +3398,21 @@ regular_print:
case 107:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1215 "awkgram.y"
{ (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2)
- (3)])); }
break;
case 108:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1217 "awkgram.y"
{ (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2)
- (3)])); }
break;
case 109:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1219 "awkgram.y"
{
if ((yyvsp[(1) - (3)])->lasti->opcode == Op_match_rec)
@@ -3433,7 +3433,7 @@ regular_print:
case 110:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1235 "awkgram.y"
{
if (do_lint_old)
@@ -3448,7 +3448,7 @@ regular_print:
case 111:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1245 "awkgram.y"
{
if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode ==
Op_match_rec)
@@ -3460,35 +3460,35 @@ regular_print:
case 112:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1252 "awkgram.y"
{ (yyval) = mk_condition((yyvsp[(1) - (5)]), (yyvsp[(2) - (5)]),
(yyvsp[(3) - (5)]), (yyvsp[(4) - (5)]), (yyvsp[(5) - (5)])); }
break;
case 113:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1254 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 114:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1259 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 115:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1261 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 116:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1263 "awkgram.y"
{
(yyvsp[(2) - (2)])->opcode = Op_assign_quotient;
@@ -3498,49 +3498,49 @@ regular_print:
case 117:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1271 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 118:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1273 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 119:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1278 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 120:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1280 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 121:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1285 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 122:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1287 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 123:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1289 "awkgram.y"
{
int count = 2;
@@ -3592,49 +3592,49 @@ regular_print:
case 125:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1341 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) -
(3)])); }
break;
case 126:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1343 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) -
(3)])); }
break;
case 127:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1345 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) -
(3)])); }
break;
case 128:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1347 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) -
(3)])); }
break;
case 129:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1349 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) -
(3)])); }
break;
case 130:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1351 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) -
(3)])); }
break;
case 131:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1353 "awkgram.y"
{
/*
@@ -3662,7 +3662,7 @@ regular_print:
case 132:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1376 "awkgram.y"
{
(yyvsp[(2) - (2)])->opcode = Op_postincrement;
@@ -3672,7 +3672,7 @@ regular_print:
case 133:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1381 "awkgram.y"
{
(yyvsp[(2) - (2)])->opcode = Op_postdecrement;
@@ -3682,7 +3682,7 @@ regular_print:
case 134:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1386 "awkgram.y"
{
if (do_lint_old) {
@@ -3707,7 +3707,7 @@ regular_print:
case 135:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1411 "awkgram.y"
{
(yyval) = mk_getline((yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]),
(yyvsp[(1) - (4)]), (yyvsp[(2) - (4)])->redir_type);
@@ -3717,49 +3717,49 @@ regular_print:
case 136:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1417 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) -
(3)])); }
break;
case 137:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1419 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) -
(3)])); }
break;
case 138:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1421 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) -
(3)])); }
break;
case 139:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1423 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) -
(3)])); }
break;
case 140:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1425 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) -
(3)])); }
break;
case 141:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1427 "awkgram.y"
{ (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) -
(3)])); }
break;
case 142:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1432 "awkgram.y"
{
(yyval) = list_create((yyvsp[(1) - (1)]));
@@ -3768,7 +3768,7 @@ regular_print:
case 143:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1436 "awkgram.y"
{
if ((yyvsp[(2) - (2)])->opcode == Op_match_rec) {
@@ -3805,14 +3805,14 @@ regular_print:
case 144:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1468 "awkgram.y"
{ (yyval) = (yyvsp[(2) - (3)]); }
break;
case 145:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1470 "awkgram.y"
{
(yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)]));
@@ -3823,7 +3823,7 @@ regular_print:
case 146:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1476 "awkgram.y"
{
(yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)]));
@@ -3834,7 +3834,7 @@ regular_print:
case 147:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1482 "awkgram.y"
{
static short warned1 = FALSE;
@@ -3852,7 +3852,7 @@ regular_print:
case 150:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1497 "awkgram.y"
{
(yyvsp[(1) - (2)])->opcode = Op_preincrement;
@@ -3862,7 +3862,7 @@ regular_print:
case 151:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1502 "awkgram.y"
{
(yyvsp[(1) - (2)])->opcode = Op_predecrement;
@@ -3872,7 +3872,7 @@ regular_print:
case 152:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1507 "awkgram.y"
{
(yyval) = list_create((yyvsp[(1) - (1)]));
@@ -3881,7 +3881,7 @@ regular_print:
case 153:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1511 "awkgram.y"
{
(yyval) = list_create((yyvsp[(1) - (1)]));
@@ -3890,7 +3890,7 @@ regular_print:
case 154:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1515 "awkgram.y"
{
if ((yyvsp[(2) - (2)])->lasti->opcode == Op_push_i
@@ -3910,7 +3910,7 @@ regular_print:
case 155:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1530 "awkgram.y"
{
/*
@@ -3925,7 +3925,7 @@ regular_print:
case 156:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1543 "awkgram.y"
{
func_use((yyvsp[(1) - (1)])->lasti->func_name, FUNC_USE);
@@ -3935,7 +3935,7 @@ regular_print:
case 157:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1548 "awkgram.y"
{
/* indirect function call */
@@ -3973,7 +3973,7 @@ regular_print:
case 158:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1584 "awkgram.y"
{
param_sanity((yyvsp[(3) - (4)]));
@@ -3992,42 +3992,42 @@ regular_print:
case 159:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1601 "awkgram.y"
{ (yyval) = NULL; }
break;
case 160:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1603 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 161:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1608 "awkgram.y"
{ (yyval) = NULL; }
break;
case 162:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1610 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (2)]); }
break;
case 163:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1615 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 164:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1617 "awkgram.y"
{
(yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
@@ -4036,7 +4036,7 @@ regular_print:
case 165:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1624 "awkgram.y"
{
INSTRUCTION *ip = (yyvsp[(1) - (1)])->lasti;
@@ -4055,7 +4055,7 @@ regular_print:
case 166:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1641 "awkgram.y"
{
INSTRUCTION *t = (yyvsp[(2) - (3)]);
@@ -4074,14 +4074,14 @@ regular_print:
case 167:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1658 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); }
break;
case 168:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1660 "awkgram.y"
{
(yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
@@ -4090,14 +4090,14 @@ regular_print:
case 169:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1667 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (2)]); }
break;
case 170:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1672 "awkgram.y"
{
char *var_name = (yyvsp[(1) - (1)])->lextok;
@@ -4110,7 +4110,7 @@ regular_print:
case 171:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1680 "awkgram.y"
{
char *arr = (yyvsp[(1) - (2)])->lextok;
@@ -4122,7 +4122,7 @@ regular_print:
case 172:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1690 "awkgram.y"
{
INSTRUCTION *ip = (yyvsp[(1) - (1)])->nexti;
@@ -4139,7 +4139,7 @@ regular_print:
case 173:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1702 "awkgram.y"
{
(yyval) = list_append((yyvsp[(2) - (3)]), (yyvsp[(1) - (3)]));
@@ -4150,7 +4150,7 @@ regular_print:
case 174:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1711 "awkgram.y"
{
(yyvsp[(1) - (1)])->opcode = Op_postincrement;
@@ -4159,7 +4159,7 @@ regular_print:
case 175:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1715 "awkgram.y"
{
(yyvsp[(1) - (1)])->opcode = Op_postdecrement;
@@ -4168,49 +4168,49 @@ regular_print:
case 176:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1718 "awkgram.y"
{ (yyval) = NULL; }
break;
case 178:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1726 "awkgram.y"
{ yyerrok; }
break;
case 179:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1730 "awkgram.y"
{ yyerrok; }
break;
case 182:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1739 "awkgram.y"
{ yyerrok; }
break;
case 183:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1743 "awkgram.y"
{ (yyval) = (yyvsp[(1) - (1)]); yyerrok; }
break;
case 184:
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 1747 "awkgram.y"
{ yyerrok; }
break;
-/* Line 1821 of yacc.c */
+/* Line 1806 of yacc.c */
#line 4227 "awkgram.c"
default: break;
}
@@ -7773,7 +7773,7 @@ mk_getline(INSTRUCTION *op, INSTRUCTION *var, INSTRUCTION
*redir, int redirtype)
else
ip = list_create(op);
op->into_var = (var != NULL);
- op->redir_type = (redir != NULL) ? redirtype : 0;
+ op->redir_type = (redir != NULL) ? redirtype : redirect_none;
return (asgn == NULL ? ip : list_append(ip, asgn));
}
diff --git a/awkgram.y b/awkgram.y
index 73c45f6..22d8889 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -900,7 +900,7 @@ simple_stmt
$1->expr_count = 0;
$1->opcode = Op_K_print_rec;
if ($4 == NULL) { /* no redircetion */
- $1->redir_type = 0;
+ $1->redir_type = redirect_none;
$$ = list_create($1);
} else {
INSTRUCTION *ip;
@@ -924,12 +924,12 @@ regular_print:
if ($4 == NULL) { /* no redirection */
if ($3 == NULL) { /* printf without arg */
$1->expr_count = 0;
- $1->redir_type = 0;
+ $1->redir_type = redirect_none;
$$ = list_create($1);
} else {
INSTRUCTION *t = $3;
$1->expr_count = count_expressions(&t,
FALSE);
- $1->redir_type = 0;
+ $1->redir_type = redirect_none;
$$ = list_append(t, $1);
}
} else {
@@ -5076,7 +5076,7 @@ mk_getline(INSTRUCTION *op, INSTRUCTION *var, INSTRUCTION
*redir, int redirtype)
else
ip = list_create(op);
op->into_var = (var != NULL);
- op->redir_type = (redir != NULL) ? redirtype : 0;
+ op->redir_type = (redir != NULL) ? redirtype : redirect_none;
return (asgn == NULL ? ip : list_append(ip, asgn));
}
diff --git a/io.c b/io.c
index 721b1ab..7e46cd9 100644
--- a/io.c
+++ b/io.c
@@ -72,11 +72,15 @@
#include <netdb.h>
#endif /* HAVE_NETDB_H */
+#if defined(HAVE_POPEN_H)
+#include "popen.h"
+#endif
+
#ifndef HAVE_GETADDRINFO
#include "missing_d/getaddrinfo.h"
#endif
-#ifndef AI_ADDRCONFIG /* This is a recent symbol, not everyone has it */
+#ifndef AI_ADDRCONFIG /* not everyone has this symbol */
#define AI_ADDRCONFIG 0
#endif /* AI_ADDRCONFIG */
@@ -142,44 +146,47 @@
typedef enum { CLOSE_ALL, CLOSE_TO, CLOSE_FROM } two_way_close_type;
-/* Several macros make the code a bit clearer: */
-/* */
-/* */
-/* <defines and enums>= */
+/* Several macros to make the code a bit clearer. */
#define at_eof(iop) (((iop)->flag & IOP_AT_EOF) != 0)
#define has_no_data(iop) ((iop)->dataend == NULL)
#define no_data_left(iop) ((iop)->off >= (iop)->dataend)
-/* The key point to the design is to split out the code that searches through
*/
-/* a buffer looking for the record and the terminator into separate routines,
*/
-/* with a higher-level routine doing the reading of data and buffer
management. */
-/* This makes the code easier to manage; the buffering code is the same
independent */
-/* of how we find a record. Communication is via the return value: */
-/* */
-/* */
-/* <defines and enums>= */
+
+/*
+ * The key point to the design is to split out the code that searches through
+ * a buffer looking for the record and the terminator into separate routines,
+ * with a higher-level routine doing the reading of data and buffer management.
+ * This makes the code easier to manage; the buffering code is the same
+ * independent of how we find a record. Communication is via the return
+ * value:
+ */
+
typedef enum recvalues {
REC_OK, /* record and terminator found, recmatch struct filled
in */
NOTERM, /* no terminator found, give me more input data */
TERMATEND, /* found terminator at end of buffer */
- TERMNEAREND /* found terminator close to end of buffer, for RE
might be bigger */
+ TERMNEAREND /* found terminator close to end of buffer, for when
+ the RE might be match more data further in
+ the file. */
} RECVALUE;
-/* Between calls to a scanning routine, the state is stored in */
-/* an [[enum scanstate]] variable. Not all states apply to all */
-/* variants, but the higher code doesn't really care. */
-/* */
-/* */
-/* <defines and enums>= */
+
+/*
+ * Between calls to a scanning routine, the state is stored in
+ * an enum scanstate variable. Not all states apply to all
+ * variants, but the higher code doesn't really care.
+ */
+
typedef enum scanstate {
NOSTATE, /* scanning not started yet (all) */
INLEADER, /* skipping leading data (RS = "") */
INDATA, /* in body of record (all) */
INTERM /* scanning terminator (RS = "", RS = regexp) */
} SCANSTATE;
-/* When a record is seen ([[REC_OK]] or [[TERMATEND]]), the following */
-/* structure is filled in. */
-/* */
-/* */
-/* <recmatch>= */
+
+/*
+ * When a record is seen (REC_OK or TERMATEND), the following
+ * structure is filled in.
+ */
+
struct recmatch {
char *start; /* record start */
size_t len; /* length of record */
@@ -218,28 +225,21 @@ static NODE *in_PROCINFO(const char *pidx1, const char
*pidx2, NODE **full_idx);
static long get_read_timeout(IOBUF *iop);
static ssize_t read_with_timeout(int fd, char *buf, size_t size);
-#if defined(HAVE_POPEN_H)
-#include "popen.h"
-#endif
-
static int read_can_timeout = FALSE;
static long read_timeout;
static long read_default_timeout;
static struct redirect *red_head = NULL;
static NODE *RS = NULL;
-static Regexp *RS_re_yes_case;
-static Regexp *RS_re_no_case;
+static Regexp *RS_re_yes_case; /* regexp for RS when ignoring case */
+static Regexp *RS_re_no_case; /* regexp for RS when not ignoring case */
static Regexp *RS_regexp;
int RS_is_null;
-extern int output_is_tty;
extern NODE *ARGC_node;
extern NODE *ARGV_node;
extern NODE *ARGIND_node;
-extern NODE *ERRNO_node;
-extern NODE **fields_arr;
/* init_io --- set up timeout related variables */
@@ -301,6 +301,8 @@ static int vmsrtl_fileno(fp) FILE *fp; { return fileno(fp);
}
#define fileno(FP) (((FP) && *(FP)) ? vmsrtl_fileno(FP) : -1)
#endif /* VMS */
+/* after_beginfile --- reset necessary state after BEGINFILE has run */
+
void
after_beginfile(IOBUF **curfile)
{
@@ -347,14 +349,14 @@ nextfile(IOBUF **curfile, int skipping)
static IOBUF mybuf;
const char *fname;
int fd = INVALID_HANDLE;
- int errcode;
+ int errcode = 0;
IOBUF *iop = *curfile;
long argc;
if (skipping) { /* for 'nextfile' call */
errcode = 0;
if (iop != NULL) {
- errcode = iop->errcode;
+ errcode = iop->errcode;
(void) iop_close(iop);
}
*curfile = NULL;
@@ -396,7 +398,6 @@ nextfile(IOBUF **curfile, int skipping)
if (! do_traditional)
update_ERRNO();
- /* This is a kludge. */
unref(FILENAME_node->var_value);
FILENAME_node->var_value = dupnode(arg);
#ifdef HAVE_MPFR
@@ -404,7 +405,7 @@ nextfile(IOBUF **curfile, int skipping)
mpz_set_ui(MFNR, 0);
#endif
FNR = 0;
- iop = *curfile = iop_alloc(fd, fname, &mybuf, FALSE);
+ iop = *curfile = iop_alloc(fd, fname, & mybuf, FALSE);
if (fd == INVALID_HANDLE)
iop->errcode = errcode;
else
@@ -425,7 +426,7 @@ nextfile(IOBUF **curfile, int skipping)
FILENAME_node->var_value = make_string("-", 1);
FILENAME_node->var_value->flags |= MAYBE_NUM; /* be pedantic */
fname = "-";
- iop = *curfile = iop_alloc(fileno(stdin), fname, &mybuf, FALSE);
+ iop = *curfile = iop_alloc(fileno(stdin), fname, & mybuf,
FALSE);
iop->flag |= IOP_NOFREE_OBJ;
if (iop->fd == INVALID_HANDLE) {
@@ -487,7 +488,7 @@ inrec(IOBUF *iop, int *errcode)
else if ((iop->flag & IOP_CLOSED) != 0)
cnt = EOF;
else
- cnt = get_a_record(&begin, iop, errcode);
+ cnt = get_a_record(& begin, iop, errcode);
if (cnt == EOF) {
retval = 1;
@@ -518,7 +519,7 @@ remap_std_file(int oldfd)
if (newfd == INVALID_HANDLE)
newfd = open("/dev/null", O_RDWR);
if (newfd >= 0) {
- /* dup2() will close oldfd for us first. */
+ /* if oldfd is open, dup2() will close oldfd for us first. */
ret = dup2(newfd, oldfd);
if (ret == 0)
close(newfd);
@@ -561,7 +562,7 @@ iop_close(IOBUF *iop)
ret = close(iop->fd);
if (iop->close_func != NULL)
- (*iop->close_func)(iop);
+ iop->close_func(iop);
if (ret == -1)
warning(_("close of fd %d (`%s') failed (%s)"), iop->fd,
@@ -581,7 +582,7 @@ iop_close(IOBUF *iop)
unref(fields_arr[0]);
fields_arr[0] = t;
/*
- * 1/27/2003: This used to be here:
+ * This used to be here:
*
* reset_record();
*
@@ -689,11 +690,11 @@ redirect(NODE *redir_exp, int redirtype, int *errflg)
lintwarn(_("filename `%s' for `%s' redirection may be result of
logical expression"),
str, what);
+#ifdef HAVE_SOCKETS
/*
- * XXX: Use /inet4 and /inet6 with plain /inet being whatever
- * we get back from the system.
+ * Use /inet4 to force IPv4, /inet6 to force IPv6, and plain
+ * /inet will be whatever we get back from the system.
*/
-#ifdef HAVE_SOCKETS
if (inetfile(str, & len, NULL)) {
tflag |= RED_SOCKET;
if (strncmp(str + len, "tcp/", 4) == 0)
@@ -709,7 +710,7 @@ redirect(NODE *redir_exp, int redirtype, int *errflg)
* if at all possible. Messing with signal() for
* SIGCLD leads to lots of headaches. However, if
* we've gotten EOF from a child input pipeline, it's
- * good bet that the child has died. So recover it.
+ * a good bet that the child has died. So recover it.
*/
if ((rp->flag & RED_EOF) && redirtype == redirect_pipein) {
if (rp->pid != -1)
@@ -759,7 +760,7 @@ redirect(NODE *redir_exp, int redirtype, int *errflg)
while (rp->fp == NULL && rp->iop == NULL) {
if (! new_rp && rp->flag & RED_EOF) {
/*
- * encountered EOF on file or pipe -- must be cleared
+ * Encountered EOF on file or pipe -- must be cleared
* by explicit close() before reading more
*/
save_rp = NULL;
@@ -869,7 +870,7 @@ redirect(NODE *redir_exp, int redirtype, int *errflg)
/* too many files open -- close one and try again */
if (errno == EMFILE || errno == ENFILE)
close_one();
-#if defined __MINGW32__ || defined __sun
+#if defined __MINGW32__
else if (errno == 0) /* HACK! */
close_one();
#endif
@@ -892,9 +893,8 @@ redirect(NODE *redir_exp, int redirtype, int *errflg)
*/
if (errflg != NULL)
*errflg = errno;
- if (redirtype == redirect_output
- || redirtype == redirect_append
- ) {
+ if ( redirtype == redirect_output
+ || redirtype == redirect_append) {
/* multiple messages make life easier
for translators */
if (*direction == 'f')
fatal(_("can't redirect from
`%s' (%s)"),
@@ -966,7 +966,7 @@ close_one()
if ((rp->flag & (RED_FILE|RED_WRITE)) == (RED_FILE|RED_WRITE)) {
rp->flag |= RED_USED;
errno = 0;
- if (/* do_lint && */ fclose(rp->fp) != 0)
+ if (fclose(rp->fp) != 0)
warning(_("close of `%s' failed (%s)."),
rp->value, strerror(errno));
rp->fp = NULL;
@@ -1039,7 +1039,7 @@ do_close(int nargs)
*/
if (do_posix) {
unref(tmp);
- return make_number((AWKNUM) 0);
+ tmp = make_number((AWKNUM) 0);
}
return tmp;
}
@@ -1081,7 +1081,8 @@ close_rp(struct redirect *rp, two_way_close_type how)
rp->iop = NULL;
}
- } else if ((rp->flag & (RED_PIPE|RED_WRITE)) == (RED_PIPE|RED_WRITE)) {
/* write to pipe */
+ } else if ((rp->flag & (RED_PIPE|RED_WRITE)) == (RED_PIPE|RED_WRITE)) {
+ /* write to pipe */
status = pclose(rp->fp);
if ((BINMODE & 1) != 0)
os_setbinmode(fileno(stdin), O_BINARY);
@@ -1121,14 +1122,15 @@ close_redir(struct redirect *rp, int exitwarn,
two_way_close_type how)
status = close_rp(rp, how);
- /* SVR4 awk checks and warns about status of close */
if (status != 0) {
int save_errno = errno;
char *s = strerror(save_errno);
/*
- * Too many people have complained about this.
- * As of 2.15.6, it is now under lint control.
+ * BWK's awk, as far back as SVR4 (1989) would check
+ * and warn about the status of close. However, when
+ * we did this we got too many complaints, so we moved
+ * it to be under lint control.
*/
if (do_lint) {
if ((rp->flag & RED_PIPE) != 0)
@@ -1233,7 +1235,7 @@ close_io(int *stdio_problem)
for (rp = red_head; rp != NULL; rp = next) {
next = rp->next;
/*
- * close_redir() will print a message if needed
+ * close_redir() will print a message if needed.
* if do_lint, warn about lack of explicit close
*/
if (close_redir(rp, do_lint, CLOSE_ALL))
@@ -1241,7 +1243,7 @@ close_io(int *stdio_problem)
rp = NULL;
}
/*
- * Some of the non-Unix os's have problems doing an fclose
+ * Some of the non-Unix os's have problems doing an fclose()
* on stdout and stderr. Since we don't really need to close
* them, we just flush them, and do that across the board.
*/
@@ -1311,34 +1313,34 @@ socketopen(int family, int type, const char *localpname,
struct addrinfo *rres, *rres0;
struct addrinfo rhints;
- int lerror;
- int rerror;
+ int lerror, rerror;
int socket_fd = INVALID_HANDLE;
int any_remote_host = (strcmp(remotehostname, "0") == 0);
- memset (&lhints, '\0', sizeof (lhints));
+ memset(& lhints, '\0', sizeof (lhints));
lhints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
lhints.ai_socktype = type;
lhints.ai_family = family;
- lerror = getaddrinfo (NULL, localpname, &lhints, &lres);
+ lerror = getaddrinfo(NULL, localpname, & lhints, & lres);
if (lerror) {
if (strcmp(localpname, "0") != 0)
fatal(_("local port %s invalid in `/inet'"),
localpname);
lres0 = NULL;
- lres = &lhints;
+ lres = & lhints;
} else
lres0 = lres;
while (lres != NULL) {
- memset (&rhints, '\0', sizeof (rhints));
+ memset (& rhints, '\0', sizeof (rhints));
rhints.ai_flags = lhints.ai_flags;
rhints.ai_socktype = lhints.ai_socktype;
rhints.ai_family = lhints.ai_family;
rhints.ai_protocol = lhints.ai_protocol;
- rerror = getaddrinfo (any_remote_host ? NULL : remotehostname,
remotepname, &rhints, &rres);
+ rerror = getaddrinfo(any_remote_host ? NULL : remotehostname,
+ remotepname, & rhints, & rres);
if (rerror) {
if (lres0 != NULL)
freeaddrinfo(lres0);
@@ -1362,7 +1364,8 @@ socketopen(int family, int type, const char *localpname,
(char *) & on, sizeof(on));
#ifdef SO_LINGER
linger.l_onoff = 1;
- linger.l_linger = 30; /* linger for 30/100
second */
+ /* linger for 30/100 second */
+ linger.l_linger = 30;
setsockopt(socket_fd, SOL_SOCKET, SO_LINGER,
(char *) & linger, sizeof(linger));
#endif
@@ -1378,12 +1381,12 @@ socketopen(int family, int type, const char *localpname,
int clientsocket_fd = INVALID_HANDLE;
struct sockaddr_storage remote_addr;
- socklen_t namelen = sizeof
(remote_addr);
+ socklen_t namelen = sizeof(remote_addr);
if (listen(socket_fd, 1) >= 0
&& (clientsocket_fd =
accept(socket_fd,
- (struct sockaddr *)
&remote_addr,
- &namelen)) >= 0) {
+ (struct sockaddr *) &
remote_addr,
+ & namelen)) >= 0) {
close(socket_fd);
socket_fd = clientsocket_fd;
break;
@@ -1392,15 +1395,15 @@ socketopen(int family, int type, const char *localpname,
#ifdef MSG_PEEK
char buf[10];
struct sockaddr_storage remote_addr;
- socklen_t readle;
+ socklen_t read_len;
if (recvfrom(socket_fd, buf, 1,
MSG_PEEK,
(struct sockaddr *) &
remote_addr,
- & readle) >= 0
- && readle
+ & read_len) >= 0
+ && read_len
&& connect(socket_fd,
- (struct sockaddr *)&
remote_addr,
- readle) == 0)
+ (struct sockaddr *) &
remote_addr,
+ read_len) == 0)
break;
#endif
}
@@ -1441,11 +1444,10 @@ devopen(const char *name, const char *mode)
int len;
int family;
- flag = str2mode(mode);
-
if (strcmp(name, "-") == 0)
return fileno(stdin);
+ flag = str2mode(mode);
openfd = INVALID_HANDLE;
if (do_traditional)
@@ -1469,9 +1471,9 @@ devopen(const char *name, const char *mode)
struct stat sbuf;
cp += 3;
- openfd = (int) strtoul(cp, &ptr, 10);
+ openfd = (int) strtoul(cp, & ptr, 10);
if (openfd <= INVALID_HANDLE || ptr == cp
- || fstat(openfd, &sbuf) < 0)
+ || fstat(openfd, & sbuf) < 0)
openfd = INVALID_HANDLE;
}
/* do not set close-on-exec for inherited fd's */
@@ -1534,7 +1536,7 @@ devopen(const char *name, const char *mode)
cp++;
/*
* The remote port ends the special file name.
- * This means there already is a 0 at the end of the string.
+ * This means there already is a '\0' at the end of the string.
* Therefore no need to patch any string ending.
*
* Here too, require a port, let them explicitly put 0 if
@@ -1548,48 +1550,48 @@ devopen(const char *name, const char *mode)
{
#define DEFAULT_RETRIES 20
- static unsigned long def_retries = DEFAULT_RETRIES;
- static int first_time = TRUE;
- unsigned long retries = 0;
- static long msleep = 1000;
-
- if (first_time) {
- char *cp, *end;
- unsigned long count = 0;
- char *ms2;
-
- first_time = FALSE;
- if ((cp = getenv("GAWK_SOCK_RETRIES")) != NULL)
{
- count = strtoul(cp, &end, 10);
- if (end != cp && count > 0)
- def_retries = count;
- }
-
- /*
- * Env var is in milliseconds, paramter to
usleep()
- * is microseconds, make the conversion.
Default is
- * 1 millisecond.
- */
- if ((ms2 = getenv("GAWK_MSEC_SLEEP")) != NULL) {
- msleep = strtol(ms2, &end, 10);
- if (end == ms2 || msleep < 0)
- msleep = 1000;
- else
- msleep *= 1000;
- }
+ static unsigned long def_retries = DEFAULT_RETRIES;
+ static int first_time = TRUE;
+ unsigned long retries = 0;
+ static long msleep = 1000;
+
+ if (first_time) {
+ char *cp, *end;
+ unsigned long count = 0;
+ char *ms2;
+
+ first_time = FALSE;
+ if ((cp = getenv("GAWK_SOCK_RETRIES")) != NULL) {
+ count = strtoul(cp, & end, 10);
+ if (end != cp && count > 0)
+ def_retries = count;
}
- retries = def_retries;
- do {
- openfd = socketopen(family, protocol,
localpname, cp, hostname);
- retries--;
- } while (openfd == INVALID_HANDLE && retries > 0 &&
usleep(msleep) == 0);
+ /*
+ * Env var is in milliseconds, paramter to usleep()
+ * is microseconds, make the conversion. Default is
+ * 1 millisecond.
+ */
+ if ((ms2 = getenv("GAWK_MSEC_SLEEP")) != NULL) {
+ msleep = strtol(ms2, & end, 10);
+ if (end == ms2 || msleep < 0)
+ msleep = 1000;
+ else
+ msleep *= 1000;
+ }
}
+ retries = def_retries;
- *localpnamelastcharp = '/';
- *hostnameslastcharp = '/';
+ do {
+ openfd = socketopen(family, protocol, localpname, cp,
hostname);
+ retries--;
+ } while (openfd == INVALID_HANDLE && retries > 0 &&
usleep(msleep) == 0);
+ }
+
+ *localpnamelastcharp = '/';
+ *hostnameslastcharp = '/';
#else /* ! HAVE_SOCKETS */
- fatal(_("TCP/IP communications are not supported"));
+ fatal(_("TCP/IP communications are not supported"));
#endif /* HAVE_SOCKETS */
}
@@ -1601,8 +1603,8 @@ strictopen:
/* on OS/2 directory access via open() is not permitted */
struct stat buf;
- if (stat(name, &buf) == 0 && S_ISDIR(buf.st_mode))
- errno = EISDIR;
+ if (stat(name, & buf) == 0 && S_ISDIR(buf.st_mode))
+ errno = EISDIR;
}
#endif
if (openfd != INVALID_HANDLE) {
@@ -1648,9 +1650,11 @@ two_way_open(const char *str, struct redirect *rp)
fclose(rp->fp);
return FALSE;
}
+ os_close_on_exec(fd, str, "socket", "to/from");
os_close_on_exec(newfd, str, "socket", "to/from");
rp->iop = iop_alloc(newfd, str, NULL, TRUE);
if (rp->iop == NULL) {
+ close(newfd);
fclose(rp->fp);
return FALSE;
}
@@ -1675,20 +1679,20 @@ two_way_open(const char *str, struct redirect *rp)
pid_t pid;
struct stat statb;
struct termios st;
- /* Use array of chars to avoid ascii / ebcdic issues */
+ /* Use array of chars to avoid ASCII / EBCDIC issues */
static char pty_chars[] = "pqrstuvwxyzabcdefghijklmno";
int i;
if (! initialized) {
initialized = TRUE;
#ifdef HAVE_GRANTPT
- have_dev_ptmx = (stat("/dev/ptmx", &statb) >= 0);
+ have_dev_ptmx = (stat("/dev/ptmx", & statb) >= 0);
#endif
i = 0;
do {
c = pty_chars[i++];
sprintf(slavenam, "/dev/pty%c0", c);
- if (stat(slavenam, &statb) >= 0) {
+ if (stat(slavenam, & statb) >= 0) {
first_pty_letter = c;
break;
}
@@ -1716,8 +1720,9 @@ two_way_open(const char *str, struct redirect *rp)
if (first_pty_letter) {
/*
* Assume /dev/ptyXNN and /dev/ttyXN naming system.
- * The FIRST_PTY_LETTER gives the first X to try. We
try in the
- * sequence FIRST_PTY_LETTER, .., 'z', 'a', ..,
FIRST_PTY_LETTER.
+ * The FIRST_PTY_LETTER gives the first X to try.
+ * We try in the sequence FIRST_PTY_LETTER, ..,
+ * 'z', 'a', .., FIRST_PTY_LETTER.
* Is this worthwhile, or just over-zealous?
*/
c = first_pty_letter;
@@ -1727,7 +1732,7 @@ two_way_open(const char *str, struct redirect *rp)
for (i = 0; i < 16; i++) {
sprintf(slavenam, "/dev/pty%c%x", c, i);
- if (stat(slavenam, &statb) < 0) {
+ if (stat(slavenam, & statb) < 0) {
no_ptys = TRUE; /* bypass all
this next time */
goto use_pipes;
}
@@ -1769,7 +1774,7 @@ two_way_open(const char *str, struct redirect *rp)
ioctl(slave, I_PUSH, "ldterm");
#endif
- tcgetattr(slave, &st);
+ tcgetattr(slave, & st);
st.c_iflag &= ~(ISTRIP | IGNCR | INLCR | IXOFF);
st.c_iflag |= (ICRNL | IGNPAR | BRKINT | IXON);
st.c_oflag &= ~OPOST;
@@ -1777,10 +1782,6 @@ two_way_open(const char *str, struct redirect *rp)
st.c_cflag |= CREAD | CS8 | CLOCAL;
st.c_lflag &= ~(ECHO | ECHOE | ECHOK | NOFLSH | TOSTOP);
st.c_lflag |= ISIG;
-#if 0
- st.c_cc[VMIN] = 1;
- st.c_cc[VTIME] = 0;
-#endif
/* Set some control codes to default values */
#ifdef VINTR
@@ -1798,9 +1799,9 @@ two_way_open(const char *str, struct redirect *rp)
#ifdef VEOF
st.c_cc[VEOF] = '\004'; /* ^d */
#endif
- tcsetattr(slave, TCSANOW, &st);
+ tcsetattr(slave, TCSANOW, & st);
- switch (pid = fork ()) {
+ switch (pid = fork()) {
case 0:
/* Child process */
setsid();
@@ -1840,9 +1841,9 @@ two_way_open(const char *str, struct redirect *rp)
}
/* parent */
- if (close(slave)) {
+ if (close(slave) != 0) {
close(master);
- (void) kill(pid, SIGKILL); /* overkill? (pardon
pun) */
+ (void) kill(pid, SIGKILL);
fatal(_("close of slave pty failed (%s)"),
strerror(errno));
}
@@ -1850,7 +1851,7 @@ two_way_open(const char *str, struct redirect *rp)
rp->iop = iop_alloc(master, str, NULL, TRUE);
if (rp->iop == NULL) {
(void) close(master);
- (void) kill(pid, SIGKILL); /* overkill? (pardon
pun) */
+ (void) kill(pid, SIGKILL);
return FALSE;
}
@@ -1863,7 +1864,7 @@ two_way_open(const char *str, struct redirect *rp)
iop_close(rp->iop);
rp->iop = NULL;
(void) close(master);
- (void) kill(pid, SIGKILL); /* overkill? (pardon
pun) */
+ (void) kill(pid, SIGKILL);
if (dup_master > 0)
(void) close(dup_master);
return FALSE;
@@ -1903,7 +1904,7 @@ use_pipes:
save_stdout = dup(1); /* duplicate stdout */
if (save_stdout == -1 || save_stdin == -1) {
- /* if an error occurrs close all open file handles */
+ /* if an error occurs close all open file handles */
save_errno = errno;
if (save_stdin != -1)
close(save_stdin);
@@ -2006,7 +2007,7 @@ use_pipes:
(void) close(ctop[1]);
(void) close(ptoc[0]);
(void) close(ptoc[1]);
- (void) kill(pid, SIGKILL); /* overkill? (pardon pun) */
+ (void) kill(pid, SIGKILL);
return FALSE;
}
@@ -2018,7 +2019,7 @@ use_pipes:
(void) close(ctop[1]);
(void) close(ptoc[0]);
(void) close(ptoc[1]);
- (void) kill(pid, SIGKILL); /* overkill? (pardon pun) */
+ (void) kill(pid, SIGKILL);
return FALSE;
}
@@ -2060,9 +2061,9 @@ wait_any(int interesting) /* pid of interest, if any */
qstat = signal(SIGQUIT, SIG_IGN);
for (;;) {
#ifdef HAVE_SYS_WAIT_H /* POSIX compatible sys/wait.h */
- pid = wait(&status);
+ pid = wait(& status);
#else
- pid = wait((union wait *)&status);
+ pid = wait((union wait *) & status);
#endif
if (interesting && pid == interesting) {
break;
@@ -2095,27 +2096,31 @@ gawk_popen(const char *cmd, struct redirect *rp)
#endif
/*
- * used to wait for any children to synchronize input and output,
+ * We used to wait for any children to synchronize input and output,
* but this could cause gawk to hang when it is started in a pipeline
- * and thus has a child process feeding it input (shell dependent)
+ * and thus has a child process feeding it input (shell dependent).
+ *
+ * (void) wait_any(0); // wait for outstanding processes
*/
- /*(void) wait_any(0);*/ /* wait for outstanding processes */
if (pipe(p) < 0)
fatal(_("cannot open pipe `%s' (%s)"), cmd, strerror(errno));
#ifdef __EMX__
- save_stdout = dup(1); /* save stdout */
rp->iop = NULL;
+ save_stdout = dup(1); /* save stdout */
if (save_stdout == -1) {
- close(p[0]); close(p[1]);
- return rp->iop; /* failed */
+ close(p[0]);
+ close(p[1]);
+ return NULL; /* failed */
}
close(1); /* close stdout */
if (dup(p[1]) != 1) {
- close(p[0]); close(p[1]);
- fatal(_("moving pipe to stdout in child failed (dup: %s)"),
strerror(errno));
+ close(p[0]);
+ close(p[1]);
+ fatal(_("moving pipe to stdout in child failed (dup: %s)"),
+ strerror(errno));
}
/* none of these handles must be inherited by the child process */
@@ -2236,7 +2241,7 @@ gawk_pclose(struct redirect *rp)
/* do_getline --- read in a line, into var and with redirection */
NODE *
-do_getline_redir(int intovar, int redirtype)
+do_getline_redir(int into_variable, enum redirval redirtype)
{
struct redirect *rp = NULL;
IOBUF *iop;
@@ -2247,12 +2252,12 @@ do_getline_redir(int intovar, int redirtype)
NODE **lhs = NULL;
int redir_error = 0;
- if (intovar)
+ if (into_variable)
lhs = POP_ADDRESS();
- assert(redirtype != 0);
+ assert(redirtype != redirect_none);
redir_exp = TOP();
- rp = redirect(redir_exp, redirtype, &redir_error);
+ rp = redirect(redir_exp, redirtype, & redir_error);
DEREF(redir_exp);
decr_sp();
if (rp == NULL) {
@@ -2267,9 +2272,9 @@ do_getline_redir(int intovar, int redirtype)
return make_number((AWKNUM) 0.0);
errcode = 0;
- cnt = get_a_record(&s, iop, &errcode);
+ cnt = get_a_record(& s, iop, & errcode);
if (errcode != 0) {
- if (! do_traditional && (errcode != -1))
+ if (! do_traditional && errcode != -1)
update_ERRNO_saved(errcode);
return make_number((AWKNUM) -1.0);
}
@@ -2302,24 +2307,24 @@ do_getline_redir(int intovar, int redirtype)
/* do_getline --- read in a line, into var and without redirection */
NODE *
-do_getline(int intovar, IOBUF *iop)
+do_getline(int into_variable, IOBUF *iop)
{
int cnt = EOF;
char *s = NULL;
int errcode;
if (iop == NULL) { /* end of input */
- if (intovar)
+ if (into_variable)
(void) POP_ADDRESS();
return make_number((AWKNUM) 0.0);
}
errcode = 0;
- cnt = get_a_record(&s, iop, &errcode);
+ cnt = get_a_record(& s, iop, & errcode);
if (errcode != 0) {
- if (! do_traditional && (errcode != -1))
+ if (! do_traditional && errcode != -1)
update_ERRNO_saved(errcode);
- if (intovar)
+ if (into_variable)
(void) POP_ADDRESS();
return make_number((AWKNUM) -1.0);
}
@@ -2329,7 +2334,7 @@ do_getline(int intovar, IOBUF *iop)
INCREMENT_REC(NR);
INCREMENT_REC(FNR);
- if (! intovar) /* no optional var. */
+ if (! into_variable) /* no optional var. */
set_record(s, cnt);
else { /* assignment to variable */
NODE **lhs;
@@ -2382,7 +2387,7 @@ init_awkpath(char *path)
memcpy(p, start, len);
/* add directory punctuation if necessary */
- if (! isdirpunct(*(end - 1)))
+ if (! isdirpunct(end[-1]))
p[len++] = '/';
p[len] = '\0';
@@ -2556,23 +2561,12 @@ int
srcopen(SRCFILE *s)
{
if (s->stype == SRC_STDIN)
- return (0);
+ return fileno(stdin);
if (s->stype == SRC_FILE || s->stype == SRC_INC)
return devopen(s->fullpath, "r");
return INVALID_HANDLE;
}
-#ifdef TEST
-int bufsize = 8192;
-
-void
-fatal(const char *s)
-{
- printf("%s\n", s);
- exit(EXIT_FAILURE);
-}
-#endif
-
/* open hooks, mainly for use by extension functions */
static struct open_hook {
@@ -2659,12 +2653,12 @@ iop_alloc(int fd, const char *name, IOBUF *iop, int
do_openhooks)
(void)(! do_traditional && (unref(RT_node->var_value), \
RT_node->var_value = make_string(str, len)))
-/* grow must increase size of buffer, set end, make sure off and dataend point
at */
-/* right spot. */
-/* */
-/* */
-/* <growbuffer>= */
-/* grow_iop_buffer --- grow the buffer */
+/*
+ * grow_iop_buffer:
+ *
+ * grow must increase size of buffer, set end, make sure off and dataend
+ * point at the right spot.
+ */
static void
grow_iop_buffer(IOBUF *iop)
@@ -2698,10 +2692,8 @@ grow_iop_buffer(IOBUF *iop)
iop->end = iop->buf + iop->size;
}
-/* Here are the routines. */
-/* */
-/* */
-/* <rs1scan>= */
+/* Here are the routines. */
+
/* rs1scan --- scan for a single character record terminator */
static RECVALUE
@@ -2782,19 +2774,19 @@ rs1scan(IOBUF *iop, struct recmatch *recm, SCANSTATE
*state)
int len = iop->dataend - bp;
int found = 0;
- memset(&mbs, 0, sizeof(mbstate_t));
+ memset(& mbs, 0, sizeof(mbstate_t));
do {
if (*bp == rs)
found = 1;
if (is_valid_character(*bp))
mbclen = 1;
else
- mbclen = mbrlen(bp, len, &mbs);
- if ( (mbclen == 1)
- || (mbclen == (size_t) -1)
- || (mbclen == (size_t) -2)
- || (mbclen == 0)) {
- /* We treat it as a singlebyte character. */
+ mbclen = mbrlen(bp, len, & mbs);
+ if ( mbclen == 1
+ || mbclen == (size_t) -1
+ || mbclen == (size_t) -2
+ || mbclen == 0) {
+ /* We treat it as a single-byte character. */
mbclen = 1;
}
len -= mbclen;
@@ -2804,8 +2796,8 @@ rs1scan(IOBUF *iop, struct recmatch *recm, SCANSTATE
*state)
/* Check that newline found isn't the sentinel. */
if (found && (bp - mbclen) < iop->dataend) {
/*
- * set len to what we have so far, in case this is
- * all there is
+ * Set len to what we have so far, in case this is
+ * all there is.
*/
recm->len = bp - recm->start - mbclen;
recm->rt_start = bp - mbclen;
@@ -2839,7 +2831,6 @@ rs1scan(IOBUF *iop, struct recmatch *recm, SCANSTATE
*state)
}
}
-/* <rsrescan>= */
/* rsrescan --- search for a regex match in the buffer */
static RECVALUE
@@ -2929,21 +2920,15 @@ again:
* This matches the "xyz" and ends up putting the
* "abc" into the front of the next record. Ooops.
*
- * The remaybelong() function looks to see if the
+ * The re->maybe_long member is true if the
* regex contains one of: + * ? |. This is a very
* simple heuristic, but in combination with the
* "end of match within a few bytes of end of buffer"
* check, should keep things reasonable.
*/
- /*
- * XXX: The reisstring and remaybelong tests should
- * really be done once when RS is assigned to and
- * then tested as flags here. Maybe one day.
- */
-
/* succession of tests is easier to trace in GDB. */
- if (remaybelong(RS->stptr, RS->stlen)) {
+ if (RSre->maybe_long) {
char *matchend = iop->off + reend;
if (iop->dataend - matchend < RS->stlen)
@@ -2953,7 +2938,6 @@ again:
return REC_OK;
}
-/* <rsnullscan>= */
/* rsnullscan --- handle RS = "" */
static RECVALUE
@@ -3030,7 +3014,6 @@ find_longest_terminator:
return REC_OK;
}
-/* <getarecord>= */
/* get_a_record --- read a record from IOP into out, return length of EOF, set
RT */
static int
@@ -3052,9 +3035,9 @@ get_a_record(char **out, /* pointer to pointer to
data */
read_timeout = get_read_timeout(iop);
if (iop->get_record != NULL)
- return (*iop->get_record)(out, iop, errcode);
+ return iop->get_record(out, iop, errcode);
- /* <fill initial buffer>= */
+ /* fill initial buffer */
if (has_no_data(iop) || no_data_left(iop)) {
iop->count = iop->read_func(iop->fd, iop->buf, iop->readsize);
if (iop->count == 0) {
@@ -3071,10 +3054,12 @@ get_a_record(char **out, /* pointer to pointer
to data */
}
}
- /* <loop through file to find a record>= */
+ /* loop through file to find a record */
state = NOSTATE;
for (;;) {
size_t dataend_off;
+ size_t room_left;
+ size_t amt_to_read;
ret = (*matchrec)(iop, & recm, & state);
iop->flag &= ~IOP_AT_START;
@@ -3082,64 +3067,62 @@ get_a_record(char **out, /* pointer to pointer
to data */
break;
/* need to add more data to buffer */
- /* <shift data down in buffer>= */
+ /* shift data down in buffer */
dataend_off = iop->dataend - iop->off;
memmove(iop->buf, iop->off, dataend_off);
iop->off = iop->buf;
iop->dataend = iop->buf + dataend_off;
- /* <adjust recm contents>= */
+ /* adjust recm contents */
recm.start = iop->off;
if (recm.rt_start != NULL)
recm.rt_start = iop->off + recm.len;
- /* <read more data, break if EOF>= */
- {
+ /* read more data, break if EOF */
#define min(x, y) (x < y ? x : y)
- /* subtract one in read count to leave room for
sentinel */
- size_t room_left = iop->end - iop->dataend - 1;
- size_t amt_to_read = min(iop->readsize, room_left);
-
- if (amt_to_read < iop->readsize) {
- grow_iop_buffer(iop);
- /* <adjust recm contents>= */
- recm.start = iop->off;
- if (recm.rt_start != NULL)
- recm.rt_start = iop->off + recm.len;
-
- /* recalculate amt_to_read */
- room_left = iop->end - iop->dataend - 1;
- amt_to_read = min(iop->readsize, room_left);
- }
- while (amt_to_read + iop->readsize < room_left)
- amt_to_read += iop->readsize;
+ /* subtract one in read count to leave room for sentinel */
+ room_left = iop->end - iop->dataend - 1;
+ amt_to_read = min(iop->readsize, room_left);
+
+ if (amt_to_read < iop->readsize) {
+ grow_iop_buffer(iop);
+ /* adjust recm contents */
+ recm.start = iop->off;
+ if (recm.rt_start != NULL)
+ recm.rt_start = iop->off + recm.len;
+
+ /* recalculate amt_to_read */
+ room_left = iop->end - iop->dataend - 1;
+ amt_to_read = min(iop->readsize, room_left);
+ }
+ while (amt_to_read + iop->readsize < room_left)
+ amt_to_read += iop->readsize;
#ifdef SSIZE_MAX
- /*
- * POSIX limits read to SSIZE_MAX. There are (bizarre)
- * systems where this amount is small.
- */
- amt_to_read = min(amt_to_read, SSIZE_MAX);
+ /*
+ * POSIX limits read to SSIZE_MAX. There are (bizarre)
+ * systems where this amount is small.
+ */
+ amt_to_read = min(amt_to_read, SSIZE_MAX);
#endif
- iop->count = iop->read_func(iop->fd, iop->dataend,
amt_to_read);
- if (iop->count == -1) {
- *errcode = errno;
- iop->flag |= IOP_AT_EOF;
- break;
- } else if (iop->count == 0) {
- /*
- * hit EOF before matching RS, so end
- * the record and set RT to ""
- */
- iop->flag |= IOP_AT_EOF;
- break;
- } else
- iop->dataend += iop->count;
- }
+ iop->count = iop->read_func(iop->fd, iop->dataend, amt_to_read);
+ if (iop->count == -1) {
+ *errcode = errno;
+ iop->flag |= IOP_AT_EOF;
+ break;
+ } else if (iop->count == 0) {
+ /*
+ * hit EOF before matching RS, so end
+ * the record and set RT to ""
+ */
+ iop->flag |= IOP_AT_EOF;
+ break;
+ } else
+ iop->dataend += iop->count;
}
- /* <set record, RT, return right value>= */
+ /* set record, RT, return right value */
/*
* rtval is not a static pointer to avoid dangling pointer problems
diff --git a/re.c b/re.c
index 9be46d9..f3256a1 100644
--- a/re.c
+++ b/re.c
@@ -33,6 +33,7 @@ static void check_bracket_exp(char *s, size_t len);
Regexp *
make_regexp(const char *s, size_t len, int ignorecase, int dfa, int canfatal)
{
+ static char metas[] = ".*+(){}[]|?^$\\";
Regexp *rp;
const char *rerr;
const char *src = s;
@@ -46,6 +47,7 @@ make_regexp(const char *s, size_t len, int ignorecase, int
dfa, int canfatal)
int has_anchor = FALSE;
int may_have_range = 0;
reg_syntax_t dfa_syn;
+ int i;
/*
* The number of bytes in the current multibyte character.
@@ -90,11 +92,11 @@ make_regexp(const char *s, size_t len, int ignorecase, int
dfa, int canfatal)
/* The previous byte is a singlebyte character, or last
byte
of a multibyte character. We check the next
character. */
is_multibyte = mbrlen(src, end - src, &mbs);
- if ( (is_multibyte == 1)
- || (is_multibyte == (size_t) -1)
- || (is_multibyte == (size_t) -2
- || (is_multibyte == 0))) {
- /* We treat it as a singlebyte character. */
+ if ( is_multibyte == 1
+ || is_multibyte == (size_t) -1
+ || is_multibyte == (size_t) -2
+ || is_multibyte == 0) {
+ /* We treat it as a single-byte character. */
is_multibyte = 0;
}
}
@@ -233,6 +235,21 @@ make_regexp(const char *s, size_t len, int ignorecase, int
dfa, int canfatal)
} else
rp->dfa = FALSE;
rp->has_anchor = has_anchor;
+
+ /* Additional flags that help with RS as regexp. */
+ for (i = 0; i < len; i++) {
+ if (strchr(metas, buf[i]) != NULL) {
+ rp->has_meta = TRUE;
+ break;
+ }
+ }
+
+ for (i = len - 1; i >= 0; i--) {
+ if (strchr("*+|?", buf[i]) != NULL) {
+ rp->maybe_long = TRUE;
+ break;
+ }
+ }
return rp;
}
@@ -422,17 +439,12 @@ avoid_dfa(NODE *re, char *str, size_t len)
int
reisstring(const char *text, size_t len, Regexp *re, const char *buf)
{
- static char metas[] = ".*+(){}[]|?^$\\";
- int i;
int res;
const char *matched;
- /* simple checking for has meta characters in re */
- for (i = 0; i < len; i++) {
- if (strchr(metas, text[i]) != NULL) {
- return FALSE; /* give up early, can't be string match
*/
- }
- }
+ /* simple checking for meta characters in re */
+ if (re->has_meta)
+ return FALSE; /* give up early, can't be string match */
/* make accessable to gdb */
matched = &buf[RESTART(re, buf)];
@@ -442,20 +454,6 @@ reisstring(const char *text, size_t len, Regexp *re, const
char *buf)
return res;
}
-/* remaybelong --- return TRUE if the RE contains * ? | + */
-
-int
-remaybelong(const char *text, size_t len)
-{
- while (len--) {
- if (strchr("*+|?", *text++) != NULL) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
/* reflags2str --- make a regex flags value readable */
const char *
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 18 +++
awk.h | 8 +-
awkgram.c | 338 +++++++++++++++++++++---------------------
awkgram.y | 8 +-
io.c | 483 +++++++++++++++++++++++++++++-------------------------------
re.c | 52 +++----
6 files changed, 454 insertions(+), 453 deletions(-)
hooks/post-receive
--
gawk
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gawk-diffs] [SCM] gawk branch, gawk_mpfr, updated. 67db3f45748d22ff23c03d1887cb0aac341f81bb,
Arnold Robbins <=