Bump to gawk 3.1.5 45/54245/2 accepted/tizen_mobile accepted/tizen_tv accepted/tizen_wearable accepted/tizen/mobile/20151224.102246 accepted/tizen/tv/20151224.102318 accepted/tizen/wearable/20151224.102356 submit/tizen/20151223.035405
authorDongHun Kwak <dh0128.kwak@samsung.com>
Mon, 14 Dec 2015 09:34:52 +0000 (18:34 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Wed, 16 Dec 2015 06:06:03 +0000 (15:06 +0900)
Sync with tizen_2.4
Run unit test

Change-Id: Ic3c993ecbfa2b8b42f9c9dbc605ba13726effe32
Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
13 files changed:
awk.h
awkgram.y
builtin.c
dfa.c
eval.c
field.c
io.c
main.c
node.c
packaging/gawk.manifest [new file with mode: 0644]
packaging/gawk.spec [new file with mode: 0644]
run_test.sh [new file with mode: 0755]
test/Makefile.in

diff --git a/awk.h b/awk.h
index 1f1e34a60b352ac5e14e5a7e2fdfbaf37fb61322..62bd6e1856c0c836536bf822236cd2e44f947bf8 100644 (file)
--- a/awk.h
+++ b/awk.h
@@ -1166,6 +1166,9 @@ extern NODE *str2wstr P((NODE *n, size_t **ptr));
 #define force_wstring(n)       str2wstr(n, NULL)
 extern const wchar_t *wstrstr P((const wchar_t *haystack, size_t hs_len, const wchar_t *needle, size_t needle_len));
 extern const wchar_t *wcasestrstr P((const wchar_t *haystack, size_t hs_len, const wchar_t *needle, size_t needle_len));
+extern void free_wstr P((NODE *n));
+#else
+#define free_wstr(NODE)        /* empty */
 #endif
 /* re.c */
 extern Regexp *make_regexp P((const char *s, size_t len, int ignorecase, int dfa));
index b222ddc13b66b7352d1f443c85efd0d4abc66a4f..8088b34a5f054fb1c1400458c3575db446870cf5 100644 (file)
--- a/awkgram.y
+++ b/awkgram.y
@@ -2399,7 +2399,8 @@ snode(NODE *subn, NODETYPE op, int idx)
        r->subnode = subn;
        if (r->builtin == do_sprintf) {
                count_args(r);
-               r->lnode->printf_count = r->printf_count; /* hack */
+               if (r->lnode != NULL)   /* r->lnode set from subn. guard against syntax errors & check it's valid */
+                       r->lnode->printf_count = r->printf_count; /* hack */
        }
        return r;
 }
index 78f165693df0f898dde82eedce59af43e4bb3642..f4326f8b290a6cb2c1902fb3a22db7e2ca3b8f69 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -2020,7 +2020,7 @@ do_match(NODE *tree)
 
                rlength = REEND(rp, t1->stptr) - RESTART(rp, t1->stptr);        /* byte length */
 #ifdef MBS_SUPPORT
-               if (gawk_mb_cur_max > 1) {
+               if (rlength > 0 && gawk_mb_cur_max > 1) {
                        t1 = str2wstr(t1, & wc_indices);
                        rlength = wc_indices[rstart + rlength - 1] - wc_indices[rstart] + 1;
                        rstart = wc_indices[rstart];
@@ -2046,7 +2046,7 @@ do_match(NODE *tree)
                                        subpat_start = s;
                                        subpat_len = len = SUBPATEND(rp, t1->stptr, ii) - s;
 #ifdef MBS_SUPPORT
-                                       if (gawk_mb_cur_max > 1) {
+                                       if (len > 0 && gawk_mb_cur_max > 1) {
                                                subpat_start = wc_indices[s];
                                                subpat_len = wc_indices[s + len - 1] - subpat_start + 1;
                                        }
@@ -2089,9 +2089,9 @@ do_match(NODE *tree)
                        }
 
                        free(buf);
-                       if (wc_indices != NULL)
-                               free(wc_indices);
                }
+               if (wc_indices != NULL)
+                       free(wc_indices);
        } else {                /* match failed */
                rstart = 0;
                rlength = -1;
@@ -2462,6 +2462,8 @@ sub_common(NODE *tree, long how_many, int backdigs)
        free(t->stptr);
        t->stptr = buf;
        t->stlen = textlen;
+       free_wstr(t);
+       t->flags &= ~(NUMCUR|NUMBER);
 
        free_temp(s);
        if (matches > 0 && lhs) {
@@ -2471,7 +2473,6 @@ sub_common(NODE *tree, long how_many, int backdigs)
                }
                if (after_assign != NULL)
                        (*after_assign)();
-               t->flags &= ~(NUMCUR|NUMBER);
        }
        if (mb_indices != NULL)
                free(mb_indices);
diff --git a/dfa.c b/dfa.c
index 71e37369b74fb0f399f611ba9eceab035267ce2b..ae170ad7bd8a6c8d59df6d316ad9dba3d463fce8 100644 (file)
--- a/dfa.c
+++ b/dfa.c
@@ -516,7 +516,6 @@ parse_bracket_exp_mb ()
 
   work_mbc->nchars = work_mbc->nranges = work_mbc->nch_classes = 0;
   work_mbc->nequivs = work_mbc->ncoll_elems = 0;
-  work_mbc->chars = NULL;
   work_mbc->ch_classes = NULL;
   work_mbc->range_sts = work_mbc->range_ends = NULL;
   work_mbc->equivs = work_mbc->coll_elems = NULL;
@@ -1602,8 +1601,8 @@ state_index (struct dfa *d, position_set const *s, int newline, int letter)
   d->states[i].constraint = 0;
   d->states[i].first_end = 0;
 #ifdef MBS_SUPPORT
-  if (MB_CUR_MAX > 1)
-    d->states[i].mbps.nelem = 0;
+  d->states[i].mbps.nelem = 0;
+  d->states[i].mbps.elems = NULL;
 #endif
   for (j = 0; j < s->nelem; ++j)
     if (d->tokens[s->elems[j].index] < 0)
@@ -3136,8 +3135,13 @@ dfafree (struct dfa *d)
     }
 #endif /* MBS_SUPPORT */
 
-  for (i = 0; i < d->sindex; ++i)
+  for (i = 0; i < d->sindex; ++i) {
     free((ptr_t) d->states[i].elems.elems);
+#ifdef MBS_SUPPORT
+    if (d->states[i].mbps.nelem > 0)
+      free((ptr_t) d->states[i].mbps.elems);
+#endif /* MBS_SUPPORT */
+  }
   free((ptr_t) d->states);
   for (i = 0; i < d->tindex; ++i)
     if (d->follows[i].elems)
diff --git a/eval.c b/eval.c
index 375dce4acac690aa08143eb2be3ecd0801719a98..f64729e31d9ba1429fa4ea0d310489d276131e1c 100644 (file)
--- a/eval.c
+++ b/eval.c
@@ -1176,6 +1176,7 @@ r_tree_eval(register NODE *tree, int iscond)
                        memcpy(l->stptr + l->stlen, r->stptr, r->stlen);
                        l->stlen += r->stlen;
                        l->stptr[l->stlen] = '\0';
+            free_wstr(l);
                } else {
                        char *nval;
                        size_t nlen = l->stlen + r->stlen + 2;
@@ -1186,6 +1187,7 @@ r_tree_eval(register NODE *tree, int iscond)
                        unref(*lhs);
                        *lhs = make_str_node(nval, l->stlen + r->stlen, ALREADY_MALLOCED);
                }
+               (*lhs)->flags &= ~(NUMCUR|NUMBER);
                free_temp(r);
 
                if (after_assign)
@@ -2167,7 +2169,7 @@ set_BINMODE()
                        }
                }
 
