dbertoni    01/12/07 10:57:56

  Modified:    c/src/XSLT ElemNumber.cpp ElemNumber.hpp
  Log:
  Make sure to report an error for grouping separators that are not of length 1.  
Report an error if formatting a negative number as a roman numeral.
  
  Revision  Changes    Path
  1.50      +66 -24    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.49
  retrieving revision 1.50
  diff -u -r1.49 -r1.50
  --- ElemNumber.cpp    2001/09/26 22:38:40     1.49
  +++ ElemNumber.cpp    2001/12/07 18:57:56     1.50
  @@ -701,8 +701,8 @@
                if(0 == countMatchPattern)
                        executionContext.error(
                                "Programmer error! countMatchPattern should never be 
0!",
  -                             0,
  -                             this);
  +                             node,
  +                             getLocator());
   
                if(countMatchPattern->getMatchScore(node, *this, executionContext) !=
                                XPath::eMatchScoreNone)
  @@ -734,9 +734,16 @@
        XalanDOMString&                         digitGroupSepValue = theGuard1.get();
   
        if (0 != m_groupingSeparator_avt)
  -              m_groupingSeparator_avt->evaluate(digitGroupSepValue, contextNode,
  +             m_groupingSeparator_avt->evaluate(digitGroupSepValue, contextNode,
                                 *this, executionContext);
                                                                         
  +     if (length(digitGroupSepValue) != 1)
  +     {
  +             executionContext.error(
  +                     "The grouping-separator value must be one character in length",
  +                     contextNode,
  +                     getLocator());
  +     }
   
        GetAndReleaseCachedString       theGuard2(executionContext);
   
  @@ -926,28 +933,23 @@
   
   
   
  -bool
  +void
   ElemNumber::evaluateLetterValueAVT(
                        StylesheetExecutionContext&             executionContext,
                        XalanNode*                                              
contextNode,
  -                     const XalanDOMString&                   compareValue) const
  +                     XalanDOMString&                                 value) const
   {
        if (m_lettervalue_avt == 0)
        {
  -             return false;
  +             clear(value);
        }
        else
        {
  -             // A string to hold the result.
  -             StylesheetExecutionContext::GetAndReleaseCachedString   
letterVal(executionContext);
  -
                m_lettervalue_avt->evaluate(
  -                             letterVal.get(),
  +                             value,
                                contextNode,
                                *this,
                                executionContext);
  -
  -             return equals(compareValue, letterVal.get());
        }
   }
   
  @@ -1241,11 +1243,11 @@
                        break;
   
                case XalanUnicode::charLetter_I:
  -                     long2roman(listElement, true, theResult);
  +                     long2roman(executionContext, contextNode, listElement, true, 
theResult);
                        break;
   
                case XalanUnicode::charLetter_i:
  -                     long2roman(listElement, true, theResult);
  +                     long2roman(executionContext, contextNode, listElement, true, 
theResult);
   
                        theResult = toLowerCaseASCII(theResult);
                        break;
  @@ -1262,24 +1264,40 @@
                case 0x0430:
                        executionContext.error(
                                "Numbering format not supported yet",
  -                             0,
  -                             this);
  +                             contextNode,
  +                             getLocator());
                        break;
   
                // Handle the special case of Greek letters for now
                case elalphaNumberType:
  -                     if (evaluateLetterValueAVT(executionContext, contextNode, 
Constants::ATTRVAL_TRADITIONAL) == true)
                        {
  -                             NumberingResourceBundleMapType::const_iterator  i = 
s_resourceBundles.find(0x03B1);
  +                             // A string to hold the result.
  +                             StylesheetExecutionContext::GetAndReleaseCachedString  
 theGuard(executionContext);
  +
  +                             XalanDOMString&         letterVal = theGuard.get();
   
  -                             if (i != s_resourceBundles.end())
  +                             evaluateLetterValueAVT(executionContext, contextNode, 
letterVal);
  +
  +                             if (equals(letterVal, Constants::ATTRVAL_TRADITIONAL) 
== true)
                                {
  -                                     traditionalAlphaCount(listElement, 
(*i).second, theResult);
  +                                     NumberingResourceBundleMapType::const_iterator 
 i = s_resourceBundles.find(0x03B1);
  +
  +                                     if (i != s_resourceBundles.end())
  +                                     {
  +                                             traditionalAlphaCount(listElement, 
(*i).second, theResult);
  +                                     }
                                }
  -                     }
  -                     else
  -                     {
  -                             int2alphaCount(listElement, s_elalphaCountTable, 
theResult);
  +                             else if (equals(letterVal, 
Constants::ATTRVAL_ALPHABETIC) == true)
  +                             {
  +                                     int2alphaCount(listElement, 
s_elalphaCountTable, theResult);
  +                             }
  +                             else
  +                             {
  +                                     executionContext.error(
  +                                             "The legal values for letter-value are 
'alphabetic' and 'traditional'",
  +                                             contextNode,
  +                                             getLocator());
  +                             }
                        }
                        break;
   
  @@ -1427,6 +1445,30 @@
   {
   //   @@ JMD: We don't do languages yet, so this is just a placeholder
        assert(false);
  +}
  +
  +
  +
  +void
  +ElemNumber::long2roman(
  +                     StylesheetExecutionContext&             executionContext,
  +                     XalanNode*                                              
contextNode,
  +                     long                                                    val,
  +                     bool                                                    
prefixesAreOK,
  +                     XalanDOMString&                                 theResult) 
const
  +{
  +     if(val < 0)
  +     {
  +             executionContext.error(
  +                     "I and i can only format positive numbers",
  +                     contextNode,
  +                     getLocator());
  +
  +     }
  +     else
  +     {
  +             long2roman(val, prefixesAreOK, theResult);
  +     }
   }
   
   
  
  
  
  1.32      +19 -2     xml-xalan/c/src/XSLT/ElemNumber.hpp
  
  Index: ElemNumber.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.hpp,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- ElemNumber.hpp    2001/09/26 21:30:23     1.31
  +++ ElemNumber.hpp    2001/12/07 18:57:56     1.32
  @@ -228,6 +228,7 @@
         * pattern.
         * @param patterns if non-0, count only nodes
         * that match this pattern, if 0 count all ancestors.
  +      * @param executionContext The current execution context.
         * @param node Count this node and it's ancestors.
         * @param stopAtFirstFound If true, only get the first matching ancestor
         * @param ancestors The ancestors that match the pattern.
  @@ -333,11 +334,27 @@
   
   private:
   
  -     bool
  +     /**
  +      * Convert a long integer into roman numerals.
  +      * @param executionContext The current execution context.
  +      * @param contextNode The current context node.
  +      * @param val Value to convert.
  +      * @param prefixesAreOK true to enable prefix notation (e.g. 4 = "IV"), false 
to disable prefix notation (e.g. 4 = "IIII").
  +      * @param theResult The formatted Roman numeral string.
  +      */
  +     void
  +     long2roman(
  +                     StylesheetExecutionContext&             executionContext,
  +                     XalanNode*                                              
contextNode,
  +                     long                                                    val,
  +                     bool                                                    
prefixesAreOK,
  +                     XalanDOMString&                                 theResult) 
const;
  +
  +     void
        evaluateLetterValueAVT(
                        StylesheetExecutionContext&             executionContext,
                        XalanNode*                                              
contextNode,
  -                     const XalanDOMString&                   compareValue) const;
  +                     XalanDOMString&                                 value) const;
   
        void
        traditionalAlphaCount(
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to