jdonohue    00/03/17 12:47:17

  Modified:    c/src/XSLT ElemNumber.cpp
  Log:
  Fixed problems with tokenizing format string
  
  Revision  Changes    Path
  1.5       +50 -64    xml-xalan/c/src/XSLT/ElemNumber.cpp
  
  Index: ElemNumber.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.cpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ElemNumber.cpp    2000/02/03 20:13:21     1.4
  +++ ElemNumber.cpp    2000/03/17 20:47:17     1.5
  @@ -72,7 +72,12 @@
   #include "StylesheetConstructionContext.hpp"
   #include "StylesheetExecutionContext.hpp"
   
  +#if !defined(XALAN_NO_NAMESPACES)
  +     using std::vector;
  +#endif
   
  +typedef vector<DOMString> StringVectorType;
  +typedef StringVectorType::iterator StringVectorTypeIterator;
   
   const DOMString                      
ElemNumber::s_alphaCountTable(XALAN_STATIC_UCODE_STRING("ZABCDEFGHIJKLMNOPQRSTUVWXY"));
   
  @@ -711,12 +716,12 @@
                        const DOM_Node&                                 
contextNode) const
   {
        const int       nNumbers = theList.size();
  -     XMLCh           numberType = '1';
  +     XMLCh   numberType('1');
        int                     numberWidth = 1;
   
        DOMString       formattedNumber;
        DOMString       formatToken;
  -     DOMString       sepString;
  +     DOMString       sepString(".");
        DOMString       lastSepString;
   
        DOMString       formatValue = !isEmpty(m_format_avt)
  @@ -733,75 +738,56 @@
   #if ! defined(__GNUC__)
        std::locale             loc = getLocale(executionContext, contextNode);
   #endif
  +     // Construct an array of tokens.  We need to be able to check if the 
last
  +     // token in non-alphabetic, in which case the penultimate 
non-alphabetic is
  +     // the repeating separator
  +     StringVectorType tokenVector;
  +     while(formatTokenizer.hasMoreTokens())
  +             tokenVector.push_back(formatTokenizer.nextToken());
   
  +     // Get rid of the leading and trailing non-alphabetics, save for later
  +     DOMString leaderStr;
  +     DOMString trailerStr;
  +     StringVectorTypeIterator it;
  +     it = tokenVector.begin();
  +     if(! isLetterOrDigit(charAt((*it), 0)))
  +     {
  +             leaderStr = *it;
  +             tokenVector.erase(it);
  +     }
  +     it += tokenVector.size()-1;
  +     if(! isLetterOrDigit(charAt((*it), 0)))
  +     {
  +             trailerStr = *it;
  +             tokenVector.erase(it);
  +     }
  +
  +     // Now we're left with a sequence of alpha,non-alpha tokens, format them
  +     // with the corresponding entry in the format string, or the last one 
if no
  +     // more matching ones
  +     formattedNumber = leaderStr;
  +     it = tokenVector.begin();
        for(int i = 0; i < nNumbers; i++)
        {
  -             while(formatTokenizer.hasMoreTokens())
  +             if (it != tokenVector.end())
                {
  -                     formatToken = formatTokenizer.nextToken();
  -
  -                     if(isLetterOrDigit(charAt(formatToken, 
length(formatToken) - 1)))
  -                     {
  -                             numberWidth = length(formatToken);
  -
  -                             numberType = charAt(formatToken, numberWidth - 
1);
  -                             break; // from while(tokenizer.hasMoreTokens())
  -                     }
  -                     else
  -                     {
  -                             sepString = formatToken;
  -
  -                             formattedNumber += sepString;
  -
  -                             if(formatTokenizer.hasMoreTokens())
  -                             {
  -                                     while(formatTokenizer.hasMoreTokens())
  -                                     {
  -                                             formatToken = 
formatTokenizer.nextToken();
  -
  -                                             
if(!isLetterOrDigit(charAt(formatToken, 0)))
  -                                             {
  -                                                     lastSepString = 
sepString + formatToken; // possibly the last separator                         
                                                
  -                                             }
  -                                             else                    
  -                                             {
  -                                                     numberWidth = 
length(formatToken);
  -                                                     numberType = 
charAt(formatToken, numberWidth - 1);
  -                                                     break; // from inner 
while loop
  -                                             }
  -                                     }
  -                                     break; // from 
while(tokenizer.hasMoreTokens())
  -                             }
  -                     }
  -
  -             } // end while
  -
  +                     assert(isLetterOrDigit(charAt((*it), 0)));
  +                     formatToken = *it++;
  +                     numberWidth = length(formatToken);
  +                     numberType = charAt(formatToken, numberWidth - 1);
  +             }
  +             if (it != tokenVector.end())
  +             {
  +                     assert(!isLetterOrDigit(charAt((*it), 0)));
  +                     sepString = *it++;
  +             }                       
                formattedNumber += getFormattedNumber(executionContext, 
contextNode,
                                numberType, numberWidth, theList[i]);
  -     }
  -
  -     // Check to see if we finished up the format string...
  -     if(isEmpty(lastSepString))
  -             lastSepString = DOMString();
  -
  -     while(formatTokenizer.hasMoreTokens())
  -     {
  -             formatToken = formatTokenizer.nextToken();
  -
  -             if(!isLetterOrDigit(charAt(formatToken, 0)))
  -             {
  -                     lastSepString += formatToken;
  -             }
  -             else
  -             {
  -                     lastSepString = DOMString();
  -             }
  -     }
  -
  -     if(!isEmpty(lastSepString))
  -     {
  -             formattedNumber += lastSepString;
  +             // All but the last one
  +             if (i < nNumbers-1)
  +                     formattedNumber += sepString;
        }
  +     formattedNumber += trailerStr;
   
        return formattedNumber;  
   }
  
  
  

Reply via email to