[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gawk-diffs] [SCM] gawk branch, feature/api-parser, updated. gawk-4.1.0-
From: |
Andrew J. Schorr |
Subject: |
[gawk-diffs] [SCM] gawk branch, feature/api-parser, updated. gawk-4.1.0-2443-gd6406b6 |
Date: |
Mon, 6 Mar 2017 09:21:23 -0500 (EST) |
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, feature/api-parser has been updated
via d6406b66add5652130385942a7e05ebc9ea799ce (commit)
from 62fe07b69e522c909aad303b31443cc3c9bdf6c0 (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=d6406b66add5652130385942a7e05ebc9ea799ce
commit d6406b66add5652130385942a7e05ebc9ea799ce
Author: Andrew J. Schorr <address@hidden>
Date: Mon Mar 6 09:20:33 2017 -0500
Add a 6th argument to the API get_record function instead of having a
separate field_width array pointer in the input buf.
diff --git a/ChangeLog b/ChangeLog
index bc1fe39..223d6fb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2017-03-06 Andrew J. Schorr <address@hidden>
+
+ * gawkapi.h (awk_input_buf_t): Remove field_width array and instead
+ add it as a 6th argument to the get_record function. This should
+ not break existing code, since it's fine to ignore the additional
+ argument. Document the behavior of the field_width argument.
+ * io.c (inrec): Pass pointer to field_width array to get_a_record,
+ and then hand it off to set_record.
+ (do_getline_redir): If not reading into a variable, pass pointer to
+ field_width array to get_a_record and then hand it off to set_record.
+ (do_getline): Ditto.
+ (get_a_record): Add a 4th field_width argument to pass through to
+ the API get_record method.
+
2017-03-05 Andrew J. Schorr <address@hidden>
* awk.h (set_record): Add a new argument containing a field-width
diff --git a/gawkapi.h b/gawkapi.h
index 6d552b8..6fa022c 100644
--- a/gawkapi.h
+++ b/gawkapi.h
@@ -146,21 +146,24 @@ typedef struct awk_input {
* than zero, gawk will automatically update the ERRNO variable based
* on the value of *errcode (e.g., setting *errcode = errno should do
* the right thing).
- */
- int (*get_record)(char **out, struct awk_input *iobuf, int *errcode,
- char **rt_start, size_t *rt_len);
-
- /*
- * If this pointer is non-NULL, then this record should be parsed
- * using the supplied field widths instead of the default gawk
- * field parsing mechanism. The field_width array should have
+ *
+ * If field_width is non-NULL, then its value will be initialized
+ * to NULL, and the function may set it to point to an array of
+ * integers supplying field width information to override the default
+ * gawk field parsing mechanism. The field_width array should have
* at least 2*NF+1 elements, and the value of field_width[2*NF]
* must be negative. The first entry field_width[0] should contain
* the number of bytes to skip before $1; field_width[1] contains
* the number of bytes in $1. Note that these values are specified
- * in bytes, not (potentially multi-byte) characters!
+ * in bytes, not (potentially multi-byte) characters! And note that this
+ * array will not be copied by gawk; it must persist at least until the
+ * next call to get_record or close_func. Note that field_width will
+ * be NULL when getline is assigning the results to a variable, thus
+ * field parsing is not needed.
*/
- const int *field_width;
+ int (*get_record)(char **out, struct awk_input *iobuf, int *errcode,
+ char **rt_start, size_t *rt_len,
+ const int **field_width);
/*
* No argument prototype on read_func to allow for older systems
diff --git a/io.c b/io.c
index 040b485..8aa9da8 100644
--- a/io.c
+++ b/io.c
@@ -287,7 +287,7 @@ static RECVALUE rsrescan(IOBUF *iop, struct recmatch *recm,
SCANSTATE *state);
static RECVALUE (*matchrec)(IOBUF *iop, struct recmatch *recm, SCANSTATE
*state) = rs1scan;
-static int get_a_record(char **out, IOBUF *iop, int *errcode);
+static int get_a_record(char **out, IOBUF *iop, int *errcode, const int
**field_width);
static void free_rp(struct redirect *rp);
@@ -590,13 +590,14 @@ inrec(IOBUF *iop, int *errcode)
char *begin;
int cnt;
bool retval = true;
+ const int *field_width = NULL;
if (at_eof(iop) && no_data_left(iop))
cnt = EOF;
else if ((iop->flag & IOP_CLOSED) != 0)
cnt = EOF;
else
- cnt = get_a_record(& begin, iop, errcode);
+ cnt = get_a_record(& begin, iop, errcode, & field_width);
/* Note that get_a_record may return -2 when I/O would block */
if (cnt < 0) {
@@ -604,7 +605,7 @@ inrec(IOBUF *iop, int *errcode)
} else {
INCREMENT_REC(NR);
INCREMENT_REC(FNR);
- set_record(begin, cnt, iop->public.field_width);
+ set_record(begin, cnt, field_width);
if (*errcode > 0)
retval = false;
}
@@ -2618,6 +2619,7 @@ do_getline_redir(int into_variable, enum redirval
redirtype)
NODE *redir_exp = NULL;
NODE **lhs = NULL;
int redir_error = 0;
+ const int *field_width = NULL;
if (into_variable)
lhs = POP_ADDRESS();
@@ -2646,7 +2648,7 @@ do_getline_redir(int into_variable, enum redirval
redirtype)
return make_number((AWKNUM) 0.0);
errcode = 0;
- cnt = get_a_record(& s, iop, & errcode);
+ cnt = get_a_record(& s, iop, & errcode, (lhs ? NULL : & field_width));
if (errcode != 0) {
if (! do_traditional && (errcode != -1))
update_ERRNO_int(errcode);
@@ -2668,7 +2670,7 @@ do_getline_redir(int into_variable, enum redirval
redirtype)
}
if (lhs == NULL) /* no optional var. */
- set_record(s, cnt, iop->public.field_width);
+ set_record(s, cnt, field_width);
else { /* assignment to variable */
unref(*lhs);
*lhs = make_string(s, cnt);
@@ -2686,6 +2688,7 @@ do_getline(int into_variable, IOBUF *iop)
int cnt = EOF;
char *s = NULL;
int errcode;
+ const int *field_width = NULL;
if (iop == NULL) { /* end of input */
if (into_variable)
@@ -2694,7 +2697,7 @@ do_getline(int into_variable, IOBUF *iop)
}
errcode = 0;
- cnt = get_a_record(& s, iop, & errcode);
+ cnt = get_a_record(& s, iop, & errcode, (into_variable ? NULL : &
field_width));
if (errcode != 0) {
if (! do_traditional && (errcode != -1))
update_ERRNO_int(errcode);
@@ -2709,7 +2712,7 @@ do_getline(int into_variable, IOBUF *iop)
INCREMENT_REC(FNR);
if (! into_variable) /* no optional var. */
- set_record(s, cnt, iop->public.field_width);
+ set_record(s, cnt, field_width);
else { /* assignment to variable */
NODE **lhs;
lhs = POP_ADDRESS();
@@ -3653,7 +3656,8 @@ errno_io_retry(void)
static int
get_a_record(char **out, /* pointer to pointer to data */
IOBUF *iop, /* input IOP */
- int *errcode) /* pointer to error variable */
+ int *errcode, /* pointer to error variable */
+ const int **field_width)/* pointer to pointer to field_width array */
{
struct recmatch recm;
SCANSTATE state;
@@ -3672,7 +3676,8 @@ get_a_record(char **out, /* pointer to pointer to
data */
char *rt_start;
size_t rt_len;
int rc = iop->public.get_record(out, &iop->public, errcode,
- &rt_start, &rt_len);
+ &rt_start, &rt_len,
+ field_width);
if (rc == EOF)
iop->flag |= IOP_AT_EOF;
else {
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 14 ++++++++++++++
gawkapi.h | 23 +++++++++++++----------
io.c | 23 ++++++++++++++---------
3 files changed, 41 insertions(+), 19 deletions(-)
hooks/post-receive
--
gawk
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gawk-diffs] [SCM] gawk branch, feature/api-parser, updated. gawk-4.1.0-2443-gd6406b6,
Andrew J. Schorr <=