1308 lines
51 KiB
C
1308 lines
51 KiB
C
/*
|
|
* Copyright Microsoft Corporation, 1987
|
|
*
|
|
* This Module contains Proprietary Information of Microsoft
|
|
* Corporation and should be treated as Confidential.
|
|
*/
|
|
/*
|
|
* EXTERN.H: external declarations
|
|
*/
|
|
|
|
|
|
#include <malloc.h>
|
|
#include <memory.h>
|
|
#if NOT OSXENIX
|
|
#include <io.h>
|
|
#include <stdlib.h>
|
|
#endif
|
|
#include <string.h>
|
|
#include <search.h>
|
|
|
|
#ifdef _MBCS
|
|
#define _CRTVAR1
|
|
#include <mbctype.h>
|
|
#include <mbstring.h>
|
|
#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<cb; i++)
|
|
{
|
|
if(j==1)
|
|
{
|
|
fprintf( stdout,"\r\n\t%04X\t",iTotal);
|
|
}
|
|
|
|
fprintf( stdout,"%02X ",*((char*)pb+i));
|
|
iTotal++;
|
|
if(++j > 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
|