diff options
Diffstat (limited to 'src/location-manual.c')
-rw-r--r-- | src/location-manual.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/location-manual.c b/src/location-manual.c new file mode 100644 index 0000000..1f68b6c --- /dev/null +++ b/src/location-manual.c @@ -0,0 +1,113 @@ +/* location-manual.c -- Manual location provider source + This file is part of Redshift. + + Redshift is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Redshift is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Redshift. If not, see <http://www.gnu.org/licenses/>. + + Copyright (c) 2010 Jon Lund Steffensen <jonlst@gmail.com> +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> +#include <errno.h> + +#include "location-manual.h" + +#ifdef ENABLE_NLS +# include <libintl.h> +# define _(s) gettext(s) +#else +# define _(s) s +#endif + + +int +location_manual_init(location_manual_state_t *state) +{ + state->lat = NAN; + state->lon = NAN; + + return 0; +} + +int +location_manual_start(location_manual_state_t *state) +{ + /* Latitude and longitude must be set */ + if (isnan(state->lat) || isnan(state->lon)) { + fputs(_("Latitude and longitude must be set.\n"), stderr); + exit(EXIT_FAILURE); + } + + return 0; +} + +void +location_manual_free(location_manual_state_t *state) +{ +} + +void +location_manual_print_help(FILE *f) +{ + fputs(_("Specify location manually.\n"), f); + fputs("\n", f); + + /* TRANSLATORS: Manual location help output + left column must not be translated */ + fputs(_(" lat=N\t\tLatitude\n" + " lon=N\t\tLongitude\n"), f); + fputs("\n", f); +} + +int +location_manual_set_option(location_manual_state_t *state, const char *key, + const char *value) +{ + /* Parse float value */ + char *end; + errno = 0; + float v = strtof(value, &end); + if (errno != 0 || *end != '\0') { + fputs(_("Malformed argument.\n"), stderr); + return -1; + } + + if ((key == NULL && isnan(state->lat)) || + (key != NULL && strcasecmp(key, "lat") == 0)) { + state->lat = v; + } else if ((key == NULL && isnan(state->lon)) || + (key != NULL && strcasecmp(key, "lon") == 0)) { + state->lon = v; + } else if (key == NULL) { + fputs(_("Too many arguments.\n"), stderr); + return -1; + } else { + fprintf(stderr, _("Unknown method parameter: `%s'.\n"), key); + return -1; + } + + return 0; +} + +int +location_manual_get_location(location_manual_state_t *state, float *lat, + float *lon) +{ + *lat = state->lat; + *lon = state->lon; + + return 0; +} |