gcc const fix, converted linefeeds
[shibboleth/cpp-xmltooling.git] / xmltooling / util / DateTime.h
index aceaf22..44ce374 100644 (file)
-/*\r
- *  Copyright 2001-2006 Internet2\r
- * \r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-/**\r
- * @file DateTime.h\r
- * \r
- * Manipulation of XML date/time data. \r
- */\r
-\r
-#ifndef _XML_DATETIME_H\r
-#define _XML_DATETIME_H\r
-\r
-#include <xmltooling/base.h>\r
-\r
-#if defined (_MSC_VER)\r
-    #pragma warning( push )\r
-    #pragma warning( disable : 4244 )\r
-#endif\r
-\r
-#include <xercesc/util/XMLDateTime.hpp>\r
-\r
-#if defined (_MSC_VER)\r
-    #pragma warning( pop )\r
-#endif\r
-\r
-namespace xmltooling\r
-{\r
-    /**\r
-     * Class for manipulating XML date/time information.\r
-     * \r
-     * This is mostly copied from Xerces-C, but they haven't produced a usable date/time\r
-     * class, so we had to incorporate a version of it for now. It can't be inherited\r
-     * since the fields needed are private.\r
-     */\r
-    class XMLTOOL_API DateTime\r
-    {\r
-    public:\r
-        /// @cond OFF\r
-        DateTime();\r
-        DateTime(const XMLCh* const);\r
-        DateTime(time_t epoch);\r
-        DateTime(const DateTime&);\r
-        DateTime& operator=(const DateTime&);\r
-        ~DateTime();\r
-    \r
-        inline void setBuffer(const XMLCh* const);\r
-    \r
-        const XMLCh* getRawData() const;\r
-        const XMLCh* getFormattedString() const;\r
-        int getSign() const;\r
-    \r
-        XMLCh* getDateTimeCanonicalRepresentation() const;\r
-        XMLCh* getTimeCanonicalRepresentation() const;\r
-    \r
-        void parseDateTime();\r
-        void parseDate();\r
-        void parseTime();\r
-        void parseDay();\r
-        void parseMonth();\r
-        void parseYear();\r
-        void parseMonthDay();\r
-        void parseYearMonth();\r
-        void parseDuration();\r
-    \r
-        static int compare(const DateTime* const, const DateTime* const);\r
-        static int compare(const DateTime* const, const DateTime* const, bool);\r
-        static int compareOrder(const DateTime* const, const DateTime* const);                                    \r
-    \r
-        int getYear() const {return fValue[CentYear];}\r
-        int getMonth() const {return fValue[Month];}\r
-        int getDay() const {return fValue[Day];}\r
-        int getHour() const {return fValue[Hour];}\r
-        int getMinute() const {return fValue[Minute];}\r
-        int getSecond() const {return fValue[Second];}\r
-        time_t getEpoch() const;\r
-    \r
-        /// @endcond\r
-    private:\r
-        enum valueIndex {\r
-            CentYear   = 0,\r
-            Month      ,\r
-            Day        ,\r
-            Hour       ,\r
-            Minute     ,\r
-            Second     ,\r
-            MiliSecond ,  //not to be used directly\r
-            utc        ,\r
-            TOTAL_SIZE\r
-        };\r
-    \r
-        enum utcType {\r
-            UTC_UNKNOWN = 0,\r
-            UTC_STD        ,          // set in parse() or normalize()\r
-            UTC_POS        ,          // set in parse()\r
-            UTC_NEG                   // set in parse()\r
-        };\r
-    \r
-        enum timezoneIndex {\r
-            hh = 0,\r
-            mm ,\r
-            TIMEZONE_ARRAYSIZE\r
-        };\r
-    \r
-        static int compareResult(int, int, bool);\r
-        static void addDuration(DateTime* pDuration, const DateTime* const pBaseDate, int index);\r
-        static int compareResult(const DateTime* const, const DateTime* const, bool, int);\r
-        static inline int getRetVal(int, int);\r
-    \r
-        inline void reset();\r
-        //inline void assertBuffer() const;\r
-        inline void copy(const DateTime&);\r
-        \r
-        inline void initParser();\r
-        inline bool isNormalized() const;\r
-    \r
-        void getDate();\r
-        void getTime();\r
-        void getYearMonth();\r
-        void getTimeZone(const int);\r
-        void parseTimeZone();\r
-    \r
-        int findUTCSign(const int start);\r
-        int indexOf(const int start, const int end, const XMLCh ch) const;\r
-        int parseInt(const int start, const int end) const;\r
-        int parseIntYear(const int end) const;\r
-        double parseMiliSecond(const int start, const int end) const;\r
-    \r
-        void validateDateTime() const;\r
-        void normalize();\r
-        void fillString(XMLCh*& ptr, valueIndex ind, int expLen) const;\r
-        int  fillYearString(XMLCh*& ptr, valueIndex ind) const;\r
-        void searchMiliSeconds(XMLCh*& miliStartPtr, XMLCh*& miliEndPtr) const;\r
-    \r
-       bool operator==(const DateTime& toCompare) const;\r
-    \r
-        static const int DATETIMES[][TOTAL_SIZE];\r
-        int fValue[TOTAL_SIZE];\r
-        int fTimeZone[TIMEZONE_ARRAYSIZE];\r
-        int fStart;\r
-        int fEnd;\r
-        int fBufferMaxLen;\r
-        XMLCh* fBuffer;\r
-    \r
-        double fMiliSecond;\r
-        bool fHasTime;\r
-    };\r
-\r
-    inline void DateTime::setBuffer(const XMLCh* const aString)\r
-    {\r
-        reset();\r
-        fEnd = XMLString::stringLen(aString);\r
-        if (fEnd > 0) {\r
-            if (fEnd > fBufferMaxLen) {\r
-                delete[] fBuffer;\r
-                fBufferMaxLen = fEnd + 8;\r
-                fBuffer = new XMLCh[fBufferMaxLen+1];\r
-            }\r
-            memcpy(fBuffer, aString, (fEnd+1) * sizeof(XMLCh));\r
-        }\r
-    }\r
-    \r
-    inline void DateTime::reset()\r
-    {\r
-        for ( int i=0; i < XMLDateTime::TOTAL_SIZE; i++ )\r
-            fValue[i] = 0;\r
-    \r
-        fMiliSecond   = 0;\r
-        fHasTime      = false;\r
-        fTimeZone[hh] = fTimeZone[mm] = 0;\r
-        fStart = fEnd = 0;\r
-    \r
-        if (fBuffer)\r
-            *fBuffer = 0;\r
-    }\r
-    \r
-    inline void DateTime::copy(const DateTime& rhs)\r
-    {\r
-        for ( int i = 0; i < XMLDateTime::TOTAL_SIZE; i++ )\r
-            fValue[i] = rhs.fValue[i];\r
-    \r
-        fMiliSecond   = rhs.fMiliSecond;\r
-        fHasTime      = rhs.fHasTime;\r
-        fTimeZone[hh] = rhs.fTimeZone[hh];\r
-        fTimeZone[mm] = rhs.fTimeZone[mm];\r
-        fStart = rhs.fStart;\r
-        fEnd   = rhs.fEnd;\r
-    \r
-        if (fEnd > 0) {\r
-            if (fEnd > fBufferMaxLen) {\r
-                delete[] fBuffer;\r
-                fBufferMaxLen = rhs.fBufferMaxLen;\r
-                fBuffer = new XMLCh[fBufferMaxLen+1];\r
-            }\r
-            memcpy(fBuffer, rhs.fBuffer, (fEnd+1) * sizeof(XMLCh));\r
-        }\r
-    }\r
-    \r
-    inline void DateTime::initParser()\r
-    {\r
-        fStart = 0;   // to ensure scan from the very first beginning\r
-                      // in case the pointer is updated accidentally by someone else.\r
-    }\r
-    \r
-    inline bool DateTime::isNormalized() const\r
-    {\r
-        return (fValue[XMLDateTime::utc] == XMLDateTime::UTC_STD ? true : false);\r
-    }\r
-    \r
-    inline int DateTime::getRetVal(int c1, int c2)\r
-    {\r
-        if ((c1 == XMLDateTime::LESS_THAN && c2 == XMLDateTime::GREATER_THAN) ||\r
-            (c1 == XMLDateTime::GREATER_THAN && c2 == XMLDateTime::LESS_THAN))\r
-            return XMLDateTime::INDETERMINATE;\r
-    \r
-        return (c1 != XMLDateTime::INDETERMINATE) ? c1 : c2;\r
-    }\r
-\r
-}\r
-\r
-#endif\r
+/*
+ *  Copyright 2001-2006 Internet2
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file DateTime.h
+ * 
+ * Manipulation of XML date/time data. 
+ */
+
+#ifndef _XML_DATETIME_H
+#define _XML_DATETIME_H
+
+#include <xmltooling/base.h>
+
+#if defined (_MSC_VER)
+    #pragma warning( push )
+    #pragma warning( disable : 4244 )
+#endif
+
+#include <xercesc/util/XMLDateTime.hpp>
+
+#if defined (_MSC_VER)
+    #pragma warning( pop )
+#endif
+
+namespace xmltooling
+{
+    /**
+     * Class for manipulating XML date/time information.
+     * 
+     * This is mostly copied from Xerces-C, but they haven't produced a usable date/time
+     * class, so we had to incorporate a version of it for now. It can't be inherited
+     * since the fields needed are private.
+     */
+    class XMLTOOL_API DateTime
+    {
+    public:
+        /// @cond OFF
+        DateTime();
+        DateTime(const XMLCh* const);
+        DateTime(time_t epoch);
+        DateTime(const DateTime&);
+        DateTime& operator=(const DateTime&);
+        ~DateTime();
+    
+        inline void setBuffer(const XMLCh* const);
+    
+        const XMLCh* getRawData() const;
+        const XMLCh* getFormattedString() const;
+        int getSign() const;
+    
+        XMLCh* getDateTimeCanonicalRepresentation() const;
+        XMLCh* getTimeCanonicalRepresentation() const;
+    
+        void parseDateTime();
+        void parseDate();
+        void parseTime();
+        void parseDay();
+        void parseMonth();
+        void parseYear();
+        void parseMonthDay();
+        void parseYearMonth();
+        void parseDuration();
+    
+        static int compare(const DateTime* const, const DateTime* const);
+        static int compare(const DateTime* const, const DateTime* const, bool);
+        static int compareOrder(const DateTime* const, const DateTime* const);                                    
+    
+        int getYear() const {return fValue[CentYear];}
+        int getMonth() const {return fValue[Month];}
+        int getDay() const {return fValue[Day];}
+        int getHour() const {return fValue[Hour];}
+        int getMinute() const {return fValue[Minute];}
+        int getSecond() const {return fValue[Second];}
+        time_t getEpoch() const;
+    
+        /// @endcond
+    private:
+        enum valueIndex {
+            CentYear   = 0,
+            Month      ,
+            Day        ,
+            Hour       ,
+            Minute     ,
+            Second     ,
+            MiliSecond ,  //not to be used directly
+            utc        ,
+            TOTAL_SIZE
+        };
+    
+        enum utcType {
+            UTC_UNKNOWN = 0,
+            UTC_STD        ,          // set in parse() or normalize()
+            UTC_POS        ,          // set in parse()
+            UTC_NEG                   // set in parse()
+        };
+    
+        enum timezoneIndex {
+            hh = 0,
+            mm ,
+            TIMEZONE_ARRAYSIZE
+        };
+    
+        static int compareResult(int, int, bool);
+        static void addDuration(DateTime* pDuration, const DateTime* const pBaseDate, int index);
+        static int compareResult(const DateTime* const, const DateTime* const, bool, int);
+        static inline int getRetVal(int, int);
+    
+        inline void reset();
+        //inline void assertBuffer() const;
+        inline void copy(const DateTime&);
+        
+        inline void initParser();
+        inline bool isNormalized() const;
+    
+        void getDate();
+        void getTime();
+        void getYearMonth();
+        void getTimeZone(const int);
+        void parseTimeZone();
+    
+        int findUTCSign(const int start);
+        int indexOf(const int start, const int end, const XMLCh ch) const;
+        int parseInt(const int start, const int end) const;
+        int parseIntYear(const int end) const;
+        double parseMiliSecond(const int start, const int end) const;
+    
+        void validateDateTime() const;
+        void normalize();
+        void fillString(XMLCh*& ptr, valueIndex ind, int expLen) const;
+        int  fillYearString(XMLCh*& ptr, valueIndex ind) const;
+        void searchMiliSeconds(XMLCh*& miliStartPtr, XMLCh*& miliEndPtr) const;
+    
+       bool operator==(const DateTime& toCompare) const;
+    
+        static const int DATETIMES[][TOTAL_SIZE];
+        int fValue[TOTAL_SIZE];
+        int fTimeZone[TIMEZONE_ARRAYSIZE];
+        int fStart;
+        int fEnd;
+        int fBufferMaxLen;
+        XMLCh* fBuffer;
+    
+        double fMiliSecond;
+        bool fHasTime;
+    };
+
+    inline void DateTime::setBuffer(const XMLCh* const aString)
+    {
+        reset();
+        fEnd = XMLString::stringLen(aString);
+        if (fEnd > 0) {
+            if (fEnd > fBufferMaxLen) {
+                delete[] fBuffer;
+                fBufferMaxLen = fEnd + 8;
+                fBuffer = new XMLCh[fBufferMaxLen+1];
+            }
+            memcpy(fBuffer, aString, (fEnd+1) * sizeof(XMLCh));
+        }
+    }
+    
+    inline void DateTime::reset()
+    {
+        for ( int i=0; i < XMLDateTime::TOTAL_SIZE; i++ )
+            fValue[i] = 0;
+    
+        fMiliSecond   = 0;
+        fHasTime      = false;
+        fTimeZone[hh] = fTimeZone[mm] = 0;
+        fStart = fEnd = 0;
+    
+        if (fBuffer)
+            *fBuffer = 0;
+    }
+    
+    inline void DateTime::copy(const DateTime& rhs)
+    {
+        for ( int i = 0; i < XMLDateTime::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;
+        fEnd   = rhs.fEnd;
+    
+        if (fEnd > 0) {
+            if (fEnd > fBufferMaxLen) {
+                delete[] fBuffer;
+                fBufferMaxLen = rhs.fBufferMaxLen;
+                fBuffer = new XMLCh[fBufferMaxLen+1];
+            }
+            memcpy(fBuffer, rhs.fBuffer, (fEnd+1) * sizeof(XMLCh));
+        }
+    }
+    
+    inline void DateTime::initParser()
+    {
+        fStart = 0;   // to ensure scan from the very first beginning
+                      // in case the pointer is updated accidentally by someone else.
+    }
+    
+    inline bool DateTime::isNormalized() const
+    {
+        return (fValue[XMLDateTime::utc] == XMLDateTime::UTC_STD ? true : false);
+    }
+    
+    inline int DateTime::getRetVal(int c1, int c2)
+    {
+        if ((c1 == XMLDateTime::LESS_THAN && c2 == XMLDateTime::GREATER_THAN) ||
+            (c1 == XMLDateTime::GREATER_THAN && c2 == XMLDateTime::LESS_THAN))
+            return XMLDateTime::INDETERMINATE;
+    
+        return (c1 != XMLDateTime::INDETERMINATE) ? c1 : c2;
+    }
+
+}
+
+#endif