]> git.ipfire.org Git - thirdparty/bash.git/commitdiff
commit bash-20070830 snapshot
authorChet Ramey <chet.ramey@case.edu>
Wed, 7 Dec 2011 14:11:49 +0000 (09:11 -0500)
committerChet Ramey <chet.ramey@case.edu>
Wed, 7 Dec 2011 14:11:49 +0000 (09:11 -0500)
CWRU/CWRU.chlog
CWRU/CWRU.chlog~
config-top.h
stringlib.c
stringlib.c~ [new file with mode: 0644]
tests/RUN-ONE-TEST

index 038c6ca410c001651842f64b4eaac7292c999d03..fb2a385d02b538de5403362f8ee64d5e3f3ccd54 100644 (file)
@@ -14845,3 +14845,15 @@ subst.c
        - change to do_assignment_internal to make an assignment to a variable
          with the `noassign' internal attribute not a variable assignment
          error.
+       - fix do_assignment_internal so assignment to a `noassign' variable
+         does not cause it to suddenly become visible if it's currently
+         invisible
+
+                                   9/3
+                                   ---
+stringlib.c
+       - change strsub to check whether or not temp is non-null before
+         trying to null-terminate it.  Also make sure temp is allocated
+         even if the pattern and replacement strings are empty, and set
+         to a copy of string (like ${foo//})
+         Bug report from Timo Lindfors <timo.lindfors@iki.fi>
index a8f2e2b356a4af409341bebf0c6cc41166053a23..6214d04b64f1ad8093f54123e5cf0ea5e3394ed9 100644 (file)
@@ -14844,4 +14844,15 @@ histexpand.c
 subst.c
        - change to do_assignment_internal to make an assignment to a variable
          with the `noassign' internal attribute not a variable assignment
-         error
+         error.
+       - fix do_assignment_internal so assignment to a `noassign' variable
+         does not cause it to suddenly become visible if it's currently
+         invisible
+
+                                   9/3
+                                   ---
+stringlib.c
+       - change strsub to check whether or not temp is non-null before
+         trying to null-terminate it.  Also make sure temp is allocated
+         even if the pattern and replacement strings are empty.
+         Bug report from Timo Lindfors <timo.lindfors@iki.fi>
index 7a90b1615191b705fea2c25f6ecb393e95e86134..0fdd403c950794320294792fd48ff7d0615c6273 100644 (file)
@@ -46,7 +46,7 @@
 #define V9_ECHO
 
 /* Define DONT_REPORT_SIGPIPE if you don't want to see `Broken pipe' messages
-   when a job like `cat jobs.c | exit 1' is executed. */
+   when a job like `cat jobs.c | exit 1' terminates due to a SIGPIPE. */
 #define DONT_REPORT_SIGPIPE
 
 /* The default value of the PATH variable. */
index 97280cf5a843c957be9aa7b63401f26d43e4d995..d0cbdad4bf6a9ba2d647b879b5d8e09761305268 100644 (file)
@@ -170,7 +170,10 @@ strsub (string, pat, rep, global)
          temp[templen++] = string[i++];
        }
     }
-  temp[templen] = 0;
+  if (temp)
+    temp[templen] = 0;
+  else
+    temp = savestring (string);
   return (temp);
 }
 
diff --git a/stringlib.c~ b/stringlib.c~
new file mode 100644 (file)
index 0000000..626ddbe
--- /dev/null
@@ -0,0 +1,289 @@
+/* stringlib.c - Miscellaneous string functions. */
+
+/* Copyright (C) 1996-2002 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+
+   Bash is free software; you can redistribute it and/or modify it under
+   the terms of the GNU General Public License as published by the Free
+   Software Foundation; either version 2, or (at your option) any later
+   version.
+
+   Bash is distributed in the hope that it will be useful, but WITHOUT ANY
+   WARRANTY; without even the implied warranty of MERCHANTABILITY or
+   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+   for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with Bash; see the file COPYING.  If not, write to the Free Software
+   Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#include "config.h"
+
+#include "bashtypes.h"
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#include "bashansi.h"
+#include <stdio.h>
+#include "chartypes.h"
+
+#include "shell.h"
+#include "pathexp.h"
+
+#include <glob/glob.h>
+
+#if defined (EXTENDED_GLOB)
+#  include <glob/strmatch.h>
+#endif
+
+/* **************************************************************** */
+/*                                                                 */
+/*             Functions to manage arrays of strings               */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Find STRING in ALIST, a list of string key/int value pairs.  If FLAGS
+   is 1, STRING is treated as a pattern and matched using strmatch. */
+int
+find_string_in_alist (string, alist, flags)
+     char *string;
+     STRING_INT_ALIST *alist;
+     int flags;
+{
+  register int i;
+  int r;
+
+  for (i = r = 0; alist[i].word; i++)
+    {
+#if defined (EXTENDED_GLOB)
+      if (flags)
+       r = strmatch (alist[i].word, string, FNM_EXTMATCH) != FNM_NOMATCH;
+      else
+#endif
+       r = STREQ (string, alist[i].word);
+
+      if (r)
+       return (alist[i].token);
+    }
+  return -1;
+}
+
+/* Find TOKEN in ALIST, a list of string/int value pairs.  Return the
+   corresponding string.  Allocates memory for the returned
+   string.  FLAGS is currently ignored, but reserved. */
+char *
+find_token_in_alist (token, alist, flags)
+     int token;
+     STRING_INT_ALIST *alist;
+     int flags;
+{
+  register int i;
+
+  for (i = 0; alist[i].word; i++)
+    {
+      if (alist[i].token == token)
+        return (savestring (alist[i].word));
+    }
+  return ((char *)NULL);
+}
+
+int
+find_index_in_alist (string, alist, flags)
+     char *string;
+     STRING_INT_ALIST *alist;
+     int flags;
+{
+  register int i;
+  int r;
+
+  for (i = r = 0; alist[i].word; i++)
+    {
+#if defined (EXTENDED_GLOB)
+      if (flags)
+       r = strmatch (alist[i].word, string, FNM_EXTMATCH) != FNM_NOMATCH;
+      else
+#endif
+       r = STREQ (string, alist[i].word);
+
+      if (r)
+       return (i);
+    }
+
+  return -1;
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                 String Management Functions                     */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Cons a new string from STRING starting at START and ending at END,
+   not including END. */
+char *
+substring (string, start, end)
+     char *string;
+     int start, end;
+{
+  register int len;
+  register char *result;
+
+  len = end - start;
+  result = (char *)xmalloc (len + 1);
+  strncpy (result, string + start, len);
+  result[len] = '\0';
+  return (result);
+}
+
+/* Replace occurrences of PAT with REP in STRING.  If GLOBAL is non-zero,
+   replace all occurrences, otherwise replace only the first.
+   This returns a new string; the caller should free it. */
+char *
+strsub (string, pat, rep, global)
+     char *string, *pat, *rep;
+     int global;
+{
+  int patlen, replen, templen, tempsize, repl, i;
+  char *temp, *r;
+
+  patlen = strlen (pat);
+  replen = strlen (rep);
+  for (temp = (char *)NULL, i = templen = tempsize = 0, repl = 1; string[i]; )
+    {
+      if (repl && STREQN (string + i, pat, patlen))
+       {
+#if 0
+         if (replen)
+           RESIZE_MALLOCED_BUFFER (temp, templen, replen, tempsize, (replen * 2));
+#else
+         RESIZE_MALLOCED_BUFFER (temp, templen, replen ? replen : 1, tempsize, replen ? (replen * 2) : 16);
+#endif
+
+         for (r = rep; *r; )
+           temp[templen++] = *r++;
+
+         i += patlen ? patlen : 1;     /* avoid infinite recursion */
+         repl = global != 0;
+       }
+      else
+       {
+         RESIZE_MALLOCED_BUFFER (temp, templen, 1, tempsize, 16);
+         temp[templen++] = string[i++];
+       }
+    }
+  if (temp)
+    temp[templen] = 0;
+  return (temp);
+}
+
+/* Replace all instances of C in STRING with TEXT.  TEXT may be empty or
+   NULL.  If DO_GLOB is non-zero, we quote the replacement text for
+   globbing.  Backslash may be used to quote C. */
+char *
+strcreplace (string, c, text, do_glob)
+     char *string;
+     int c;
+     char *text;
+     int do_glob;
+{
+  char *ret, *p, *r, *t;
+  int len, rlen, ind, tlen;
+
+  len = STRLEN (text);
+  rlen = len + strlen (string) + 2;
+  ret = (char *)xmalloc (rlen);
+
+  for (p = string, r = ret; p && *p; )
+    {
+      if (*p == c)
+       {
+         if (len)
+           {
+             ind = r - ret;
+             if (do_glob && (glob_pattern_p (text) || strchr (text, '\\')))
+               {
+                 t = quote_globbing_chars (text);
+                 tlen = strlen (t);
+                 RESIZE_MALLOCED_BUFFER (ret, ind, tlen, rlen, rlen);
+                 r = ret + ind;        /* in case reallocated */
+                 strcpy (r, t);
+                 r += tlen;
+                 free (t);
+               }
+             else
+               {
+                 RESIZE_MALLOCED_BUFFER (ret, ind, len, rlen, rlen);
+                 r = ret + ind;        /* in case reallocated */
+                 strcpy (r, text);
+                 r += len;
+               }
+           }
+         p++;
+         continue;
+       }
+
+      if (*p == '\\' && p[1] == c)
+       p++;
+
+      ind = r - ret;
+      RESIZE_MALLOCED_BUFFER (ret, ind, 2, rlen, rlen);
+      r = ret + ind;                   /* in case reallocated */
+      *r++ = *p++;
+    }
+  *r = '\0';
+
+  return ret;
+}
+
+#ifdef INCLUDE_UNUSED
+/* Remove all leading whitespace from STRING.  This includes
+   newlines.  STRING should be terminated with a zero. */
+void
+strip_leading (string)
+     char *string;
+{
+  char *start = string;
+
+  while (*string && (whitespace (*string) || *string == '\n'))
+    string++;
+
+  if (string != start)
+    {
+      int len = strlen (string);
+      FASTCOPY (string, start, len);
+      start[len] = '\0';
+    }
+}
+#endif
+
+/* Remove all trailing whitespace from STRING.  This includes
+   newlines.  If NEWLINES_ONLY is non-zero, only trailing newlines
+   are removed.  STRING should be terminated with a zero. */
+void
+strip_trailing (string, len, newlines_only)
+     char *string;
+     int len;
+     int newlines_only;
+{
+  while (len >= 0)
+    {
+      if ((newlines_only && string[len] == '\n') ||
+         (!newlines_only && whitespace (string[len])))
+       len--;
+      else
+       break;
+    }
+  string[len + 1] = '\0';
+}
+
+/* A wrapper for bcopy that can be prototyped in general.h */
+void
+xbcopy (s, d, n)
+     char *s, *d;
+     int n;
+{
+  FASTCOPY (s, d, n);
+}
index 72ec06a2c1fd8dde92acea5e8ac773e35f1d061b..3efcf32d68e9722024b6ca9d67f9e81b2aa5ac04 100755 (executable)
@@ -1,4 +1,4 @@
-BUILD_DIR=/usr/local/build/bash/bash-current
+BUILD_DIR=/usr/local/build/chet/bash/bash-current
 THIS_SH=$BUILD_DIR/bash
 PATH=$PATH:$BUILD_DIR