Index: /trunk/psLib/src/astro/psTime.c
===================================================================
--- /trunk/psLib/src/astro/psTime.c	(revision 2178)
+++ /trunk/psLib/src/astro/psTime.c	(revision 2179)
@@ -11,6 +11,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.34 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-10-15 19:10:50 $
+ *  @version $Revision: 1.35 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-10-20 20:05:51 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -482,4 +482,25 @@
 
     return out;
+}
+
+psTime* psTimeAlloc(psTimeType type)
+{
+    psTime *outTime = NULL;
+
+    if(type!=PS_TIME_TAI && type!=PS_TIME_UTC) {
+        psError(__func__, " : Line %d - Incorrect type. Type: %d", __LINE__, type);
+        return NULL;
+    }
+
+    outTime = (psTime*)psAlloc(sizeof(psTime));
+    if(outTime == NULL) {
+        psAbort(__func__, " : Line %d - Failed to allocate memory", __LINE__);
+    }
+
+    outTime->sec = 0;
+    outTime->usec = 0;
+    outTime->type = type;
+
+    return outTime;
 }
 
@@ -1004,4 +1025,5 @@
 psTime* psTimeAdd(const psTime *tai1, const psTime *tai2)
 {
+    psF64 deltaSec = 0;
     long deltaUsec = 0;
     psTime *outTime = NULL;
@@ -1010,4 +1032,10 @@
     if(tai1->type != tai2->type) {
         psError(__func__, " : Line %d - Argument types inconsistent for time addition", __LINE__);
+        return NULL;
+    } else if(tai1->usec >= 1e6) {
+        psError(__func__, " : Line %d - Argument 1 microseconds too big. Value %u", __LINE__, tai1->usec);
+        return NULL;
+    } else if(tai2->usec >= 1e6) {
+        psError(__func__, " : Line %d - Argument 2 microseconds too big. Value %u", __LINE__, tai2->usec);
         return NULL;
     }
@@ -1018,8 +1046,12 @@
     deltaUsec = tai1->usec + tai2->usec;
 
-    // Adjust time in case of microsecond overflow after subtraction
-    if(deltaUsec > 1e6) {
-        outTime->sec++;
-        outTime->usec = 2e6 - deltaUsec;
+    // Adjust time in case of microsecond overflow after addition
+    if(deltaUsec >= 1e6) {
+        if(deltaSec < 0 ) {
+            outTime->sec--; // Negative seconds - make more negative
+        } else {
+            outTime->sec++; // Positive seconds - make more positive
+        }
+        outTime->usec = deltaUsec - 1e6;
     } else {
         outTime->usec = deltaUsec;
@@ -1031,4 +1063,5 @@
 psTime* psTimeSubtract(const psTime *tai1, const psTime *tai2)
 {
+    psS64 deltaSec = 0;
     long deltaUsec = 0;
     psTime *outTime = NULL;
@@ -1038,14 +1071,24 @@
         psError(__func__, " : Line %d - Argument types inconsistent for time subtraction", __LINE__);
         return NULL;
+    } else if(tai1->usec >= 1e6) {
+        psError(__func__, " : Line %d - Argument 1 microseconds too big. Value %u", __LINE__, tai1->usec);
+        return NULL;
+    } else if(tai2->usec >= 1e6) {
+        psError(__func__, " : Line %d - Argument 2 microseconds too big. Value %u", __LINE__, tai2->usec);
+        return NULL;
     }
 
     ALLOC_TIME(outTime);
     outTime->type = tai1->type;
-    outTime->sec = tai1->sec - tai2->sec;
+    deltaSec = tai1->sec - tai2->sec;
     deltaUsec = (long)tai1->usec - (long)tai2->usec;
 
     // Adjust time in case of microsecond underflow after subtraction
     if(deltaUsec < 0) {
-        outTime->sec--;
+        if(deltaSec < 0) {
+            deltaSec++; // Negative seconds - make less negative
+        } else {
+            deltaSec--; // Positive seconds - make less positive
+        }
         outTime->usec = 1e6+deltaUsec;
     } else {
@@ -1053,4 +1096,6 @@
     }
 
+    outTime->sec = deltaSec;
+
     return outTime;
 }
@@ -1058,4 +1103,5 @@
 psTime* psTimeDelta(const psTime *tai1, const psTime *tai2)
 {
+    psS64 deltaSec = 0;
     long deltaUsec = 0;
     psTime *outTime = NULL;
@@ -1065,14 +1111,24 @@
         psError(__func__, " : Line %d - Argument types inconsistent for time subtraction", __LINE__);
         return NULL;
+    } else if(tai1->usec >= 1e6) {
+        psError(__func__, " : Line %d - Argument 1 microseconds too big. Value %u", __LINE__, tai1->usec);
+        return NULL;
+    } else if(tai2->usec >= 1e6) {
+        psError(__func__, " : Line %d - Argument 2 microseconds too big. Value %u", __LINE__, tai2->usec);
+        return NULL;
     }
 
     ALLOC_TIME(outTime);
     outTime->type = tai1->type;
-    outTime->sec = tai1->sec - tai2->sec;
-    deltaUsec = tai1->usec - tai2->usec;
+    deltaSec = tai1->sec - tai2->sec;
+    deltaUsec = (long)tai1->usec - (long)tai2->usec;
 
     // Adjust time in case of microsecond underflow after subtraction
     if(deltaUsec < 0) {
-        outTime->sec--;
+        if(deltaSec < 0) {
+            deltaSec++; // Negative seconds - make less negative
+        } else {
+            deltaSec--; // Positive seconds - make less positive
+        }
         outTime->usec = 1e6+deltaUsec;
     } else {
@@ -1080,5 +1136,5 @@
     }
 
-    outTime->sec = abs(outTime->sec);
+    outTime->sec = abs(deltaSec);
 
     return outTime;
Index: /trunk/psLib/src/astro/psTime.h
===================================================================
--- /trunk/psLib/src/astro/psTime.h	(revision 2178)
+++ /trunk/psLib/src/astro/psTime.h	(revision 2179)
@@ -54,6 +54,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-10-12 01:34:09 $
+ *  @version $Revision: 1.16 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-10-20 20:05:58 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -100,4 +100,15 @@
 psTime;
 
+/** Allocate time struct.
+ *
+ * Allocates an empty time struct. User must specify the psTimeType (PS_TIME_TAI or PS_TIME_UTC) in the argument.
+ * The seconds and microseconds members of the struct are set to zero.
+ *
+ * @return  psTime*: Struct with empty time.
+ */
+psTime* psTimeAlloc(
+    psTimeType type                     ///< Type of time to create (UTC or TAI).
+);
+
 /** Get current time.
  *
Index: /trunk/psLib/src/astronomy/psTime.c
===================================================================
--- /trunk/psLib/src/astronomy/psTime.c	(revision 2178)
+++ /trunk/psLib/src/astronomy/psTime.c	(revision 2179)
@@ -11,6 +11,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.34 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-10-15 19:10:50 $
+ *  @version $Revision: 1.35 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-10-20 20:05:51 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -482,4 +482,25 @@
 
     return out;
+}
+
+psTime* psTimeAlloc(psTimeType type)
+{
+    psTime *outTime = NULL;
+
+    if(type!=PS_TIME_TAI && type!=PS_TIME_UTC) {
+        psError(__func__, " : Line %d - Incorrect type. Type: %d", __LINE__, type);
+        return NULL;
+    }
+
+    outTime = (psTime*)psAlloc(sizeof(psTime));
+    if(outTime == NULL) {
+        psAbort(__func__, " : Line %d - Failed to allocate memory", __LINE__);
+    }
+
+    outTime->sec = 0;
+    outTime->usec = 0;
+    outTime->type = type;
+
+    return outTime;
 }
 
@@ -1004,4 +1025,5 @@
 psTime* psTimeAdd(const psTime *tai1, const psTime *tai2)
 {
+    psF64 deltaSec = 0;
     long deltaUsec = 0;
     psTime *outTime = NULL;
@@ -1010,4 +1032,10 @@
     if(tai1->type != tai2->type) {
         psError(__func__, " : Line %d - Argument types inconsistent for time addition", __LINE__);
+        return NULL;
+    } else if(tai1->usec >= 1e6) {
+        psError(__func__, " : Line %d - Argument 1 microseconds too big. Value %u", __LINE__, tai1->usec);
+        return NULL;
+    } else if(tai2->usec >= 1e6) {
+        psError(__func__, " : Line %d - Argument 2 microseconds too big. Value %u", __LINE__, tai2->usec);
         return NULL;
     }
@@ -1018,8 +1046,12 @@
     deltaUsec = tai1->usec + tai2->usec;
 
-    // Adjust time in case of microsecond overflow after subtraction
-    if(deltaUsec > 1e6) {
-        outTime->sec++;
-        outTime->usec = 2e6 - deltaUsec;
+    // Adjust time in case of microsecond overflow after addition
+    if(deltaUsec >= 1e6) {
+        if(deltaSec < 0 ) {
+            outTime->sec--; // Negative seconds - make more negative
+        } else {
+            outTime->sec++; // Positive seconds - make more positive
+        }
+        outTime->usec = deltaUsec - 1e6;
     } else {
         outTime->usec = deltaUsec;
@@ -1031,4 +1063,5 @@
 psTime* psTimeSubtract(const psTime *tai1, const psTime *tai2)
 {
+    psS64 deltaSec = 0;
     long deltaUsec = 0;
     psTime *outTime = NULL;
@@ -1038,14 +1071,24 @@
         psError(__func__, " : Line %d - Argument types inconsistent for time subtraction", __LINE__);
         return NULL;
+    } else if(tai1->usec >= 1e6) {
+        psError(__func__, " : Line %d - Argument 1 microseconds too big. Value %u", __LINE__, tai1->usec);
+        return NULL;
+    } else if(tai2->usec >= 1e6) {
+        psError(__func__, " : Line %d - Argument 2 microseconds too big. Value %u", __LINE__, tai2->usec);
+        return NULL;
     }
 
     ALLOC_TIME(outTime);
     outTime->type = tai1->type;
-    outTime->sec = tai1->sec - tai2->sec;
+    deltaSec = tai1->sec - tai2->sec;
     deltaUsec = (long)tai1->usec - (long)tai2->usec;
 
     // Adjust time in case of microsecond underflow after subtraction
     if(deltaUsec < 0) {
-        outTime->sec--;
+        if(deltaSec < 0) {
+            deltaSec++; // Negative seconds - make less negative
+        } else {
+            deltaSec--; // Positive seconds - make less positive
+        }
         outTime->usec = 1e6+deltaUsec;
     } else {
@@ -1053,4 +1096,6 @@
     }
 
+    outTime->sec = deltaSec;
+
     return outTime;
 }
@@ -1058,4 +1103,5 @@
 psTime* psTimeDelta(const psTime *tai1, const psTime *tai2)
 {
+    psS64 deltaSec = 0;
     long deltaUsec = 0;
     psTime *outTime = NULL;
@@ -1065,14 +1111,24 @@
         psError(__func__, " : Line %d - Argument types inconsistent for time subtraction", __LINE__);
         return NULL;
+    } else if(tai1->usec >= 1e6) {
+        psError(__func__, " : Line %d - Argument 1 microseconds too big. Value %u", __LINE__, tai1->usec);
+        return NULL;
+    } else if(tai2->usec >= 1e6) {
+        psError(__func__, " : Line %d - Argument 2 microseconds too big. Value %u", __LINE__, tai2->usec);
+        return NULL;
     }
 
     ALLOC_TIME(outTime);
     outTime->type = tai1->type;
-    outTime->sec = tai1->sec - tai2->sec;
-    deltaUsec = tai1->usec - tai2->usec;
+    deltaSec = tai1->sec - tai2->sec;
+    deltaUsec = (long)tai1->usec - (long)tai2->usec;
 
     // Adjust time in case of microsecond underflow after subtraction
     if(deltaUsec < 0) {
-        outTime->sec--;
+        if(deltaSec < 0) {
+            deltaSec++; // Negative seconds - make less negative
+        } else {
+            deltaSec--; // Positive seconds - make less positive
+        }
         outTime->usec = 1e6+deltaUsec;
     } else {
@@ -1080,5 +1136,5 @@
     }
 
-    outTime->sec = abs(outTime->sec);
+    outTime->sec = abs(deltaSec);
 
     return outTime;
Index: /trunk/psLib/src/astronomy/psTime.h
===================================================================
--- /trunk/psLib/src/astronomy/psTime.h	(revision 2178)
+++ /trunk/psLib/src/astronomy/psTime.h	(revision 2179)
@@ -54,6 +54,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-10-12 01:34:09 $
+ *  @version $Revision: 1.16 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-10-20 20:05:58 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -100,4 +100,15 @@
 psTime;
 
+/** Allocate time struct.
+ *
+ * Allocates an empty time struct. User must specify the psTimeType (PS_TIME_TAI or PS_TIME_UTC) in the argument.
+ * The seconds and microseconds members of the struct are set to zero.
+ *
+ * @return  psTime*: Struct with empty time.
+ */
+psTime* psTimeAlloc(
+    psTimeType type                     ///< Type of time to create (UTC or TAI).
+);
+
 /** Get current time.
  *
