⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cscan.c

📁 Open Watcom 的 C 编译器源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
            if( Constant <= 0x7FFFFFFFul ) {     /* 13-sep-89 */
                ConstType = TYPE_LONG;
            }else{
                ConstType = TYPE_ULONG;
            }
            break;
        case SUFF_U:
            ConstType = TYPE_UINT;
#if TARGET_INT < TARGET_LONG
            if( Constant > TARGET_UINT_MAX ) {
                ConstType = TYPE_ULONG;
            }
#endif
            break;
        case SUFF_UL:
            ConstType = TYPE_ULONG;
            break;
        default:
            break;
        }
    }else{
        switch( con.suffix ){
        case SUFF_NONE:
            ConstType = TYPE_LONG64;
            if( Const64.u._32[I64HI32] & 0x80000000 ){
                ConstType = TYPE_ULONG64;
            }
            break;
        case SUFF_L:
        case SUFF_LL:
            if( ov == CNV_32 ) {
                U32ToU64( Constant, &Const64 );
            }
            if( Const64.u._32[I64HI32] & 0x80000000 ){
                ConstType = TYPE_ULONG64;
            }else{
                ConstType = TYPE_LONG64;
            }
            break;
        case SUFF_U:
        case SUFF_UL:
        case SUFF_ULL:
            if( ov == CNV_32 ) {
                U32ToU64( Constant, &Const64 );
            }
            ConstType = TYPE_ULONG64;
            break;
        default:
            break;
        }
    }
    if( CompFlags.pre_processing && (CharSet[c] & (C_AL | C_DI)) ) {
        for(;;) {
            c = SaveNextChar();
            if( (CharSet[c] & (C_AL | C_DI)) == 0 ) break;
        }
        --TokenLen;
        Buffer[TokenLen] = '\0';
        BadTokenInfo = bad_token_type;
        return( T_BAD_TOKEN );
    } else {
        if( ov == CNV_OVR ) {
            BadTokenInfo = ERR_CONSTANT_TOO_BIG;
            if( NestLevel == SkipLevel ) {      /* 10-sep-92 */
                CWarn1( WARN_CONSTANT_TOO_BIG, ERR_CONSTANT_TOO_BIG );
            }
        }
        --TokenLen;
        Buffer[TokenLen] = '\0';
        return( T_CONSTANT );
    }
}

int ScanQuestionMark()
{
    NextChar();
    Buffer[0] = '?';
    Buffer[1] = '\0';
    return( T_QUESTION );
}

int ScanSlash()
{
    int         c;
    int         tok;

    c = NextChar();         // can't inline this copy of NextChar
    if( c == '=' ) {         /* if second char is an = */
        NextChar();
        Buffer[0] = '/';
        Buffer[1] = '=';
        Buffer[2] = '\0';
        tok = T_DIVIDE_EQUAL;
    } else if( c == '/' &&   /* if C++ // style comment */
                ! CompFlags.strict_ANSI ) {     /* 13-nov-94 */
        CppComment( '/' );
        CompFlags.scanning_cpp_comment = 1;
        for(;;) {
            c = CurrChar;
            NextChar();
            if( CurrChar == EOF_CHAR ) break;   /* 06-mar-91 AFS */
            if( CurrChar == '\0' ) break;   /* 06-mar-91 AFS */
            /* swallow up the next line if this one ends with \ */
            /* some editors don't put linefeeds on end of lines */
            if( CurrChar == '\n'  ||  c == '\r' )break;
            if( CompFlags.cpp_output && CompFlags.keep_comments ) {
                if( CurrChar != '\r' ) PrtChar( CurrChar );
            }
        }
        CppComment( 0 );
        CompFlags.scanning_cpp_comment = 0;
        Buffer[0] = ' ';
        Buffer[1] = '\0';
        tok = T_WHITE_SPACE;
    } else if( c == '*' ) {
        ScanComment();
        Buffer[0] = ' ';
        Buffer[1] = '\0';
        tok = T_WHITE_SPACE;
    } else {
        Buffer[0] = '/';
        Buffer[1] = '\0';
        tok = T_DIVIDE;
    }
    return( tok );
}

int ScanDelim1()
{
    int         token;
    int         c;

    Buffer[0] = CurrChar;
    Buffer[1] = '\0';
    token = TokValue[ CurrChar - ' ' ];
    c = *ScanCharPtr++;
    if( CharSet[c] & C_EX ) {
        c = GetCharCheck( c );
    }
    CurrChar = c;
    return( token );
}