-               if (! digits || (BINMODE_node->var_value->flags & MAYBE_NUM) == 0) {
+               if (! digits && (BINMODE_node->var_value->flags & MAYBE_NUM) == 0) {
                        BINMODE = 0;
                        if (strcmp(p, "r") == 0)
                                BINMODE = 1;
diff --git a/field.c b/field.c
index 99db3ac5e873d489464a64e2f5d2bfbe506d33ae..b79b90bd7044c1d4d6fa43444d055fd55ed49d05 100644 (file)
--- a/field.c
+++ b/field.c
@@ -155,6 +155,7 @@ rebuild_record()
        ofs = force_string(OFS_node->var_value);
        ofslen = ofs->stlen;
        for (i = NF; i > 0; i--) {
+               free_wstr(fields_arr[i]);
                tmp = fields_arr[i];
                tmp = force_string(tmp);
                tlen += tmp->stlen;
@@ -916,13 +917,13 @@ set_FIELDWIDTHS()
 
        parse_field = fw_parse_field;
        scan = force_string(FIELDWIDTHS_node->var_value)->stptr;
-       end = scan + 1;
+
        if (FIELDWIDTHS == NULL)
                emalloc(FIELDWIDTHS, int *, fw_alloc * sizeof(int), "set_FIELDWIDTHS");
        FIELDWIDTHS[0] = 0;
        for (i = 1; ; i++) {
                unsigned long int tmp;
-               if (i >= fw_alloc) {
+               if (i + 1 >= fw_alloc) {
                        fw_alloc *= 2;
                        erealloc(FIELDWIDTHS, int *, fw_alloc * sizeof(int), "set_FIELDWIDTHS");
                }
@@ -941,7 +942,7 @@ set_FIELDWIDTHS()
                errno = 0;
                tmp = strtoul(scan, &end, 10);
                if (errno != 0
-                   || !(*end == '\0' || is_blank(*end))
+                   || (*end != '\0' && ! is_blank(*end))
                    || !(0 < tmp && tmp <= INT_MAX))
                        fatal(_("invalid FIELDWIDTHS value, near `%s'"),
                              scan);
@@ -954,7 +955,7 @@ set_FIELDWIDTHS()
                if (*scan == '\0')
                        break;
        }
-       FIELDWIDTHS[i] = -1;
+       FIELDWIDTHS[i+1] = -1;
 
        update_PROCINFO("FS", "FIELDWIDTHS");
 }
diff --git a/io.c b/io.c
index 964c92840e6ff2e76ca5600c91932eeee6030ed9..ab17b6674e7e5f9723e3d4b5cfb46b421222f31e 100644 (file)
--- a/io.c
+++ b/io.c
@@ -71,7 +71,6 @@
 extern int MRL;
 
 #ifdef HAVE_SOCKETS
-enum inet_prot { INET_NONE, INET_TCP, INET_UDP, INET_RAW };
 
 #ifndef SHUT_RD
 #define SHUT_RD                0
@@ -110,6 +109,7 @@ typedef enum { CLOSE_ALL, CLOSE_TO, CLOSE_FROM } two_way_close_type;
 #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)
+#define is_internal(iop) ((iop->flag & IOP_IS_INTERNAL) != 0)
 /* 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. */
@@ -163,10 +163,10 @@ static IOBUF *iop_alloc P((int fd, const char *name, IOBUF *buf));
 static int gawk_pclose P((struct redirect *rp));
 static int do_pathopen P((const char *file));
 static int str2mode P((const char *mode));
-static void spec_setup P((IOBUF *iop, int len, int allocate));
-static int specfdopen P((IOBUF *iop, const char *name, const char *mode));
-static int pidopen P((IOBUF *iop, const char *name, const char *mode));
-static int useropen P((IOBUF *iop, const char *name, const char *mode));
+static void spec_setup P((IOBUF *iop, int len));
+static IOBUF *specfdopen P((IOBUF *iop, const char *name, const char *mode));
+static IOBUF *pidopen P((IOBUF *iop, const char *name, const char *mode));
+static IOBUF *useropen P((IOBUF *iop, const char *name, const char *mode));
 static int two_way_open P((const char *str, struct redirect *rp));
 static int pty_vs_pipe P((const char *command));
 
@@ -1132,24 +1132,60 @@ str2mode(const char *mode)
 /* socketopen --- open a socket and set it into connected state */
 
 static int
-socketopen(enum inet_prot type, int localport, int remoteport, const char *remotehostname)
+socketopen(int type, const char *localpname, const char *remotepname,
+       const char *remotehostname)
 {
-       struct hostent *hp = gethostbyname(remotehostname);
-       struct sockaddr_in local_addr, remote_addr;
+       struct addrinfo *lres, *lres0;
+       struct addrinfo lhints;
+       struct addrinfo *rres, *rres0;
+       struct addrinfo rhints;
+
+       int lerror;
+       int rerror;
+
        int socket_fd;
        int any_remote_host = strcmp(remotehostname, "0");
 
+       memset (&lhints, '\0', sizeof (lhints));
+       lhints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
+       lhints.ai_socktype = type;
+
+       lerror = getaddrinfo (NULL, localpname, &lhints, &lres);
+       if (lerror) {
+               if (strcmp(localpname, "0"))
+                       fatal(_("local port invalid in `/inet'"));
+               lres0 = NULL;
+               lres = &lhints;
+       } else
+               lres0 = lres;
+
+       while (lres) {
+               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 (remotehostname, remotepname, &rhints, &rres);
+               if (rerror) {
+                       if (lres0)
+                               freeaddrinfo(lres0);
+                       fatal(_("remote host and port information invalid"));
+               }
+               rres0 = rres;
        socket_fd = INVALID_HANDLE;
-       switch (type) {
-       case INET_TCP:  
-               if (localport != 0 || remoteport != 0) {
+               while (rres) {
+                       socket_fd = socket (rres->ai_family,
+                               rres->ai_socktype, rres->ai_protocol);
+                       if (socket_fd < 0 || socket_fd == INVALID_HANDLE)
+                               goto nextrres;
+
+                       if (type == SOCK_STREAM) {
                        int on = 1;
 #ifdef SO_LINGER
                        struct linger linger;
-
                        memset(& linger, '\0', sizeof(linger));
 #endif
-                       socket_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
                        setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR,
                                (char *) & on, sizeof(on));
 #ifdef SO_LINGER
@@ -1159,57 +1195,27 @@ socketopen(enum inet_prot type, int localport, int remoteport, const char *remot
                                (char *) & linger, sizeof(linger));
 #endif
                }
-               break;
-       case INET_UDP:  
-               if (localport != 0 || remoteport != 0)
-                       socket_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
-               break;
-       case INET_RAW:  
-#ifdef SOCK_RAW
-               if (localport == 0 && remoteport == 0)
-                       socket_fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); 
-#endif
-               break;
-       case INET_NONE:
-               /* fall through */
-       default:
-               cant_happen();
-               break;
-       }
-
-       if (socket_fd < 0 || socket_fd == INVALID_HANDLE
-           || (hp == NULL && any_remote_host != 0))
-               return INVALID_HANDLE;
+                       if (bind(socket_fd, lres->ai_addr, lres->ai_addrlen) != 0)
+                               goto nextrres;
 
-       local_addr.sin_family = remote_addr.sin_family = AF_INET;
-       local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
-       remote_addr.sin_addr.s_addr = htonl(INADDR_ANY);
-       local_addr.sin_port  = htons(localport);
-       remote_addr.sin_port = htons(remoteport);
-       if (bind(socket_fd, (struct sockaddr *) &local_addr, sizeof(local_addr)) == 0) {
                if (any_remote_host != 0) { /* not ANY => create a client */
-                       if (type == INET_TCP || type == INET_UDP) {
-                               memcpy(&remote_addr.sin_addr, hp->h_addr,
-                                       sizeof(remote_addr.sin_addr));
-                               if (connect(socket_fd,
-                                               (struct sockaddr *) &remote_addr,
-                                               sizeof(remote_addr)) != 0) {
-                                       close(socket_fd);
-                                       if (localport == 0)
-                                               socket_fd = INVALID_HANDLE;
-                                       else
-                                               socket_fd = socketopen(type, localport, 0, "0");
-                               }
+                               if (type != SOCK_RAW) {
+                                       if (connect(socket_fd, rres->ai_addr,
+                                               rres->ai_addrlen) == 0)
+                                               break;
                        } else {
                                /* /inet/raw client not ready yet */ 
                                fatal(_("/inet/raw client not ready yet, sorry"));
                                if (geteuid() != 0)
+                                               /* FIXME: is this second fatal ever reached? */
                                        fatal(_("only root may use `/inet/raw'."));
                        }
                } else { /* remote host is ANY => create a server */
-                       if (type == INET_TCP) {
+                               if (type == SOCK_STREAM) {
                                int clientsocket_fd = INVALID_HANDLE;
-                               socklen_t namelen = sizeof(remote_addr);
+
+                                       struct sockaddr_storage remote_addr;
+                                       socklen_t namelen = sizeof (remote_addr);
 
                                if (listen(socket_fd, 1) >= 0
                                    && (clientsocket_fd = accept(socket_fd,
@@ -1217,25 +1223,22 @@ socketopen(enum inet_prot type, int localport, int remoteport, const char *remot
                                                &namelen)) >= 0) {
                                        close(socket_fd);
                                        socket_fd = clientsocket_fd;
-                               } else {
-                                       close(socket_fd);
-                                       socket_fd = INVALID_HANDLE;
+                                               break;
                                }
-                       } else if (type == INET_UDP) {
+                               } else if (type == SOCK_DGRAM) {
 #ifdef MSG_PEEK
                                char buf[10];
+                                       struct sockaddr_storage remote_addr;
                                socklen_t readle;
 
                                if (recvfrom(socket_fd, buf, 1, MSG_PEEK,
                                        (struct sockaddr *) & remote_addr,
-                                       & readle) < 1
-                                               || readle != sizeof(remote_addr)
-                                   || connect(socket_fd,
+                                               & readle) >= 0
+                                               && readle
+                                               && connect(socket_fd,
                                        (struct sockaddr *)& remote_addr,
-                                               readle) != 0) {
-                                       close(socket_fd);
-                                       socket_fd = INVALID_HANDLE;
-                               }
+                                                       readle) == 0)
+                                               break;
 #endif
                        } else {
                                /* /inet/raw server not ready yet */ 
@@ -1244,10 +1247,20 @@ socketopen(enum inet_prot type, int localport, int remoteport, const char *remot
                                        fatal(_("only root may use `/inet/raw'."));
                        }
                }
-       } else {
+
+nextrres:
+                       if (socket_fd != INVALID_HANDLE)
                close(socket_fd);
                socket_fd = INVALID_HANDLE;
+                       rres = rres->ai_next;
+               }
+               freeaddrinfo(rres0);
+               if (socket_fd != INVALID_HANDLE)
+                       break;
+               lres = lres->ai_next;
        }
+       if (lres0)
+               freeaddrinfo(lres0);
 
        return socket_fd;
 }
@@ -1312,30 +1325,24 @@ devopen(const char *name, const char *mode)
        } else if (STREQN(name, "/inet/", 6)) {
 #ifdef HAVE_SOCKETS
                /* /inet/protocol/localport/hostname/remoteport */
-               enum inet_prot protocol = INET_NONE;
-               int localport, remoteport;
+               int protocol;
                char *hostname;
                char *hostnameslastcharp;
                char *localpname;
-               char proto[4];
-               struct servent *service;
+               char *localpnamelastcharp;
 
                cp = (char *) name + 6;
                /* which protocol? */
                if (STREQN(cp, "tcp/", 4))
-                       protocol = INET_TCP;
+                       protocol = SOCK_STREAM;
                else if (STREQN(cp, "udp/", 4))
-                       protocol = INET_UDP;
+                       protocol = SOCK_DGRAM;
                else if (STREQN(cp, "raw/", 4))
-                       protocol = INET_RAW;
+                       protocol = SOCK_RAW;
                else
                        fatal(_("no (known) protocol supplied in special filename `%s'"),
                                name);
 
-               proto[0] = cp[0];
-               proto[1] = cp[1];   
-               proto[2] = cp[2];   
-               proto[3] =  '\0';
                cp += 4;
 
                /* which localport? */
@@ -1353,25 +1360,17 @@ devopen(const char *name, const char *mode)
                 * By using atoi() the use of decimal numbers is enforced.
                 */
                *cp = '\0';
-
-               localport = atoi(localpname);
-               if (strcmp(localpname, "0") != 0
-                   && (localport <= 0 || localport > 65535)) {
-                       service = getservbyname(localpname, proto);
-                       if (service == NULL)
-                               fatal(_("local port invalid in `%s'"), name);
-                       else
-                               localport = ntohs(service->s_port);
-               }
-               *cp = '/';
+               localpnamelastcharp = cp;
 
                /* which hostname? */
                cp++;
                hostname = cp;
                while (*cp != '/' && *cp != '\0')
                        cp++; 
-               if (*cp != '/' || cp == hostname)
+               if (*cp != '/' || cp == hostname) {
+                       *localpnamelastcharp = '/';
                        fatal(_("must supply a remote hostname to `/inet'"));
+               }
                *cp = '\0';
                hostnameslastcharp = cp;
 
@@ -1385,22 +1384,15 @@ devopen(const char *name, const char *mode)
                 * Here too, require a port, let them explicitly put 0 if
                 * they don't care.
                 */
-               if (*cp == '\0')
+               if (*cp == '\0') {
+                       *localpnamelastcharp = '/';
+                       *hostnameslastcharp = '/';
                        fatal(_("must supply a remote port to `/inet'"));
-               remoteport = atoi(cp);
-               if (strcmp(cp, "0") != 0
-                   && (remoteport <= 0 || remoteport > 65535)) {
-                       service = getservbyname(cp, proto);
-                       if (service == NULL)
-                                fatal(_("remote port invalid in `%s'"), name);
-                       else
-                               remoteport = ntohs(service->s_port);
                }
 
-               /* Open Sesame! */
-               openfd = socketopen(protocol, localport, remoteport, hostname);
+               openfd = socketopen(protocol, localpname, cp, hostname);
+               *localpnamelastcharp = '/';
                *hostnameslastcharp = '/';
-
 #else /* ! HAVE_SOCKETS */
                fatal(_("TCP/IP communications are not supported"));
 #endif /* HAVE_SOCKETS */
@@ -1422,30 +1414,24 @@ strictopen:
 /* spec_setup --- setup an IOBUF for a special internal file */
 
 static void
-spec_setup(IOBUF *iop, int len, int allocate)
+spec_setup(IOBUF *iop, int len)
 {
        char *cp;
 
-       if (allocate) {
-               emalloc(cp, char *, len+2, "spec_setup");
-               iop->buf = cp;
-       } else {
-               len = strlen(iop->buf);
-               iop->buf[len++] = '\n'; /* get_a_record clobbered it */
-               iop->buf[len] = '\0';   /* just in case */
-       }
+       emalloc(cp, char *, len+2, "spec_setup");
+       iop->buf = cp;
        iop->off = iop->buf;
        iop->count = 0;
        iop->size = len;
        iop->end = iop->buf + len;
        iop->dataend = iop->end;
        iop->fd = -1;
-       iop->flag = IOP_IS_INTERNAL | IOP_AT_START;
+       iop->flag = IOP_IS_INTERNAL | IOP_AT_START | IOP_NO_FREE;
 }
 
 /* specfdopen --- open an fd special file */
 
-static int
+static IOBUF *
 specfdopen(IOBUF *iop, const char *name, const char *mode)
 {
        int fd;
@@ -1453,28 +1439,20 @@ specfdopen(IOBUF *iop, const char *name, const char *mode)
 
        fd = devopen(name, mode);
        if (fd == INVALID_HANDLE)
-               return INVALID_HANDLE;
-       tp = iop_alloc(fd, name, NULL);
+               return NULL;
+       tp = iop_alloc(fd, name, iop);
        if (tp == NULL) {
                /* don't leak fd's */
                close(fd);
-               return INVALID_HANDLE;
+               return NULL;
        }
-       *iop = *tp;
-       iop->flag |= IOP_NO_FREE;
-       free(tp);
-       return 0;
+       return tp;
 }
 
-#ifdef GETPGRP_VOID
-#define getpgrp_arg() /* nothing */
-#else
-#define getpgrp_arg() getpid()
-#endif
 
 /* pidopen --- "open" /dev/pid, /dev/ppid, and /dev/pgrpid */
 
-static int
+static IOBUF *
 pidopen(IOBUF *iop, const char *name, const char *mode ATTRIBUTE_UNUSED)
 {
        char tbuf[BUFSIZ];
@@ -1483,16 +1461,26 @@ pidopen(IOBUF *iop, const char *name, const char *mode ATTRIBUTE_UNUSED)
 
        warning(_("use `PROCINFO[\"%s\"]' instead of `%s'"), cp, name);
 
+       if (iop == NULL) {
+               iop = iop_alloc(INVALID_HANDLE, name, iop);
+               if (iop == NULL)
+                       return NULL;
+       }
+
        if (name[6] == 'g')
+#ifdef GETPGRP_VOID
+               sprintf(tbuf, "%d\n", (int) getpgrp());
+#else
                sprintf(tbuf, "%d\n", (int) getpgrp(getpgrp_arg()));
+#endif
        else if (name[6] == 'i')
                sprintf(tbuf, "%d\n", (int) getpid());
        else
                sprintf(tbuf, "%d\n", (int) getppid());
        i = strlen(tbuf);
-       spec_setup(iop, i, TRUE);
+       spec_setup(iop, i);
        strcpy(iop->buf, tbuf);
-       return 0;
+       return iop;
 }
 
 /* useropen --- "open" /dev/user */
@@ -1507,7 +1495,7 @@ pidopen(IOBUF *iop, const char *name, const char *mode ATTRIBUTE_UNUSED)
  * supplementary group set.
  */
 
-static int
+static IOBUF *
 useropen(IOBUF *iop, const char *name ATTRIBUTE_UNUSED, const char *mode ATTRIBUTE_UNUSED)
 {
        char tbuf[BUFSIZ], *cp;
@@ -1515,6 +1503,12 @@ useropen(IOBUF *iop, const char *name ATTRIBUTE_UNUSED, const char *mode ATTRIBU
 
        warning(_("use `PROCINFO[...]' instead of `/dev/user'"));
 
+       if (iop == NULL) {
+               iop = iop_alloc(INVALID_HANDLE, name, iop);
+               if (iop == NULL)
+                       return NULL;
+       }
+
        sprintf(tbuf, "%d %d %d %d", (int) getuid(), (int) geteuid(), (int) getgid(), (int) getegid());
 
        cp = tbuf + strlen(tbuf);
@@ -1529,9 +1523,9 @@ useropen(IOBUF *iop, const char *name ATTRIBUTE_UNUSED, const char *mode ATTRIBU
        *cp++ = '\0';
 
        i = strlen(tbuf);
-       spec_setup(iop, i, TRUE);
+       spec_setup(iop, i);
        strcpy(iop->buf, tbuf);
-       return 0;
+       return iop;
 }
 
 /* iop_open --- handle special and regular files for input */
@@ -1544,8 +1538,7 @@ iop_open(const char *name, const char *mode, IOBUF *iop)
        static struct internal {
                const char *name;
                int compare;
-               int (*fp) P((IOBUF *, const char *, const char *));
-               IOBUF iob;
+               IOBUF *(*fp) P((IOBUF *, const char *, const char *));
        } table[] = {
                { "/dev/fd/",           8,      specfdopen },
                { "/dev/stdin",         10,     specfdopen },
@@ -1570,12 +1563,7 @@ iop_open(const char *name, const char *mode, IOBUF *iop)
 
                for (i = 0; i < devcount; i++) {
                        if (STREQN(name, table[i].name, table[i].compare)) {
-                               iop = & table[i].iob;
-
-                               if (iop->buf != NULL) {
-                                       spec_setup(iop, 0, FALSE);
-                                       return iop;
-                               } else if ((*table[i].fp)(iop, name, mode) == 0)
+                               if ((iop = (*table[i].fp)(iop, name, mode)) != NULL)
                                        return iop;
                                else {
                                        warning(_("could not open `%s', mode `%s'"),
@@ -2480,9 +2468,12 @@ iop_alloc(int fd, const char *name, IOBUF *iop)
 {
        struct stat sbuf;
        struct open_hook *oh;
+       int iop_malloced = FALSE;
 
-       if (iop == NULL)
+       if (iop == NULL) {
                emalloc(iop, IOBUF *, sizeof(IOBUF), "iop_alloc");
+               iop_malloced = TRUE;
+       }
        memset(iop, '\0', sizeof(IOBUF));
        iop->flag = 0;
        iop->fd = fd;
@@ -2495,7 +2486,8 @@ iop_alloc(int fd, const char *name, IOBUF *iop)
        }
 
        if (iop->fd == INVALID_HANDLE) {
-               free(iop);
+               if (iop_malloced)
+                       free(iop);
                return NULL;
        }
        if (isatty(iop->fd))
@@ -2503,7 +2495,7 @@ iop_alloc(int fd, const char *name, IOBUF *iop)
        iop->readsize = iop->size = optimal_bufsize(iop->fd, & sbuf);
        iop->sbuf = sbuf;
        if (do_lint && S_ISREG(sbuf.st_mode) && sbuf.st_size == 0)
-                       lintwarn(_("data file `%s' is empty"), name);
+               lintwarn(_("data file `%s' is empty"), name);
        errno = 0;
        iop->count = iop->scanoff = 0;
        emalloc(iop->buf, char *, iop->size += 2, "iop_alloc");
@@ -2906,6 +2898,10 @@ get_a_record(char **out,        /* pointer to pointer to data */
 
         /* <fill initial buffer>=                                                   */
         if (has_no_data(iop) || no_data_left(iop)) {
+               if (is_internal(iop)) {
+                       iop->flag |= IOP_AT_EOF;
+                       return EOF;
+               }
                 iop->count = read(iop->fd, iop->buf, iop->readsize);
                 if (iop->count == 0) {
                         iop->flag |= IOP_AT_EOF;
diff --git a/main.c b/main.c
index 847ae54e2c0479ee6eed1487b1564000b7bcb700..baf1396501731299db98b6c902098dbba9bf3bb4 100644 (file)
--- a/main.c
+++ b/main.c
@@ -930,14 +930,11 @@ load_procinfo()
 
        PROCINFO_node = install("PROCINFO",
                        node((NODE *) NULL, Node_var_array, (NODE *) NULL));
-
 #ifdef GETPGRP_VOID
-#define getpgrp_arg() /* nothing */
+       value = getpgrp();
 #else
-#define getpgrp_arg() getpid()
+       value = getpgrp(getpid());
 #endif
-
-       value = getpgrp(getpgrp_arg());
        aptr = assoc_lookup(PROCINFO_node, tmp_string("pgrpid", 6), FALSE);
        *aptr = make_number(value);
 
diff --git a/node.c b/node.c
index b49a15064695ba0577d426ac70d897ff27cfb836..795cc2e04e7787953ca733d8f2e361dfef23cb50 100644 (file)
--- a/node.c
+++ b/node.c
@@ -96,6 +96,7 @@ r_force_number(register NODE *n)
                if (! do_traditional && isnondecimal(cp, TRUE)) {
                        n->numbr = nondec2awknum(cp, cpend - cp);
                        n->flags |= NUMCUR;
+                       ptr = cpend;
                        goto finish;
                }
        }
@@ -151,6 +152,7 @@ format_val(const char *format, int index, register NODE *s)
        register char *sp = buf;
        double val;
        char *orig, *trans, save;
+       register long num;
 
        if (! do_traditional && (s->flags & INTLSTR) != 0) {
                save = s->stptr[s->stlen];
@@ -163,9 +165,12 @@ format_val(const char *format, int index, register NODE *s)
                return tmp_string(trans, strlen(trans));
        }
 
-       /* not an integral value, or out of range */
-       if ((val = double_to_int(s->numbr)) != s->numbr
-           || val < LONG_MIN || val > LONG_MAX) {
+       /* conversion to long overflows, or out of range, or not integral */
+       val = double_to_int(s->numbr);
+       num = (long) val;
+       if (   (s->numbr > 0 && num < 0)
+           || (s->numbr < 0 && num > 0)
+           || val < LONG_MIN || val > LONG_MAX || val != s->numbr) {
                /*
                 * Once upon a time, if GFMT_WORKAROUND wasn't defined,
                 * we just blindly did this:
@@ -199,9 +204,7 @@ format_val(const char *format, int index, register NODE *s)
 
                goto no_malloc;
        } else {
-               /* integral value */
-               /* force conversion to long only once */
-               register long num = (long) val;
+               /* integral value, in range, too! */
                if (num < NVAL && num >= 0) {
                        sp = (char *) values[num];
                        s->stlen = 1;
@@ -216,15 +219,7 @@ format_val(const char *format, int index, register NODE *s)
 no_malloc:
        s->stref = 1;
        s->flags |= STRCUR;
-#if defined MBS_SUPPORT
-       if ((s->flags & WSTRCUR) != 0) {
-               assert(s->wstptr != NULL);
-               free(s->wstptr);
-               s->wstptr = NULL;
-               s->wstlen = 0;
-               s->flags &= ~WSTRCUR;
-       }
-#endif
+       free_wstr(s);
        return s;
 }
 
@@ -287,8 +282,14 @@ r_dupnode(NODE *n)
        *r = *n;
        r->flags &= ~(PERM|TEMP|FIELD);
        r->flags |= MALLOC;
-#if defined MBS_SUPPORT
+#ifdef MBS_SUPPORT
+       /*
+        * DON'T call free_wstr(r) here!
+        * r->wstptr still points at n->wstptr's value, and we
+        * don't want to free it!
+        */
        r->wstptr = NULL;
+       r->wstlen = 0;
 #endif /* defined MBS_SUPPORT */
        if (n->type == Node_val && (n->flags & STRCUR) != 0) {
                r->stref = 1;
@@ -344,11 +345,7 @@ mk_number(AWKNUM x, unsigned int flags)
        r->stref = 1;
        r->stptr = NULL;
        r->stlen = 0;
-#if defined MBS_SUPPORT
-       r->wstptr = NULL;
-       r->wstlen = 0;
-       r->flags &= ~WSTRCUR;
-#endif /* MBS_SUPPORT */
+       free_wstr(r);
 #endif /* GAWKDEBUG */
        return r;
 }
@@ -363,10 +360,11 @@ make_str_node(char *s, unsigned long len, int flags)
        getnode(r);
        r->type = Node_val;
        r->flags = (STRING|STRCUR|MALLOC);
-#if defined MBS_SUPPORT
+#ifdef MBS_SUPPORT
        r->wstptr = NULL;
        r->wstlen = 0;
-#endif
+#endif /* defined MBS_SUPPORT */
+
        if (flags & ALREADY_MALLOCED)
                r->stptr = s;
        else {
@@ -510,20 +508,13 @@ unref(register NODE *tmp)
                                return;
                        }
                        free(tmp->stptr);
-#if defined MBS_SUPPORT
-                       if (tmp->wstptr != NULL) {
-                               assert((tmp->flags & WSTRCUR) != 0);
-                               free(tmp->wstptr);
-                       }
-                       tmp->flags &= ~WSTRCUR;
-                       tmp->wstptr = NULL;
-                       tmp->wstlen = 0;
-#endif
+                       free_wstr(tmp);
                }
                freenode(tmp);
                return;
        }
        if ((tmp->flags & FIELD) != 0) {
+               free_wstr(tmp);
                freenode(tmp);
                return;
        }
@@ -704,12 +695,8 @@ str2wstr(NODE *n, size_t **ptr)
                        return n;
                /* otherwise
                        fall through and recompute to fill in the array */
-       }
-
-       if (n->wstptr != NULL) {
-               free(n->wstptr);
-               n->wstptr = NULL;
-               n->wstlen = 0;
+               if (n->wstptr != NULL) 
+                       free_wstr(n);
        }
 
        /*
@@ -750,8 +737,8 @@ str2wstr(NODE *n, size_t **ptr)
                case (size_t) -2:
                case (size_t) -1:
                case 0:
-                       goto done;
-
+                       count = 1;
+                       /* fall through */
                default:
                        *wsp++ = wc;
                        src_count -= count;
@@ -775,6 +762,20 @@ done:
        return n;
 }
 
+/* free_wstr --- release the wide string part of a node */
+
+void
+free_wstr(NODE *n)
+{
+       if ((n->flags & WSTRCUR) != 0) {
+               assert(n->wstptr != NULL);
+               free(n->wstptr);
+       }
+       n->wstptr = NULL;
+       n->wstlen = 0;
+       n->flags &= ~WSTRCUR;
+}
+
 #if 0
 static void
 dump_wstr(FILE *fp, const wchar_t *str, size_t len)
diff --git a/packaging/gawk.manifest b/packaging/gawk.manifest
new file mode 100644 (file)
index 0000000..4c82632
--- /dev/null
@@ -0,0 +1,10 @@
+<manifest>
+  <request>
+    <domain name="_"/>
+  </request>
+  <assign>
+    <filesystem path="/usr/lib/awk/grcat" exec_label="none" />
+    <filesystem path="/usr/lib/awk/pwcat" exec_label="none" />
+    <filesystem path="/bin/*" exec_label="none" />
+  </assign>
+</manifest>
diff --git a/packaging/gawk.spec b/packaging/gawk.spec
new file mode 100644 (file)
index 0000000..4260ca8
--- /dev/null
@@ -0,0 +1,61 @@
+%define run_tests 0
+%if %{run_tests}
+    # check is defined off at .rpmmacros file.
+    %undefine check
+%endif
+
+Name:           gawk
+Provides:       awk
+Version:        3.1.5
+Release:        0
+License:        GPL-2.0+
+Summary:        GNU awk
+Url:            http://www.gnu.org/software/gawk/
+Group:          Base/Utilities
+Source:         gawk-%{version}.tar.gz
+Source1001:     gawk.manifest
+
+BuildRequires:  bison
+BuildRequires:  flex
+Requires:       /bin/mktemp
+
+%description
+The gawk package contains the GNU version of awk, a text processing
+utility. Awk interprets a special-purpose programming language to do
+quick and easy text pattern matching and reformatting jobs.
+
+Install the gawk package if you need a text processing utility. Gawk is
+considered to be a standard Linux tool for processing text.
+
+%prep
+%setup -q
+cp %{SOURCE1001} .
+
+%build
+%configure \
+        --disable-man \
+        --disable-nls
+
+make %{?_smp_mflags}
+
+%check
+%if %{run_tests}
+    %__make check || exit 0
+    chmod 775 ./run_test.sh
+    ./run_test.sh %{name} %{version}
+%endif
+
+%install
+%make_install
+
+chmod a-x COPYING
+
+%remove_docs
+
+%files
+%manifest gawk.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%{_bindir}/*
+%{_libexecdir}/awk
+%{_datadir}/awk
diff --git a/run_test.sh b/run_test.sh
new file mode 100755 (executable)
index 0000000..4257d1e
--- /dev/null
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+PACKAGE_NAME=$1
+PACKAGE_VERSION=$2
+
+TEST_LOG="/tmp/${PACKAGE_NAME}_test"
+export TEST_LOG
+
+# Color
+Color_Off='\e[0m'       # Text Reset
+
+# Regular Colors
+Red='\e[0;31m'          # Red
+Green='\e[0;32m'        # Green
+Cyan='\e[0;36m'         # Cyank
+
+# Bold
+BWhite='\e[1;37m'       # White
+
+result_check() {
+    test_case=$1
+    if [ $? -eq 0 ]
+    then
+        echo -e "${Green}PASS${Color_Off}: $test_case"
+        echo "TEST: PASS: $test_case" >> ${TEST_LOG}
+    else
+        echo -e "${Red}FAIL${Color_Off}: $test_case"
+        echo -e "TEST: FAIL: $test_case" >> ${TEST_LOG}
+    fi
+}
+
+skip_test() {
+    test_case=$1
+    echo -e "${Cyan}SKIP${Color_Off}: $test_case"
+    echo "TEST: SKIP: $test_case" >> ${TEST_LOG}
+}
+
+TOTAL_CNT=`grep "TEST:" ${TEST_LOG} | wc -l`
+PASS_CNT=`grep "PASS:" ${TEST_LOG} | wc -l`
+FAIL_CNT=`grep "FAIL:" ${TEST_LOG} | wc -l`
+SKIP_CNT=`grep "SKIP:" ${TEST_LOG} | wc -l`
+
+
+br='==================='; br=$br$br$br$br;
+
+echo -e "${Green}$br ${Color_Off}"
+echo -e "${Green}Testsuite summary for ${PACKAGE_NAME} ${PACKAGE_VERSION}${Color_Off}"
+echo -e "${Green}$br ${Color_Off}"
+echo -e "#${BWhite} TOTAL: $TOTAL_CNT ${Color_Off}"
+echo -e "#${Green} PASS${Color_Off} : $PASS_CNT"
+echo -e "#${Red} FAIL${Color_Off} : $FAIL_CNT"
+echo -e "#${Cyan} SKIP${Color_Off} : $SKIP_CNT"
+echo -e "${Green}$br ${Color_Off}"
+
+rm -f ${TEST_LOG}
+exit 0
+
index 0ce9b099f5e3777ef5a1107e53b54c9250bbe654..ba070ed96e84d20bbb6019a9e344af2c464f1481 100644 (file)
@@ -782,6 +782,8 @@ CMP = cmp
 AWKPROG = ../gawk$(EXEEXT)
 all: all-am
 
+TEST_LOG = /tmp/gawk_test
+
 .SUFFIXES:
 $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Maketests $(am__configure_deps)
        @for dep in $?; do \
@@ -956,6 +958,7 @@ msg::
        @echo 'in floating point values are probably benign -- in particular,'
        @echo 'some systems may omit a leading zero and the floating point'
        @echo 'precision may lead to slightly different output in a few cases.'
+       @-rm -f $(TEST_LOG)
 
 printlang::
        @$(AWK) -f $(srcdir)/printlang.awk
@@ -994,12 +997,44 @@ poundbang::
                chmod +x ./_pbd.awk ; \
                LC_ALL=$${GAWKLOCALE:-C} LANG=$${GAWKLOCALE:-C} ./_pbd.awk $(srcdir)/poundbang.awk > _`basename $@`;  \
        fi
-       @-$(CMP) $(srcdir)/poundbang.awk _`basename $@` && rm -f _`basename $@` _pbd.awk
+       @-$(CMP) $(srcdir)/poundbang.awk _`basename $@` ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _`basename $@` _pbd.awk;
 
 messages::
        @echo $@
        @$(AWK) -f $(srcdir)/messages.awk >out2 2>out3
-       @-$(CMP) $(srcdir)/out1.ok out1 && $(CMP) $(srcdir)/out2.ok out2 && $(CMP) $(srcdir)/out3.ok out3 && rm -f out1 out2 out3
+       @-$(CMP) $(srcdir)/out1.ok out1 ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       $(CMP) $(srcdir)/out2.ok out2 ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       $(CMP) $(srcdir)/out3.ok out3 ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f out1 out2 out3;
 
 argarray::
        @echo $@
@@ -1012,7 +1047,15 @@ argarray::
        .)      : ;; \
        *)      rm -f ./argarray.in ;; \
        esac
-       @-$(CMP) $(srcdir)/argarray.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/argarray.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 regtest::
        @echo 'Some of the output from regtest is very system specific, do not'
@@ -1027,43 +1070,107 @@ manyfiles::
        @$(AWK) 'BEGIN { for (i = 1; i <= 300; i++) print i, i}' >_$@
        @$(AWK) -f $(srcdir)/manyfiles.awk _$@ _$@
        @wc -l junk/* | $(AWK) '$$1 != 2' | wc -l | sed "s/  *//g" > _$@
-       @rm -rf junk ; $(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @rm -rf junk ; $(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 compare::
        @echo $@
        @$(AWK) -f $(srcdir)/compare.awk 0 1 $(srcdir)/compare.in >_$@
-       @-$(CMP) $(srcdir)/compare.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/compare.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 inftest::
        @echo $@
        @echo This test is very machine specific...
        @$(AWK) -f $(srcdir)/inftest.awk | sed "s/inf/Inf/g" >_$@
-       @-$(CMP) $(srcdir)/inftest.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/inftest.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 getline2::
        @echo $@
        @$(AWK) -f $(srcdir)/getline2.awk $(srcdir)/getline2.awk $(srcdir)/getline2.awk >_$@
-       @-$(CMP) $(srcdir)/getline2.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/getline2.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 awkpath::
        @echo $@
        @AWKPATH="$(srcdir)$(PATH_SEPARATOR)$(srcdir)/lib" $(AWK) -f awkpath.awk >_$@
-       @-$(CMP) $(srcdir)/awkpath.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/awkpath.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 argtest::
        @echo $@
        @$(AWK) -f $(srcdir)/argtest.awk -x -y abc >_$@
-       @-$(CMP) $(srcdir)/argtest.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/argtest.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 badargs::
        @echo $@
        @-$(AWK) -f 2>&1 | grep -v patchlevel >_$@
-       @-$(CMP) $(srcdir)/badargs.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/badargs.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nonl::
        @echo $@
        @-AWKPATH=$(srcdir) $(AWK) --lint -f nonl.awk /dev/null >_$@ 2>&1
-       @-$(CMP) $(srcdir)/nonl.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/nonl.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 strftime::
        @echo This test could fail on slow machines or on a minute boundary,
@@ -1072,40 +1179,96 @@ strftime::
        @GAWKLOCALE=C; export GAWKLOCALE; \
        TZ=GMT0; export TZ; \
        (LC_ALL=C date) | $(AWK) -v OUTPUT=_$@ -f $(srcdir)/strftime.awk
-       @-$(CMP) strftime.ok _$@ && rm -f _$@ strftime.ok || exit 0
+       @-$(CMP) strftime.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@ strftime.ok;
 
 litoct::
        @echo $@
        @echo ab | $(AWK) --traditional -f $(srcdir)/litoct.awk >_$@
-       @-$(CMP) $(srcdir)/litoct.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/litoct.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fflush::
        @echo $@
        @$(srcdir)/fflush.sh >_$@
-       @-$(CMP) $(srcdir)/fflush.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/fflush.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 tweakfld::
        @echo $@
        @$(AWK) -f $(srcdir)/tweakfld.awk $(srcdir)/tweakfld.in >_$@
        @rm -f errors.cleanup
-       @-$(CMP) $(srcdir)/tweakfld.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/tweakfld.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 mmap8k::
        @echo $@
        @$(AWK) '{ print }' $(srcdir)/mmap8k.in >_$@
-       @-$(CMP) $(srcdir)/mmap8k.in _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/mmap8k.in _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 tradanch::
        @echo $@
        @$(AWK) --traditional -f $(srcdir)/tradanch.awk $(srcdir)/tradanch.in >_$@
-       @-$(CMP) $(srcdir)/tradanch.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/tradanch.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 # AIX /bin/sh exec's the last command in a list, therefore issue a ":"
 # command so that pid.sh is fork'ed as a child before being exec'ed.
 pid::
        @echo pid
        @AWKPATH=$(srcdir) AWK=$(AWKPROG) $(SHELL) $(srcdir)/pid.sh $$$$ > _`basename $@` ; :
-       @-$(CMP) $(srcdir)/pid.ok _`basename $@` && rm -f _`basename $@` _`basename $@`.in
+       @-$(CMP) $(srcdir)/pid.ok _`basename $@` ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _`basename $@` _`basename $@`.in;
 
 strftlng::
        @echo $@
@@ -1113,45 +1276,125 @@ strftlng::
        @if $(CMP) $(srcdir)/strftlng.ok _$@ >/dev/null 2>&1 ; then : ; else \
        TZ=UTC0; export TZ; $(AWK) -f $(srcdir)/strftlng.awk >_$@ ; \
        fi
-       @-$(CMP) $(srcdir)/strftlng.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/strftlng.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nors::
        @echo $@
        @echo A B C D E | tr -d '\12\15' | $(AWK) '{ print $$NF }' - $(srcdir)/nors.in > _$@
-       @-$(CMP) $(srcdir)/nors.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/nors.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 reint::
        @echo $@
        @$(AWK) --re-interval -f $(srcdir)/reint.awk $(srcdir)/reint.in >_$@
-       @-$(CMP) $(srcdir)/reint.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/reint.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 pipeio1::
        @echo $@
        @$(AWK) -f $(srcdir)/pipeio1.awk >_$@
        @rm -f test1 test2
-       @-$(CMP) $(srcdir)/pipeio1.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/pipeio1.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 pipeio2::
        @echo $@
        @$(AWK) -v SRCDIR=$(srcdir) -f $(srcdir)/pipeio2.awk >_$@
-       @-$(CMP) $(srcdir)/pipeio2.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/pipeio2.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 clobber::
        @echo $@
        @$(AWK) -f $(srcdir)/clobber.awk >_$@
-       @-$(CMP) $(srcdir)/clobber.ok seq && $(CMP) $(srcdir)/clobber.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/clobber.ok seq ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       $(CMP) $(srcdir)/clobber.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
        @rm -f seq
 
 arynocls::
        @echo $@
        @-AWKPATH=$(srcdir) $(AWK) -v INPUT=$(srcdir)/arynocls.in -f arynocls.awk >_$@
-       @-$(CMP) $(srcdir)/arynocls.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/arynocls.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 getlnbuf::
        @echo $@
        @-AWKPATH=$(srcdir) $(AWK) -f getlnbuf.awk $(srcdir)/getlnbuf.in > _$@
        @-AWKPATH=$(srcdir) $(AWK) -f gtlnbufv.awk $(srcdir)/getlnbuf.in > _2$@
-       @-$(CMP) $(srcdir)/getlnbuf.ok _$@ && $(CMP) $(srcdir)/getlnbuf.ok _2$@ && rm -f _$@ _2$@
+       @-$(CMP) $(srcdir)/getlnbuf.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       $(CMP) $(srcdir)/getlnbuf.ok _2$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@ _2$@;
 
 inetmesg::
        @echo These tests only work if your system supports the services
@@ -1179,27 +1422,67 @@ inetdayt::
 redfilnm::
        @echo $@
        @$(AWK) -f $(srcdir)/redfilnm.awk srcdir=$(srcdir) $(srcdir)/redfilnm.in >_$@
-       @-$(CMP) $(srcdir)/redfilnm.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/redfilnm.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 leaddig::
        @echo $@
        @$(AWK) -v x=2E  -f $(srcdir)/leaddig.awk >_$@
-       @-$(CMP) $(srcdir)/leaddig.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/leaddig.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 gsubtst3::
        @echo $@
        @$(AWK) --re-interval -f $(srcdir)/$@.awk $(srcdir)/$@.in >_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 space::
        @echo $@
        @$(AWK) -f ' ' $(srcdir)/space.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 printf0::
        @echo $@
        @$(AWK) --posix -f $(srcdir)/$@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rsnulbig::
        @echo $@
@@ -1207,7 +1490,15 @@ rsnulbig::
        @$(AWK) 'BEGIN { for (i = 1; i <= 128*64+1; i++) print "abcdefgh123456\n" }' 2>&1 | \
        $(AWK) 'BEGIN { RS = ""; ORS = "\n\n" }; { print }' 2>&1 | \
        $(AWK) '/^[^a]/; END{ print NR }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rsnulbig2::
        @echo $@
@@ -1215,997 +1506,2581 @@ rsnulbig2::
                for (i = 1; i <= 128; i++) print n; print "abc\n" }' 2>&1 | \
                $(AWK) 'BEGIN { RS = ""; ORS = "\n\n" };{ print }' 2>&1 | \
                $(AWK) '/^[^a]/; END { print NR }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 whiny::
        @echo $@
        @WHINY_USERS=1 $(AWK) -f $(srcdir)/$@.awk $(srcdir)/$@.in >_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 ignrcas2::
        @echo $@
        @GAWKLOCALE=en_US ; export GAWKLOCALE ; \
        $(AWK) -f $(srcdir)/$@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >> _$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 subamp::
        @echo $@
        @GAWKLOCALE=en_US.UTF-8 ; export GAWKLOCALE ; \
        $(AWK) -f $(srcdir)/$@.awk $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >> _$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 # This test makes sure gawk exits with a zero code.
 # Thus, unconditionally generate the exit code.
 exitval1::
        @echo $@
        @$(AWK) -f $(srcdir)/exitval1.awk >_$@ 2>&1; echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fsspcoln::
        @echo $@
        @$(AWK) -f $(srcdir)/$@.awk 'FS=[ :]+' $(srcdir)/$@.in >_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rsstart1::
        @echo $@
        @$(AWK) -f $(srcdir)/$@.awk $(srcdir)/rsstart1.in >_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rsstart2::
        @echo $@
        @$(AWK) -f $(srcdir)/$@.awk $(srcdir)/rsstart1.in >_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rsstart3::
        @echo $@
        @head $(srcdir)/rsstart1.in | $(AWK) -f $(srcdir)/rsstart2.awk >_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nondec2::
        @echo $@
        @$(AWK) --non-decimal-data -v a=0x1 -f $(srcdir)/$@.awk >_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 Gt-dummy:
 # file Maketests, generated from Makefile.am by the Gentests program
 addcomma:
        @echo addcomma
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 anchgsub:
        @echo anchgsub
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 arrayparm:
        @echo arrayparm
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 arrayref:
        @echo arrayref
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 arrymem1:
        @echo arrymem1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 arrayprm2:
        @echo arrayprm2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 arrayprm3:
        @echo arrayprm3
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 arryref2:
        @echo arryref2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+rm -f _$@;
 
 arryref3:
        @echo arryref3
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 arryref4:
        @echo arryref4
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 arryref5:
        @echo arryref5
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 arynasty:
        @echo arynasty
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 aryprm1:
        @echo aryprm1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 aryprm2:
        @echo aryprm2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 aryprm3:
        @echo aryprm3
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 aryprm4:
        @echo aryprm4
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 aryprm5:
        @echo aryprm5
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 aryprm6:
        @echo aryprm6
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 aryprm7:
        @echo aryprm7
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 aryprm8:
        @echo aryprm8
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 arysubnm:
        @echo arysubnm
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 asgext:
        @echo asgext
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 back89:
        @echo back89
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 backgsub:
        @echo backgsub
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 childin:
        @echo childin
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 clsflnam:
        @echo clsflnam
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 compare2:
        @echo compare2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 concat1:
        @echo concat1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 concat2:
        @echo concat2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 concat3:
        @echo concat3
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 convfmt:
        @echo convfmt
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 datanonl:
        @echo datanonl
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 defref:
        @echo defref
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 delarprm:
        @echo delarprm
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 delarpm2:
        @echo delarpm2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 delfunc:
        @echo delfunc
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 dynlj:
        @echo dynlj
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 eofsplit:
        @echo eofsplit
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 exitval2:
        @echo exitval2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fldchg:
        @echo fldchg
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fldchgnf:
        @echo fldchgnf
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fmttest:
        @echo fmttest
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fnamedat:
        @echo fnamedat
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fnarray:
        @echo fnarray
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fnarray2:
        @echo fnarray2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fnarydel:
        @echo fnarydel
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fnaryscl:
        @echo fnaryscl
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fnasgnm:
        @echo fnasgnm
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fnmisc:
        @echo fnmisc
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fnparydl:
        @echo fnparydl
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fordel:
        @echo fordel
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 forsimp:
        @echo forsimp
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fsbs:
        @echo fsbs
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fsrs:
        @echo fsrs
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fstabplus:
        @echo fstabplus
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 funsemnl:
        @echo funsemnl
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 funsmnam:
        @echo funsmnam
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 funstack:
        @echo funstack
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 getline:
        @echo getline
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 getline3:
        @echo getline3
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 getnr2tb:
        @echo getnr2tb
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 getnr2tm:
        @echo getnr2tm
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 gsubasgn:
        @echo gsubasgn
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 gsubtest:
        @echo gsubtest
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 gsubtst2:
        @echo gsubtst2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 gsubtst4:
        @echo gsubtst4
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 gsubtst5:
        @echo gsubtst5
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+rm -f _$@;
 
 hex:
        @echo hex
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 hsprint:
        @echo hsprint
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 inputred:
        @echo inputred
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 intest:
        @echo intest
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 intprec:
        @echo intprec
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 iobug1:
        @echo iobug1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 leadnl:
        @echo leadnl
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 longsub:
        @echo longsub
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 longwrds:
        @echo longwrds
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 manglprm:
        @echo manglprm
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 math:
        @echo math
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+rm -f _$@;
 
 membug1:
        @echo membug1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 minusstr:
        @echo minusstr
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nasty:
        @echo nasty
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nasty2:
        @echo nasty2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 negexp:
        @echo negexp
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nested:
        @echo nested
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nfldstr:
        @echo nfldstr
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nfneg:
        @echo nfneg
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nfset:
        @echo nfset
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nlfldsep:
        @echo nlfldsep
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nlinstr:
        @echo nlinstr
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nlstrina:
        @echo nlstrina
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 noeffect:
        @echo noeffect
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nofmtch:
        @echo nofmtch
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 noloop1:
        @echo noloop1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 noloop2:
        @echo noloop2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 noparms:
        @echo noparms
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nulrsend:
        @echo nulrsend
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 numindex:
        @echo numindex
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 numsubstr:
        @echo numsubstr
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 octsub:
        @echo octsub
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 ofmt:
        @echo ofmt
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 ofmtbig:
        @echo ofmtbig
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 ofmtfidl:
        @echo ofmtfidl
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 ofmts:
        @echo ofmts
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 onlynl:
        @echo onlynl
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 opasnidx:
        @echo opasnidx
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 opasnslf:
        @echo opasnslf
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 paramdup:
        @echo paramdup
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 paramtyp:
        @echo paramtyp
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 parseme:
        @echo parseme
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 pcntplus:
        @echo pcntplus
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 prdupval:
        @echo prdupval
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 prec:
        @echo prec
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 printf1:
        @echo printf1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 prmarscl:
        @echo prmarscl
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 prmreuse:
        @echo prmreuse
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 prt1eval:
        @echo prt1eval
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 prtoeval:
        @echo prtoeval
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 psx96sub:
        @echo psx96sub
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rand:
        @echo rand
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rebt8b1:
        @echo rebt8b1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rebt8b2:
        @echo rebt8b2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 regeq:
        @echo regeq
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 reindops:
        @echo reindops
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 reparse:
        @echo reparse
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 resplit:
        @echo resplit
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rs:
        @echo rs
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rsnul1nl:
        @echo rsnul1nl
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rstest1:
        @echo rstest1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rstest2:
        @echo rstest2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rstest3:
        @echo rstest3
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rstest4:
        @echo rstest4
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rstest5:
        @echo rstest5
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rswhite:
        @echo rswhite
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 scalar:
        @echo scalar
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 sclforin:
        @echo sclforin
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 sclifin:
        @echo sclifin
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 sortempty:
        @echo sortempty
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 splitargv:
        @echo splitargv
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 splitarr:
        @echo splitarr
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 splitdef:
        @echo splitdef
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 splitvar:
        @echo splitvar
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 splitwht:
        @echo splitwht
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 sprintfc:
        @echo sprintfc
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 strcat1:
        @echo strcat1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 strtod:
        @echo strtod
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 subsepnm:
        @echo subsepnm
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 subslash:
        @echo subslash
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 substr:
        @echo substr
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 swaplns:
        @echo swaplns
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 synerr1:
        @echo synerr1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 uninit2:
        @echo uninit2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 uninit3:
        @echo uninit3
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 uninit4:
        @echo uninit4
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 uninitialized:
        @echo uninitialized
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 unterm:
        @echo unterm
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 wjposer1:
        @echo wjposer1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 zeroe0:
        @echo zeroe0
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 zeroflag:
        @echo zeroflag
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 getlnhd:
        @echo getlnhd
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 asort:
        @echo asort
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 asorti:
        @echo asorti
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 backw:
        @echo backw
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 clos1way:
        @echo clos1way
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fieldwdth:
        @echo fieldwdth
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 fsfwfs:
        @echo fsfwfs
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 gensub:
        @echo gensub
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 gensub2:
        @echo gensub2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 gnuops2:
        @echo gnuops2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 gnuops3:
        @echo gnuops3
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 gnureops:
        @echo gnureops
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 icasefs:
        @echo icasefs
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 icasers:
        @echo icasers
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 igncdym:
        @echo igncdym
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 igncfs:
        @echo igncfs
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 ignrcase:
        @echo ignrcase
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 lint:
        @echo lint
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 match1:
        @echo match1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 match2:
        @echo match2
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 nondec:
        @echo nondec
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 posix:
        @echo posix
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 procinfs:
        @echo procinfs
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 printfbad1:
        @echo printfbad1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 regx8bit:
        @echo regx8bit
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rebuf:
        @echo rebuf
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 rstest6:
        @echo rstest6
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  < $(srcdir)/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 shadow:
        @echo shadow
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 sort1:
        @echo sort1
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 strtonum:
        @echo strtonum
        @AWKPATH=$(srcdir) $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
-       @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@
+       @-$(CMP) $(srcdir)/$@.ok _$@ ;\
+       if test $$? -eq 0; then\
+               echo -e "PASS: $@" ;\
+               echo "TEST: PASS: $@" >> $(TEST_LOG) ;\
+       else \
+               echo -e "FAIL: $@" ;\
+               echo -e "TEST: FAIL: $@" >> $(TEST_LOG) ;\
+       fi;\
+       rm -f _$@;
 
 # end of file Maketests