Ignore:
Timestamp:
Dec 12, 2012, 6:10:33 PM (6 years ago)
Author:
cameron
Message:

Various fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icXML/icXML-devel/src/icxmlc/XMLSymbolTable.cpp

    r2731 r2774  
    77/*
    88 * @author Nigel Medforth, nigelm -at- interational-characters.com
    9  * @version $Id: XMLSymbolTable.cpp 209 2012-12-02 21:17:04Z robc $
     9 * @version $Id: XMLSymbolTable.cpp 224 2012-12-12 03:31:56Z nigelm $
    1010 *
    1111 */
     
    2929)
    3030{
    31     DEBUG_SYMBOL_MESSAGE("XMLSymbolTable::add(" << key << ',' << length << ')')
    32 
    3331    XMLSymbol entry;
    3432    entry.fFlags = 0;
     
    3634    entry.fRawSymbol = fSymbolPool.insert(key, length);
    3735
     36    DEBUG_SYMBOL_MESSAGE("XMLSymbolTable::add(" << entry.fRawSymbol << ',' << length << ')')
     37
    3838    XMLBuffer symbol(length, fMemoryManager);
    3939    fTranscoder->transcodeFrom(key, length, symbol);
    4040    const XMLCh * symbolName = symbol.getRawBuffer();
    41 
    42     DEBUG_SYMBOL_MESSAGE(" -- symbolName=" << symbolName)
    4341
    4442    /// VERIFY THAT THE CHARACTERS IN THE SYMBOL ARE LEGAL ACCORDING TO XML SPECIFICATIONS
     
    4846    }
    4947
    50     /**
    51      Is this a processing instruction?
    52      **/
    53     if (unlikely(symbolName[0] == chQuestion))
     48
     49    entry.fQName = new QName(symbolName, XMLNamespaceResolver::fEmptyUriId, fMemoryManager);
     50
     51    entry.fName = entry.fQName->getRawName();
     52
     53    if (fScanner->getDoNamespaces())
    5454    {
    55         entry.fQName = NULL;
    56         entry.fName = XMLString::replicate(&symbolName[1], fMemoryManager);
    57 
    58         entry.fFlags = XMLSymbol::IS_PROCESSING_INSTRUCTION;
    59         if (likely(XMLStringU::isXML(entry.fName)))
     55        const XMLSize_t length = symbol.getLen();
     56        int colon;
     57        entry.fPrefixId = fNamespaceResolver->resolvePrefixId(symbolName, length, colon);
     58        if (entry.fPrefixId < XMLNamespaceResolver::fPredefinedCount)
    6059        {
    61             entry.fFlags |= XMLSymbol::XML;
    62         }
    63     }
    64     else
    65     {
    66         entry.fQName = new QName(symbolName, XMLNamespaceResolver::fEmptyUriId, fMemoryManager);
    67         entry.fName = entry.fQName->getRawName();       
    68         if (fScanner->getDoNamespaces())
    69         {
    70             const XMLSize_t length = symbol.getLen();
    71             int colon;
    72             entry.fPrefixId = fNamespaceResolver->resolvePrefixId(symbolName, length, colon);
    73             if (entry.fPrefixId < XMLNamespaceResolver::fPredefinedCount)
     60            switch (entry.fPrefixId)
    7461            {
    75                 switch (entry.fPrefixId)
    76                 {
    77                     case XMLNamespaceResolver::fEmptyUriId:
    78                         if (unlikely(XMLStringU::isXMLNS(symbolName)))
    79                         {
    80                             entry.fFlags |= XMLSymbol::XMLNS;
    81                         }
    82                         break;
    83                     case XMLNamespaceResolver::fXMLUriId:
    84                         entry.fFlags |= XMLSymbol::XML;
    85                         break;
    86                     case XMLNamespaceResolver::fXMLNSUriId:
     62                case XMLNamespaceResolver::fEmptyUriId:
     63                    if (unlikely(XMLStringU::isXMLNS(symbolName)))
     64                    {
    8765                        entry.fFlags |= XMLSymbol::XMLNS;
    88                         ++colon;
    89                         entry.fPrefixId = fNamespaceResolver->resolvePrefixId(&symbolName[colon], length - colon);
    90                         if (unlikely(entry.fPrefixId == XMLNamespaceResolver::fXMLNSUriId))
    91                         {
    92                             fScanner->emitError(XMLErrs::NoUseOfxmlnsAsPrefix);
    93                         }
    94                         break;
    95                 }
     66                    }
     67                    break;
     68                case XMLNamespaceResolver::fXMLUriId:
     69                    entry.fFlags |= XMLSymbol::XML;
     70                    break;
     71                case XMLNamespaceResolver::fXMLNSUriId:
     72                    entry.fFlags |= XMLSymbol::XMLNS;
     73                    ++colon;
     74                    entry.fPrefixId = fNamespaceResolver->resolvePrefixId(&symbolName[colon], length - colon);
     75                    if (unlikely(entry.fPrefixId == XMLNamespaceResolver::fXMLNSUriId))
     76                    {
     77                        fScanner->emitError(XMLErrs::NoUseOfxmlnsAsPrefix);
     78                    }
     79                    break;
    9680            }
    9781        }
     
    124108    symbolName[length] = 0;
    125109
    126     /**
    127      Is this a processing instruction?
    128      **/
    129     if (unlikely(symbolName[0] == chQuestion))
     110    entry.fQName = new QName(symbolName, XMLNamespaceResolver::fEmptyUriId, fMemoryManager);
     111
     112    entry.fName = entry.fQName->getRawName();
     113
     114    int colon;
     115    entry.fPrefixId = fNamespaceResolver->resolvePrefixId(symbolName, length, colon);
     116    if (entry.fPrefixId < XMLNamespaceResolver::fPredefinedCount)
    130117    {
    131         entry.fQName = NULL;
    132         entry.fName = XMLString::replicate(&symbolName[1], fMemoryManager);
    133 
    134         entry.fFlags = XMLSymbol::IS_PROCESSING_INSTRUCTION;
    135         if (likely(XMLStringU::isXML(entry.fName)))
     118        switch (entry.fPrefixId)
    136119        {
    137             entry.fFlags |= XMLSymbol::XML;
    138         }
    139     }
    140     else
    141     {
    142         entry.fQName = new QName(symbolName, XMLNamespaceResolver::fEmptyUriId, fMemoryManager);
    143         entry.fName = entry.fQName->getRawName();
    144 
    145         int colon;
    146         entry.fPrefixId = fNamespaceResolver->resolvePrefixId(symbolName, length, colon);
    147         if (entry.fPrefixId < XMLNamespaceResolver::fPredefinedCount)
    148         {
    149             switch (entry.fPrefixId)
    150             {
    151                 case XMLNamespaceResolver::fEmptyUriId:
    152                     if (unlikely(XMLStringU::isXMLNS(symbolName)))
    153                     {
    154                         entry.fFlags |= XMLSymbol::XMLNS;
    155                     }
    156                     break;
    157                 case XMLNamespaceResolver::fXMLUriId:
    158                     entry.fFlags |= XMLSymbol::XML;
    159                     break;
    160                 case XMLNamespaceResolver::fXMLNSUriId:
     120            case XMLNamespaceResolver::fEmptyUriId:
     121                if (unlikely(XMLStringU::isXMLNS(symbolName)))
     122                {
    161123                    entry.fFlags |= XMLSymbol::XMLNS;
    162                     ++colon;
    163                     entry.fPrefixId = fNamespaceResolver->resolvePrefixId(&symbolName[colon], length - colon);
    164                     break;
    165             }
     124                }
     125                break;
     126            case XMLNamespaceResolver::fXMLUriId:
     127                entry.fFlags |= XMLSymbol::XML;
     128                break;
     129            case XMLNamespaceResolver::fXMLNSUriId:
     130                entry.fFlags |= XMLSymbol::XMLNS;
     131                ++colon;
     132                entry.fPrefixId = fNamespaceResolver->resolvePrefixId(&symbolName[colon], length - colon);
     133                break;
    166134        }
    167135    }
Note: See TracChangeset for help on using the changeset viewer.