int ScanMinus()
{
    int         chr2;
    int         tok;

    Buffer[0] = '-';
    chr2 = NextChar();          // can't inline this copy of NextChar
    Buffer[1] = chr2;
    if( chr2 == '>' ) {
        tok = T_ARROW;
        Buffer[2] = '\0';
        NextChar();
    } else if( chr2 == '=' ) {
        tok = T_MINUS_EQUAL;
        Buffer[2] = '\0';
        NextChar();
    } else if( chr2 == '-' ) {
        tok = T_MINUS_MINUS;
        Buffer[2] = '\0';
        NextChar();
    } else {
        Buffer[1] = '\0';
        tok = T_MINUS;
    }
    return( tok );
}

int ScanEqual()
{
    Buffer[0] = '=';
    if( NextChar() == '=' ) {
        NextChar();
        Buffer[1] = '=';
        Buffer[2] = '\0';
        return( T_EQ );
    } else {
        Buffer[1] = '\0';
        return( T_EQUAL );
    }
}

int ScanStar()
{
    Buffer[0] = '*';
    if( NextChar() == '=' ) {
        NextChar();
        Buffer[1] = '=';
        Buffer[2] = '\0';
        return( T_TIMES_EQUAL );
    } else {
        Buffer[1] = '\0';
        return( T_TIMES );
    }
}

int ScanColon()
{
    int         chr2;

    Buffer[0] = ':';
    chr2 = NextChar();
    if( chr2 == '>' ) {
        NextChar();
        Buffer[1] = '>';
        Buffer[2] = '\0';
        return( T_SEG_OP );
#if _CPU == 370
    } else if( chr2 == ')' ) {
        NextChar();
        Buffer[1] = ')';
        Buffer[2] = '\0';
        return( T_RIGHT_BRACKET );
#endif
    } else {
        Buffer[1] = '\0';
        return( T_COLON );
    }
}

int ScanDelim2()
{
    int         c;
    int         chr2;
    int         tok;
    unsigned char chrclass;

    c = CurrChar;
    Buffer[0] = c;
    Buffer[1] = '\0';
    chrclass = TokValue[ c - ' ' ];
    tok = chrclass & C_MASK;
    chr2 = NextChar();          // can't inline this copy of NextChar
    if( chr2 == '=' ) {         /* if second char is an = */
        if( chrclass & EQ ) {   /* and = is valid second char */
            ++tok;
            NextChar();
            Buffer[1] = '=';
            Buffer[2] = '\0';
        }
    } else if( chr2 == c ) {    /* if second char is same as first */
        if( chrclass & DUP ) {  /* and duplicate is valid */
            tok += 2;
            Buffer[1] = c;
            Buffer[2] = '\0';
            if( NextChar() == '=' ) {
                if( tok == T_LSHIFT  ||  tok == T_RSHIFT ) {
                    ++tok;
                    NextChar();
                    Buffer[2] = '=';
                    Buffer[3] = '\0';
                }
            }
        }
#if _CPU == 370
    } else if( c == '('  &&  chr2 == ':' ) {
        tok = T_LEFT_BRACKET;
        NextChar();
        Buffer[1] = ':';
        Buffer[2] = '\0';
#endif
    }
    return( tok );
}

static void ScanComment( void )
{
    int         c;
    int         prev_char;
    unsigned    start_line;
    char        *scanptr;

    CompFlags.scanning_comment = 1;
    if( CompFlags.cpp_output ) {        // 30-dec-93
        CppComment( '*' );
        c = NextChar();
        for( ;; ) {
            if( c == '*' ){
                c = NextChar();
                if( c == '/' )break;
                if( CompFlags.keep_comments ) {
                    PrtChar( '*' );
                }
                continue; //could be **/
            }
            if( c == EOF_CHAR ) {
                CppComment( 0 );
                return;
            }
            if( c == '\n' ) {
                PrtChar( c );
            } else if( c != '\r' && CompFlags.keep_comments ) {
                PrtChar( c );
            }
            c = NextChar();
        }
        CppComment( 0 );
    } else {
        start_line = TokenLine;
        // make '/' a special character so that we only have to do one test
        // for each character inside the main loop
        CharSet['/'] |= C_EX;           // make '/' special character
        c = '\0';
        for(;;) {
            scanptr = ScanCharPtr;
            for(;;) {
                prev_char = c;
                c = *scanptr++;
                if( CharSet[c] & C_EX ) break;
                prev_char = c;
                c = *scanptr++;
                if( CharSet[c] & C_EX ) break;
                prev_char = c;
                c = *scanptr++;
                if( CharSet[c] & C_EX ) break;
                prev_char = c;
                c = *scanptr++;
                if( CharSet[c] & C_EX ) break;
                prev_char = c;
                c = *scanptr++;
                if( CharSet[c] & C_EX ) break;
                prev_char = c;
                c = *scanptr++;
                if( CharSet[c] & C_EX ) break;
                prev_char = c;
                c = *scanptr++;
                if( CharSet[c] & C_EX ) break;
                prev_char = c;
                c = *scanptr++;
                if( CharSet[c] & C_EX ) break;
            }
            ScanCharPtr = scanptr;
            if( c != '/' ) {
                c = GetCharCheck( c );
                if( c == EOF_CHAR )  return;
            }
            if( c == '/' ) {
                if( prev_char == '*' )  break;
                // get next character and see if it is '*' for nested comment
                c = NextChar();
                if( c == '*' ) {
                    c = NextChar();
                    if( c == '/' ) break;       /* 19-oct-94 */
                    TokenLine = SrcFileLineNum;
                    CWarn2( WARN_NESTED_COMMENT,
                            ERR_NESTED_COMMENT, start_line );
                }
            }
            // NextChar might not be pointing to GetNextChar at this point
            while( NextChar != GetNextChar ) {
                c = NextChar();
                if( c == EOF_CHAR )  return;
            }
        }
        CharSet['/'] &= ~C_EX;          // undo '/' special character
    }
    CompFlags.scanning_comment = 0;
    NextChar();
}

