You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@apache.org on 2001/12/07 19:57:56 UTC

cvs commit: xml-xalan/c/src/XSLT ElemNumber.cpp ElemNumber.hpp

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: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org