Changeset 391 for python/trunk/PC/import_nt.c
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/PC/import_nt.c
r2 r391 1 1 /******************************************************************** 2 2 3 import_nt.c 3 import_nt.c 4 4 5 5 Win32 specific import code. … … 17 17 18 18 FILE *PyWin_FindRegisteredModule(const char *moduleName, 19 20 21 19 struct filedescr **ppFileDesc, 20 char *pathBuf, 21 Py_ssize_t pathLen) 22 22 { 23 24 25 23 char *moduleKey; 24 const char keyPrefix[] = "Software\\Python\\PythonCore\\"; 25 const char keySuffix[] = "\\Modules\\"; 26 26 #ifdef _DEBUG 27 28 29 30 27 /* In debugging builds, we _must_ have the debug version 28 * registered. 29 */ 30 const char debugString[] = "\\Debug"; 31 31 #else 32 32 const char debugString[] = ""; 33 33 #endif 34 35 36 37 38 34 struct filedescr *fdp = NULL; 35 FILE *fp; 36 HKEY keyBase = HKEY_CURRENT_USER; 37 int modNameSize; 38 long regStat; 39 39 40 41 42 43 44 45 46 47 48 49 50 51 moduleKey = alloca(bufSize); 52 53 54 40 /* Calculate the size for the sprintf buffer. 41 * Get the size of the chars only, plus 1 NULL. 42 */ 43 size_t bufSize = sizeof(keyPrefix)-1 + 44 strlen(PyWin_DLLVersionString) + 45 sizeof(keySuffix) + 46 strlen(moduleName) + 47 sizeof(debugString) - 1; 48 /* alloca == no free required, but memory only local to fn, 49 * also no heap fragmentation! 50 */ 51 moduleKey = alloca(bufSize); 52 PyOS_snprintf(moduleKey, bufSize, 53 "Software\\Python\\PythonCore\\%s\\Modules\\%s%s", 54 PyWin_DLLVersionString, moduleName, debugString); 55 55 56 57 58 59 60 61 62 63 64 regStat = RegQueryValue(keyBase, moduleKey, 65 56 assert(pathLen < INT_MAX); 57 modNameSize = (int)pathLen; 58 regStat = RegQueryValue(keyBase, moduleKey, pathBuf, &modNameSize); 59 if (regStat != ERROR_SUCCESS) { 60 /* No user setting - lookup in machine settings */ 61 keyBase = HKEY_LOCAL_MACHINE; 62 /* be anal - failure may have reset size param */ 63 modNameSize = (int)pathLen; 64 regStat = RegQueryValue(keyBase, moduleKey, 65 pathBuf, &modNameSize); 66 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 67 if (regStat != ERROR_SUCCESS) 68 return NULL; 69 } 70 /* use the file extension to locate the type entry. */ 71 for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) { 72 size_t extLen = strlen(fdp->suffix); 73 assert(modNameSize >= 0); /* else cast to size_t is wrong */ 74 if ((size_t)modNameSize > extLen && 75 strnicmp(pathBuf + ((size_t)modNameSize-extLen-1), 76 fdp->suffix, 77 extLen) == 0) 78 break; 79 } 80 if (fdp->suffix == NULL) 81 return NULL; 82 fp = fopen(pathBuf, fdp->mode); 83 if (fp != NULL) 84 *ppFileDesc = fdp; 85 return fp; 86 86 }
Note:
See TracChangeset
for help on using the changeset viewer.