static int CharConst( int char_type )
{
    int         c;
    int         i;
    int         n;
    int         token;
    long        value;
    char        error;

    c = SaveNextChar();
    if( c == '\'' ) {                           /* 05-jan-95 */
        NextChar();
        Buffer[TokenLen] = '\0';
        BadTokenInfo = ERR_INV_CHAR_CONSTANT;
        return( T_BAD_TOKEN );
    }
    BadTokenInfo = 0;
    token = T_CONSTANT;
    i = 0;
    value = 0;
    error = 0;
    for( ;; ) {
        if( c == '\r'  ||  c == '\n' ) {
            token = T_BAD_TOKEN;
            break;
        }
        if( c == '\\' ) {
            c = SaveNextChar();
            if( c >= '0'  &&  c <= '7' ) {              /* 09-jan-94 */
                n = c - '0';
                c = SaveNextChar();
                if( c >= '0'  &&  c <= '7' ) {
                    n = n * 8 + c - '0';
                    c = SaveNextChar();
                    if( c >= '0'  &&  c <= '7' ) {
                        n = n * 8 + c - '0';
                        SaveNextChar();
                        if( n > 0377  &&  char_type != TYPE_WCHAR ) {
                            BadTokenInfo = ERR_CONSTANT_TOO_BIG;
                            if( NestLevel == SkipLevel ) {
                                CWarn1( WARN_CONSTANT_TOO_BIG,
                                        ERR_CONSTANT_TOO_BIG );
                            }
                            n &= 0377;          // mask off high bits
                        }
                    }
                }
                c = n;
            } else {
                c = ESCChar( c, NULL, &error );
            }
            if( char_type == TYPE_WCHAR ) {     /* 02-aug-91 */
                ++i;
                value = (value << 8) + ((c & 0xFF00) >> 8);
                c &= 0x00FF;
            }
        } else {
            if( CharSet[c] & C_DB ) {   /* if double-byte char */
                c = (c << 8) + (SaveNextChar() & 0x00FF);
                if( char_type == TYPE_WCHAR ) { /* 15-jun-93 */
                    if( CompFlags.jis_to_unicode ) {
                        c = JIS2Unicode( c );
                    }
                }
                ++i;
                value = (value << 8) + ((c & 0xFF00) >> 8);
                c &= 0x00FF;
            } else if( char_type == TYPE_WCHAR ) {/* 02-aug-91 */
                if( CompFlags.use_unicode ) {
                    c = UniCode[ c ];
                } else if( CompFlags.jis_to_unicode ) {
                    c = JIS2Unicode( c );
                }
                ++i;
                value = (value << 8) + ((c & 0xFF00) >> 8);
                c &= 0x00FF;
            } else {
                _ASCIIOUT( c );
            }
            SaveNextChar();
        }
        ++i;
        value = (value << 8) + c;
        /* handle case where user wants a \ but doesn't escape it */
        if( c == '\'' && CurrChar != '\'' ) {
            if( ! CompFlags.cpp_output ) {      /* 08-feb-93 */
                token = T_BAD_TOKEN;
                break;
            }
        }
        c = CurrChar;
        if( c == '\'' ) break;
        if( i >= 4 ) {
            if( ! CompFlags.cpp_output ) {      /* 08-feb-93 */
                token = T_BAD_TOKEN;
                break;
            }
        }
    }

⌨️ 快捷键说明

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