IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 4836


Ignore:
Timestamp:
Aug 20, 2005, 4:54:04 AM (21 years ago)
Author:
eugene
Message:

time modifications

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/imregister/base/misc.c

    r3534 r4836  
    55  tz = dt;
    66}
    7 
    8 /***** convert [-]00:00:00 to 0.0000 ****/
    9 int dms_to_ddd (double *Value, char *string) {
    10  
    11   int valid, neg, status;
    12   double tmp, value;
    13   char *p1, *p2, *px;
    14 
    15   valid = FALSE;
    16   neg = FALSE;
    17   stripwhite (string);
    18   p1 = string;
    19   px = string + strlen(string);
    20 
    21   if (string[0] == '-') {
    22     valid = TRUE;
    23     neg = TRUE;
    24     p1 = &string[1];
    25   }
    26   if (string[0] == '+') {
    27     valid = TRUE;
    28     neg = FALSE;
    29     p1 = &string[1];
    30   }
    31   if (isdigit(string[0])) {
    32     valid = TRUE;
    33     p1 = &string[0];
    34   }
    35   if (!valid) { return (FALSE); }
    36 
    37   status = 1;
    38   tmp = strtod (p1, &p2);
    39   if (p2 == p1) return (FALSE); /* entry not a number: +fred */
    40   value = tmp;
    41   if (p2 == px) goto escape;    /* entry only number: +1.0 */
    42   p1 = p2 + 1;
    43 
    44   tmp = strtod (p1, &p2);
    45   if (p2 == p1) goto escape;    /* entry not a number: +1:fred */
    46   status = 2;
    47   value += tmp / 60.0;
    48   if (p2 == px) goto escape;    /* entry only number: +1:1 */
    49   p1 = p2 + 1;
    50 
    51   tmp = strtod (p1, &p2);
    52   if (p2 == p1) goto escape;    /* entry not a number: +1:1:fred */
    53   value += tmp / 3600.0;
    54 
    55  escape:
    56   if (neg) {
    57     value *= -1;
    58   }
    59   *Value = value;
    60 
    61   return (status);
    62 }
    63 
    64 /**********/
    65 int str_to_radec (double *ra, double *dec, char *str1, char *str2) {
    66 
    67   double Ra, Dec;
    68 
    69   *ra = *dec = 0;
    70   switch (dms_to_ddd (&Ra, str1)) {
    71   case 0:
    72     fprintf (stderr, "syntax error in RA\n");
    73     return (FALSE);
    74   case 1:
    75     break;
    76   case 2:
    77     Ra = Ra * 15;
    78     break;
    79   }
    80   switch (dms_to_ddd (&Dec, str2)) {
    81   case 0:
    82     fprintf (stderr, "syntax error in DEC\n");
    83     return (FALSE);
    84   case 1:
    85   case 2:
    86     break;
    87   }
    88   *ra = Ra;
    89   *dec = Dec;
    90   return (TRUE);
    91 }
    92 
    93 # define FORMAT_DAYS    1
    94 # define FORMAT_HOURS   2
    95 # define FORMAT_MINUTES 3
    96 # define FORMAT_SECONDS 4
    97 # define FORMAT_JD      5
    98 # define FORMAT_DATE    6
    99 
    100 /**********/
    101 int chk_time (char *line) {
    102 
    103   char *p1, *p2;
    104   double tmp;
    105   int mode;
    106 
    107   mode = FORMAT_DATE;
    108 
    109   p1 = line;
    110   tmp = strtod (p1, &p2);
    111   if (p2 == p1 + strlen (p1) - 1) {
    112     if (*p2 == 'd') {
    113       mode = FORMAT_DAYS;
    114     }
    115     if (*p2 == 'h') {
    116       mode = FORMAT_HOURS;
    117     }
    118     if (*p2 == 'm') {
    119       mode = FORMAT_MINUTES;
    120     }
    121     if (*p2 == 's') {
    122       mode = FORMAT_SECONDS;
    123     }
    124     if (*p2 == 'j') {
    125       mode = FORMAT_JD;
    126     }
    127   }
    128   return (mode);
    129 }
    130 
    131 /**********/
    132 int str_to_time (char *line, unsigned long *second) {
    133  
    134   struct timeval now;
    135   double jd;
    136 
    137   if (!strcasecmp (line, "NOW")) {
    138     gettimeofday (&now, (struct timezone *) NULL);
    139     *second = now.tv_sec;
    140     return (TRUE);
    141   }
    142    
    143   if (!strcasecmp (line, "TODAY")) {
    144     gettimeofday (&now, (struct timezone *) NULL);
    145     *second = 86400 * ((int)(now.tv_sec / 86400));
    146     return (TRUE);
    147   }
    148    
    149   switch (chk_time (line)) {
    150   case 0:
    151     return (FALSE);
    152   case FORMAT_DAYS:
    153     *second = strtod (line, 0) * 86400.0;
    154     return (TRUE);
    155   case FORMAT_HOURS:
    156     *second = strtod (line, 0) * 3600.0;
    157     return (TRUE);
    158   case FORMAT_MINUTES:
    159     *second = strtod (line, 0) * 60.0;
    160     return (TRUE);
    161   case FORMAT_SECONDS:
    162     *second = strtod (line, 0);
    163     return (TRUE);
    164   case FORMAT_JD:
    165     jd = strtod (line, 0);
    166     *second = jd_to_sec (jd);
    167     return (TRUE);
    168   case FORMAT_DATE:
    169     *second = date_to_sec (line);
    170     return (TRUE);
    171   }
    172   return (FALSE);
    173 }
    174 
    175 /**********/
    176 int str_to_dtime (char *line, double *second) {
    177  
    178   switch (chk_time (line)) {
    179   case 0:
    180   case FORMAT_JD:
    181   case FORMAT_DATE:
    182     return (FALSE);
    183   case FORMAT_DAYS:
    184     *second = strtod (line, 0) * 86400.0;
    185     return (TRUE);
    186   case FORMAT_HOURS:
    187     *second = strtod (line, 0) * 3600.0;
    188     return (TRUE);
    189   case FORMAT_MINUTES:
    190     *second = strtod (line, 0) * 60.0;
    191     return (TRUE);
    192   case FORMAT_SECONDS:
    193     *second = strtod (line, 0);
    194     return (TRUE);
    195   }
    196   return (FALSE);
    197 }
    198 
    199 /**********/
    200 double sec_to_jd (unsigned long second) {
    201 
    202   double jd;
    203  
    204   jd = second/86400.0 + 2440587.5;
    205   return (jd);
    206 }
    207 
    208 /**********/
    209 unsigned long int jd_to_sec (double jd) {
    210 
    211   unsigned long int second;
    212 
    213   second = (jd - 2440587.5)*86400;
    214   return (second);
    215 }
    216 
    217 /**********/
    218 double sec_to_mjd (unsigned long second) {
    219 
    220   double mjd;
    221  
    222   mjd = second/86400.0 + 40587.0;
    223   return (mjd);
    224 }
    225 
    226 /**********/
    227 unsigned long int mjd_to_sec (double mjd) {
    228 
    229   unsigned long int second;
    230 
    231   second = (mjd - 40587.0)*86400;
    232   return (second);
    233 }
    234 
    235 /**********/
    236 char *sec_to_date (unsigned long second) {
    237  
    238   struct tm *gmt;
    239   char *line;
    240  
    241   ALLOCATE (line, char, 64);
    242   second -= 3600*tz;
    243   gmt   = gmtime (&second);
    244   snprintf (line, 64, "%4d/%02d/%02d,%02d:%02d:%02d", 1900+gmt[0].tm_year, gmt[0].tm_mon+1, gmt[0].tm_mday, gmt[0].tm_hour, gmt[0].tm_min, gmt[0].tm_sec);
    245   return (line);
    246 
    247 }
    248 
    249 /***** date in format yyyy/mm/dd,hh:mm:ss *****/
    250 unsigned long date_to_sec (char *date) {
    251  
    252   unsigned long second;
    253   double tmp, jd;
    254   struct tm now;
    255   char *p1, *p2, *px;
    256  
    257   p1 = date;
    258   px = date + strlen(date);
    259   bzero (&now, sizeof(now));
    260 
    261   tmp = strtod (p1, &p2);
    262   if (p2 == p1) goto escape;
    263   now.tm_year = tmp;
    264   if (now.tm_year > 1000) now.tm_year -= 1900;
    265   if (now.tm_year <   50) now.tm_year += 100;
    266   if (p2 == px) goto escape; 
    267   p1 = p2 + 1;
    268 
    269   tmp = strtod (p1, &p2);
    270   if (p2 == p1) goto escape;
    271   now.tm_mon = tmp - 1; /* mon runs from 0 - 11 */
    272   if (p2 == px) goto escape; 
    273   p1 = p2 + 1;
    274 
    275   tmp = strtod (p1, &p2);
    276   if (p2 == p1) goto escape;
    277   now.tm_mday = tmp;
    278   if (p2 == px) goto escape; 
    279   p1 = p2 + 1;
    280 
    281   tmp = strtod (p1, &p2);
    282   if (p2 == p1) goto escape;
    283   p1 = p2 + 1;
    284   now.tm_hour = tmp;
    285   if (p2 == px) goto escape; 
    286 
    287   tmp = strtod (p1, &p2);
    288   if (p2 == p1) goto escape;
    289   now.tm_min = tmp;
    290   if (p2 == px) goto escape; 
    291   p1 = p2 + 1;
    292 
    293   tmp = strtod (p1, &p2);
    294   if (p2 == p1) goto escape;
    295   now.tm_sec = tmp;
    296   if (p2 == px) goto escape; 
    297   p1 = p2 + 1;
    298 
    299  escape:
    300   jd = now.tm_mday - 32075 + (int)(1461*(1900 + now.tm_year + 4800 + (int)(((now.tm_mon+1)-14)/12))/4)
    301     + (int)(367*((now.tm_mon+1) - 2 - (int)(((now.tm_mon+1) - 14)/12)*12)/12)
    302     - (int)(3*(int)((1900 + now.tm_year + 4900 + (int)(((now.tm_mon+1) - 14)/12))/100)/4) - 0.5;
    303  
    304   second = (jd - 2440587.5)*86400 + 3600.0*now.tm_hour + now.tm_min*60.0 + now.tm_sec;
    305 
    306   second += 3600*tz;
    307 
    308   return (second);
    309 }
    310 
    311 
    312 /* times may be in forms as:
    313    20040200450s (N seconds since 1970.0)
    314    2440900.232j (julian date)
    315    99/02/23,03:22:18 (date string)
    316    (separators may be anything except space, +, -)
    317    99:02:15:12:23:30
    318    99:02:15:12h23m30s
    319    */
    320 
    3217
    3228/* return values:
Note: See TracChangeset for help on using the changeset viewer.