Ejemplo n.º 1
0
local void GrabTokens( int parm_cnt, struct macro_parm *formal_parms, const char *mac_name, source_loc *loc )
{
    MEPTR       mentry;
    int         i;
    int         j;
    TOKEN       prev_token;
    int         prev_non_ws_token;
    unsigned    mlen;
    macro_flags mflags;
    TOKEN       *p_token;

    mentry = CreateMEntry( mac_name );
    mflags = MFLAG_USER_DEFINED;
    if( parm_cnt < 0 ) {
        mflags |= MFLAG_VAR_ARGS;
        parm_cnt = -parm_cnt;
    }
    mentry->parm_count = parm_cnt;
    mentry->src_loc.fno = loc->fno;
    mentry->src_loc.line = loc->line;
    mlen = mentry->macro_len;
    mentry->macro_defn = mlen;
    MacroOverflow( mlen, 0 );
    MacroCopy( mentry, MacroOffset, mlen );
    prev_token = T_NULL;
    prev_non_ws_token = T_NULL;
    if( CurToken != T_NULL ) {
        do {
            CurToken = ScanToken();
        } while( CurToken == T_WHITE_SPACE );
        if( CurToken == T_SHARP_SHARP ) {
            CErr1( ERR_MISPLACED_SHARP_SHARP );
            PPNextToken();
        }
    }
    for( ;; ) {
        i = 0;
        if( ( CurToken == T_STRING ) && CompFlags.wide_char_string ) {
            CurToken = T_LSTRING;                   /* 15-may-92 */
        }
        p_token = (TOKEN *)&TokenBuf[ i ];
        *p_token = CurToken;
        i += sizeof( TOKEN );
        if( CurToken == T_NULL )
            break;
        if( CurToken == T_EOF )
            break;
        switch( CurToken ) {
        case T_SHARP:
            /* if it is a function-like macro definition */
            if( parm_cnt != 0 ) {
                *p_token = T_MACRO_SHARP;
                CurToken = T_MACRO_SHARP;           /* 26-mar-91 */
            }
            break;
        case T_SHARP_SHARP:
            *p_token = T_MACRO_SHARP_SHARP;
            break;
        case T_WHITE_SPACE:
            if( prev_token == T_WHITE_SPACE )
                i -= sizeof( TOKEN );
            break;
        case T_ID:
            j = FormalParm( formal_parms );
            if( j != 0 ) {
                if( (mflags & MFLAG_VAR_ARGS) && (j == parm_cnt - 1) )
                    CurToken = T_MACRO_VAR_PARM;
                else
                    CurToken = T_MACRO_PARM;
                *p_token = CurToken;
                TokenBuf[ i ] = j - 1;
                ++i;
            } else {
                j = 0;
                while( (TokenBuf[ i++ ] = Buffer[ j++ ]) != '\0' )
                    ;   /*empty*/
            }
            break;
        case T_BAD_CHAR:
            TokenBuf[ i++ ] = Buffer[ 0 ];
            if( Buffer[ 1 ] != '\0' ) {
                *(TOKEN *)&TokenBuf[ i ] = T_WHITE_SPACE;
                i += sizeof( TOKEN );
            }
            break;
        case T_CONSTANT:
        case T_STRING:
        case T_LSTRING:
        case T_BAD_TOKEN:
        case T_PPNUMBER:
            j = 0;
            while( (TokenBuf[ i++ ] = Buffer[ j++ ]) != '\0' )
                ;   /* empty */
            break;
        default:
            break;
        }
        if( CurToken != T_WHITE_SPACE ) {
            if( prev_non_ws_token == T_MACRO_SHARP &&       /* 26-mar-91 */
                CurToken != T_MACRO_PARM &&
                CurToken != T_MACRO_VAR_PARM ) {
                CErr1( ERR_MUST_BE_MACRO_PARM );
                prev_token = *(TOKEN *)TokenBuf;
                *(TOKEN *)TokenBuf = T_SHARP;               /* 17-jul-92 */
                MacroCopy( TokenBuf, MacroOffset + mlen - sizeof( TOKEN ), sizeof( TOKEN ) );
                *(TOKEN *)TokenBuf = prev_token;
            }
            prev_non_ws_token = CurToken;
        }
        prev_token = CurToken;
        CurToken = ScanToken();
        MacroOverflow( mlen + i, mlen );
        MacroCopy( TokenBuf, MacroOffset + mlen, i );
        mlen += i;
    }
    if( prev_non_ws_token == T_MACRO_SHARP ) {
        CErr1( ERR_MUST_BE_MACRO_PARM );
    }
    if( prev_token == T_WHITE_SPACE ) {
        mlen -= sizeof( TOKEN );
    }
    MacroOverflow( mlen + sizeof( TOKEN ), mlen );
    *(TOKEN *)(MacroOffset + mlen) = T_NULL;
    mlen += sizeof( TOKEN );
    if( prev_non_ws_token == T_SHARP_SHARP ) {
        CErr1( ERR_MISPLACED_SHARP_SHARP );
    }
    mentry->macro_len = mlen;
    MacLkAdd( mentry, mlen, mflags );
    FreeMEntry( mentry );
    MacroSize += mlen;
}
Ejemplo n.º 2
0
static char *Def_Macro_Tokens( const char *str, bool multiple_tokens, macro_flags mflags )
{
    size_t      len;
    MEPTR       mentry;

    len = get_namelen( str );
    if( len == 0 ) {
        CErr1( ERR_NO_MACRO_ID_COMMAND_LINE );
        return( (char *)str );
    }
    mentry = CreateMEntry( str, len );
    str += len;
    len = 0;
    if( !EqualChar( *str ) ) {
        MTOK( TokenBuf + len ) = T_PPNUMBER;
        MTOKINC( len );
        TokenBuf[len++] = '1';
        TokenBuf[len++] = '\0';
    } else {
        bool ppscan_mode;

        ppscan_mode = InitPPScan();
        ReScanInit( ++str );
        for( ; *str != '\0'; ) {
            ReScanToken();
            if( ReScanPos() == str )
                break;
            if( CurToken == T_WHITE_SPACE )
                break;
            if( CurToken == T_BAD_CHAR && !multiple_tokens )
                break;
            MTOK( TokenBuf + len ) = CurToken;
            MTOKINC( len );
            switch( CurToken ) {
            case T_BAD_CHAR:
                TokenBuf[len++] = Buffer[0];
                break;
            case T_CONSTANT:
            case T_PPNUMBER:
            case T_ID:
            case T_LSTRING:
            case T_STRING:
                memcpy( &TokenBuf[len], &Buffer[0], TokenLen + 1 );
                len += TokenLen + 1;
                break;
            default:
                break;
            }
            str = ReScanPos();
            if( !multiple_tokens ) {
                break;
            }
        }
        FiniPPScan( ppscan_mode );
    }
    MTOK( TokenBuf + len ) = T_NULL;
    MTOKINC( len );
    if( CMPLIT( mentry->macro_name, "defined" ) != 0 ) {
        MacroAdd( mentry, TokenBuf, len, mflags );
    } else {
        CErr1( ERR_CANT_DEFINE_DEFINED );
    }
    FreeMEntry( mentry );
    return( (char *)str );
}
Ejemplo n.º 3
0
static void GrabTokens( mac_parm_count parm_count, macro_flags mflags, MPPTR formal_parms, const char *mac_name, source_loc *loc )
{
    MEPTR           mentry;
    size_t          len;
    TOKEN           prev_token;
    TOKEN           prev_non_ws_token;
    size_t          mlen;
    mac_parm_count  parmno;

    mentry = CreateMEntry( mac_name, strlen( mac_name ) );
    mentry->parm_count = parm_count;
    mentry->src_loc.fno = loc->fno;
    mentry->src_loc.line = loc->line;
    mlen = mentry->macro_len;
    mentry->macro_defn = mlen;
    MacroOverflow( mlen, 0 );
    MacroCopy( mentry, MacroOffset, mlen );
    prev_token = T_NULL;
    prev_non_ws_token = T_NULL;
    if( CurToken != T_NULL ) {
        do {
            CurToken = ScanToken();
        } while( CurToken == T_WHITE_SPACE );
        if( CurToken == T_SHARP_SHARP ) {
            CErr1( ERR_MISPLACED_SHARP_SHARP );
            PPNextToken();
        }
    }
    for( ; CurToken != T_NULL && CurToken != T_EOF ; ) {
        MTOK( TokenBuf ) = CurToken;
        len = sizeof( TOKEN );
        switch( CurToken ) {
        case T_SHARP:
            /* if it is a function-like macro definition */
            if( parm_count != 0 ) {
                CurToken = T_MACRO_SHARP;
                MTOK( TokenBuf ) = CurToken;
            }
            break;
        case T_SHARP_SHARP:
            MTOK( TokenBuf ) = T_MACRO_SHARP_SHARP;
            break;
        case T_WHITE_SPACE:
            if( prev_token == T_WHITE_SPACE )
                MTOKDEC( len );
            break;
        case T_ID:
            parmno = FormalParm( formal_parms );
            if( parmno != 0 ) {
                if( (mflags & MFLAG_VAR_ARGS) && (parmno == parm_count - 1) ) {
                    CurToken = T_MACRO_VAR_PARM;
                } else {
                    CurToken = T_MACRO_PARM;
                }
                MTOK( TokenBuf ) = CurToken;
                MTOKPARM( TokenBuf + len ) = parmno - 1;
                MTOKPARMINC( len );
            } else {
                memcpy( TokenBuf + len, Buffer, TokenLen + 1 );
                len += TokenLen + 1;
            }
            break;
        case T_BAD_CHAR:
            TokenBuf[len++] = Buffer[0];
            if( Buffer[1] != '\0' ) {
                MTOK( TokenBuf + len ) = T_WHITE_SPACE;
                MTOKINC( len );
            }
            break;
        case T_STRING:
            if( CompFlags.wide_char_string ) {
                CurToken = T_LSTRING;
                MTOK( TokenBuf ) = CurToken;
            }
            /* fall through */
        case T_CONSTANT:
        case T_LSTRING:
        case T_BAD_TOKEN:
        case T_PPNUMBER:
            memcpy( TokenBuf + len, Buffer, TokenLen + 1 );
            len += TokenLen + 1;
            break;
        default:
            break;
        }
        if( CurToken != T_WHITE_SPACE ) {
            if( prev_non_ws_token == T_MACRO_SHARP
              && CurToken != T_MACRO_PARM && CurToken != T_MACRO_VAR_PARM ) {
                CErr1( ERR_MUST_BE_MACRO_PARM );
                MTOK( MacroOffset + mlen - sizeof( TOKEN ) ) = T_SHARP;
            }
            prev_non_ws_token = CurToken;
        }
        prev_token = CurToken;
        CurToken = ScanToken();
        MacroOverflow( mlen + len, mlen );
        MacroCopy( TokenBuf, MacroOffset + mlen, len );
        mlen += len;
    }
    if( prev_non_ws_token == T_MACRO_SHARP ) {
        CErr1( ERR_MUST_BE_MACRO_PARM );
    }
    if( prev_token == T_WHITE_SPACE ) {
        MTOKDEC( mlen );
    }
    MacroOverflow( mlen + sizeof( TOKEN ), mlen );
    MTOK( MacroOffset + mlen ) = T_NULL;
    MTOKINC( mlen );
    if( prev_non_ws_token == T_SHARP_SHARP ) {
        CErr1( ERR_MISPLACED_SHARP_SHARP );
    }
    mentry->macro_len = mlen;
    MacLkAdd( mentry, mlen, mflags );
    FreeMEntry( mentry );
    MacroSize += mlen;
}