[Python-checkins] CVS: python/dist/src/Python import.c,2.169,2.170

Tim Peters tim_one@users.sourceforge.net
2001年3月01日 10:12:03 -0800


Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv11859/python/dist/src/python
Modified Files:
	import.c 
Log Message:
More MacOSX fiddling. As noted in a comment, I believe all variations
of these "search the directory" schemes (including this one) are still prone
to making mistakes.
Index: import.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/import.c,v
retrieving revision 2.169
retrieving revision 2.170
diff -C2 -r2.169 -r2.170
*** import.c	2001年03月01日 08:47:29	2.169
--- import.c	2001年03月01日 18:12:00	2.170
***************
*** 985,995 ****
 }
 
! /* case_ok(buf, len, namelen, name)
! * We've already done a successful stat() or fopen() on buf (a path of length
! * len, exclusive of trailing null). name is the last component of that path
! * (a string of length namelen, exclusive of trailing null).
 * case_ok() is to return 1 if there's a case-sensitive match for
 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
 * exists.
 * case_ok() is used to implement case-sensitive import semantics even
 * on platforms with case-insensitive filesystems. It's trivial to implement
--- 985,1006 ----
 }
 
! /* case_ok(char* buf, int len, int namelen, char* name)
! * The arguments here are tricky, best shown by example:
! * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py0円
! * ^ ^ ^ ^
! * |--------------------- buf ---------------------|
! * |------------------- len ------------------|
! * |------ name -------|
! * |----- namelen -----|
! * buf is the full path, but len only counts up to (& exclusive of) the
! * extension. name is the module name, also exclusive of extension.
! *
! * We've already done a successful stat() or fopen() on buf, so know that
! * there's some match, possibly case-insensitive.
! *
 * case_ok() is to return 1 if there's a case-sensitive match for
 * name, else 0. case_ok() is also to return 1 if envar PYTHONCASEOK
 * exists.
+ *
 * case_ok() is used to implement case-sensitive import semantics even
 * on platforms with case-insensitive filesystems. It's trivial to implement
***************
*** 1016,1020 ****
 #endif
 
! #elif defined(__MACH__) && defined(__APPLE__)
 #include <sys/types.h>
 #include <dirent.h>
--- 1027,1031 ----
 #endif
 
! #elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
 #include <sys/types.h>
 #include <dirent.h>
***************
*** 1108,1133 ****
 	 strncmp(name, (char *)fss.name+1, namelen) == 0;
 
! /* new-fangled macintosh */
! #elif defined(__MACH__) && defined(__APPLE__)
 	DIR *dirp;
 	struct dirent *dp;
! 	char pathname[MAXPATHLEN + 1];
! 	const int pathlen = len - namelen - 1; /* don't want trailing SEP */
 
 	if (getenv("PYTHONCASEOK") != NULL)
 		return 1;
 
! 	/* Copy the path component into pathname; substitute "." if empty */
! 	if (pathlen <= 0) {
! 		pathname[0] = '.';
! 		pathname[1] = '0円';
 	}
 	else {
! 		assert(pathlen <= MAXPATHLEN);
! 		memcpy(pathname, buf, pathlen);
! 		pathname[pathlen] = '0円';
 	}
 	/* Open the directory and search the entries for an exact match. */
! 	dirp = opendir(pathname);
 	if (dirp) {
 		while ((dp = readdir(dirp)) != NULL) {
--- 1119,1151 ----
 	 strncmp(name, (char *)fss.name+1, namelen) == 0;
 
! /* new-fangled macintosh (macosx)
! *
! * XXX This seems prone to obscure errors, like suppose someone does
! * XXX "import xyz", and in some directory there's both "XYZ.py" and
! * XXX "xyz.txt". fopen("xyz.py") will open XYZ.py, but when marching thru
! * XXX the directory we'll eventually "succeed" on "xyz.txt" because the
! * XXX extension is never checked.
! */
! #elif defined(__MACH__) && defined(__APPLE__) && defined(HAVE_DIRENT_H)
 	DIR *dirp;
 	struct dirent *dp;
! 	char dirname[MAXPATHLEN + 1];
! 	const int dirlen = len - namelen - 1; /* don't want trailing SEP */
 
 	if (getenv("PYTHONCASEOK") != NULL)
 		return 1;
 
! 	/* Copy the dir component into dirname; substitute "." if empty */
! 	if (dirlen <= 0) {
! 		dirname[0] = '.';
! 		dirname[1] = '0円';
 	}
 	else {
! 		assert(dirlen <= MAXPATHLEN);
! 		memcpy(dirname, buf, dirlen);
! 		dirname[dirlen] = '0円';
 	}
 	/* Open the directory and search the entries for an exact match. */
! 	dirp = opendir(dirname);
 	if (dirp) {
 		while ((dp = readdir(dirp)) != NULL) {
***************
*** 1138,1142 ****
 						strlen(dp->d_name);
 #endif
! 			if (thislen == namelen && !strcmp(dp->d_name, name)) {
 				(void)closedir(dirp);
 				return 1; /* Found */
--- 1156,1161 ----
 						strlen(dp->d_name);
 #endif
! 			if (thislen >= namelen &&
! 			 strncmp(dp->d_name, name, namelen) == 0) {
 				(void)closedir(dirp);
 				return 1; /* Found */

AltStyle によって変換されたページ (->オリジナル) /