Esempio n. 1
0
void TypeSet( void )
/******************/
{
    type_display        *parent;
    type_display        *field;

    ScanLeftBrace();
    while( !ScanRightBrace() ) {
        if( ScanCmd( &TypeSettings ) != TY_STRUCT ) oops();
        parent = VarDisplayAddStruct( ScanName() );
        ScanLeftBrace();
        while( !ScanRightBrace() ) {
            if( ScanAttribute( parent, ScanCmd( &TypeSettings ) ) == TY_FIELD ) {
                field = VarDisplayAddField( parent, ScanName() );
                ScanLeftBrace();
                while( !ScanRightBrace() ) {
                    if( ScanAttribute( field, ScanCmd( &TypeSettings ) ) == TY_FIELD ) {
                        oops();
                    }
                }
            }
        }
    }
    ReqEOC();
}
Esempio n. 2
0
//-----------------------------------------------------------------
static void ScanItem (const CH * pchStart, const CH * pchEnd, HTOK * pk)
{
    if(pchStart == NULL || pk == NULL)
    {
        VSASSERT(false,"");
        return;
    }
    
    HRESULT hr;

    pk->id     = hi_Unknown;
    pk->pch    = (CH*)pchStart;
    pk->cch    = 0;
    pk->bEnd   = false;

    if (pchStart >= pchEnd)
    {
        pk->id = hi_Eof;
        return;
    }
    const CH * pchScan = pchStart;
    
    switch (*pchScan)
    {
//  case _CH(0):
//      pk->id = hi_Eof;
//      break;
//
//  case _CH('\n'):
//  case _CH('\r'):
//      pchScan = AdvanceLineBreak((CH*)pchScan);
//      pk->id = hi_Eol;
//      break;
    
    case _CH('<'):
        {
            const CH * pchName;
            int cch;
            
            pchScan++;          
            pk->id = hi_Error;
            switch (*pchScan)
            {
            case _CH('!'):
                pk->id = hi_Error;
                pchScan++;
                while (_CH('>') != *pchScan)
                {
                    const CH * pch;
                    int        cch;

                    SKIPWHITE_RET

                    if (IsAAlpha(*pchScan))
                        hr = ScanName(pchScan, pchEnd, &pch, &cch);
                    else
                    {
                        switch(*pchScan)
                        {
                        case CH('\''):
                        case CH('"'):
                            hr = ScanValue(pchScan, pchEnd, &pch, &cch);
                            break;

                        case CH('-'):
                            hr = ScanComment(pchScan, pchEnd, &pch, &cch);
                            break;
                        
                        default:
                            hr = S_OK;
                            pch = pchScan;
                            cch = 1;
                            break;
                        }
                    }

                    pchScan = pch + cch;
                    if (FAILED(hr) || (pchScan >= pchEnd))
                        return;
                }
                pk->id = hi_TagSpecial;
                break;

            case _CH('%'):  // ASP 'tag'
                pk->id = hi_TagSpecial;
                do {
                    do {
                        pchScan++;
                    } while ((pchScan < pchEnd) && (_CH('>') != *pchScan));
                } while ((pchScan < pchEnd) &&  (*(pchScan-1) != _CH('%')));
                break;

            case _CH('/'):
                pk->bEnd = true;
                pchScan++;
                break;

            case _CH('?'):  //
                pk->id = hi_TagSpecial;
                pchScan++;
                while ((pchScan < pchEnd) && (_CH('>') != *pchScan))
                    pchScan++;
                break;

            }
            if (pk->id != hi_TagSpecial)
            {
                pk->id = hi_Error;
                SKIPWHITE_RET
                if (!IsAAlpha(*pchScan))
                    return;
                pchName = pchScan;
                while ((pchScan < pchEnd) && IsAAlNum(*pchScan))
                    pchScan++;
                if (pchScan >= pchEnd)
                    return;
                cch = (int)(pchScan - pchName);
                if (cch <= cchMaxTag && cch > 0)
                {
                    CH * pszName = (CH*)_alloca((cch+1)*CBCH );
                    strcchcopy(pszName, cch+1, pchName);
                    pk->id = LookupElement(pszName);
                }
                else
                    return;
                if (!pk->bEnd)
                {
                    // scan attributes and comments
                    for(;;)
                    {
                        HATT    hatt;
                        HRESULT hr = ScanAttribute(pchScan, pchEnd, &hatt);
                        if (FAILED(hr))
                        {
                            pk->id = hi_Error;
                            return;
                        }
                        if (S_FALSE == hr)
                            break;
                        pchScan = hatt.pchValue ? hatt.pchValue + hatt.cchValue : hatt.pchName + hatt.cchName;
                    }
                }
            }
            // Skip over whitespace and, if this is an empty element, the closing '/' (e.g. "<foo ... />")
            while ((pchScan < pchEnd) && ((*pchScan <= 32) || (*pchScan == _CH('/'))))
                pchScan++;
            if ((pchScan >= pchEnd) || (_CH('>') != *pchScan))
                pk->id = hi_Error;
            pchScan++;
        }
        break;

//  case _CH('&'):
//      pk->id = hi_Entity;
//      if (!ScanEntity(pchScan, &pk->ch, &pchScan))
//          goto L_Text;
//      break;
    
    default:
//L_Text:
        pk->id = hi_Text;
        for (bool f = true; f && (pchScan < pchEnd); )
        {
            switch (*pchScan)
            {
//          case _CH(0):
//          case _CH('\n'):
//          case _CH('\r'):
//          case _CH('&'):
            case _CH('<'):
                f = false;
                break;
            default:
                pchScan++;
                break;
            }
        }
        break;
    }
Esempio n. 3
0
//-----------------------------------------------------------------
// FindAttribute - Find a specific attribute
//
// Returns:
//   S_OK     Found Attribute
//   S_FALSE  Attribute not found
//   E_FAIL   Syntax error
//
static HRESULT FindAttribute (const CH * pchTag, const CH *pchEnd, const CH * pszAName, const CH **ppchVal, int * pcchVal)
{
    if(pchTag == NULL || pszAName == NULL || *pszAName == NULL)
    {
        VSASSERT(false,"");
        return E_INVALIDARG;
    }
    
    HRESULT    hr;
    const CH * pch;
    int        cch;
    int        cchAttIn = slen(pszAName);
    const CH * pchScan = pchTag;
    const CH * pchVal  = 0;
    
    *ppchVal = 0;
    *pcchVal = 0;

    if (*pchScan == _CH('<'))
        pchScan++;

    // don't look in ! tags or end tags
    if (*pchScan == _CH('!') || *pchScan == _CH('/') || *pchScan == _CH('?'))
        return S_FALSE;

    SKIPWHITE_FAIL

    hr = ScanName(pchScan, pchEnd, &pch, &cch);
    if (FAILED(hr))
        return E_FAIL;
    pchScan = pch + cch;
    if (pchScan >= pchEnd)
        return S_FALSE;  // no attributes

    for(;;)
    {
        HATT    hatt;
        HRESULT hr = ScanAttribute(pchScan, pchEnd, &hatt);
        if (FAILED(hr))
            return E_FAIL;
        if (S_FALSE == hr)
            break;
        pchScan = hatt.pchValue ? hatt.pchValue + hatt.cchValue : hatt.pchName + hatt.cchName;
        if (!hatt.pchName || !hatt.cchName)
            continue; // comment

        if ((cchAttIn == hatt.cchName) && (0 == icmpn(hatt.pchName, pszAName, cchAttIn)))        
        {
            /// strip quotes, if any
            CH ch = *hatt.pchValue;
            if (ch == _CH('"') || ch == _CH('\''))
            {
                VSASSERT(ch == hatt.pchValue[hatt.cchValue-1],"");
                hatt.pchValue++;
                hatt.cchValue -= 2;
            }
            // done!
            *ppchVal = hatt.pchValue;
            *pcchVal = hatt.cchValue;
            return S_OK;
        }
    }
    return S_FALSE;
}