geopoint/c/GeoPoint.c

Run Settings
LanguageC
Language Version
Run Command
#include <stdio.h> #include <stdlib.h> #define GEO_OK 1 #define GEO_ERROR -10000 #define GEO_INVALID_LAT -10001 #define GEO_INVALID_LON -10002 float check_longitude(float lon) { if (lon < -180 || lon > 180) return GEO_INVALID_LON; return lon; } float check_latitude(float lat) { if (lat <= -90 || lat > 90) return GEO_INVALID_LAT; return lat; } typedef struct { float lat; float lon; } GeoPoint; int geopoint_check_error(GeoPoint *geo) { if (geo->lat < GEO_ERROR) return GEO_INVALID_LAT; if (geo->lon < GEO_ERROR) return GEO_INVALID_LON; return GEO_OK; } char *geopoint_error_message(int error) { switch (error) { case GEO_INVALID_LAT: return "latitude is invalid"; case GEO_INVALID_LON: return "longitude is invalid"; default: return "OK"; } } void geopoint_init(GeoPoint *geo, float lat, float lon) { geo->lat = check_latitude(lat); geo->lon = check_longitude(lon); } void geopoint_set_lat(GeoPoint *geo, float lat) { geo->lat = check_latitude(lat); } void geopoint_set_lon(GeoPoint *geo, float lon) { geo->lon = check_longitude(lon); } char *geopoint_gist(char *out, size_t size, GeoPoint *geo) { snprintf(out, size, "%s%f %s%f", geo->lat >= 0 ? "N" : "S", fabs(geo->lat), geo->lon >= 0 ? "E" : "W", fabs(geo->lon) ); return out; } void die(char *msg) { printf("%s", msg); exit(1); } int main(void) { GeoPoint geo; geopoint_init(&geo, 39.1915045, -96.6070506); int error = geopoint_check_error(&geo); if (error != GEO_OK) die(geopoint_error_message(error)); printf("%f\n", geo.lat); printf("%f\n", geo.lon); char *msg = malloc(255); printf("%s\n", geopoint_gist(msg, 255, &geo)); free(msg); return 0; }
Editor Settings
Theme
Key bindings
Full width
Lines