Imported from ../bash-2.0.tar.gz.
[platform/upstream/bash.git] / lib / glob / glob.c
index 6ff2cb4..412e15c 100644 (file)
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
-\f
+
 /* To whomever it may concern: I have never seen the code which most
    Unix programs use to perform this function.  I wrote this from scratch
    based on specifications for the pattern matching.  --RMS.  */
 
-#if defined (SHELL)
-#  if defined (HAVE_STDLIB_H)
-#    include <stdlib.h>
-#  else
+#include <config.h>
+
+#if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX)
+  #pragma alloca
+#endif /* _AIX && RISC6000 && !__GNUC__ */
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  if defined (SHELL)
 #    include "ansi_stdlib.h"
-#  endif /* HAVE_STDLIB_H */
-#  include <config.h>
+#  endif /* SHELL */
 #endif
 
 #include <sys/types.h>
 
-#if !defined (SHELL) && (defined (_POSIX_VERSION) || defined (USGr3))
-#  if !defined (HAVE_DIRENT_H)
-#    define HAVE_DIRENT_H
-#  endif /* !HAVE_DIRENT_H */
-#endif /* !SHELL && (_POSIX_VERSION || USGr3) */
-
 #if defined (HAVE_DIRENT_H)
 #  include <dirent.h>
-#  if !defined (direct)
-#    define direct dirent
-#  endif /* !direct */
 #  define D_NAMLEN(d) strlen ((d)->d_name)
 #else /* !HAVE_DIRENT_H */
 #  define D_NAMLEN(d) ((d)->d_namlen)
-#  if defined (USG)
-#    if defined (Xenix)
-#      include <sys/ndir.h>
-#    else /* !Xenix (but USG...) */
-#      include "ndir.h"
-#    endif /* !Xenix */
-#  else /* !USG */
+#  if defined (HAVE_SYS_NDIR_H)
+#    include <sys/ndir.h>
+#  endif
+#  if defined (HAVE_SYS_DIR_H)
 #    include <sys/dir.h>
-#  endif /* !USG */
+#  endif /* HAVE_SYS_DIR_H */
+#  if defined (HAVE_NDIR_H)
+#    include <ndir.h>
+#  endif
+#  if !defined (dirent)
+#    define dirent direct
+#  endif
 #endif /* !HAVE_DIRENT_H */
 
 #if defined (_POSIX_SOURCE)
 #  define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
 #endif /* _POSIX_SOURCE */
 
-#if defined (USG) || defined (NeXT)
-#  if !defined (HAVE_STRING_H)
-#    define HAVE_STRING_H
-#  endif /* !HAVE_STRING_H */
-#endif /* USG || NeXT */
-
 #if defined (HAVE_STRING_H)
 #  include <string.h>
 #else /* !HAVE_STRING_H */
 #  include <strings.h>
 #endif /* !HAVE_STRING_H */
 
-#if defined (USG)
-#  if !defined (isc386)
-#    include <memory.h>
-#  endif /* !isc386 */
-#  if defined (RISC6000)
-extern void bcopy ();
-#  else /* !RISC6000 */
-#    define bcopy(s, d, n) ((void) memcpy ((d), (s), (n)))
-#  endif /* !RISC6000 */
-#endif /* USG */
-
-#include "fnmatch.h"
+#if !defined (HAVE_BCOPY)
+#  define bcopy(s, d, n) ((void) memcpy ((d), (s), (n)))
+#endif /* !HAVE_BCOPY */
 
 /* If the opendir () on your system lets you open non-directory files,
-   then we consider that not robust.  Define OPENDIR_NOT_ROBUST in the
-   SYSDEP_CFLAGS for your machines entry in machines.h. */
+   then we consider that not robust. */
 #if defined (OPENDIR_NOT_ROBUST)
 #  if defined (SHELL)
 #    include "posixstat.h"
@@ -99,7 +86,10 @@ extern void bcopy ();
 #  endif /* !SHELL */
 #endif /* OPENDIR_NOT_ROBUST */
 
-#if !defined (HAVE_STDLIB_H)
+#include "memalloc.h"
+#include "fnmatch.h"
+
+#if !defined (HAVE_STDLIB_H) && !defined (SHELL)
 extern char *malloc (), *realloc ();
 extern void free ();
 #endif /* !HAVE_STDLIB_H */
@@ -123,7 +113,6 @@ int noglob_dot_filenames = 1;
 /* Global variable to return to signify an error in globbing. */
 char *glob_error_return;
 
-\f
 /* Return nonzero if PATTERN has any special globbing chars in it.  */
 int
 glob_pattern_p (pattern)
@@ -205,7 +194,7 @@ glob_vector (pat, dir)
     };
 
   DIR *d;
-  register struct direct *dp;
+  register struct dirent *dp;
   struct globval *lastlink;
   register struct globval *nextlink;
   register char *nextname;
@@ -365,7 +354,14 @@ glob_dir_to_array (dir, array)
                                   + strlen (array[i]) + 1);
       if (result[i] == NULL)
        return (NULL);
-      sprintf (result[i], "%s%s%s", dir, add_slash ? "/" : "", array[i]);
+#if 1
+      strcpy (result[i], dir);
+      if (add_slash)
+        result[i][l] = '/';
+      strcpy (result[i] + l + add_slash, array[i]);
+#else
+      (void)sprintf (result[i], "%s%s%s", dir, add_slash ? "/" : "", array[i]);
+#endif
     }
   result[i] = NULL;
 
@@ -432,7 +428,7 @@ glob_filename (pathname)
        goto memory_error;
       else if (directories == (char **)&glob_error_return)
        {
-         free ((char *)result);
+         free ((char *) result);
          return ((char **) &glob_error_return);
        }
       else if (*directories == NULL)