peiyongz    2004/08/31 13:50:50

  Modified:    c/src/xercesc/util XMLDateTime.hpp XMLDateTime.cpp
  Log:
  Parse/keep milisecond as double to retain precision.
  
  Revision  Changes    Path
  1.19      +16 -2     xml-xerces/c/src/xercesc/util/XMLDateTime.hpp
  
  Index: XMLDateTime.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLDateTime.hpp,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- XMLDateTime.hpp   11 Aug 2004 16:48:55 -0000      1.18
  +++ XMLDateTime.hpp   31 Aug 2004 20:50:50 -0000      1.19
  @@ -57,6 +57,9 @@
   /*
    * $Id$
    * $Log$
  + * Revision 1.19  2004/08/31 20:50:50  peiyongz
  + * Parse/keep milisecond as double to retain precision.
  + *
    * Revision 1.18  2004/08/11 16:48:55  peiyongz
    * Allow XSValue access
    *
  @@ -148,7 +151,7 @@
           Hour       ,
           Minute     ,
           Second     ,
  -        MiliSecond ,
  +        MiliSecond ,  //not to be used directly
           utc        ,
           TOTAL_SIZE
       };
  @@ -322,6 +325,9 @@
   
       int                   parseIntYear(const int end) const;
   
  +    double                parseMiliSecond(const int start
  +                                        , const int end) const;
  +
       // -----------------------------------------------------------------------
       // validator and normalizer
       // -----------------------------------------------------------------------
  @@ -365,6 +371,10 @@
       int          fEnd;
       int          fBufferMaxLen;
       XMLCh*       fBuffer;
  +
  +    double       fMiliSecond;
  +    bool         fHasTime;
  +
       MemoryManager* fMemoryManager;
   
       friend class XSValue;
  @@ -393,6 +403,8 @@
       for ( int i=0; i < TOTAL_SIZE; i++ )
           fValue[i] = 0;
   
  +    fMiliSecond   = 0;
  +    fHasTime      = false;
       fTimeZone[hh] = fTimeZone[mm] = 0;
       fStart = fEnd = 0;
   
  @@ -405,6 +417,8 @@
       for ( int i = 0; i < TOTAL_SIZE; i++ )
           fValue[i] = rhs.fValue[i];
   
  +    fMiliSecond   = rhs.fMiliSecond;
  +    fHasTime      = rhs.fHasTime;
       fTimeZone[hh] = rhs.fTimeZone[hh];
       fTimeZone[mm] = rhs.fTimeZone[mm];
       fStart = rhs.fStart;
  
  
  
  1.26      +60 -10    xml-xerces/c/src/xercesc/util/XMLDateTime.cpp
  
  Index: XMLDateTime.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/XMLDateTime.cpp,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- XMLDateTime.cpp   29 Jan 2004 11:48:47 -0000      1.25
  +++ XMLDateTime.cpp   31 Aug 2004 20:50:50 -0000      1.26
  @@ -57,6 +57,9 @@
   /*
    * $Id$
    * $Log$
  + * Revision 1.26  2004/08/31 20:50:50  peiyongz
  + * Parse/keep milisecond as double to retain precision.
  + *
    * Revision 1.25  2004/01/29 11:48:47  cargilld
    * Code cleanup changes to get rid of various compiler diagnostic messages.
    *
  @@ -509,6 +512,18 @@
           }
       }
   
  +    if ( lTemp.fHasTime)
  +    {
  +        if ( lTemp.fMiliSecond < rTemp.fMiliSecond )
  +        {
  +            return LESS_THAN;
  +        }
  +        else if ( lTemp.fMiliSecond > rTemp.fMiliSecond )
  +        {
  +            return GREATER_THAN;
  +        }
  +    }
  +
       return EQUAL;
   }
   
  @@ -526,6 +541,8 @@
   , fEnd(0)
   , fBufferMaxLen(0)
   , fBuffer(0)
  +, fMiliSecond(0)
  +, fHasTime(false)
   , fMemoryManager(manager)
   {
       reset();
  @@ -537,6 +554,8 @@
   , fEnd(0)
   , fBufferMaxLen(0)
   , fBuffer(0)
  +, fMiliSecond(0)
  +, fHasTime(false)
   , fMemoryManager(manager)
   {
       setBuffer(aString);
  @@ -624,6 +643,7 @@
       getTime();
       validateDateTime();
       normalize();
  +    fHasTime = true;
   }
   
   //
  @@ -651,6 +671,7 @@
   
       validateDateTime();
       normalize();
  +    fHasTime = true;
   }
   
   //
  @@ -988,7 +1009,7 @@
                   }
   
                   fValue[Second]     = negate * parseInt(fStart, mlsec);
  -                fValue[MiliSecond] = negate * parseInt(mlsec+1, end);
  +                fMiliSecond        = negate * parseMiliSecond(mlsec+1, end);
               }
               else
               {
  @@ -1124,17 +1145,12 @@
   
           if ( sign == NOT_FOUND )
           {
  -            fValue[MiliSecond] = parseInt(fStart, fEnd);  //get ms between '.' and 
fEnd
  +            fMiliSecond = parseMiliSecond(fStart, fEnd);  //get ms between '.' and 
fEnd
               fStart = fEnd;
           }
           else
           {
  -            //to do: parseInt would eliminate any leading zeros
  -            //       therefore for 12:01:01.0034
  -            //       fValue[MiliSecond] would catch 34
  -            //       rather than 0034
  -            //
  -            fValue[MiliSecond] = parseInt(fStart, sign);  //get ms between UTC sign 
and fEnd
  +            fMiliSecond = parseMiliSecond(fStart, sign);  //get ms between UTC sign 
and fEnd
           }
        }
       else if(sign == 0 || sign != fStart)
  @@ -1371,7 +1387,7 @@
           (fValue[Hour] > 24) ||
           ((fValue[Hour] == 24) && ((fValue[Minute] !=0) ||
                                     (fValue[Second] !=0) ||
  -                                  (fValue[MiliSecond] !=0))))
  +                                  (fMiliSecond    !=0))))
       {
           ThrowXMLwithMemMgr1(SchemaDateTimeException
                   , XMLExcepts::DateTime_hour_invalid
  @@ -1472,6 +1488,40 @@
       }
   
       return (int) retVal;
  +}
  +
  +//
  +// Note:
  +//    start: pointing to the first digit after the '.'
  +//    end:   pointing to one position after the last digit
  +//    fStart NOT updated
  +//
  +double XMLDateTime::parseMiliSecond(const int start, const int end) const
  +{
  +
  +    unsigned int  miliSecLen = (end-1) - (start-1) + 1; //to include the '.'
  +    XMLCh* miliSecData = (XMLCh*) fMemoryManager->allocate( (miliSecLen + 1) * 
sizeof(XMLCh));
  +    ArrayJanitor<XMLCh> janMili(miliSecData, fMemoryManager);
  +    XMLString::copyNString(miliSecData, &(fBuffer[start-1]), miliSecLen);
  +    *(miliSecData + miliSecLen) = chNull;
  +
  +    char *nptr = XMLString::transcode(miliSecData, fMemoryManager);
  +    ArrayJanitor<char> jan(nptr, fMemoryManager);
  +    int   strLen = strlen(nptr);
  +    char *endptr = 0;
  +    errno = 0;
  +
  +    //printf("milisec=<%s>\n", nptr);
  +
  +    double retVal = strtod(nptr, &endptr);
  +
  +    // check if all chars are valid char
  +    if ( (endptr - nptr) != strLen)
  +        ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_Inv_chars, 
fMemoryManager);
  +
  +    // we don't check underflow occurs since
  +    // nothing we can do about it.
  +    return retVal;
   }
   
   //
  
  
  

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

Reply via email to