mirror of
https://https.git.savannah.gnu.org/git/bash.git
synced 2026-06-29 00:19:51 +02:00
commit bash-20070830 snapshot
This commit is contained in:
@@ -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>
|
||||
|
||||
+12
-1
@@ -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>
|
||||
|
||||
+1
-1
@@ -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. */
|
||||
|
||||
+4
-1
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+289
@@ -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);
|
||||
}
|
||||
+1
-1
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user