Index: trunk/psLib/src/astro/psTime.c
===================================================================
--- trunk/psLib/src/astro/psTime.c	(revision 6204)
+++ trunk/psLib/src/astro/psTime.c	(revision 6268)
@@ -10,6 +10,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.79 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-01-26 21:10:22 $
+ *  @version $Revision: 1.80 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-01-31 23:24:21 $
  *
  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -93,4 +93,5 @@
 static psTime* convertTimeTTTAI(psTime* time);
 static psTime* convertTimeUTCUT1(psTime* time);
+
 
 /** Removes leading and trailing whitespace and # characters from a string. The cleaned string is a new null
@@ -581,4 +582,6 @@
     time->type = PS_TIME_TAI;
 
+    //XXX: Set leapseconds to TRUE
+    //    time->leapsecond = true;
     return time;
 }
@@ -676,4 +679,5 @@
     if(time->type == PS_TIME_UT1) {
         psError(PS_ERR_BAD_PARAMETER_VALUE,true,"Cannot convert from UT1 time type");
+        //        return NULL;
         return time;
     }
@@ -1161,6 +1165,13 @@
 
     // Determine Julian and modified Julian dates used in table lookup and time delta calculation
-    jd = psTimeToJD(time);
-    mjd = psTimeToMJD(time);
+    if(time->sec < 0) {
+        // psTime earlier than epoch
+        jd = time->sec / SEC_PER_DAY - time->nsec / NSEC_PER_DAY + JD_EPOCH_OFFSET;
+        mjd = time->sec / SEC_PER_DAY - time->nsec / NSEC_PER_DAY + MJD_EPOCH_OFFSET;
+    } else {
+        // psTime greater than epoch
+        jd = time->sec / SEC_PER_DAY + time->nsec / NSEC_PER_DAY + JD_EPOCH_OFFSET;
+        mjd = time->sec / SEC_PER_DAY + time->nsec / NSEC_PER_DAY + MJD_EPOCH_OFFSET;
+    }
 
     // Set ceiling of the julian date to the last entry in the lookup table
@@ -1205,5 +1216,4 @@
     PS_ASSERT_INT_WITHIN_RANGE(time2->nsec,0,(psU32)((1e9)-1),0);
     diff = abs((psS64)p_psTimeGetTAIDelta((psTime*)time1)-(psS64)p_psTimeGetTAIDelta((psTime*)time2));
-
     return diff;
 }
@@ -1248,12 +1258,20 @@
     PS_ASSERT_INT_WITHIN_RANGE(time->nsec,0,(psU32)((1e9)-1),NAN);
 
+    psTime *time2 = p_psTimeCopy(time);
+    //XXX: ADD says that this formula works only for PS_TIME_TAI, so adding the following:
+    if (time->type == PS_TIME_UTC || time->type == PS_TIME_TT) {
+        time2 = psTimeConvert(time2, PS_TIME_TAI);
+    }
+
     // Julian date conversion
-    if(time->sec < 0) {
+    if(time2->sec < 0) {
         // psTime earlier than epoch
-        jd = time->sec / SEC_PER_DAY - time->nsec / NSEC_PER_DAY + JD_EPOCH_OFFSET;
+        jd = time2->sec / SEC_PER_DAY - time2->nsec / NSEC_PER_DAY + JD_EPOCH_OFFSET;
     } else {
         // psTime greater than epoch
-        jd = time->sec / SEC_PER_DAY + time->nsec / NSEC_PER_DAY + JD_EPOCH_OFFSET;
-    }
+        jd = time2->sec / SEC_PER_DAY + time2->nsec / NSEC_PER_DAY + JD_EPOCH_OFFSET;
+    }
+
+    psFree(time2);
     return jd;
 }
@@ -1266,13 +1284,19 @@
     PS_ASSERT_PTR_NON_NULL(time,NAN);
     PS_ASSERT_INT_WITHIN_RANGE(time->nsec,0,(psU32)((1e9)-1),NAN);
+    psTime *time2 = p_psTimeCopy(time);
+    //XXX: ADD says that this formula works only for PS_TIME_TAI, so adding the following:
+    if (time->type == PS_TIME_UTC || time->type == PS_TIME_TT) {
+        time2 = psTimeConvert(time2, PS_TIME_TAI);
+    }
 
     // Modified Julian date conversion
-    if(time->sec < 0) {
+    if(time2->sec < 0) {
         // psTime earlier than epoch
-        mjd = time->sec / SEC_PER_DAY - time->nsec / NSEC_PER_DAY + MJD_EPOCH_OFFSET;
+        mjd = time2->sec / SEC_PER_DAY - time2->nsec / NSEC_PER_DAY + MJD_EPOCH_OFFSET;
     } else {
         // psTime greater than epoch
-        mjd = time->sec / SEC_PER_DAY + time->nsec / NSEC_PER_DAY + MJD_EPOCH_OFFSET;
-    }
+        mjd = time2->sec / SEC_PER_DAY + time2->nsec / NSEC_PER_DAY + MJD_EPOCH_OFFSET;
+    }
+    psFree(time2);
     return mjd;
 }
@@ -1810,6 +1834,10 @@
     PS_ASSERT_PTR_NON_NULL(inTime, NULL);
     psTime *outTime = psTimeAlloc(inTime->type);
-    *outTime = *inTime;
+    //    *outTime = *inTime;
+    outTime->sec = inTime->sec;
+    outTime->nsec = inTime->nsec;
+    outTime->leapsecond = inTime->leapsecond;
     return outTime;
 }
 
+
