aboutsummaryrefslogtreecommitdiffstats
path: root/awk4.c
diff options
context:
space:
mode:
Diffstat (limited to 'awk4.c')
-rw-r--r--awk4.c103
1 files changed, 60 insertions, 43 deletions
diff --git a/awk4.c b/awk4.c
index f88f9b96..97ac44a8 100644
--- a/awk4.c
+++ b/awk4.c
@@ -5,6 +5,33 @@
* Written by David Trueman, 1988
*
* $Log: awk4.c,v $
+ * Revision 1.36 89/03/22 22:10:23 david
+ * a cleaner way to handle assignment to $n where n > 0
+ *
+ * Revision 1.35 89/03/22 21:05:24 david
+ * delete some obsolete code
+ *
+ * Revision 1.34 89/03/22 21:00:34 david
+ * replace some free()'s with freenode()
+ *
+ * Revision 1.33 89/03/21 19:26:01 david
+ * minor cleanup
+ *
+ * Revision 1.32 89/03/21 18:22:54 david
+ * some function tracing debugging code
+ *
+ * Revision 1.31 89/03/21 10:53:21 david
+ * cleanup
+ *
+ * Revision 1.30 89/03/15 22:22:03 david
+ * fix from hack: check for null function before using it in diagnostic
+ *
+ * Revision 1.29 89/03/15 22:02:24 david
+ * new case stuff added
+ *
+ * Revision 1.28 89/03/15 21:34:37 david
+ * free more memory and purge obstack stuff
+ *
* Revision 1.27 88/12/14 10:53:49 david
* malloc structures in func_call and free them on return
*
@@ -100,16 +127,17 @@ NODE *arg_list; /* Node_expression_list of calling args. */
NODE **sp;
static int func_tag_valid = 0;
int count;
- extern NODE *lookup(), *install();
- extern NODE *pop_var();
extern NODE *ret_node;
/*
* retrieve function definition node
*/
f = lookup(variables, name->stptr);
- if (f->type != Node_func)
+ if (!f || f->type != Node_func)
fatal("function `%s' not defined", name->stptr);
+#ifdef FUNC_TRACE
+ fprintf(stderr, "function %s called\n", name->stptr);
+#endif
/*
* mark stack for variables allocated during life of function
*/
@@ -186,13 +214,13 @@ NODE *arg_list; /* Node_expression_list of calling args. */
}
deref = n->lnode;
do_deref();
- free((char *) n);
+ freenode(n);
}
while (count-- > 0) {
n = *sp++;
deref = n->lnode;
do_deref();
- free((char *) n);
+ freenode(n);
}
free((char *) local_stack);
return r;
@@ -206,13 +234,21 @@ NODE *tree;
int rstart;
struct re_registers reregs;
struct re_pattern_buffer *rp;
- extern NODE *RSTART_node, *RLENGTH_node;
t1 = force_string(tree_eval(tree->lnode));
- if (tree->rnode->type == Node_regex)
+ if (tree->rnode->type == Node_regex) {
rp = tree->rnode->rereg;
- else {
- rp = make_regexp(force_string(tree_eval(tree->rnode)));
+ if (!strict && ((IGNORECASE_node->var_value->numbr != 0)
+ ^ (tree->rnode->re_case != 0))) {
+ /* recompile since case sensitivity differs */
+ rp = tree->rnode->rereg =
+ mk_re_parse(tree->rnode->re_text,
+ (IGNORECASE_node->var_value->numbr != 0));
+ tree->rnode->re_case = (IGNORECASE_node->var_value->numbr != 0);
+ }
+ } else {
+ rp = make_regexp(force_string(tree_eval(tree->rnode)),
+ (IGNORECASE_node->var_value->numbr != 0));
if (rp == NULL)
cant_happen();
}
@@ -258,10 +294,19 @@ NODE *tree;
global = (tree->type == Node_gsub);
- if (tree->rnode->type == Node_regex)
+ if (tree->rnode->type == Node_regex) {
rp = tree->rnode->rereg;
- else {
- rp = make_regexp(force_string(tree_eval(tree->rnode)));
+ if (! strict && ((IGNORECASE_node->var_value->numbr != 0)
+ ^ (tree->rnode->re_case != 0))) {
+ /* recompile since case sensitivity differs */
+ rp = tree->rnode->rereg =
+ mk_re_parse(tree->rnode->re_text,
+ (IGNORECASE_node->var_value->numbr != 0));
+ tree->rnode->re_case = (IGNORECASE_node->var_value->numbr != 0);
+ }
+ } else {
+ rp = make_regexp(force_string(tree_eval(tree->rnode)),
+ (IGNORECASE_node->var_value->numbr != 0));
if (rp == NULL)
cant_happen();
}
@@ -269,6 +314,7 @@ NODE *tree;
s = force_string(tree_eval(tree->lnode));
tree = tree->rnode;
deref = 0;
+ field_num = -1;
if (tree == NULL) {
t = WHOLELINE;
lhs = &fields_arr[0];
@@ -276,7 +322,7 @@ NODE *tree;
deref = t;
} else {
t = tree->lnode;
- lhs = get_lhs(t);
+ lhs = get_lhs(t, 1);
t = force_string(tree_eval(t));
}
/*
@@ -346,19 +392,13 @@ NODE *tree;
if (matches > 0) {
if (field_num == 0)
set_record(fields_arr[0]->stptr, fields_arr[0]->stlen);
- else if (field_num > 0) {
- node0_valid = 0;
- if (NF_node->var_value->numbr == -1 &&
- field_num > NF_node->var_value->numbr)
- assign_number(&(NF_node->var_value),
- (AWKNUM) field_num);
- }
t->flags &= ~NUM;
}
field_num = -1;
return tmp_number((AWKNUM) matches);
}
+void
init_args(argc0, argc, argv0, argv)
int argc0, argc;
char *argv0;
@@ -366,11 +406,6 @@ char **argv;
{
int i, j;
NODE **aptr;
- extern NODE **assoc_lookup();
- extern NODE *spc_var();
- extern NODE *make_string();
- extern NODE *make_number();
- extern NODE *tmp_number();
ARGV_node = spc_var("ARGV", Nnull_string);
aptr = assoc_lookup(ARGV_node, tmp_number(0.0));
@@ -382,21 +417,3 @@ char **argv;
}
ARGC_node = spc_var("ARGC", make_number((AWKNUM) j));
}
-
-#ifdef USG
-int
-bcopy (src, dst, length)
-register char *src, *dst;
-register int length;
-{
- (void) memcpy (dst, src, length);
-}
-
-int
-bzero (b, length)
-register char *b;
-register int length;
-{
- (void) memset (b, '\0', length);
-}
-#endif