cmdlnany.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,444 行 · 第 1/3 页

C
1,444
字号
/****************************************************************************
*
*                            Open Watcom Project
*
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
*  ========================================================================
*
*    This file contains Original Code and/or Modifications of Original
*    Code as defined in and that are subject to the Sybase Open Watcom
*    Public License version 1.0 (the 'License'). You may not use this file
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
*    provided with the Original Code and Modifications, and is also
*    available at www.sybase.com/developer/opensource.
*
*    The Original Code and all software distributed under the License are
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
*    NON-INFRINGEMENT. Please see the License for the specific language
*    governing rights and limitations under the License.
*
*  ========================================================================
*
* Description:  Platform independent command line processing.
*
****************************************************************************/


#include "plusplus.h"

#include "compcfg.h"

#include <ctype.h>
#include <unistd.h>
#include <fcntl.h>

#include "memmgr.h"
#include "errdefns.h"
#include "preproc.h"
#include "macro.h"
#include "cmdline.h"
#include "context.h"
#include "scan.h"
#include "iosupp.h"
#include "fname.h"
#include "unicode.h"
#include "cgdata.h"
#include "pcheader.h"
#include "hfile.h"
#include "codegen.h"
#include "cgback.h"
#include "pragdefn.h"
#include "pdefn2.h"
#include "initdefs.h"
#include "brinfo.h"

#include "cmdlnpr1.gh"
#include "cmdlnsys.h"


#define MAX_INDIRECTION                 5       // max. '@' indirections
static unsigned indirectionLevel;               // # '@' indirections

static void checkPacking( unsigned *p )
{
    *p = VerifyPackAmount( *p );
}

static void checkWarnLevel( unsigned *p )
{
    if( *p > 10 ) {
        *p = 10;
    }
}

static void checkPPWidth( unsigned *p )
{
    *p = PpVerifyWidth( *p );
}

static void checkTabWidth( unsigned *p )
{
    switch( *p ) {
    case 2:
    case 4:
    case 8:
        break;
    default:
        *p = DEF_TAB_WIDTH;
    }
}

static void checkOENumber( unsigned *p )
{
    p = p;
}

static void checkPrologSize( unsigned *p )
{
    *p += TARGET_UINT - 1;
    *p &= ~( TARGET_UINT - 1 );
}

static void checkErrorLimit( unsigned *p )
{
    p = p;
}

static int scanDefine( OPT_STRING **p )
{
    MEPTR cmdln_mac;

    p = p;
    cmdln_mac = DefineCmdLineMacro( CompFlags.extended_defines );
    if( cmdln_mac != NULL ) {
        cmdln_mac->macro_flags |= MACRO_USER_DEFINED;
    }
    return( 1 );
}

static int scanDefinePlus( OPT_STRING **p )
{
    MEPTR cmdln_mac;

    p = p;
    if( CmdScanSwEnd() ) {
        CompFlags.extended_defines = 1;
    } else {
        cmdln_mac = DefineCmdLineMacro( TRUE );
        if( cmdln_mac != NULL ) {
            cmdln_mac->macro_flags |= MACRO_USER_DEFINED;
        }
    }
    return( 1 );
}

static int scanUndefine( OPT_STRING **p )
{
    p = p;
    AddUndefName();
    return( 1 );
}

#ifdef OPT_BR
typedef enum                    // BROWSE KINDS
{   FBI_VAR          = 0x01     // - variables
,   FBI_TYPE         = 0x02     // - types
,   FBI_MEMB_DATA    = 0x04     // - member data
,   FBI_FUN          = 0x08     // - functions
,   FBI_MACRO        = 0x10     // - macros
// derived
,   FBI_DEFAULT_ON
        = FBI_VAR | FBI_TYPE | FBI_MEMB_DATA | FBI_FUN | FBI_MACRO
,   FBI_DEFAULT_OFF
        = FBI_VAR | FBI_TYPE | FBI_MEMB_DATA | FBI_FUN | FBI_MACRO
} FBI_KIND;

static int scanFBIopts          // SCAN FBI/FBX OPTIONS
    ( FBI_KIND* a_kind          // - addr[ option kinds ]
    , FBI_KIND def_kind )       // - default kind
{
    int retn;                   // - return: 1 ==> ok, 0 ==> error
    FBI_KIND kind;              // - options scanned

    kind = 0;
    CmdRecogEquals();
    for( ; ; ) {
        if( CmdScanSwEnd()
         || CmdPeekChar() == '-' ) {
            if( 0 == kind ) {
                kind = def_kind;
            }
            retn = 1;
            break;
        }
        switch( CmdScanChar() ) {
          case 'v' :
            kind |= FBI_VAR;
            continue;
          case 't' :
            kind |= FBI_TYPE;
            continue;
          case 'f' :
            kind |= FBI_FUN;
            continue;
          case 'm' :
            kind |= FBI_MEMB_DATA;
            continue;
          case 'p' :
            kind |= FBI_MACRO;
            continue;
          default :
            BadCmdLine( ERR_INVALID_OPTION );
            retn = 0;
            break;
        }
        break;
    }
    *a_kind = kind;
    return retn;
}

#endif

static int scanFBX( OPT_STRING **p )
{
#ifdef OPT_BR
    int retn;                   // - return: 1 ==> ok, 0 ==> error
    FBI_KIND options;           // - options scanned

    p = p;
    if( scanFBIopts( &options, FBI_DEFAULT_OFF ) ) {
        if( options & FBI_VAR ) {
            CompFlags.optbr_v = FALSE;
        }
        if( options & FBI_TYPE ) {
            CompFlags.optbr_t = FALSE;
        }
        if( options & FBI_MEMB_DATA ) {
            CompFlags.optbr_m = FALSE;
        }
        if( options & FBI_MACRO ) {
            CompFlags.optbr_p = FALSE;
        }
        if( options & FBI_FUN ) {
            CompFlags.optbr_f = FALSE;
        }
        retn = 1;
    } else {
        retn = 0;
    }
    return retn;
#else
    p = p;
    BadCmdLine( ERR_INVALID_OPTION );
    return 0;
#endif
}

