Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

257 lines
5.9 KiB

4 years ago
  1. /***********************************************************************
  2. * Microsoft (R) 32-Bit Incremental Linker
  3. *
  4. * Copyright (C) Microsoft Corp 1992-95. All rights reserved.
  5. *
  6. * File: defaultl.cpp
  7. *
  8. * File Comments:
  9. *
  10. * The default library handling routines.
  11. *
  12. ***********************************************************************/
  13. #include "link.h"
  14. STATIC BOOL FMatchDefaultLib(const char *szName, DL *pdl);
  15. PLIB
  16. FindLib(const char *sz, LIBS *plibs)
  17. // Calls PlibFind to locate a lib with same name
  18. //
  19. {
  20. char szDrive[_MAX_DRIVE];
  21. char szDir[_MAX_DIR];
  22. char szFname[_MAX_FNAME];
  23. char szExt[_MAX_EXT];
  24. char szPath[_MAX_PATH];
  25. _splitpath(sz, szDrive, szDir, szFname, szExt);
  26. if (szExt[0] == '\0') {
  27. strcpy(szExt, ".lib");
  28. }
  29. _makepath(szPath, szDrive, szDir, szFname, szExt);
  30. return(PlibFind(szPath,
  31. plibs->plibHead,
  32. (szDrive[0] == '\0' && szDir[0] == '\0')));
  33. }
  34. VOID
  35. NoDefaultLib(const char *szName, LIBS *plibs)
  36. // Removes a .lib (if present) from the default libs for *plibs, and
  37. // prevents it from becoming a default lib in the future.
  38. //
  39. // If szName is NULL then all default libs are removed and suppressed.
  40. //
  41. {
  42. DL **ppdl;
  43. BOOL fFound;
  44. assert(!fIncrDbFile);
  45. if (plibs->fNoDefaultLibs) {
  46. // all defaultlibs are turned off ... don't bother
  47. return;
  48. }
  49. if (szName == NULL) {
  50. VERBOSE(Message(NODEFLIB));
  51. plibs->fNoDefaultLibs = TRUE;
  52. return;
  53. }
  54. fFound = FALSE;
  55. for (ppdl = &plibs->pdlFirst; *ppdl != NULL; ppdl = &(*ppdl)->pdlNext) {
  56. if (FMatchDefaultLib(szName, *ppdl)) {
  57. (*ppdl)->flags |= LIB_DontSearch;
  58. fFound = TRUE;
  59. }
  60. }
  61. if (!fFound) {
  62. // Add a record to remember that this defaultlib is turned off.
  63. *ppdl = (DL *) Malloc(sizeof(DL));
  64. (*ppdl)->pdlNext = NULL;
  65. (*ppdl)->szName = Strdup(szName);
  66. (*ppdl)->flags = LIB_DontSearch;
  67. (*ppdl)->pmod = NULL;
  68. }
  69. VERBOSE(Message(NODEFLIBLIB, szName));
  70. }
  71. VOID
  72. MakeDefaultLib(const char *szName, LIBS *plibs)
  73. // Creates a defaultlib for the specified name, if we haven't already seen a
  74. // nodefaultlib for it.
  75. //
  76. {
  77. DL **ppdl;
  78. assert(!fIncrDbFile);
  79. if (plibs->fNoDefaultLibs) {
  80. return;
  81. }
  82. for (ppdl = &plibs->pdlFirst; *ppdl != NULL; ppdl = &(*ppdl)->pdlNext) {
  83. if (FMatchDefaultLib(szName, *ppdl)) {
  84. // Either it's already there or its negation is already there.
  85. //
  86. (*ppdl)->flags |= LIB_Default;
  87. return;
  88. }
  89. }
  90. *ppdl = (DL *) Malloc(sizeof(DL));
  91. (*ppdl)->pdlNext = NULL;
  92. (*ppdl)->szName = Strdup(szName);
  93. (*ppdl)->flags = LIB_Default;
  94. (*ppdl)->pmod = NULL;
  95. VERBOSE(Message(DEFLIB, szName));
  96. }
  97. VOID
  98. ExcludeLib(const char *szName, LIBS *plibs, PMOD pmod)
  99. // Creates a excludelib for the specified name, if we haven't already seen a
  100. // nodefaultlib for it.
  101. //
  102. {
  103. DL **ppdl;
  104. assert(!fIncrDbFile);
  105. if (plibs->fNoDefaultLibs) {
  106. return;
  107. }
  108. for (ppdl = &plibs->pdlFirst; *ppdl != NULL; ppdl = &(*ppdl)->pdlNext) {
  109. if (FMatchDefaultLib(szName, *ppdl)) {
  110. // it's already there.
  111. //
  112. (*ppdl)->flags |= LIB_Exclude;
  113. return;
  114. }
  115. }
  116. *ppdl = (DL *) Malloc(sizeof(DL));
  117. (*ppdl)->pdlNext = NULL;
  118. (*ppdl)->szName = Strdup(szName);
  119. (*ppdl)->flags = LIB_Exclude;
  120. (*ppdl)->pmod = pmod;
  121. VERBOSE(Message(EXCLUDELIB, szName));
  122. }
  123. STATIC BOOL
  124. FMatchDefaultLib(const char *szName, DL *pdl)
  125. // Determine identity of a name with an existing defaultlib.
  126. // This is used for matching -defaultlib:foo with -nodefaultlib:foo.
  127. //
  128. // Algorithm: case-insensitive comparison, ignoring trailing .lib.
  129. {
  130. size_t cch1;
  131. size_t cch2;
  132. cch1 = strlen(szName);
  133. if ((cch1 >= 4) && (_stricmp(&szName[cch1 - 4], ".lib") == 0)) {
  134. cch1 -= 4;
  135. }
  136. cch2 = strlen(pdl->szName);
  137. if ((cch2 >= 4) && (_stricmp(&pdl->szName[cch2 - 4], ".lib") == 0)) {
  138. cch2 -= 4;
  139. }
  140. return((cch1 == cch2) && (_strnicmp(szName, pdl->szName, cch1) == 0));
  141. }
  142. PLIB
  143. PlibInstantiateDefaultLib(PLIBS plibs)
  144. // Convert the first valid defaultlib into a LIB. This means we will attempt
  145. // to link it.
  146. //
  147. // Returns NULL if none exists.
  148. {
  149. DL *pdl;
  150. if (plibs->fNoDefaultLibs) {
  151. return NULL;
  152. }
  153. for (pdl = plibs->pdlFirst; pdl != NULL; pdl = pdl->pdlNext) {
  154. LIB *plib;
  155. if (pdl->flags & LIB_DontSearch) {
  156. continue; // this one is turned off
  157. }
  158. if (!(pdl->flags & LIB_Default)) {
  159. continue; // this one never got added as a default lib
  160. }
  161. if (pdl->flags & LIB_Processed) {
  162. continue; // this one already done
  163. }
  164. pdl->flags |= LIB_Processed; // we either instantiate this one or throw it away
  165. plib = FindLib(pdl->szName, plibs); // look if the lib has already been searched
  166. if (plib == NULL) {
  167. char *sz;
  168. struct _stat statfile;
  169. // Name does not match a lib which is already linked.
  170. sz = SzSearchEnv("LIB", pdl->szName, LIB_EXT);
  171. plib = PlibNew(sz, 0L, plibs);
  172. assert(plib);
  173. if (_stat(sz, &statfile) == -1) {
  174. Fatal(NULL, CANTOPENFILE, sz);
  175. }
  176. plib->TimeStamp = statfile.st_mtime;
  177. plib->flags |= LIB_Default;
  178. if (szReproDir != NULL) {
  179. CopyFileToReproDir(sz, FALSE);
  180. }
  181. return(plib);
  182. }
  183. }
  184. return NULL; // didn't find one
  185. }
  186. DL *
  187. PdlFind(const char *sz, DL *pdlFirst)
  188. // checks to see if lib is on pdl
  189. {
  190. DL *pdl;
  191. for (pdl = pdlFirst; pdl != NULL; pdl = pdl->pdlNext) {
  192. if (FMatchDefaultLib(sz, pdl)) {
  193. // found a match
  194. return pdl;
  195. }
  196. }
  197. return NULL;
  198. }