From cf13f0eb246a9f88b211a052c35b25dfa39063a4 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 3 May 2013 20:44:28 +0200 Subject: [PATCH] improved object name parsing --- src/objects.c | 81 ++++++++++++++++++++++++++++++--------------------- src/objects.h | 28 +++++++++--------- 2 files changed, 62 insertions(+), 47 deletions(-) diff --git a/src/objects.c b/src/objects.c index 5e3643e..8655131 100644 --- a/src/objects.c +++ b/src/objects.c @@ -27,18 +27,32 @@ #include "objects.h" -void object_pos(enum object obj, double jd, struct ln_lnlat_posn *obs, struct object_details *details) { +const char* objects[] = { + NULL, /* invalid */ + "sun", + "moon", + "mars", + "neptune", + "jupiter", + "mercury", + "uranus", + "saturn", + "venus", + "pluto" +}; + +void object_pos(enum object obj, double jd, struct object_details *details) { switch (obj) { - case OBJECT_SUN: return object_pos_sun(jd, obs, details); - case OBJECT_MOON: return object_pos_moon(jd, obs, details); - case OBJECT_MARS: return object_pos_mars(jd, obs, details); - case OBJECT_NEPTUNE: return object_pos_neptune(jd, obs, details); - case OBJECT_JUPITER: return object_pos_jupiter(jd, obs, details); - case OBJECT_MERCURY: return object_pos_mercury(jd, obs, details); - case OBJECT_URANUS: return object_pos_uranus(jd, obs, details); - case OBJECT_SATURN: return object_pos_saturn(jd, obs, details); - case OBJECT_VENUS: return object_pos_venus(jd, obs, details); - case OBJECT_PLUTO: return object_pos_pluto(jd, obs, details); + case OBJECT_SUN: return object_pos_sun(jd, details); + case OBJECT_MOON: return object_pos_moon(jd, details); + case OBJECT_MARS: return object_pos_mars(jd, details); + case OBJECT_NEPTUNE: return object_pos_neptune(jd, details); + case OBJECT_JUPITER: return object_pos_jupiter(jd, details); + case OBJECT_MERCURY: return object_pos_mercury(jd, details); + case OBJECT_URANUS: return object_pos_uranus(jd, details); + case OBJECT_SATURN: return object_pos_saturn(jd, details); + case OBJECT_VENUS: return object_pos_venus(jd, details); + case OBJECT_PLUTO: return object_pos_pluto(jd, details); } } @@ -57,86 +71,85 @@ int object_rst(enum object obj, double jd, double horizon, struct ln_lnlat_posn } } -enum object object_from_name(const char *name, bool casesen) { - // TODO case sensivity +enum object object_from_name(const char *name) { + int c; + for (c = 1; c <= OBJECTS; c++) { + if (strcmp(objects[c], name) == 0) { + return (enum object) c; + } + } - if (strcmp(name, "sun") == 0) return OBJECT_SUN; - else if (strcmp(name, "moon") == 0) return OBJECT_MOON; - else if (strcmp(name, "mars") == 0) return OBJECT_MARS; - else if (strcmp(name, "neptune") == 0) return OBJECT_NEPTUNE; - else if (strcmp(name, "jupiter") == 0) return OBJECT_JUPITER; - else if (strcmp(name, "mercury") == 0) return OBJECT_MERCURY; - else if (strcmp(name, "uranus") == 0) return OBJECT_URANUS; - else if (strcmp(name, "saturn") == 0) return OBJECT_SATURN; - else if (strcmp(name, "venus") == 0) return OBJECT_VENUS; - else if (strcmp(name, "pluto") == 0) return OBJECT_PLUTO; - else return OBJECT_INVALID; + return OBJECT_INVALID; } -void object_pos_sun(double jd, struct ln_lnlat_posn *obs, struct object_details *details) { +const char * object_to_name(enum object obj) { + return objects[obj]; +} + +void object_pos_sun(double jd, struct object_details *details) { ln_get_solar_equ_coords(jd, &details->equ); details->distance = ln_get_earth_solar_dist(jd); details->diameter = ln_get_solar_sdiam(jd); } -void object_pos_moon(double jd, struct ln_lnlat_posn *obs, struct object_details *details) { +void object_pos_moon(double jd, struct object_details *details) { ln_get_lunar_equ_coords(jd, &details->equ); details->distance = ln_get_lunar_earth_dist(jd) / AU_METERS; details->diameter = ln_get_lunar_sdiam(jd); } -void object_pos_mars(double jd, struct ln_lnlat_posn *obs, struct object_details *details) { +void object_pos_mars(double jd, struct object_details *details) { ln_get_mars_equ_coords(jd, &details->equ); details->distance = ln_get_mars_earth_dist(jd); details->diameter = ln_get_mars_sdiam(jd); } -void object_pos_neptune(double jd, struct ln_lnlat_posn *obs, struct object_details *details) { +void object_pos_neptune(double jd, struct object_details *details) { ln_get_neptune_equ_coords(jd, &details->equ); details->distance = ln_get_neptune_earth_dist(jd); details->diameter = ln_get_neptune_sdiam(jd); } -void object_pos_jupiter(double jd, struct ln_lnlat_posn *obs, struct object_details *details) { +void object_pos_jupiter(double jd, struct object_details *details) { ln_get_jupiter_equ_coords(jd, &details->equ); details->distance = ln_get_jupiter_earth_dist(jd); details->diameter = ln_get_jupiter_equ_sdiam(jd); } -void object_pos_mercury(double jd, struct ln_lnlat_posn *obs, struct object_details *details) { +void object_pos_mercury(double jd, struct object_details *details) { ln_get_mercury_equ_coords(jd, &details->equ); details->distance = ln_get_mercury_earth_dist(jd); details->diameter = ln_get_mercury_sdiam(jd); } -void object_pos_uranus(double jd, struct ln_lnlat_posn *obs, struct object_details *details) { +void object_pos_uranus(double jd, struct object_details *details) { ln_get_uranus_equ_coords(jd, &details->equ); details->distance = ln_get_uranus_earth_dist(jd); details->diameter = ln_get_uranus_sdiam(jd); } -void object_pos_saturn(double jd, struct ln_lnlat_posn *obs, struct object_details *details) { +void object_pos_saturn(double jd, struct object_details *details) { ln_get_saturn_equ_coords(jd, &details->equ); details->distance = ln_get_saturn_earth_dist(jd); details->diameter = ln_get_saturn_equ_sdiam(jd); } -void object_pos_venus(double jd, struct ln_lnlat_posn *obs, struct object_details *details) { +void object_pos_venus(double jd, struct object_details *details) { ln_get_venus_equ_coords(jd, &details->equ); details->distance = ln_get_venus_earth_dist(jd); details->diameter = ln_get_venus_sdiam(jd); } -void object_pos_pluto(double jd, struct ln_lnlat_posn *obs, struct object_details *details) { +void object_pos_pluto(double jd, struct object_details *details) { ln_get_pluto_equ_coords(jd, &details->equ); details->distance = ln_get_pluto_earth_dist(jd); diff --git a/src/objects.h b/src/objects.h index 6e41642..92bcb44 100644 --- a/src/objects.h +++ b/src/objects.h @@ -31,6 +31,7 @@ #include #define AU_METERS 149597870.7 +#define OBJECTS 10 enum object { OBJECT_INVALID, @@ -48,7 +49,7 @@ enum object { struct object_details { double jd; /* julian date of observation */ - double tz; /* timezone of observer */ + int tz; /* timezone of observer */ double diameter; /* in arc seconds */ double distance; /* in AU */ @@ -61,20 +62,21 @@ struct object_details { const char *azidir; /* direction of azimuth - like N,S,W,E,NSW,.. */ }; -enum object object_from_name(const char *name, bool casesen); +enum object object_from_name(const char *name); +const char * object_to_name(enum object obj); -void object_pos(enum object obj, double jd, struct ln_lnlat_posn *obs, struct object_details *details); +void object_pos(enum object obj, double jd, struct object_details *details); int object_rst(enum object obj, double jd, double horizon, struct ln_lnlat_posn *obs, struct ln_rst_time *rst); -void object_pos_sun(double jd, struct ln_lnlat_posn *obs, struct object_details *details); -void object_pos_moon(double jd, struct ln_lnlat_posn *obs, struct object_details *details); -void object_pos_mars(double jd, struct ln_lnlat_posn *obs, struct object_details *details); -void object_pos_neptune(double jd, struct ln_lnlat_posn *obs, struct object_details *details); -void object_pos_jupiter(double jd, struct ln_lnlat_posn *obs, struct object_details *details); -void object_pos_mercury(double jd, struct ln_lnlat_posn *obs, struct object_details *details); -void object_pos_uranus(double jd, struct ln_lnlat_posn *obs, struct object_details *details); -void object_pos_saturn(double jd, struct ln_lnlat_posn *obs, struct object_details *details); -void object_pos_venus(double jd, struct ln_lnlat_posn *obs, struct object_details *details); -void object_pos_pluto(double jd, struct ln_lnlat_posn *obs, struct object_details *details); +void object_pos_sun(double jd, struct object_details *details); +void object_pos_moon(double jd, struct object_details *details); +void object_pos_mars(double jd, struct object_details *details); +void object_pos_neptune(double jd, struct object_details *details); +void object_pos_jupiter(double jd, struct object_details *details); +void object_pos_mercury(double jd, struct object_details *details); +void object_pos_uranus(double jd, struct object_details *details); +void object_pos_saturn(double jd, struct object_details *details); +void object_pos_venus(double jd, struct object_details *details); +void object_pos_pluto(double jd, struct object_details *details); #endif /* _OBJECTS_H_ */