static int scanFBI( OPT_STRING **p )
{
#ifdef OPT_BR
    int retn;                   // - return: 1 ==> ok, 0 ==> error
    FBI_KIND options;           // - options scanned

    p = p;
    if( scanFBIopts( &options, FBI_DEFAULT_ON ) ) {
        if( options & FBI_VAR ) {
            CompFlags.optbr_v = TRUE;
        }
        if( options & FBI_TYPE ) {
            CompFlags.optbr_t = TRUE;
        }
        if( options & FBI_MEMB_DATA ) {
            CompFlags.optbr_m = TRUE;
        }
        if( options & FBI_MACRO ) {
            CompFlags.optbr_p = TRUE;
        }
        if( options & FBI_FUN ) {
            CompFlags.optbr_f = TRUE;
        }
        retn = 1;
    } else {
        retn = 0;
    }
    return retn;
#else
    p = p;
    BadCmdLine( ERR_INVALID_OPTION );
    return 0;
#endif
}

int OPT_GET_LOWER( void )
{
    return( CmdScanLowerChar() );
}

int OPT_RECOG_LOWER( int c )
{
    return( CmdRecogLowerChar( c ) );
}

int OPT_RECOG( int c )
{
    return( CmdRecogChar( c ) );
}

void OPT_UNGET( void )
{
    CmdScanUngetChar();
}

int OPT_END( void )
{
    return( CmdDelimitChar() );
}

static int scanOffNumber( unsigned *pvalue )
{
    int number_scanned;
    unsigned value;
    int c;

    CmdRecogEquals();
    number_scanned = 0;
    value = 0;
    for(;;) {
        c = CmdScanLowerChar();
        if( ! isdigit( c ) ) {
            CmdScanUngetChar();
            break;
        }
        value *= 10;
        value += c - '0';
        number_scanned = 1;
    }
    if( number_scanned ) {
        *pvalue = value;
    }
    return( number_scanned );
}

int OPT_GET_NUMBER_DEFAULT( unsigned *p, unsigned default_value )
{
    unsigned value;

    if( scanOffNumber( &value ) ) {
        *p = value;
    } else {
        *p = default_value;
    }
    return( 1 );
}

int OPT_GET_NUMBER( unsigned *p )
{
    unsigned value;

    if( scanOffNumber( &value ) ) {
        *p = value;
        return( 1 );
    }
    BadCmdLine( ERR_INVALID_OPTION_NUMBER );
    return( 0 );
}

static void addNumber( OPT_NUMBER **h, unsigned number )
{
    OPT_NUMBER *value;

    value = CMemAlloc( sizeof( *value ) );
    value->number = number;
    value->next = *h;
    *h = value;
}

int OPT_GET_NUMBER_MULTIPLE( OPT_NUMBER **h )
{
    unsigned value;

    if( scanOffNumber( &value ) ) {
        addNumber( h, value );
        return( 1 );
    }
    BadCmdLine( ERR_INVALID_OPTION_NUMBER );
    return( 0 );
}

int OPT_GET_CHAR( int *p )
{
    int c;

    if( ! OPT_END() ) {
        CmdRecogEquals();
        if( ! OPT_END() ) {
            c = CmdScanChar();
            if( isprint( c ) ) {
                *p = c;
                return( 1 );
            }
        }
    }
    BadCmdLine( ERR_INVALID_OPTION );
    return( 0 );
}

static void addString( OPT_STRING **h, char const *s, size_t len )
{
    OPT_STRING *value;

    value = CMemAlloc( sizeof( *value ) + len );
    stvcpy( value->data, s, len );
    value->next = *h;
    *h = value;
}

static void stripQuotes( char *fname )
{
    char *s;
    char *d;

    if( *fname == '"' ) {
        // string will shrink so we can reduce in place
        d = fname;
        for( s = d + 1; *s && *s != '"'; ++s ) {
            // collapse double backslashes, only then look for escaped quotes
            if( s[0] == '\\' && s[1] == '\\' ) {
                ++s;
            } else if( s[0] == '\\' && s[1] == '"' ) {
                ++s;
            }
            *d++ = *s;
        }
        *d = '\0';
    }
}

static void OPT_CLEAN_STRING( OPT_STRING **h )
{
    OPT_STRING *s;

    while( *h ) {
        s = *h;
        *h = s->next;
        CMemFree( s );
    }
}

static void OPT_CLEAN_NUMBER( OPT_NUMBER **h )
{
    OPT_NUMBER *s;

    while( *h ) {
        s = *h;
        *h = s->next;
        CMemFree( s );
    }
}

static void reverseList( OPT_STRING **h )
{
    OPT_STRING *s;
    OPT_STRING *p;
    OPT_STRING *n;

    s = *h;
    *h = NULL;
    for( p = s; p != NULL; p = n ) {
        n = p->next;
        p->next = *h;
        *h = p;
    }
}

static char *reduceToOneString( OPT_STRING **h )
{
    OPT_STRING *s;
    char *p;

    s = *h;
    if( s != NULL ) {
        if( s->data[0] != '\0' ) {
            *h = s->next;
            OPT_CLEAN_STRING( h );
            p = (char*)s;
            strcpy( p, s->data );
        } else {
            OPT_CLEAN_STRING( h );
            p = NULL;
        }
    } else {
        p = NULL;
    }
    return( p );
}

char *SetStringOption( char **o, OPT_STRING **h )

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?