Changeset 4836
- Timestamp:
- Aug 20, 2005, 4:54:04 AM (21 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/imregister/base/misc.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/imregister/base/misc.c
r3534 r4836 5 5 tz = dt; 6 6 } 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 194 # define FORMAT_HOURS 295 # define FORMAT_MINUTES 396 # define FORMAT_SECONDS 497 # define FORMAT_JD 598 # define FORMAT_DATE 699 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:30318 99:02:15:12h23m30s319 */320 321 7 322 8 /* return values:
Note:
See TracChangeset
for help on using the changeset viewer.
