cmdos2.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,220 行 · 第 1/3 页
C
1,220 行
// in case someone wants internal relocs generated.
{
FmtData.u.os2.gen_int_relocs = TRUE;
return( TRUE );
}
extern bool ProcToggleRelocsFlag( void )
/***************************************/
// Rational wants internal relocs generated, but wants the "no internal relocs"
// flag set
{
FmtData.u.os2.toggle_relocs = TRUE;
return( TRUE );
}
extern bool ProcPENoRelocs( void )
/*********************************/
{
LinkState &= ~MAKE_RELOCS;
return( TRUE );
}
extern bool ProcNoStdCall( void )
/*******************************/
{
FmtData.u.pe.no_stdcall = TRUE;
return( TRUE );
}
extern bool ProcOS2( void )
/*************************/
// process the format os2 or format windows directives
//
{
Extension = E_LOAD;
while( ProcOne( SubFormats, SEP_NO, FALSE ) ) {} // NOTE NULL loop
if( FmtData.type & MK_WINDOWS ) {
if( ProcOne( WindowsFormatKeywords, SEP_NO, FALSE ) ) {
ProcOne( WindowsFormatKeywords, SEP_NO, FALSE );
}
} else if( FmtData.type & MK_WIN_VXD ) {
ProcOne( VXDFormatKeywords, SEP_NO, FALSE );
FmtData.dll = TRUE;
} else {
ProcOne( OS2FormatKeywords, SEP_NO, FALSE );
if( FmtData.type & MK_OS2_LX ) {
if( FmtData.dll ) {
FmtData.u.os2.gen_int_relocs = TRUE;
}
}
}
if( FmtData.type & MK_ONLY_OS2_16 ) { // if no 32-bit thing specd
HintFormat( MK_ONLY_OS2_16 ); // make sure 16-bit is what we get
if( FmtData.dll ) {
FmtData.u.os2.flags &= ~MULTIPLE_AUTO_DATA;
FmtData.u.os2.flags |= SINGLE_AUTO_DATA;
}
}
return( TRUE );
}
extern bool ProcPE( void )
/************************/
{
ProcOne( NTFormatKeywords, SEP_NO, FALSE );
FmtData.u.pe.heapcommit = 4*1024; // arbitrary non-zero default.
FmtData.u.pe.os2.heapsize = 8*1024; // another arbitrary non-zero default
FmtData.u.pe.stackcommit = PE_DEF_STACK_COMMIT;
FmtData.u.pe.os2.segment_shift = 9; // 512 byte arbitrary rounding
return( TRUE );
}
extern bool ProcVXD( void )
/************************/
{
return( ProcOS2() );
/*
ProcOne( VXDFormatKeywords, SEP_NO, FALSE );
FmtData.u.pe.heapcommit = 4*1024; // arbitrary non-zero default.
FmtData.u.pe.os2.heapsize = 8*1024; // another arbitrary non-zero default
FmtData.u.pe.stackcommit = PE_DEF_STACK_COMMIT;
return( TRUE );
*/
}
extern bool ProcWindows( void )
/*****************************/
{
return( ProcOS2() );
}
extern void ChkBase( offset align )
/*********************************/
// Note: align must be a power of 2
{
if( FmtData.objalign != NO_BASE_SPEC && FmtData.objalign > align ) {
align = FmtData.objalign;
}
if( FmtData.base != NO_BASE_SPEC &&
(FmtData.base & (align-1)) != 0 ) {
LnkMsg( LOC+LINE+WRN+MSG_OFFSET_MUST_BE_ALIGNED, "l", align );
FmtData.base = (FmtData.base + align-1) & ~(align-1);
}
}
extern void SetOS2Fmt()
/*********************/
// set up the structures needed to be able to process something in OS/2 mode.
{
if( LinkState & FMT_INITIALIZED ) return;
LinkState |= FMT_INITIALIZED;
FmtData.u.os2.flags = MULTIPLE_AUTO_DATA;
FmtData.u.os2.heapsize = 0;
FmtData.u.os2.segment_shift = 0;
FmtData.u.os2.res_module_name = NULL;
FmtData.u.os2.stub_file_name = NULL;
FmtData.u.os2.os2_seg_flags = NULL;
FmtData.u.os2.description = NULL;
FmtData.u.os2.exports = NULL;
FmtData.u.os2.old_lib_name = NULL;
if( FmtData.type & MK_WINDOWS ) {
FmtData.def_seg_flags |= SEG_PRELOAD;
}
Extension = E_LOAD;
ChkBase(64*1024);
}
extern void FreeOS2Fmt()
/**********************/
{
_LnkFree( FmtData.u.os2.stub_file_name );
_LnkFree( FmtData.u.os2.res_module_name );
_LnkFree( FmtData.u.os2.old_lib_name );
_LnkFree( FmtData.u.os2.description );
FreeImpNameTab();
FreeExportList();
FreeSegFlags( (seg_flags *) FmtData.u.os2.os2_seg_flags );
}
extern bool ProcLE( void )
/************************/
{
return( TRUE );
}
extern bool ProcLX( void )
/************************/
{
return( TRUE );
}
extern bool ProcOS2DLL( void )
/****************************/
{
FmtData.dll = TRUE;
Extension = E_DLL;
if( FmtData.type & MK_WINDOWS ) {
FmtData.u.os2.flags &= ~MULTIPLE_AUTO_DATA;
FmtData.u.os2.flags |= SINGLE_AUTO_DATA;
FmtData.def_seg_flags |= SEG_PURE | SEG_MOVABLE;
}
if( ProcOne( Init_Keywords, SEP_NO, FALSE ) ) {
if( !ProcOne( Term_Keywords, SEP_NO, FALSE ) ) {
if( FmtData.u.os2.flags & INIT_INSTANCE_FLAG ) {
FmtData.u.os2.flags |= TERM_INSTANCE_FLAG;
}
}
}
return( TRUE );
}
extern bool ProcPhysDevice( void )
/********************************/
{
FmtData.u.os2.flags |= PHYS_DEVICE;
return( TRUE );
}
extern bool ProcVirtDevice( void )
/********************************/
{
FmtData.u.os2.flags |= VIRT_DEVICE;
return( TRUE );
}
extern bool ProcPM( void )
/************************/
{
FmtData.u.os2.flags |= PM_APPLICATION;
return( TRUE );
}
extern bool ProcPMCompatible( void )
/**********************************/
{
FmtData.u.os2.flags |= PM_COMPATIBLE;
return( TRUE );
}
extern bool ProcPMFullscreen( void )
/**********************************/
{
FmtData.u.os2.flags |= PM_NOT_COMPATIBLE;
return( TRUE );
}
extern bool ProcMemory( void )
/****************************/
{
FmtData.u.os2.flags |= CLEAN_MEMORY;
return( TRUE );
}
extern bool ProcFont( void )
/**************************/
{
FmtData.u.os2.flags |= PROPORTIONAL_FONT;
return( TRUE );
}
extern bool ProcDynamicDriver( void )
/********************************/
{
FmtData.u.os2.flags |= VIRT_DEVICE;
return( TRUE );
}
extern bool ProcStaticDriver( void )
/********************************/
{
FmtData.u.os2.flags |= PHYS_DEVICE;
return( TRUE );
}
extern bool ProcInitGlobal( void )
/********************************/
{
FmtData.u.os2.flags &= ~INIT_INSTANCE_FLAG;
return( TRUE );
}
extern bool ProcInitInstance( void )
/**********************************/
{
FmtData.u.os2.flags |= INIT_INSTANCE_FLAG;
return( TRUE );
}
extern bool ProcInitThread( void )
/********************************/
{
FmtData.u.os2.flags |= INIT_THREAD_FLAG;
return( TRUE );
}
extern bool ProcTermGlobal( void )
/********************************/
{
FmtData.u.os2.flags &= ~TERM_INSTANCE_FLAG;
return( TRUE );
}
extern bool ProcTermInstance( void )
/**********************************/
{
FmtData.u.os2.flags |= TERM_INSTANCE_FLAG;
return( TRUE );
}
extern bool ProcTermThread( void )
/********************************/
{
FmtData.u.os2.flags |= TERM_THREAD_FLAG;
return( TRUE );
}
static bool getsegflags( void )
/*****************************/
{
os2_seg_flags * entry;
Token.thumb = REJECT;
_ChkAlloc( entry, sizeof( os2_seg_flags ) );
entry->specified = 0;
entry->flags = FmtData.def_seg_flags; // default value.
entry->name = NULL;
entry->type = SEGFLAG_SEGMENT;
entry->next = FmtData.u.os2.os2_seg_flags;
FmtData.u.os2.os2_seg_flags = entry;
ProcOne( SegDesc, SEP_NO, FALSE ); // look for an optional segdesc
if( entry->type != SEGFLAG_CODE && entry->type != SEGFLAG_DATA ) {
if( !GetToken( SEP_NO, TOK_INCLUDE_DOT ) ) {
FmtData.u.os2.os2_seg_flags = entry->next;
_LnkFree( entry );
return( FALSE );
}
entry->name = tostring();
}
while( ProcOne( SegModel, SEP_NO, FALSE ) ) {}
return( TRUE );
}
extern bool ProcOS2Class( void )
/******************************/
{
FmtData.u.os2.os2_seg_flags->type = SEGFLAG_CLASS;
return( TRUE );
}
extern bool ProcSegType( void )
/*****************************/
{
if( !ProcOne( SegTypeDesc, SEP_NO, FALSE ) ) {
LnkMsg( LOC+LINE+WRN+MSG_INVALID_TYPE_DESC, NULL );
}
return( TRUE );
}
extern bool ProcSegCode( void )
/*****************************/
{
FmtData.u.os2.os2_seg_flags->type = SEGFLAG_CODE;
return( TRUE );
}
extern bool ProcSegData( void )
/*****************************/
{
FmtData.u.os2.os2_seg_flags->type = SEGFLAG_DATA;
return( TRUE );
}
extern bool ProcPreload( void )
/*****************************/
{
if( FmtData.u.os2.os2_seg_flags->specified & SEG_PRELOAD ) {
LnkMsg( LOC+LINE+WRN+MSG_SEG_FLAG_MULT_DEFD, NULL );
}
FmtData.u.os2.os2_seg_flags->flags |= SEG_PRELOAD;
FmtData.u.os2.os2_seg_flags->specified |= SEG_PRELOAD;
return( TRUE );
}
extern bool ProcLoadoncall( void )
/********************************/
{
if( FmtData.u.os2.os2_seg_flags->specified & SEG_PRELOAD ) {
LnkMsg( LOC+LINE+WRN+MSG_SEG_FLAG_MULT_DEFD, NULL );
}
FmtData.u.os2.os2_seg_flags->flags &= ~SEG_PRELOAD;
FmtData.u.os2.os2_seg_flags->specified |= SEG_PRELOAD;
return( TRUE );
}
extern bool ProcIopl( void )
/**************************/
{
if( FmtData.u.os2.os2_seg_flags->specified & SEG_IOPL_SPECD ) {
LnkMsg( LOC+LINE+WRN+MSG_SEG_FLAG_MULT_DEFD, NULL );
}
FmtData.u.os2.os2_seg_flags->flags &= ~SEG_LEVEL_3;
FmtData.u.os2.os2_seg_flags->flags |= SEG_LEVEL_2;
FmtData.u.os2.os2_seg_flags->specified |= SEG_IOPL_SPECD;
return( TRUE );
}
extern bool ProcNoIopl( void )
/****************************/
{
if( FmtData.u.os2.os2_seg_flags->specified & SEG_IOPL_SPECD ) {
LnkMsg( LOC+LINE+WRN+MSG_SEG_FLAG_MULT_DEFD, NULL );
}
FmtData.u.os2.os2_seg_flags->flags |= SEG_LEVEL_3;
FmtData.u.os2.os2_seg_flags->specified |= SEG_IOPL_SPECD;
return( TRUE );
}
extern bool ProcExecuteonly( void )
/*********************************/
{
if( FmtData.u.os2.os2_seg_flags->specified & SEG_RFLAG ) {
LnkMsg( LOC+LINE+WRN+MSG_SEG_FLAG_MULT_DEFD, NULL );
}
FmtData.u.os2.os2_seg_flags->flags |= SEG_READ_ONLY;
FmtData.u.os2.os2_seg_flags->specified |= SEG_READ_ONLY;
return( TRUE );
}
extern bool ProcExecuteread( void )
/*********************************/
{
if( FmtData.u.os2.os2_seg_flags->specified & SEG_RFLAG ) {
LnkMsg( LOC+LINE+WRN+MSG_SEG_FLAG_MULT_DEFD, NULL );
}
FmtData.u.os2.os2_seg_flags->flags &= ~SEG_READ_ONLY;
FmtData.u.os2.os2_seg_flags->specified |= SEG_READ_ONLY;
return( TRUE );
}
extern bool ProcReadOnly( void )
/******************************/
{
if( FmtData.u.os2.os2_seg_flags->specified & SEG_RFLAG ) {
LnkMsg( LOC+LINE+WRN+MSG_SEG_FLAG_MULT_DEFD, NULL );
}
FmtData.u.os2.os2_seg_flags->flags |= SEG_READ_ONLY;
FmtData.u.os2.os2_seg_flags->specified |= SEG_READ_SPECD;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?