#define LINT_ARGS #include #include #include #include #include #include "mbrmake.h" #define LONGESTPATH 128 #define SLASH "\\" #define SLASHCHAR '\\' #define XSLASHCHAR '/' WORD near cAtomsMac; // total number of atoms WORD near cModulesMac; // total number of modules WORD near cSymbolsMac; // total number of symbols static char *tmpl = "XXXXXX"; extern WORD HashAtomStr (char *); // rjsa LPCH GetAtomStr (VA vaSym); void SeekError (char *pfilenm) // couldn't seek to position ... emit error message // { Error(ERR_SEEK_FAILED, pfilenm); } void ReadError (char *pfilenm) // couldn't read from file... emit error message // { Error(ERR_READ_FAILED, pfilenm); } void WriteError (char *pfilenm) // couldn't write to file ... emit error message // { Error(ERR_WRITE_FAILED, pfilenm); } void FindTmp (char *pbuf) /* copy TMP path to pbuf if exists */ // // { char ebuf[LONGESTPATH]; char *env = ebuf; *pbuf = '\0'; *env = '\0'; // if (!(env = getenv("TMP"))) if (!(env = getenvOem("TMP"))) return; /* no path, return */ // env = strncpy(ebuf, env, LONGESTPATH-1); strncpy(ebuf, env, LONGESTPATH-1); free( env ); env = ebuf; ebuf[LONGESTPATH-1] = '\0'; if (!( env = ebuf ) ) return; env = ebuf + strcspn(ebuf, ";"); if (*env == ';') *env = '\0'; if (env != ebuf) { env--; if (*env != SLASHCHAR && *env != XSLASHCHAR) strcat(ebuf, SLASH); } strcpy (pbuf, ebuf); } char * MakTmpFileName (char *pext) // Create a temporary file with the extension supplied. // returns a pointer to the file name on the heap. // { char ptmpnam[96]; char btmpl[7]; char *p; strcpy (btmpl, tmpl); p = mktemp(btmpl); FindTmp (ptmpnam); strcat (ptmpnam, p); free (p); strcat (ptmpnam, pext); /* /tmp/xxxxxx.ext file */ return (LszDup(ptmpnam)); } LSZ LszBaseName (LSZ lsz) // return the base name part of a path // { LPCH lpch; lpch = strrchr(lsz, '\\'); if (lpch) return lpch+1; if (lsz[1] == ':') return lsz+2; return lsz; } VA VaSearchModule (char *p) // search for the named module in the module list // { VA vaMod; LSZ lsz, lszBase; char buf[PATH_BUF]; strcpy(buf, ToAbsPath(p, r_cwd)); lszBase = LszBaseName(buf); SetVMClient(VM_SEARCH_MOD); vaMod = vaRootMod; while (vaMod) { gMOD(vaMod); lsz = GetAtomStr(cMOD.vaNameSym); if (strcmpi(LszBaseName(lsz), lszBase) == 0 && strcmpi(buf,ToAbsPath(lsz, c_cwd)) == 0) { SetVMClient(VM_MISC); return (vaMod); } vaMod = cMOD.vaNextMod; } SetVMClient(VM_MISC); return vaNil; } VA VaSearchModuleExact (char *p) // search for the named module in the module list -- EXACT match only // { VA vaMod; SetVMClient(VM_SEARCH_MOD); vaMod = vaRootMod; while (vaMod) { gMOD(vaMod); if (strcmp(p,GetAtomStr(cMOD.vaNameSym)) == 0) { SetVMClient(VM_MISC); return (vaMod); } vaMod = cMOD.vaNextMod; } SetVMClient(VM_MISC); return vaNil; } VA VaSearchSymbol (char *pStr) // search for the named symbol (not a module!) // { WORD hashid; VA vaRootSym, vaSym; LSZ lszAtom; SetVMClient(VM_SEARCH_SYM); vaRootSym = rgVaSym[hashid = HashAtomStr (pStr)]; if (vaRootSym) { vaSym = vaRootSym; while (vaSym) { gSYM(vaSym); lszAtom = gTEXT(cSYM.vaNameText); if (strcmp (pStr, lszAtom) == 0) { SetVMClient(VM_MISC); return (vaSym); // Duplicate entry } vaSym = cSYM.vaNextSym; // current = next } } SetVMClient(VM_MISC); return vaNil; } LPCH GetAtomStr (VA vaSym) // Swap in the Atom page for the symbol chain entry pSym // Return the atom's address in the page. // { gSYM(vaSym); return gTEXT(cSYM.vaNameText); } VA MbrAddAtom (char *pStr, char fFILENM) // create a new symbol with the given name // { WORD hashid; VA vaSym, vaSymRoot, vaText; if (!fFILENM) vaSymRoot = rgVaSym[hashid = HashAtomStr (pStr)]; else vaSymRoot = rgVaSym[hashid = MAXSYMPTRTBLSIZ - 1]; SetVMClient(VM_SEARCH_SYM); if (vaSymRoot) { vaSym = vaSymRoot; while (vaSym) { gSYM(vaSym); if (!strcmp (pStr, GetAtomStr(vaSym))) { #if defined (DEBUG) if (OptD & 2) printf("MbrAddAtom: duplicate (%s)\n", pStr); #endif SetVMClient(VM_SEARCH_SYM); return (vaSym); // Duplicate entry } vaSym = cSYM.vaNextSym; // current = next } } // we are now going to have to add the symbol if (fFILENM) { SetVMClient(VM_ADD_MOD); cModulesMac++; } else { SetVMClient(VM_ADD_SYM); cSymbolsMac++; } cAtomsMac++; vaSym = VaAllocGrpCb(grpSym, sizeof(SYM)); vaText = VaAllocGrpCb(grpText, strlen(pStr) + 1); gSYM(vaSym); cSYM.vaNameText = vaText; cSYM.vaNextSym = rgVaSym[hashid]; pSYM(vaSym); rgVaSym[hashid] = vaSym; strcpy(gTEXT(vaText), pStr); pTEXT(vaText); SetVMClient(VM_MISC); return (vaSym); } VA FAR * near rgvaSymSorted; // rjsa int CmpSym(VA FAR *lhsym1, VA FAR *lhsym2); void SortAtoms () // create the "subscript sort" array pointers rgvaSymSorted // { VA vaSym; char buf[PATH_BUF]; WORD i, iSym; SetVMClient(VM_SORT_ATOMS); rgvaSymSorted = (VA FAR *)LpvAllocCb(cAtomsMac * sizeof(VA)); iSym = 0; for (i=0; i < MAXSYMPTRTBLSIZ; i++) { vaSym = rgVaSym[i]; while (vaSym) { gSYM(vaSym); rgvaSymSorted[iSym] = cSYM.vaNameText; vaSym = cSYM.vaNextSym; iSym++; } } // sort symbols qsort(rgvaSymSorted, cSymbolsMac, sizeof(VA), CmpSym); // the files are in the last hash bucket so they went to the // end of this array we just made -- we sort them separately // sort files qsort(rgvaSymSorted + cSymbolsMac, cModulesMac, sizeof(VA), CmpSym); // convert the Page/Atom values back to virtual symbol addresses for (i=0; i < cSymbolsMac; i++) { strcpy(buf, gTEXT(rgvaSymSorted[i])); rgvaSymSorted[i] = VaSearchSymbol(buf); } for (; i < cAtomsMac; i++) { strcpy(buf, gTEXT(rgvaSymSorted[i])); #ifdef DEBUG if (OptD & 64) printf("Module: %s\n", buf); #endif rgvaSymSorted[i] = (VaSearchModuleExact(buf), cMOD.vaNameSym); } } int __cdecl CmpSym (VA FAR *sym1, VA FAR *sym2) // compare two symbols given their pointers // { register char far *lpch1, *lpch2; register int cmp; lpch1 = gTEXT(*sym1); // LRU will not page out lpch1 lpch2 = gTEXT(*sym2); cmp = strcmpi(lpch1, lpch2); if (cmp) return cmp; return strcmp(lpch1, lpch2); }