comparison src/sysdep.c @ 462:0784d089fdc9 r21-2-46

Import from CVS: tag r21-2-46
author cvs
date Mon, 13 Aug 2007 11:44:37 +0200
parents 223736d75acb
children 7039e6323819
comparison
equal deleted inserted replaced
461:120ed4009e51 462:0784d089fdc9
31 31
32 #include <config.h> 32 #include <config.h>
33 33
34 #ifdef WIN32_NATIVE 34 #ifdef WIN32_NATIVE
35 #ifdef MINGW 35 #ifdef MINGW
36 #include <mingw32/process.h> 36 #include <mingw/process.h>
37 #else 37 #else
38 /* <process.h> should not conflict with "process.h", as per ANSI definition. 38 /* <process.h> should not conflict with "process.h", as per ANSI definition.
39 This is not true with visual c though. The trick below works with 39 This is not true with visual c though. The trick below works with
40 VC4.2b, 5.0 and 6.0. It assumes that VC is installed in a kind of 40 VC4.2b, 5.0 and 6.0. It assumes that VC is installed in a kind of
41 standard way, so include path ends with /include. 41 standard way, so include path ends with /include.
2983 return rtnval; 2983 return rtnval;
2984 #else /* MULE */ 2984 #else /* MULE */
2985 if (rtnval == NULL) /* End of directory */ 2985 if (rtnval == NULL) /* End of directory */
2986 return NULL; 2986 return NULL;
2987 { 2987 {
2988 Extcount external_len;
2989 int ascii_filename_p = 1;
2990 const Extbyte * const external_name = (const Extbyte *) rtnval->d_name; 2988 const Extbyte * const external_name = (const Extbyte *) rtnval->d_name;
2991 2989 Extcount external_len = strlen (rtnval->d_name);
2992 /* Optimize for the common all-ASCII case, computing len en passant */ 2990 const Bufbyte *internal_name;
2993 for (external_len = 0; external_name[external_len] ; external_len++) 2991 Bytecount internal_len;
2994 { 2992
2995 if (!BYTE_ASCII_P (external_name[external_len])) 2993 TO_INTERNAL_FORMAT (DATA, (external_name, external_len),
2996 ascii_filename_p = 0; 2994 ALLOCA, (internal_name, internal_len),
2997 } 2995 Qfile_name);
2998 if (ascii_filename_p) 2996
2997 /* check for common case of ASCII filename */
2998 if (internal_len == external_len &&
2999 !memcmp (external_name, internal_name, internal_len))
2999 return rtnval; 3000 return rtnval;
3000 3001
3001 { /* Non-ASCII filename */ 3002 { /* Non-ASCII filename */
3002 static Bufbyte_dynarr *internal_DIRENTRY; 3003 static Bufbyte_dynarr *internal_DIRENTRY;
3003 const Bufbyte *internal_name;
3004 Bytecount internal_len;
3005 if (!internal_DIRENTRY) 3004 if (!internal_DIRENTRY)
3006 internal_DIRENTRY = Dynarr_new (Bufbyte); 3005 internal_DIRENTRY = Dynarr_new (Bufbyte);
3007 else 3006 else
3008 Dynarr_reset (internal_DIRENTRY); 3007 Dynarr_reset (internal_DIRENTRY);
3009 3008
3010 Dynarr_add_many (internal_DIRENTRY, (Bufbyte *) rtnval, 3009 Dynarr_add_many (internal_DIRENTRY, (Bufbyte *) rtnval,
3011 offsetof (DIRENTRY, d_name)); 3010 offsetof (DIRENTRY, d_name));
3012 3011
3013 TO_INTERNAL_FORMAT (DATA, (external_name, external_len),
3014 ALLOCA, (internal_name, internal_len),
3015 Qfile_name);
3016 3012
3017 Dynarr_add_many (internal_DIRENTRY, internal_name, internal_len); 3013 Dynarr_add_many (internal_DIRENTRY, internal_name, internal_len);
3018 Dynarr_add (internal_DIRENTRY, '\0'); /* NUL-terminate */ 3014 Dynarr_add (internal_DIRENTRY, '\0'); /* NUL-terminate */
3019 return (DIRENTRY *) Dynarr_atp (internal_DIRENTRY, 0); 3015 return (DIRENTRY *) Dynarr_atp (internal_DIRENTRY, 0);
3020 } 3016 }