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(); }
//----------------------------------------------------------------- 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; }
//----------------------------------------------------------------- // 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; }