summaryrefslogtreecommitdiff
path: root/field.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2010-07-16 12:54:45 +0300
committerArnold D. Robbins <arnold@skeeve.com>2010-07-16 12:54:45 +0300
commitf20ab7c3039a4023f41372bfe4bde3b16d481df7 (patch)
tree4425de8c6177df655f165cb61d70d0acb5fdc968 /field.c
parent6607eb3d5e40b98d2acc8f6b0d6a0b5a4b0f56bd (diff)
downloadgawk-f20ab7c3039a4023f41372bfe4bde3b16d481df7.tar.gz
Move to gawk-3.0.4.gawk-3.0.4
Diffstat (limited to 'field.c')
-rw-r--r--field.c66
1 files changed, 39 insertions, 27 deletions
diff --git a/field.c b/field.c
index 31c96287..052c0c12 100644
--- a/field.c
+++ b/field.c
@@ -3,7 +3,7 @@
*/
/*
- * Copyright (C) 1986, 1988, 1989, 1991-1997 the Free Software Foundation, Inc.
+ * Copyright (C) 1986, 1988, 1989, 1991-1999 the Free Software Foundation, Inc.
*
* This file is part of GAWK, the GNU implementation of the
* AWK Programming Language.
@@ -24,7 +24,6 @@
*/
#include "awk.h"
-#include <assert.h>
typedef void (* Setfunc) P((long, char *, long, NODE *));
@@ -63,6 +62,9 @@ int default_FS; /* TRUE when FS == " " */
Regexp *FS_regexp = NULL;
static NODE *Null_field = NULL;
+/* using_FIELDWIDTHS --- static function, macro to avoid overhead */
+#define using_FIELDWIDTHS() (parse_field == fw_parse_field)
+
/* init_fields --- set up the fields array to start with */
void
@@ -140,7 +142,6 @@ rebuild_record()
char *ops;
register char *cops;
long i;
- char *f0start, *f0end;
assert(NF != -1);
@@ -184,15 +185,27 @@ rebuild_record()
* any fields that still point into it, and have them point
* into the new field zero.
*/
- f0start = fields_arr[0]->stptr;
- f0end = fields_arr[0]->stptr + fields_arr[0]->stlen;
for (cops = ops, i = 1; i <= NF; i++) {
- char *field_data = fields_arr[i]->stptr;
-
- if (fields_arr[i]->stlen > 0
- && f0start <= field_data && field_data < f0end)
- fields_arr[i]->stptr = cops;
+ if (fields_arr[i]->stlen > 0) {
+ NODE *n;
+ getnode(n);
+
+ if ((fields_arr[i]->flags & FIELD) == 0) {
+ *n = *Null_field;
+ n->stlen = fields_arr[i]->stlen;
+ if ((fields_arr[i]->flags & (NUM|NUMBER)) != 0) {
+ n->flags |= (fields_arr[i]->flags & (NUM|NUMBER));
+ n->numbr = fields_arr[i]->numbr;
+ }
+ } else {
+ *n = *(fields_arr[i]);
+ n->flags &= ~(MALLOC|TEMP|PERM|STRING);
+ }
+ n->stptr = cops;
+ unref(fields_arr[i]);
+ fields_arr[i] = n;
+ }
cops += fields_arr[i]->stlen + ofslen;
}
@@ -751,7 +764,7 @@ NODE *tree;
arr->type = Node_var_array;
assoc_clear(arr);
- if (sep->re_flags & FS_DFLT) {
+ if ((sep->re_flags & FS_DFLT) != 0 && ! using_FIELDWIDTHS()) {
parseit = parse_field;
fs = force_string(FS_node->var_value);
rp = FS_regexp;
@@ -851,20 +864,20 @@ set_FS()
if (fields_arr != NULL)
(void) get_field(HUGE - 1, 0);
- if (save_fs && cmp_nodes(FS_node->var_value, save_fs) == 0
- && save_rs && cmp_nodes(RS_node->var_value, save_rs) == 0)
- return;
- unref(save_fs);
- save_fs = dupnode(FS_node->var_value);
- unref(save_rs);
- save_rs = dupnode(RS_node->var_value);
- resave_fs = TRUE;
- buf[0] = '\0';
- default_FS = FALSE;
- if (FS_regexp) {
- refree(FS_regexp);
- FS_regexp = NULL;
+ if (! (save_fs && cmp_nodes(FS_node->var_value, save_fs) == 0
+ && save_rs && cmp_nodes(RS_node->var_value, save_rs) == 0)) {
+ unref(save_fs);
+ save_fs = dupnode(FS_node->var_value);
+ unref(save_rs);
+ save_rs = dupnode(RS_node->var_value);
+ resave_fs = TRUE;
+ if (FS_regexp) {
+ refree(FS_regexp);
+ FS_regexp = NULL;
+ }
}
+ buf[0] = '\0';
+ default_FS = FALSE;
fs = force_string(FS_node->var_value);
if (! do_traditional && fs->stlen == 0)
parse_field = null_parse_field;
@@ -887,7 +900,7 @@ set_FS()
if (fs->stptr[0] == ' ' && fs->stlen == 1)
default_FS = TRUE;
else if (fs->stptr[0] != ' ' && fs->stlen == 1) {
- if (! IGNORECASE)
+ if (! IGNORECASE || ! isalpha(fs->stptr[0]))
parse_field = sc_parse_field;
else if (fs->stptr[0] == '\\')
/* yet another special case */
@@ -910,6 +923,5 @@ set_FS()
int
using_fieldwidths()
{
- return parse_field == fw_parse_field;
+ return using_FIELDWIDTHS();
}
-