Bash-4.3 patch 16
This commit is contained in:
parent
c6dcdf4d7a
commit
34ce402d02
3 changed files with 52 additions and 2 deletions
|
@ -123,6 +123,8 @@ static char **glob_dir_to_array __P((char *, char **, int));
|
||||||
extern char *glob_patscan __P((char *, char *, int));
|
extern char *glob_patscan __P((char *, char *, int));
|
||||||
extern wchar_t *glob_patscan_wc __P((wchar_t *, wchar_t *, int));
|
extern wchar_t *glob_patscan_wc __P((wchar_t *, wchar_t *, int));
|
||||||
|
|
||||||
|
extern char *glob_dirscan __P((char *, int));
|
||||||
|
|
||||||
/* Compile `glob_loop.c' for single-byte characters. */
|
/* Compile `glob_loop.c' for single-byte characters. */
|
||||||
#define CHAR unsigned char
|
#define CHAR unsigned char
|
||||||
#define INT int
|
#define INT int
|
||||||
|
@ -187,6 +189,9 @@ extglob_skipname (pat, dname, flags)
|
||||||
se = pp + strlen (pp) - 1; /* end of string */
|
se = pp + strlen (pp) - 1; /* end of string */
|
||||||
pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */
|
pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */
|
||||||
/* we should check for invalid extglob pattern here */
|
/* we should check for invalid extglob pattern here */
|
||||||
|
if (pe == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* if pe != se we have more of the pattern at the end of the extglob
|
/* if pe != se we have more of the pattern at the end of the extglob
|
||||||
pattern. Check the easy case first ( */
|
pattern. Check the easy case first ( */
|
||||||
if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0)
|
if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0)
|
||||||
|
@ -1015,7 +1020,7 @@ glob_filename (pathname, flags)
|
||||||
{
|
{
|
||||||
char **result;
|
char **result;
|
||||||
unsigned int result_size;
|
unsigned int result_size;
|
||||||
char *directory_name, *filename, *dname;
|
char *directory_name, *filename, *dname, *fn;
|
||||||
unsigned int directory_len;
|
unsigned int directory_len;
|
||||||
int free_dirname; /* flag */
|
int free_dirname; /* flag */
|
||||||
int dflags;
|
int dflags;
|
||||||
|
@ -1031,6 +1036,18 @@ glob_filename (pathname, flags)
|
||||||
|
|
||||||
/* Find the filename. */
|
/* Find the filename. */
|
||||||
filename = strrchr (pathname, '/');
|
filename = strrchr (pathname, '/');
|
||||||
|
#if defined (EXTENDED_GLOB)
|
||||||
|
if (filename && extended_glob)
|
||||||
|
{
|
||||||
|
fn = glob_dirscan (pathname, '/');
|
||||||
|
#if DEBUG_MATCHING
|
||||||
|
if (fn != filename)
|
||||||
|
fprintf (stderr, "glob_filename: glob_dirscan: fn (%s) != filename (%s)\n", fn ? fn : "(null)", filename);
|
||||||
|
#endif
|
||||||
|
filename = fn;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (filename == NULL)
|
if (filename == NULL)
|
||||||
{
|
{
|
||||||
filename = pathname;
|
filename = pathname;
|
||||||
|
|
|
@ -42,6 +42,8 @@
|
||||||
#define WLPAREN L'('
|
#define WLPAREN L'('
|
||||||
#define WRPAREN L')'
|
#define WRPAREN L')'
|
||||||
|
|
||||||
|
extern char *glob_patscan __P((char *, char *, int));
|
||||||
|
|
||||||
/* Return 1 of the first character of WSTRING could match the first
|
/* Return 1 of the first character of WSTRING could match the first
|
||||||
character of pattern WPAT. Wide character version. */
|
character of pattern WPAT. Wide character version. */
|
||||||
int
|
int
|
||||||
|
@ -375,3 +377,34 @@ bad_bracket:
|
||||||
|
|
||||||
return matlen;
|
return matlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Skip characters in PAT and return the final occurrence of DIRSEP. This
|
||||||
|
is only called when extended_glob is set, so we have to skip over extglob
|
||||||
|
patterns x(...) */
|
||||||
|
char *
|
||||||
|
glob_dirscan (pat, dirsep)
|
||||||
|
char *pat;
|
||||||
|
int dirsep;
|
||||||
|
{
|
||||||
|
char *p, *d, *pe, *se;
|
||||||
|
|
||||||
|
d = pe = se = 0;
|
||||||
|
for (p = pat; p && *p; p++)
|
||||||
|
{
|
||||||
|
if (extglob_pattern_p (p))
|
||||||
|
{
|
||||||
|
if (se == 0)
|
||||||
|
se = p + strlen (p) - 1;
|
||||||
|
pe = glob_patscan (p + 2, se, 0);
|
||||||
|
if (pe == 0)
|
||||||
|
continue;
|
||||||
|
else if (*pe == 0)
|
||||||
|
break;
|
||||||
|
p = pe - 1; /* will do increment above */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (*p == dirsep)
|
||||||
|
d = p;
|
||||||
|
}
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
|
@ -25,6 +25,6 @@
|
||||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||||
looks for to find the patch level (for the sccs version string). */
|
looks for to find the patch level (for the sccs version string). */
|
||||||
|
|
||||||
#define PATCHLEVEL 15
|
#define PATCHLEVEL 16
|
||||||
|
|
||||||
#endif /* _PATCHLEVEL_H_ */
|
#endif /* _PATCHLEVEL_H_ */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue