summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>1994-10-02 23:01:05 +0000
committerJim Meyering <jim@meyering.net>1994-10-02 23:01:05 +0000
commitc9b696a6bdd47cda67dae18be0b10f3719a8a5f3 (patch)
tree1382ba752023bb9eced53f38477325d03d2041cf
parentb2e7f0596a8dad6e5af4ade0ae7e50bc3d6cf77d (diff)
downloadcoreutils-c9b696a6bdd47cda67dae18be0b10f3719a8a5f3.tar.xz
merge with 1.9.1g
-rw-r--r--lib/memchr.c7
-rw-r--r--lib/regex.c147
-rw-r--r--old/textutils/ChangeLog56
-rw-r--r--old/textutils/NEWS2
-rw-r--r--src/fmt.c2
-rw-r--r--src/sort.c2
6 files changed, 144 insertions, 72 deletions
diff --git a/lib/memchr.c b/lib/memchr.c
index 1fe765484..44a9dc5e0 100644
--- a/lib/memchr.c
+++ b/lib/memchr.c
@@ -21,14 +21,7 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#ifdef HAVE_CONFIG_H
-#if defined (CONFIG_BROKETS)
-/* We use <config.h> instead of "config.h" so that a compilation
- using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
- (which it would do because it found this file in $srcdir). */
#include <config.h>
-#else
-#include "config.h"
-#endif
#endif
#if (SIZEOF_LONG != 4 && SIZEOF_LONG != 8)
diff --git a/lib/regex.c b/lib/regex.c
index 2edcc42f8..fd3c6a885 100644
--- a/lib/regex.c
+++ b/lib/regex.c
@@ -27,14 +27,7 @@
#define _GNU_SOURCE
#ifdef HAVE_CONFIG_H
-#if defined (emacs) || defined (CONFIG_BROKETS)
-/* We use <config.h> instead of "config.h" so that a compilation
- using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
- (which it would do because it found this file in $srcdir). */
#include <config.h>
-#else
-#include "config.h"
-#endif
#endif
/* We need this for `regex.h', and perhaps for the Emacs include files. */
@@ -898,8 +891,8 @@ static const char *re_error_msg[] =
ralloc heap) shift the data out from underneath the regexp
routines.
- Here's another reason to avoid allocation: Emacs insists on
- processing input from X in a signal handler; processing X input may
+ Here's another reason to avoid allocation: Emacs
+ processes input from X in a signal handler; processing X input may
call malloc; if input arrives while a matching routine is calling
malloc, then we're scrod. But Emacs can't just block input while
calling matching routines; then we don't notice interrupts when
@@ -910,8 +903,9 @@ static const char *re_error_msg[] =
/* Normally, this is fine. */
#define MATCH_MAY_ALLOCATE
-/* But under some circumstances, it's not. */
-#if defined (emacs) || (defined (REL_ALLOC) && defined (C_ALLOCA))
+/* The match routines may not allocate if (1) they would do it with malloc
+ and (2) it's not safe for htem to use malloc. */
+#if (defined (C_ALLOCA) || defined (REGEX_MALLOC)) && (defined (emacs) || defined (REL_ALLOC))
#undef MATCH_MAY_ALLOCATE
#endif
@@ -1494,6 +1488,10 @@ typedef struct
The `fastmap' and `newline_anchor' fields are neither
examined nor set. */
+/* Return, freeing storage we allocated. */
+#define FREE_STACK_RETURN(value) \
+ return (free (compile_stack.stack), value)
+
static reg_errcode_t
regex_compile (pattern, size, syntax, bufp)
const char *pattern;
@@ -1600,7 +1598,7 @@ regex_compile (pattern, size, syntax, bufp)
{ /* Caller did not allocate a buffer. Do it for them. */
bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
}
- if (!bufp->buffer) return REG_ESPACE;
+ if (!bufp->buffer) FREE_STACK_RETURN (REG_ESPACE);
bufp->allocated = INIT_BUF_SIZE;
}
@@ -1655,7 +1653,7 @@ regex_compile (pattern, size, syntax, bufp)
if (!laststart)
{
if (syntax & RE_CONTEXT_INVALID_OPS)
- return REG_BADRPT;
+ FREE_STACK_RETURN (REG_BADRPT);
else if (!(syntax & RE_CONTEXT_INDEP_OPS))
goto normal_char;
}
@@ -1688,7 +1686,7 @@ regex_compile (pattern, size, syntax, bufp)
else if (syntax & RE_BK_PLUS_QM && c == '\\')
{
- if (p == pend) return REG_EESCAPE;
+ if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
PATFETCH (c1);
if (!(c1 == '+' || c1 == '?'))
@@ -1787,7 +1785,7 @@ regex_compile (pattern, size, syntax, bufp)
{
boolean had_char_class = false;
- if (p == pend) return REG_EBRACK;
+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
/* Ensure that we have enough space to push a charset: the
opcode, the length count, and the bitset; 34 bytes in all. */
@@ -1818,14 +1816,14 @@ regex_compile (pattern, size, syntax, bufp)
/* Read in characters and ranges, setting map bits. */
for (;;)
{
- if (p == pend) return REG_EBRACK;
+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
PATFETCH (c);
/* \ might escape characters inside [...] and [^...]. */
if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
{
- if (p == pend) return REG_EESCAPE;
+ if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
PATFETCH (c1);
SET_LIST_BIT (c1);
@@ -1841,7 +1839,7 @@ regex_compile (pattern, size, syntax, bufp)
/* Look ahead to see if it's a range when the last thing
was a character class. */
if (had_char_class && c == '-' && *p != ']')
- return REG_ERANGE;
+ FREE_STACK_RETURN (REG_ERANGE);
/* Look ahead to see if it's a range when the last thing
was a character: if this is a hyphen not at the
@@ -1854,7 +1852,7 @@ regex_compile (pattern, size, syntax, bufp)
{
reg_errcode_t ret
= compile_range (&p, pend, translate, syntax, b);
- if (ret != REG_NOERROR) return ret;
+ if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
}
else if (p[0] == '-' && p[1] != ']')
@@ -1865,7 +1863,7 @@ regex_compile (pattern, size, syntax, bufp)
PATFETCH (c1);
ret = compile_range (&p, pend, translate, syntax, b);
- if (ret != REG_NOERROR) return ret;
+ if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
}
/* See if we're at the beginning of a possible character
@@ -1879,7 +1877,7 @@ regex_compile (pattern, size, syntax, bufp)
c1 = 0;
/* If pattern is `[[:'. */
- if (p == pend) return REG_EBRACK;
+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
for (;;)
{
@@ -1910,29 +1908,34 @@ regex_compile (pattern, size, syntax, bufp)
boolean is_upper = STREQ (str, "upper");
boolean is_xdigit = STREQ (str, "xdigit");
- if (!IS_CHAR_CLASS (str)) return REG_ECTYPE;
+ if (!IS_CHAR_CLASS (str))
+ FREE_STACK_RETURN (REG_ECTYPE);
/* Throw away the ] at the end of the character
class. */
PATFETCH (c);
- if (p == pend) return REG_EBRACK;
+ if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
for (ch = 0; ch < 1 << BYTEWIDTH; ch++)
{
+ /* This was split into 3 if's to
+ avoid an arbitrary limit in some compiler. */
if ( (is_alnum && ISALNUM (ch))
|| (is_alpha && ISALPHA (ch))
|| (is_blank && ISBLANK (ch))
- || (is_cntrl && ISCNTRL (ch))
- || (is_digit && ISDIGIT (ch))
+ || (is_cntrl && ISCNTRL (ch)))
+ SET_LIST_BIT (ch);
+ if ( (is_digit && ISDIGIT (ch))
|| (is_graph && ISGRAPH (ch))
|| (is_lower && ISLOWER (ch))
- || (is_print && ISPRINT (ch))
- || (is_punct && ISPUNCT (ch))
+ || (is_print && ISPRINT (ch)))
+ SET_LIST_BIT (ch);
+ if ( (is_punct && ISPUNCT (ch))
|| (is_space && ISSPACE (ch))
|| (is_upper && ISUPPER (ch))
|| (is_xdigit && ISXDIGIT (ch)))
- SET_LIST_BIT (ch);
+ SET_LIST_BIT (ch);
}
had_char_class = true;
}
@@ -1998,7 +2001,7 @@ regex_compile (pattern, size, syntax, bufp)
case '\\':
- if (p == pend) return REG_EESCAPE;
+ if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
/* Do not translate the character after the \, so that we can
distinguish, e.g., \B from \b, even if we normally would
@@ -2063,7 +2066,7 @@ regex_compile (pattern, size, syntax, bufp)
if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
goto normal_backslash;
else
- return REG_ERPAREN;
+ FREE_STACK_RETURN (REG_ERPAREN);
handle_close:
if (fixup_alt_jump)
@@ -2083,7 +2086,7 @@ regex_compile (pattern, size, syntax, bufp)
if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
goto normal_char;
else
- return REG_ERPAREN;
+ FREE_STACK_RETURN (REG_ERPAREN);
/* Since we just checked for an empty stack above, this
``can't happen''. */
@@ -2190,7 +2193,7 @@ regex_compile (pattern, size, syntax, bufp)
if (syntax & RE_NO_BK_BRACES)
goto unfetch_interval;
else
- return REG_EBRACE;
+ FREE_STACK_RETURN (REG_EBRACE);
}
GET_UNSIGNED_NUMBER (lower_bound);
@@ -2210,12 +2213,12 @@ regex_compile (pattern, size, syntax, bufp)
if (syntax & RE_NO_BK_BRACES)
goto unfetch_interval;
else
- return REG_BADBR;
+ FREE_STACK_RETURN (REG_BADBR);
}
if (!(syntax & RE_NO_BK_BRACES))
{
- if (c != '\\') return REG_EBRACE;
+ if (c != '\\') FREE_STACK_RETURN (REG_EBRACE);
PATFETCH (c);
}
@@ -2225,7 +2228,7 @@ regex_compile (pattern, size, syntax, bufp)
if (syntax & RE_NO_BK_BRACES)
goto unfetch_interval;
else
- return REG_BADBR;
+ FREE_STACK_RETURN (REG_BADBR);
}
/* We just parsed a valid interval. */
@@ -2234,7 +2237,7 @@ regex_compile (pattern, size, syntax, bufp)
if (!laststart)
{
if (syntax & RE_CONTEXT_INVALID_OPS)
- return REG_BADRPT;
+ FREE_STACK_RETURN (REG_BADRPT);
else if (syntax & RE_CONTEXT_INDEP_OPS)
laststart = b;
else
@@ -2401,7 +2404,7 @@ regex_compile (pattern, size, syntax, bufp)
c1 = c - '0';
if (c1 > regnum)
- return REG_ESUBREG;
+ FREE_STACK_RETURN (REG_ESUBREG);
/* Can't back reference to a subexpression if inside of it. */
if (group_in_compile_stack (compile_stack, c1))
@@ -2473,7 +2476,7 @@ regex_compile (pattern, size, syntax, bufp)
STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
if (!COMPILE_STACK_EMPTY)
- return REG_EPAREN;
+ FREE_STACK_RETURN (REG_EPAREN);
free (compile_stack.stack);
@@ -2704,8 +2707,9 @@ compile_range (p_ptr, pend, translate, syntax, b)
We also want to fetch the endpoints without translating them; the
appropriate translation is done in the bit-setting loop below. */
- range_start = ((unsigned char *) p)[-2];
- range_end = ((unsigned char *) p)[0];
+ /* The SVR4 compiler on the 3B2 had trouble with unsigned const char *. */
+ range_start = ((const unsigned char *) p)[-2];
+ range_end = ((const unsigned char *) p)[0];
/* Have to increment the pointer into the pattern string, so the
caller isn't still at the ending character. */
@@ -2849,22 +2853,25 @@ re_compile_fastmap (bufp)
case anychar:
- /* `.' matches anything ... */
- for (j = 0; j < (1 << BYTEWIDTH); j++)
- fastmap[j] = 1;
+ {
+ int fastmap_newline = fastmap['\n'];
- /* ... except perhaps newline. */
- if (!(bufp->syntax & RE_DOT_NEWLINE))
- fastmap['\n'] = 0;
+ /* `.' matches anything ... */
+ for (j = 0; j < (1 << BYTEWIDTH); j++)
+ fastmap[j] = 1;
- /* Return if we have already set `can_be_null'; if we have,
- then the fastmap is irrelevant. Something's wrong here. */
- else if (bufp->can_be_null)
- return 0;
+ /* ... except perhaps newline. */
+ if (!(bufp->syntax & RE_DOT_NEWLINE))
+ fastmap['\n'] = fastmap_newline;
- /* Otherwise, have to check alternative paths. */
- break;
+ /* Return if we have already set `can_be_null'; if we have,
+ then the fastmap is irrelevant. Something's wrong here. */
+ else if (bufp->can_be_null)
+ return 0;
+ /* Otherwise, have to check alternative paths. */
+ break;
+ }
#ifdef emacs
case syntaxspec:
@@ -3592,17 +3599,27 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
longest match, try backtracking. */
if (d != end_match_2)
{
+ /* 1 if this match ends in the same string (string1 or string2)
+ as the best previous match. */
+ boolean same_str_p = (FIRST_STRING_P (match_end)
+ == MATCHING_IN_FIRST_STRING);
+ /* 1 if this match is the best seen so far. */
+ boolean best_match_p;
+
+ /* AIX compiler got confused when this was combined
+ with the previous declaration. */
+ if (same_str_p)
+ best_match_p = d > match_end;
+ else
+ best_match_p = !MATCHING_IN_FIRST_STRING;
+
DEBUG_PRINT1 ("backtracking.\n");
if (!FAIL_STACK_EMPTY ())
{ /* More failure points to try. */
- boolean same_str_p = (FIRST_STRING_P (match_end)
- == MATCHING_IN_FIRST_STRING);
/* If exceeds best match so far, save it. */
- if (!best_regs_set
- || (same_str_p && d > match_end)
- || (!same_str_p && !MATCHING_IN_FIRST_STRING))
+ if (!best_regs_set || best_match_p)
{
best_regs_set = true;
match_end = d;
@@ -3618,8 +3635,10 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
goto fail;
}
- /* If no failure points, don't restore garbage. */
- else if (best_regs_set)
+ /* If no failure points, don't restore garbage. And if
+ last match is real best match, don't restore second
+ best one. */
+ else if (best_regs_set && !best_match_p)
{
restore_best_regs:
/* Restore best match. It may happen that `dend ==
@@ -4282,7 +4301,7 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
#endif
if ((re_opcode_t) p1[3] == exactn
- && ! (p2[1] * BYTEWIDTH > p1[4]
+ && ! ((int) p2[1] * BYTEWIDTH > (int) p1[4]
&& (p2[1 + p1[4] / BYTEWIDTH]
& (1 << (p1[4] % BYTEWIDTH)))))
{
@@ -4296,9 +4315,9 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
int idx;
/* We win if the charset_not inside the loop
lists every character listed in the charset after. */
- for (idx = 0; idx < p2[1]; idx++)
+ for (idx = 0; idx < (int) p2[1]; idx++)
if (! (p2[2 + idx] == 0
- || (idx < p1[4]
+ || (idx < (int) p1[4]
&& ((p2[2 + idx] & ~ p1[5 + idx]) == 0))))
break;
@@ -4313,7 +4332,9 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
int idx;
/* We win if the charset inside the loop
has no overlap with the one after the loop. */
- for (idx = 0; idx < p2[1] && idx < p1[4]; idx++)
+ for (idx = 0;
+ idx < (int) p2[1] && idx < (int) p1[4];
+ idx++)
if ((p2[2 + idx] & p1[5 + idx]) != 0)
break;
diff --git a/old/textutils/ChangeLog b/old/textutils/ChangeLog
index 1ee582ca7..972cc5422 100644
--- a/old/textutils/ChangeLog
+++ b/old/textutils/ChangeLog
@@ -1,3 +1,59 @@
+Sun Oct 02 17:57:09 1994 Jim Meyering (meyering@comco.com)
+
+ * tr.c (main): Give an error and fail when squeezing repeats
+ and no non-options are given. Reported by Tony Robinson
+ (ajr@eng.cam.ac.uk).
+
+ * sort.c (main): Temporarily copy each input file that might be
+ another name for the output file. When in doubt (e.g. a pipe),
+ copy. This allows the dangerous (historical -- in cnews) idiom
+ `cat file | sort -o file' to work properly. Don't rely on this
+ behavior in new shell scripts. From Paul Eggert (eggert@twinsun.com).
+
+Mon Sep 26 18:01:47 1994 David J. MacKenzie (djm@churchy.gnu.ai.mit.edu)
+
+ * lib/xwrite.c safe-read.c memchr.c linebuffer.c full-write.c:
+ Remove CONFIG_BROKETS ifdef.
+ * src/Makefile.in lib/Makefile.in: Don't define it.
+
+Sat Sep 24 21:26:27 1994 Jim Meyering (meyering@comco.com)
+
+ * full-write.c (full_write): Declare argument LEN to be size_t.
+
+Mon Sep 12 13:35:27 1994 Jim Meyering (meyering@comco.com)
+
+ * tail.c (tail_file): [For multiple files only]: Report truncation
+ of monitored file and reset current file size. From Franc,ois Pinard.
+
+Sat Aug 27 16:57:20 1994 Jim Meyering (meyering@comco.com)
+
+ * system.h [BROKEN_STAT_MACROS]: Remove unnecessary #ifdef's.
+ From Franc,ois Pinard.
+
+Tue Jul 26 11:33:53 1994 Jim Meyering (meyering@comco.com)
+
+ * system.h: Remove `|| defined(_POSIX_VERSION)' from test that
+ decides whether to include <fcntl.h>. From Francois Pinard.
+
+Wed Jul 13 12:33:34 1994 Jim Meyering (meyering@comco.com)
+
+ * tr.c (substr): Fix off-by-one allocation error.
+
+Wed Jun 22 01:02:50 1994 Jim Meyering (meyering@comco.com)
+
+ * tac.c (tac_file): Use O_RDONLY instead of zero in call to open.
+ (tac): Fix typo that had `1' as arg #2 of error after failed read.
+ Use errno instead. From Michael I Bushnell <mib@gnu.ai.mit.edu>.
+
+Thu May 26 08:46:32 1994 Jim Meyering (meyering@comco.com)
+
+ * configure.in [INSTALL]: Revert change of March 25. autoconf
+ has been fixed.
+
+Mon Apr 11 17:25:43 1994 Jim Meyering (meyering@comco.com)
+
+ * join.c (prline): Remove unused function. Indent.
+
Fri May 6 05:44:24 1994 Jim Meyering (meyering@comco.com)
* tail.c (tail_forever): Don't print headers when asked not to.
diff --git a/old/textutils/NEWS b/old/textutils/NEWS
index 06bcdf451..4e211fadb 100644
--- a/old/textutils/NEWS
+++ b/old/textutils/NEWS
@@ -1,4 +1,6 @@
User-visible changes in release 1.10
+* new program: fmt
+* tail -f on multiple files reports file truncation
* tail -q corrected so it never prints headers
* wc -c is much faster when operating on non-regular files
* unexpand gives a diagnostic (rather than a segfault) when given a name of
diff --git a/src/fmt.c b/src/fmt.c
index 206ee077f..52c7d91c5 100644
--- a/src/fmt.c
+++ b/src/fmt.c
@@ -281,7 +281,7 @@ usage (status)
fprintf (stderr, "Try `%s --help' for more information.\n", program_name);
else
{
- printf ("Usage: %s [OPTION]... [FILE]...\n", program_name);
+ printf ("Usage: %s [-DIGITS] [OPTION]... [FILE]...\n", program_name);
fputs ("\
Mandatory arguments to long options are mandatory for short options too.\n\
\n\
diff --git a/src/sort.c b/src/sort.c
index ae28518b3..1f6630395 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -1,5 +1,5 @@
/* sort - sort lines of text (with all kinds of options).
- Copyright (C) 1988, 1991 Free Software Foundation
+ Copyright (C) 1988, 1991, 1992, 1993, 1994 Free Software Foundation
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by