/* * Copyright Microsoft Corporation, 1987 * * This Module contains Proprietary Information of Microsoft * Corporation and should be treated as Confidential. */ /* * EXTERN.H: external declarations */ #include #include #if NOT OSXENIX #include #include #endif #include #include #ifdef _MBCS #define _CRTVAR1 #include #include #define strchr _mbschr #define strrchr _mbsrchr #endif #ifndef DECLSPEC_NORETURN #if (_MSC_VER >= 1200) #define DECLSPEC_NORETURN __declspec(noreturn) #else #define DECLSPEC_NORETURN #endif #endif /**************************************************************** * * * External function declarations * * * ****************************************************************/ extern void AddContribution(unsigned short gsn, unsigned short offMin, unsigned short offMac, unsigned short cbPad); extern void AddContributor(SNTYPE gsn, unsigned long raComdat, unsigned long size); extern void NEAR AddLibPath(unsigned short i); extern void AddLibrary(unsigned char *psbName); extern void AddComdatUses(APROPCOMDAT*, APROPCOMDAT*); extern PLTYPE FAR * NEAR AddVmProp (PLTYPE FAR *list, RBTYPE rprop); extern void NEAR AllocateScratchSpace(void); extern void NEAR AllocComDat(void); extern void NEAR AllocSortBuffer(unsigned max, int AOrder); extern void NEAR AssignAddresses(void); extern void NEAR AssignDos3Addr(void); extern void NEAR AssignSegAddr(void); extern void AttachComdat(RBTYPE vrComdat, SNTYPE gsn); extern void NEAR BakPat(void); extern void BigEnSyms(void (*pproc)(APROPNAMEPTR papropName, RBTYPE rhte, RBTYPE rprop, WORD fNewHte), ATTRTYPE attr); #if QBLIB extern void NEAR BldQbSymbols(unsigned short gsnQbSym); #endif #if CMDMSDOS extern void BreakLine(unsigned char *psb, void (*pfunc)(unsigned char *psb), char sepchar); #endif extern void ChkInput(void); extern APROPSNPTR CheckClass(APROPSNPTR apropSn, RBTYPE rhteClass); #if OVERLAYS extern void CheckOvl(APROPSNPTR apropSn, WORD iovFile); #endif #if OEXE extern void NEAR Check_edata_end(SNTYPE gsnTop, SEGTYPE segTop); extern void CheckSegmentsMemory(void); #if INMEM extern void ChkSum(WORD,BYTE FAR *,FTYPE); #else extern void ChkSum(WORD,BYTE *, WORD); #endif #endif #if FALSE extern void CheckSum (WORD cb, BYTE *pb, WORD fOdd); #else #define CheckSum(cb, pb, fOdd) #endif #if OSMSDOS extern void CleanupNearHeap(void); #endif extern void NEAR ComDatRc1(void); extern void NEAR ComDatRc2(void); extern void CputcQC(int ch); extern void CputsQC(char *str); extern void CputcStd(int ch); extern void CputsStd(char *str); #if EXE386 extern WORD NEAR CrossingPage(RLCPTR rlcp); #endif extern short CURDSK(void); extern void CtrlC(void); #if SYMDEB extern void NEAR DoComdatDebugging(void); extern void DebPublic(RBTYPE rprop, WORD type); extern void DebMd2(void); extern void DeclareStdIds(void); extern void NEAR Define_edata_end(APROPSNPTR papropSn); extern void DisplayBanner(void); extern WORD DoDebSrc(void); #endif #if OSEGEXE extern void NEAR DoIteratedFixups(unsigned short cb,unsigned char *pb); extern void ProcesNTables(char *pName); #endif #if OSMSDOS extern short Dos3AllocMem(short *pcparMem); #endif extern void Dos3FreeMem(short saMem); extern void NEAR DrivePass(void (NEAR *pProcessPass)(void)); extern void NEAR DupErr(BYTE *sb); extern void NEAR EmitStub(void); extern void EndPack(void *prun); extern void NEAR EndRec(void); extern PROPTYPE EnterName(BYTE *,ATTRTYPE, WORD); extern void ErrPrefix(void); extern RBTYPE NEAR ExtractMin(unsigned n); extern DECLSPEC_NORETURN void cdecl Fatal (MSGTYPE msg, ...); extern unsigned char FCHGDSK(int drive); extern int cdecl FGtAddr(const RBTYPE *rb1, const RBTYPE *rb2); extern int cdecl FGtName(const RBTYPE *rb1, const RBTYPE *rb2); extern void FindLib(char *sbLib); extern void NEAR FixBakpat(void); extern void FixComdatRa(void); extern void NEAR FixErrSub(MSGTYPE msg, RATYPE ra, WORD gsnFrame, WORD gsnTarget, RATYPE raTarget, FTYPE fErr); extern void NEAR FixOld(void); extern void NEAR FixNew(void); #ifdef LEGO extern void NEAR FixNewKeep(void); #endif /* LEGO */ extern void NEAR FixOvlData(void); extern void NEAR FixRc2(void); extern void flskbd(void); extern void cdecl FmtPrint(char *fmt, ...); extern unsigned char fPathChr(char ch); extern void NEAR fpagcpy(char FAR *,char FAR *); extern void FreeHandle(void); extern void NEAR FreeSortBuffer(void); extern void FreeSymTab(void); #if EXE386 extern void FillInImportTable(void); extern void GenImportTable(void); extern APROPSNPTR GenSeg(unsigned char *sbName, unsigned char *sbClass, unsigned char ggr, unsigned short fPublic); #else extern APROPSNPTR NEAR GenSeg(unsigned char *sbName, unsigned char *sbClass, unsigned char ggr, unsigned short fPublic); #endif extern void NEAR GetBytes(unsigned char *pb,unsigned short n); extern void NEAR GetBytesNoLim(unsigned char *pb,unsigned short n); extern char * NEAR getdicpage(unsigned short pn); extern WORD GetGsnInfo(GSNINFO *pInfo); extern AHTEPTR GetHte(RBTYPE rprop); #if CMDMSDOS extern void NEAR GetLibAll(unsigned char *sbLib); extern void NEAR GetLine(unsigned char *pcmdlin,char *prompt); #endif extern void GetLineOff(WORD *pLine, RATYPE *pRa); extern void NEAR GetLocName(unsigned char *psb); extern void GetLocSb(BYTE *); #if DEBUG_HEAP_ALLOCS extern BYTE FAR *GETMEM(unsigned size, char* pFile, int Line); #define GetMem(x) GETMEM((x), __FILE__, __LINE__) #define REALLOC(x, y) REALLOC_((x), (y), __FILE__, __LINE__) extern void *REALLOC_( void*, size_t, char* pFile, int Line); extern void FreeMem(void*); #else extern BYTE FAR *GetMem(unsigned size); #define REALLOC realloc #define FreeMem(x) free(x) #endif extern unsigned char * NEAR GetPropName(void FAR *ahte); #if defined(M_I386) OR defined( _WIN32 ) extern WORD cbRec; /* Size of object record in bytes */ extern BSTYPE bsInput; /* Current input file stream */ #else extern WORD NEAR Gets(void); #endif extern RBTYPE NEAR GetSymPtr(unsigned n); extern unsigned short IFind(unsigned char *sb,unsigned char b); #if SYMDEB extern void NEAR InitDeb1(void); extern void InitDbRhte(void); extern void InitializeWorld(void); extern WORD NEAR IsDebSeg(RBTYPE rhteClass, RBTYPE rhteSeg); #endif #if USE_REAL extern int IsDosxnt(void); extern int IsWin31(void); #endif extern void NEAR InitEntTab(void); extern void InitP2Tabs (void); #if QBLIB extern void NEAR InitQbLib(void); #endif extern void NEAR InitSort(RBTYPE **buf, WORD *base1, WORD *lim1, WORD *base2, WORD *lim2 ); extern void InitSym(void); extern void InitTabs(void); extern void initvm(void); #if EXE386 extern void InitVmBase(void); #endif extern DECLSPEC_NORETURN void NEAR InvalidObject(void); extern WORD NEAR GetIndexHard(WORD imin,WORD imax); extern WORD NEAR GetIndex(WORD imin,WORD imax); extern void KillRunfile(void); #if OEXE OR EXE386 extern void NEAR LChkSum(unsigned short cb,unsigned char *pb); #endif extern DWORD NEAR LGets(void); extern void NEAR LibEnv(void); extern void NEAR LibrarySearch(void); extern void NEAR LinRec2(void); extern void NEAR LNmRc1(WORD fLocal); extern WORD NEAR LookupLibSym(unsigned char *psb); extern long NEAR MakeHole(long cb); extern void MkPubSym(unsigned char *sb, unsigned char ggr, unsigned short gsn, RATYPE ra); extern void NEAR ModRc1(void); #if EXE386 extern void MoveToVm(unsigned short cb, unsigned char *obData, unsigned short seg, RATYPE ra); #else extern void NEAR MoveToVm(unsigned short cb, unsigned char *obData, unsigned short seg, RATYPE ra); #endif #if OSEGEXE extern unsigned short NEAR MpSaRaEto(unsigned short sa, RATYPE ra); #endif extern BYTE FAR * NEAR msaNew(SEGTYPE seg); extern BYTE FAR * NEAR msaOld(SEGTYPE seg); extern void NewExport(unsigned char *sbEntry, unsigned char *sbInternal, unsigned short ordno, unsigned short flags); #if EXE386 extern void NewImport(unsigned char *sbEntry, unsigned long ordEntry, unsigned char *sbModule, unsigned char *sbInternal, unsigned short impFlags); extern void NEAR NewSeg(unsigned char *sbName, unsigned char *sbClass, unsigned short iOvl, unsigned long flags); #else extern void NewImport(unsigned char *sbEntry, unsigned short ordEntry, unsigned char *sbModule, unsigned char *sbInternal); extern void NEAR NewSeg(unsigned char *sbName, unsigned char *sbClass, unsigned short iOvl, unsigned short flags); #endif #if OSEGEXE extern BSTYPE LinkOpenExe(BYTE *sbExe); #endif #if SYMDEB extern void OutDebSections(void); #endif extern void NEAR OutDos3Exe(void); extern void NEAR OutEntTab(void); extern void cdecl OutError(MSGTYPE msg, ...); extern void OutFileCur(BSTYPE bs); extern void NEAR OutFixTab(SATYPE sa); extern void OutHeader(struct exe_hdr *prun); #if FEXEPACK extern void OutPack(unsigned char *pb, unsigned cb); extern long Out5Pack(SATYPE sa, unsigned short *packed); #endif extern void OutputIlk(void); extern void NEAR OutSas(void *mpsasec); extern void NEAR OutSegExe(void); #if EXE386 extern void NEAR OutExe386(void); #endif extern void cdecl OutWarn (MSGTYPE msg, ...); extern void OutWord(unsigned short x); #define OutVm(va,cb) WriteExe(va, cb) extern void NEAR PadToPage(unsigned short align); extern void NEAR PatchStub(long lfahdr, long lfaseg); extern void NEAR pagein(REGISTER char *pb, unsigned short fpn); extern void NEAR pageout(REGISTER char *pb, unsigned short fpn); extern void ParseCmdLine(int argc,char * *argv); extern void ParseDeffile(void); extern void PeelFlags(unsigned char *psb); extern void * PInit(void); extern void * PAlloc(void *, int); extern void PFree(void *); extern void PReinit(void *); extern void PrintGroupOrigins(APROPNAMEPTR papropGroup, RBTYPE rhte, RBTYPE rprop, WORD fNewHte); extern void PrintMap(void); #if QBLIB extern void NEAR PrintQbStart(void); #endif extern void ProcFlag(unsigned char *psb); extern void ProcObject(unsigned char *psbObj); extern void NEAR ProcP1(void); extern void NEAR ProcP2(void); extern int cdecl PromptQC(unsigned char *sbNew, MSGTYPE msg, int msgparm, MSGTYPE pmt, int pmtparm); extern int cdecl PromptStd(unsigned char *sbNew, MSGTYPE msg, int msgparm, MSGTYPE pmt, int pmtparm); extern PROPTYPE NEAR PropAdd(RBTYPE rhte, unsigned char attr); extern PROPTYPE NEAR PropRhteLookup(RBTYPE rhte, unsigned char attr, unsigned char fCreate); extern RBTYPE NEAR RhteFromProp(APROPPTR aprop); extern PROPTYPE NEAR PropSymLookup(BYTE *, ATTRTYPE, WORD); #if QBLIB extern int cdecl QbCompSym(const RBTYPE *prb1, const RBTYPE *prb2); #endif #if USE_REAL extern int RelockConvMem(void); extern void RealMemExit(void); extern int MakeConvMemPageable(void); #endif #if AUTOVM extern RBTYPE NEAR RbAllocSymNode(unsigned short cb); #else extern RBTYPE NEAR RbAllocSymNode(unsigned short cb); #endif extern char * ReclaimVM(unsigned short cnt); extern void ReclaimScratchSpace(void); extern void NEAR RecordSegmentReference(SEGTYPE seg, RATYPE ra, SEGTYPE segDst); extern int NEAR relscr(void); extern void NEAR ReleaseRlcMemory(void); extern void resetmax(void); #if SYMDEB extern void SaveCode(SNTYPE gsn, DWORD cb, DWORD raInit); #endif #if OSEGEXE #if EXE386 extern RATYPE NEAR SaveFixup(SATYPE obj, DWORD page, RLCPTR rlcp); extern void EmitFixup(SATYPE objTarget, DWORD raTarget, WORD locKind, DWORD virtAddr); #else extern RATYPE NEAR SaveFixup(unsigned short saLoc, RLCPTR rlcp); #endif #endif extern unsigned short SaveInput(unsigned char *psbFile, long lfa, unsigned short ifh, unsigned short iov); extern void SavePropSym(APROPNAMEPTR prop, RBTYPE rhte, RBTYPE rprop, WORD fNewHte); extern WORD SbCompare(unsigned char *ps1, unsigned char *ps2, unsigned short fncs); extern unsigned char SbSuffix(unsigned char *sb, unsigned char *sbSuf, unsigned short fIgnoreCase); extern void SbUcase(unsigned char *sb); extern int NEAR SearchPathLink(char FAR *lpszPath, char *pszFile, int ifh, WORD fStripPath); extern void SetDosseg(void); extern void NEAR SetupOverlays(void); extern BSTYPE NEAR ShrOpenRd(char *pname); #if NEWSYM #if NOT NOASM AND (CPU8086 OR CPU286) extern void SmallEnSyms(void (*pproc)(APROPNAMEPTR papropName, RBTYPE rhte, RBTYPE rprop, WORD fNewHte), ATTRTYPE attr); #endif #endif /* NEWSYM */ #if NEWIO extern int NEAR SmartOpen(char *sbInput, int ifh); #endif #if EXE386 extern void SortPtrTable(void); #endif extern void NEAR SortSyms(ATTRTYPE attr, void (*savf)(APROPNAMEPTR prop, RBTYPE rhte, RBTYPE rprop, WORD fNewHte), int (cdecl *scmpf)(const RBTYPE *sb1, const RBTYPE *sb2), void (NEAR *hdrf)(ATTRTYPE attr), void (NEAR *lstf)(WORD irbMac, ATTRTYPE attr)); extern void NEAR Store(RBTYPE element); #if SYMDEB OR OVERLAYS extern unsigned char * StripDrivePath(unsigned char *sb); #endif #if WIN_3 void cdecl SysFatal (MSGTYPE msg); #endif extern void StripPath(unsigned char *sb); extern char * cdecl swapin(long vp,unsigned short fp); extern void termvm(void); extern long NEAR TypLen(void); extern void UndecorateSb (char FAR* sbSrc, char FAR* sbDst, unsigned cbDst); extern void UpdateComdatContrib( #if ILINK WORD fIlk, #endif WORD fMap); extern void UpdateFileParts(unsigned char *psbOld, unsigned char *psbUpdate); extern void cdecl UserKill(void); extern WORD NEAR WGetsHard(void); extern WORD NEAR WGets(void); #if CMDMSDOS extern void NEAR ValidateRunFileName(BYTE *ValidExtension, WORD ForceExtension, WORD WarnUser); #endif #if ( NOT defined( M_I386 ) ) AND ( NOT defined( _WIN32 ) ) extern void WriteExe(void FAR *pb, unsigned cb); #endif extern void WriteZeros(unsigned cb); #if EXE386 extern DWORD WriteExportTable(DWORD *expSize, DWORD timestamp); extern DWORD WriteImportTable(DWORD *impSize, DWORD timestamp, DWORD *mpsaLfa); #endif extern unsigned short zcheck(unsigned char *pb,unsigned short cb); extern int NEAR yyparse(void); /* No argument type lists */ extern char FAR *brkctl(); /* Xenix call for new memory */ extern long NEAR msa386(SATYPE sa); /* * Version-dependent macro and function declarations. Hide some #ifdef's * from the source code. */ #if NEWSYM #if AUTOVM extern BYTE FAR * NEAR FetchSym(RBTYPE rb, WORD fDirty); extern BYTE FAR * NEAR FetchSym1(RBTYPE rb, WORD fDirty); #define MARKVP() markvp() #else #define FetchSym(a,b) (a) #define MARKVP() #define markvp() #endif #if defined(M_I386) OR defined( _WIN32 ) #define GetFarSb(a) (a) #else extern char *GetFarSb(RBTYPE psb); #endif #else extern BYTE *FetchSym(RBTYPE,FTYPE); #define MARKVP() markvp() #define GetFarSb(a) (BYTE *)(a) #endif #if NEWSYM extern FTYPE NEAR SbNewComp(BYTE *, BYTE FAR *, FTYPE); extern void OutSb(BSTYPE f, BYTE *pb); #else #define SbNewComp SbCompare #endif #if ECS extern int GetTxtChr(BSTYPE bs); #else #define GetTxtChr(a) getc(a) #endif #if NEWSYM AND NOT NOASM AND (CPU286 OR CPU8086) extern void (*pfEnSyms)(void (*pproc)(APROPNAMEPTR papropName, RBTYPE rhte, RBTYPE rprop, WORD fNewHte), ATTRTYPE attr); #define EnSyms(a,b) (*pfEnSyms)(a,b) #else #define EnSyms(a,b) BigEnSyms(a,b) #endif #if OSMSDOS extern FTYPE fNoprompt; #else #define fNoprompt TRUE #endif #if CPU8086 OR CPU286 #define FMALLOC _fmalloc #define FFREE _ffree #define FMEMSET _fmemset #define FREALLOC _frealloc #define FMEMCPY _fmemcpy #define FSTRLEN _fstrlen #define FSTRCPY _fstrcpy #else #define FMALLOC malloc #define FFREE free #define FMEMSET memset #define FREALLOC realloc #define FMEMCPY memcpy #define FSTRLEN strlen #define FSTRCPY strcpy #endif #if WIN_3 #define EXIT WinAppExit extern FTYPE fSeverity; /* Severity for QW_ERROR message */ extern void ReportVersion(void ); extern void ErrorMsg( char *pszError ); extern void __cdecl ErrMsgWin (char *fmt); extern void WErrorMsg( char *pszError ); extern void WinAppExit( short RetCode ); extern void ProcessWinArgs( char FAR *pszCmdLine ); extern void ParseLinkCmdStr( void ); extern void ReportProgress( char *pszStatus ); extern void SendPacket(void *pPacket); extern void __cdecl StatMsgWin (char *fmt, int p1); extern void StatHdrWin ( char *pszHdr ); extern void WinYield( void ); extern void CputcWin(int ch); extern void CputsWin(char *str); #else #define EXIT exit #endif /**************************************************************** * * * External data declarations * * * ****************************************************************/ extern char FAR *lpszLink; extern char FAR *lpszPath; extern char FAR *lpszTMP; extern char FAR *lpszLIB; extern char FAR *lpszQH; extern char FAR *lpszHELPFILES; extern char FAR *lpszCmdLine; #if OSEGEXE extern RBTYPE procOrder; /* Procedure order as defined in .DEF file */ #endif extern BSTYPE bsErr; /* Error message file stream */ extern BSTYPE bsInput; /* Current input file stream */ extern BSTYPE bsLst; /* Listing (map) file stream */ extern BSTYPE bsRunfile; /* Executable file stream */ extern WORD cbBakpat; /* # bytes in backpatch area */ extern WORD cbRec; /* Size of object record in bytes */ extern WORD cErrors; /* Number of non-fatal errors */ extern int (cdecl *cmpf)(const RBTYPE *sb1, const RBTYPE *sb2); /* Pointer to sorting comparator */ #if OMF386 extern FTYPE f386; /* True if 386 binary */ #endif #if (OSEGEXE AND defined(LEGO)) OR EXE386 extern FTYPE fKeepFixups; /* TRUE if FLAT offset fixups have to be poropagated to the .EXE file */ #endif #if EXE386 extern SNTYPE gsnImport; /* Global index of Import Address Table segment */ extern GRTYPE ggrFlat; /* Group number of pseudo-group FLAT */ extern FTYPE fFullMap; /* More map information */ extern FTYPE fKeepVSize; /* TRUE if VSIZE to be set */ #endif extern WORD extMac; /* Count of EXTDEFs */ extern WORD extMax; /* Maximum number of EXTDEFs */ extern int ExitCode; /* Linker exit code */ extern FTYPE fFullMap; /* More map information */ extern FTYPE fCommon; /* True if any communal variables */ extern FTYPE fC8IDE; /* True if running under C8 IDE */ extern FTYPE fDelexe; /* True if /DELEXECUTABLE is on */ extern FTYPE fDrivePass; /* True if executing DrivePass() */ extern FTYPE fFarCallTrans; /* True if /FARCALLTRANSLATION on */ extern FTYPE fFarCallTransSave; /* Previous state of fFarCallTrans */ extern FTYPE fIgnoreCase; /* True if ignoring case */ extern FTYPE fInOverlay; /* True if parsing overlay spec */ extern FTYPE fLibPass; /* True if in library pass */ extern FTYPE fLibraryFile; /* True if input from library */ extern FTYPE fListAddrOnly; /* True if sorting by address only */ extern FTYPE fLstFileOpen; /* True of map file open */ extern FTYPE fScrClosed; /* True if scratch file closed */ extern FTYPE fSkipFixups; /* True if skipping COMDAT and its fixups */ extern FTYPE fUndefinedExterns; /* True if any unresolved externals */ extern FTYPE fExeStrSeen; /* True if EXESTR comment seen */ extern FTYPE fPackFunctions; /* True if elimination uncalled COMDATs */ #if TCE extern FTYPE fTCE; /* True if /PACKF:MAX = Transitive Comdat Elimination */ #endif #if USE_REAL extern FTYPE fUseReal; /* True if using conv memory for paging */ extern FTYPE fSwNoUseReal; /* True if switch /NOUSEREAL set */ #endif #if O68K extern FTYPE f68k; /* True if target is a 68k */ extern FTYPE fTBigEndian; /* True if target is big-endian */ extern BYTE iMacType; /* Type of Macintosh exe */ #endif /* O68K */ extern GRTYPE ggrDGroup; /* Group number of DGROUP */ extern GRTYPE ggrMac; /* Count of global GRPDEFs */ extern GRTYPE grMac; /* Count of local GRPDEFs */ extern SNTYPE gsnMac; /* Count of global SEGDEFs */ extern SNTYPE gsnMax; /* Maximum number of SEGDEFs */ extern SNTYPE gsnStack; /* Glob. SEGDEF no. of STACK segment */ extern SNTYPE gsnText; /* Global SEGDEF for _TEXT segment */ extern WORD ifhLibCur; /* File index of current library */ extern WORD ifhLibMac; /* Count of library files */ extern long lfaLast; /* Last file position */ extern WORD lnameMac; /* Count of LNAMEs */ extern WORD lnameMax; /* Max count of LNAMEs */ extern unsigned char LINKREV; /* Release number */ extern unsigned char LINKVER; /* Version number */ extern WORD modkey; /* Module ID key */ extern SNTYPE *mpextgsn; /* f(EXTDEF no.) = glob. SEGDEF no. */ extern RATYPE *mpextra; /* f(EXTDEF no.) = symbol offset */ extern RBTYPE FAR *mpextprop; /* f(EXTDEF no.) = external name property */ extern SNTYPE mpggrgsn[]; /* f(glob GRPDEF) = glob. SEGDEF no. */ extern GRTYPE *mpgrggr; /* f(loc. GRPDEF #) = glob. GRPDEF # */ #if FAR_SEG_TABLES extern RATYPE FAR *mpgsndra; /* f(glob SEGDEF) = segment offset */ extern BYTE FAR *mpgsnfCod; /* f(glob SEGDEF) = true if code */ extern RBTYPE FAR *mpgsnrprop; /* f(glob SEGDEF) = property cell */ extern SEGTYPE FAR *mpgsnseg; /* f(glob SEGDEF) = segment number */ extern RATYPE FAR *mpsegraFirst; /* f(segment #) = offset of 1st byte */ extern SATYPE FAR *mpsegsa; /* f(seg) = sa */ extern BYTE FAR * FAR *mpsegMem; /* f(segment) = memory image */ extern BYTE FAR * FAR *mpsaMem; /* f(segment) = memory image */ #else extern RATYPE *mpgsndra; /* f(glob SEGDEF) = segment offset */ extern BYTE *mpgsnfCod; /* f(glob SEGDEF) = true if code */ extern RBTYPE *mpgsnrprop; /* f(glob SEGDEF) = property cell */ extern SEGTYPE *mpgsnseg; /* f(glob SEGDEF) = segment number */ extern RATYPE *mpsegraFirst; /* f(segment #) = offset of 1st byte */ extern SATYPE *mpsegsa; /* f(seg) = sa */ #endif extern SNTYPE *mpsngsn; /* f(local SEGDEF) = global SEGDEF */ extern RBTYPE mpifhrhte[]; /* f(lib. index) = library name */ extern long *mpitypelen; /* f(TYPDEF no.) = type length */ extern WORD *mpityptyp; /* f(TYPDEF no.) = TYPDEF no. */ extern RBTYPE FAR *mplnamerhte; /* f(LNAME no.) = hash table addr */ extern BYTE *psbRun; /* Name of run file */ extern WORD pubMac; /* Count of PUBDEFs */ extern APROPCOMDAT *pActiveComdat; extern int QCExtDefDelta; /* QC incremental compilation support */ extern int QCLinNumDelta; /* EXTDEF and LINNUM deltas */ extern WORD symMac; /* Number of symbols defined */ extern long raStart; /* Program starting address */ #if NOT NEWSYM OR AUTOVM #if AUTOVM extern WORD rbMacSyms; #else extern RBTYPE rbMacSyms; /* Count of symbol table entries */ #endif #endif extern RECTTYPE rect; /* Current record type */ #if RGMI_IN_PLACE extern BYTE *rgmi; extern BYTE bufg[DATAMAX + 4]; #else extern BYTE rgmi[DATAMAX + 4]; #define bufg rgmi #endif /* Array of code or data */ extern RBTYPE rhteBegdata; /* "BEGDATA" */ extern RBTYPE rhteBss; /* "BSS" */ extern RBTYPE rhteFirstObject;/* Name of first object file */ extern RBTYPE rhteRunfile; /* Name of run file */ extern RBTYPE rhteStack; /* "STACK" */ extern RBTYPE rprop1stFile; /* Property cell of 1st file */ extern RBTYPE rprop1stOpenFile;/* Property cell of 1st open file */ extern RBTYPE r1stFile; /* 1st input file */ extern SBTYPE sbModule; /* Name of current module */ extern SEGTYPE segCodeLast; /* Last (highest) code segment */ extern SEGTYPE segDataLast; /* Last (highest) data segment */ extern SEGTYPE segLast; /* Last (highest) segment */ extern SEGTYPE segStart; /* Program starting segment */ extern WORD snkey; /* SEGDEF ID key */ extern SNTYPE snMac; /* Local count of SEGDEFs */ extern WORD typMac; /* Local count of TYPDEFs */ extern WORD vcbData; /* # bytes in data record */ extern WORD vcln; /* # line-no entries on line */ extern FTYPE vfCreated; /* True if symbol property created */ extern FTYPE vfLineNos; /* True if line numbers requested */ extern FTYPE vfMap; /* True if public symbols requeste */ extern FTYPE vfNewOMF; /* True if OMF extensions */ extern FTYPE vfNoDefaultLibrarySearch; /* True if not searching def. libs. */ extern FTYPE vfPass1; /* True if executing Pass 1 */ extern SNTYPE vgsnCur; /* SEGDEF no. of current segment */ extern SNTYPE vgsnLineNosPrev;/* Previous SEGDEF no. for linnums */ extern int vmfd; /* VM scratch file handle */ #if EXE386 extern DWORD vpageCur; /* Current object page number */ #endif extern RATYPE vraCur; /* Current data record offset */ extern RECTTYPE vrectData; /* Type of current data record */ extern RBTYPE vrhte; /* Address of hash table entry */ extern RBTYPE vrhteCODEClass; /* "CODE" */ extern RBTYPE vrhteFile; /* Name of current file */ extern RBTYPE vrprop; /* Address of property cell */ extern RBTYPE vrpropFile; /* Prop. cell of current file */ extern RBTYPE vrpropTailFile; /* Prop. cell of last file */ extern SEGTYPE vsegCur; /* Current segment */ extern WORD ExeStrLen; // Length of EXE strings in buffer extern WORD ExeStrMax; // Length of EXE strings buffer extern char FAR *ExeStrBuf; // EXE strings buffer #if FDEBUG extern FTYPE fDebug; /* True if /INFORMATION on */ #endif #if CMDXENIX extern WORD symlen; /* Maximum symbol length */ #endif #if OSMSDOS extern char bigbuf[LBUFSIZ];/* File I/O buffer */ extern FTYPE fPauseRun; /* True if /PAUSE */ extern BYTE chRunFile; /* Run file drive LETTER */ extern BYTE chListFile; /* List file drive NUMBER */ extern RBTYPE rhteLstfile; /* Name of list file */ extern BYTE DskCur; /* Default drive number */ #endif #if C8_IDE extern char msgBuf[]; /* Message buffer */ #endif #if LIBMSDOS extern long libHTAddr; /* Offset of dictionary */ #endif #if SYMDEB extern FTYPE fSkipPublics; /* True if no public subsection */ extern FTYPE fSymdeb; /* True if /CODEVIEW */ extern FTYPE fCVpack; /* True if CV packing requested */ extern FTYPE fTextMoved; /* True if /DOSSEG & !/NONULLS */ extern int NullDelta; /* _TEXT was moved by so many bytes */ extern SEGTYPE segDebFirst; /* First debug segment */ extern SEGTYPE segDebLast; /* Last debug segment */ extern FTYPE fDebSeg; /* True if datarec from debug segment */ extern WORD ObjDebTotal; /* Total number of OBJ modules with debug info */ extern RBTYPE rhteDebSrc; /* Class "DEBSRC" virt addr */ extern RBTYPE rhteDebSym; /* Class "DEBSYM" virt addr */ extern RBTYPE rhteDebTyp; /* Class "DEBTYP" virt addr */ extern RBTYPE rhteTypes; extern RBTYPE rhteSymbols; extern RBTYPE rhte0Types; extern RBTYPE rhte0Symbols; #if OSEGEXE extern WORD cbImpSeg; /* Size of $$IMPORTS segment */ extern SNTYPE gsnImports; /* $$IMPORTS global segment number */ extern char bufExportsFileName[]; /* Name of exports file */ #endif #endif #if OSEGEXE extern SNTYPE gsnAppLoader; /* Aplication loader global segment number */ extern RBTYPE vpropAppLoader; /* Pointer to application loader name */ #if EXE386 extern DWORD hdrSize; /* Default size of .EXE header */ extern DWORD virtBase; /* Virtual base address of memory image */ extern DWORD cbEntTab; /* Count of bytes in Export Address Table */ extern DWORD cbAuxTab; /* Count of bytes in Auxiliary Data Table */ extern DWORD cbNamePtr; /* Count of bytes in Export Name Pointer Table */ extern DWORD cbOrdinal; /* Count of bytes in Export Ordinal Table */ extern DWORD cbExpName; /* Count of bytes in Export Name Table */ extern WORD cGateSel; /* Number of selectors required by call-gate exports */ extern DWORD cbImports; /* # bytes in Imported Names table */ extern DWORD cbImportsMod; /* # bytes in Imported Module Names table */ extern DWORD *mpsaVMArea; /* VM area for AREASA(sa) */ extern DWORD *mpsaBase; /* Base virtual address of memory object */ extern WORD cChainBuckets; /* Count of entry table chain buckets */ extern DWORD cbStack; /* Reserved size of stack in bytes */ extern DWORD cbStackCommit; /* Commited size of stack in bytes */ extern DWORD cbHeap; /* Reserved size of heap in bytes */ extern DWORD cbHeapCommit; /* Commited size of heap in bytes */ #else extern WORD cbEntTab; /* Count of bytes in Entry Table */ extern WORD cbImports; /* # bytes in Imported Names table */ extern WORD cbHeap; /* Size of heap in bytes */ extern WORD cbStack; /* Size of stack in bytes */ #endif extern WORD cFixupBuckets; /* Count of entry table buckets */ extern long chksum32; /* Long checksum */ extern WORD cMovableEntries;/* Count of movable entries */ #if EXE386 extern DWORD dfCode; /* Default code segment attributes */ extern DWORD dfData; /* Default data segment attributes */ #else extern WORD dfCode; /* Default code segment attributes */ extern WORD dfData; /* Default data segment attributes */ #endif extern WORD expMac; /* Count of exported names */ extern FTYPE fHeapMax; /* True if heap size = 64k - size of DGROUP */ extern FTYPE fRealMode; /* True if REALMODE specified */ extern FTYPE fStub; /* True if DOS3 stub given */ extern FTYPE fWarnFixup; /* True if /WARNFIXUP */ extern BYTE TargetOs; /* Target operating system */ #if EXE386 extern BYTE TargetSubsys; /* Target operating subsystem */ extern BYTE UserMajorVer; /* User program version */ extern BYTE UserMinorVer; /* User program version */ #endif extern BYTE ExeMajorVer; /* Executable major version number */ extern BYTE ExeMinorVer; /* Executable minor version number */ extern EPTYPE FAR * FAR *htsaraep; /* Hash SA:RA to entry point */ extern DWORD FAR *mpsacb; /* f(sa) = # bytes */ #if O68K extern DWORD *mpsadraDP; /* offset from start of segment to DP */ #endif extern DWORD FAR *mpsacbinit; /* f(sa) = # initialized bytes */ #if EXE386 extern DWORD *mpsacrlc; /* f(sa) = # relocations */ extern DWORD *mpsaflags; /* f(sa) = segment attributes */ extern WORD *mpextflags; /* f(glob. EXTDEF) = flags */ #else extern RLCHASH FAR * FAR *mpsaRlc; /* f(sa) = relocations hash vector */ extern WORD FAR *mpsaflags; /* f(sa) = segment attributes */ extern BYTE FAR *mpextflags; /* f(glob. EXTDEF) = flags */ #endif extern WORD raChksum; /* Offset for checksum */ extern RBTYPE rhteDeffile; /* Name of definitions file */ extern RBTYPE rhteModule; /* Name of module */ extern RBTYPE rhteStub; /* Name of DOS3 stub program */ extern WORD fileAlign; /* Segment alignment shift count */ #if EXE386 extern WORD pageAlign; /* Page alignment shift count */ extern WORD objAlign; /* Memory object alignment shift count */ #endif extern SATYPE saMac; /* Count of physical segments */ extern WORD vepMac; /* Count of entry point records */ #if EXE386 extern WORD vFlags; /* Image flags */ extern WORD dllFlags; /* DLL flags */ #else extern WORD vFlags; /* Program flags word */ #endif extern BYTE vFlagsOthers; /* Other program flags */ #endif /* OSEGEXE */ extern FTYPE fExePack; /* True if /EXEPACK */ #if PCODE extern FTYPE fMPC; extern FTYPE fIgnoreMpcRun; /* True if /PCODE:NOMPC */ #endif #if ODOS3EXE extern FTYPE fBinary; /* True if producing .COM file */ extern WORD cparMaxAlloc; /* Max # paragraphs to ask for */ extern WORD csegsAbs; /* Number of absolute segments */ extern WORD dosExtMode; /* DOS extender mode */ extern FTYPE fNoGrpAssoc; /* True if ignoring group association */ extern SEGTYPE segResLast; /* Number of highest resident segment */ extern WORD vchksum; /* DOS3 checksum word */ extern FTYPE vfDSAlloc; /* True if allocating DGROUP high */ #if FEXEPACK extern FRAMERLC FAR mpframeRlc[]; /* f(frame number) = run time relocs */ #endif #endif /* ODOS3EXE */ #if OVERLAYS extern FTYPE fOverlays; /* True if overlays specified */ extern FTYPE fOldOverlay; /* True if /OLDOVERLAY set */ extern FTYPE fDynamic; /* True if dynamic overlays */ extern SNTYPE gsnOvlData; /* Global SEGDEF of OVERLAY_DATA */ extern SNTYPE gsnOverlay; /* Global SEGDEF of OVERLAY_THUNKS */ extern SNTYPE FAR *htgsnosn; /* Hash(glob SEGDEF) = overlay segnum */ extern SNTYPE FAR *mposngsn; /* f(ovl segnum) = global SEGDEF */ extern IOVTYPE FAR *mpsegiov; /* f(seg number) = overlay number */ extern RUNRLC FAR *mpiovRlc; /* f(overlay number) = run time relocs */ extern ALIGNTYPE FAR *mpsegalign; /* f(seg number) = alignment type */ extern SNTYPE osnMac; /* Count of overlay segments */ extern BYTE vintno; /* Overlay interrupt number */ extern WORD iovFile; /* Overlay number of input file */ extern WORD iovMac; /* Count of overlays */ extern WORD ovlThunkMax; /* Number of thunks that will fit into thunk segment */ extern WORD ovlThunkMac; /* Current number of allocated thunks */ #else #define iovMac 0 #endif #if OIAPX286 extern long absAddr; /* Absolute program starting address */ extern FTYPE fPack; /* True if packing segments */ extern SATYPE *mpstsa; /* f(seg table number) = selector */ extern SATYPE stBias; /* Segment selector bias */ extern SATYPE stDataBias; /* Data segment selector bias */ extern SATYPE stLast; /* Last segment table entry */ extern WORD stMac; /* Count of seg table entries */ #if EXE386 extern WORD xevmod; /* Virtual module information */ extern RATYPE rbaseText; /* Text relocation factor */ extern RATYPE rbaseData; /* Data relocation factor */ extern FTYPE fPageswitch; /* True if -N given */ extern BYTE cblkPage; /* # 512-byte blocks in pagesize */ #endif #endif #if OIAPX286 OR ODOS3EXE extern GRTYPE *mpextggr; /* f(EXTDEF) = global GRPDEF */ extern long FAR *mpsegcb; /* f(segment number) = size in bytes */ extern BYTE FAR *mpsegFlags; /* f(segment number) = flags */ extern char *ompimisegDstIdata; /* pointer to LIDATA relocations */ #endif #if DOSEXTENDER AND NOT WIN_NT extern WORD cdecl _fDosExt; /* TRUE if running under DOS extender */ #endif #if OXOUT OR OIAPX286 extern FTYPE fIandD; /* True if "pure" (-i) */ extern FTYPE fLarge; /* True if FAR data */ extern FTYPE fLocals; /* True if including local symbols */ extern FTYPE fMedium; /* True if FAR code */ extern FTYPE fMixed; /* True if mixed model */ extern FTYPE fSymbol; /* True if including symbol table */ extern WORD xever; /* Xenix version number */ #endif #if WIN_3 #define fZ1 TRUE #else #if QCLINK extern FTYPE fZ1; #endif #endif #if QCLINK OR Z2_ON extern FTYPE fZ2; #endif #if ILINK extern FTYPE fZincr; extern FTYPE fQCIncremental; extern FTYPE fIncremental; extern WORD imodFile; extern WORD locMac; /* count of LPUBDEFs */ extern WORD imodCur; #endif extern WORD cbPadCode; /* code padding size */ extern WORD cbPadData; /* data padding size */ #if OEXE extern FTYPE fDOSExtended; extern FTYPE fNoNulls; /* True if /NONULLS given */ extern FTYPE fPackData; /* True if /PACKDATA given */ extern FTYPE fPackSet; /* True if /PACK or /NOPACK given */ extern FTYPE fSegOrder; /* True if special DOS seg order */ extern DWORD packLim; /* Code seg packing limit */ extern DWORD DataPackLim; /* Data seg packing limit */ #endif #if OSEGEXE AND ODOS3EXE extern FTYPE fOptimizeFixups;/* True if fixups optimization possible */ extern void (NEAR *pfProcFixup)(); #endif /* Ptr to FIXUPP processing routine */ extern RBTYPE mpggrrhte[]; /* f(global GRPDEF) = name */ #if FAR_SEG_TABLES extern SNTYPE FAR *mpseggsn; /* f(segment #) = global SEGDEF */ #else extern SNTYPE *mpseggsn; /* f(segment #) = global SEGDEF */ #endif extern FTYPE fNoEchoLrf; /* True if not echoing response file */ extern FTYPE fNoBanner; /* True if not displaing banner */ extern FTYPE BannerOnScreen; /* True if banner displayed */ #if CMDMSDOS extern BYTE bSep; /* Separator character */ extern BYTE chMaskSpace; /* Space mask character */ extern FTYPE fEsc; /* True if command line escaped */ extern FTYPE fStuffed; /* Put-back-character flag */ extern RBTYPE rgLibPath[]; /* Default library paths */ extern WORD cLibPaths; /* Count of library paths */ extern char CHSWITCH; /* Switch character */ #if OSMSDOS extern int (cdecl *pfPrompt)(unsigned char *sbNew, MSGTYPE msg, int msgparm, MSGTYPE pmt, int pmtparm); /* Pointer to prompt routine */ #endif #endif /* CMDMSDOS */ #if QBLIB extern FTYPE fQlib; /* True if generating Quick-library */ #else #define fQlib FALSE #endif extern char *lnknam; /* Name of linker */ #if NEWSYM extern long cbSymtab; /* # bytes in symbol table */ #endif /* NEWSYM */ extern void (*pfCputc)(int ch); /* Ptr to char output routine */ extern void (*pfCputs)(char *str); /* Ptr to string output routine */ #if NEWIO extern RBTYPE rbFilePrev; /* Pointer to previous file */ extern char mpifhfh[]; /* f(lib no.) = file handle */ #endif #if MSGMOD AND OSMSDOS #if defined(M_I386) OR defined( _WIN32 ) #define GetMsg(x) GET_MSG(x) #else extern char FAR * PASCAL __FMSG_TEXT ( unsigned ); /* Get a msg from the message segment */ extern char * GetMsg(unsigned short num); #define __NMSG_TEXT(x) GetMsg(x) #endif #endif #if MSGMOD AND OSXENIX #define __FMSG_TEXT __NMSG_TEXT #define GetMsg(x) __NMSG_TEXT(x) #endif #if NOT MSGMOD #define GetMsg(x) (x) #define __NMSG_TEXT(x) (x) #endif #define SEV_WARNING 0 #define SEV_ERROR 1 #define SEV_NOTIFICATION 2 /* Possible sev. of QW_ERROR message */ #if NEW_LIB_SEARCH extern void StoreUndef(APROPNAMEPTR, RBTYPE, RBTYPE, WORD); extern FTYPE fStoreUndefsInLookaside; #endif #if RGMI_IN_PLACE BYTE FAR * PchSegAddress(WORD cb, SEGTYPE seg, RATYPE ra); #endif #if ALIGN_REC extern BYTE *pbRec; // data for current record extern char recbuf[8192]; // record buffer... #endif //////////////// inline functions //////////////////// __inline void NEAR SkipBytes(WORD n) { #if ALIGN_REC pbRec += n; cbRec -= n; #elif WIN_NT WORD cbRead; SBTYPE skipBuf; cbRec -= n; // Update byte count while (n) // While there are bytes to skip { cbRead = n < sizeof(SBTYPE) ? n : sizeof(SBTYPE); if (fread(skipBuf, 1, cbRead, bsInput) != cbRead) InvalidObject(); n -= cbRead; } #else FILE *f = bsInput; if ((WORD)f->_cnt >= n) { f->_cnt -= n; f->_ptr += n; } else if(fseek(f,(long) n,1)) InvalidObject(); cbRec -= n; /* Update byte count */ #endif } #if ALIGN_REC __inline WORD NEAR Gets(void) { cbRec--; return *pbRec++; } #else __inline WORD NEAR Gets(void) { --cbRec; return(getc(bsInput)); } #endif __inline WORD NEAR GetIndex(WORD imin,WORD imax) { #if ALIGN_REC WORD w; if (*pbRec & 0x80) { w = (pbRec[0] & 0x7f) << 8 | pbRec[1]; pbRec += 2; cbRec -= 2; } else { w = *pbRec++; cbRec--; } if(w < imin || w > imax) InvalidObject(); return w; #else WORD index; FILE *f = bsInput; if (f->_cnt && (index = *(BYTE *)f->_ptr) < 0x80) { f->_cnt--; f->_ptr++; cbRec--; if(index < imin || index > imax) InvalidObject(); return(index); /* Return a good value */ } return GetIndexHard(imin, imax); #endif } #if ALIGN_REC __inline WORD NEAR WGets(void) { WORD w = getword(pbRec); pbRec += sizeof(WORD); cbRec -= sizeof(WORD); return w; } #else __inline WORD NEAR WGets(void) { FILE *f = bsInput; // NOTE: this code will only work on a Little Endian machine if (f->_cnt >= sizeof(WORD)) { WORD w = *(WORD *)(f->_ptr); f->_ptr += sizeof(WORD); f->_cnt -= sizeof(WORD); cbRec -= sizeof(WORD); return w; } else return WGetsHard(); } #endif __inline WORD NEAR WSGets(void) { cbRec -= 2; return (WORD)(getc(bsInput) | (getc(bsInput) << 8)); } __inline int Qwrite(char *pch, int cb, FILE *f) { if (f->_cnt >= cb) { memcpy(f->_ptr, pch, cb); f->_ptr += cb; f->_cnt -= cb; return cb; } return fwrite(pch, 1, cb, f); } #ifdef NEWSYM __inline void OutSb(BSTYPE f, BYTE *pb) { Qwrite(&pb[1],B2W(pb[0]),f); } #endif #if defined( M_I386 ) OR defined( _WIN32 ) extern void NoRoomForExe(void); #if DISPLAY_ON #pragma inline_depth(0) __inline void WriteExe(void FAR *pb, unsigned cb) { WORD i,iTotal=0,j=1; if (Qwrite((char *) pb, (int)cb, bsRunfile) != (int)cb) { NoRoomForExe(); } if(TurnDisplayOn) { fprintf( stdout,"\r\nOutVm : %lx bytes left\r\n", cb); for(i=0; i 16) j=1; } fprintf( stdout,"\r\n"); } } #pragma inline_depth() #else // DISPLAY NOT ON #define WriteExe(pb,cb) \ if (Qwrite((char *)(pb),(int)(cb),bsRunfile) != (int)(cb)) NoRoomForExe() #endif #endif #if ALIGN_REC __inline void GetBytes(BYTE *pb, WORD n) { if (n >= SBLEN || n > cbRec) InvalidObject(); memcpy(pb, pbRec, n); cbRec -= n; pbRec += n; } __inline DWORD LGets() { // NOTE: this code will only work on a Little-Endian machine DWORD dw = getdword(pbRec); pbRec += sizeof(dw); cbRec -= sizeof(dw); return dw; } __inline void GetBytesNoLim(BYTE *pb, WORD n) { if (n > cbRec) InvalidObject(); memcpy(pb, pbRec, n); pbRec += n; cbRec -= n; } #endif