commit 1198f783db53c8561ca78bb9240b749eb0a00e64
parent 0e5e6cec1ace21d11e4b3fd2568b3a7aa0a7cd54
Author: Tomas Hlavaty <tom@logand.com>
Date: Thu, 12 Sep 2019 15:44:23 +0200
readability
Diffstat:
M | osmq | | | 3 | +-- |
M | osmtile.c | | | 184 | ++++++++++++++++++++++++++++++++++--------------------------------------------- |
2 files changed, 79 insertions(+), 108 deletions(-)
diff --git a/osmq b/osmq
@@ -1,6 +1,5 @@
#!/usr/bin/env bash
-set -e
-set -o pipefail
+set -euo pipefail
read \
LAT \
LON \
diff --git a/osmtile.c b/osmtile.c
@@ -5,6 +5,8 @@
#include <sys/wait.h>
#include <unistd.h>
+#define fail(z, ...) ({fprintf(stderr, __VA_ARGS__); exit(z);})
+
/* https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames */
static int long2tilex(double lon, int z) {
return (int)(floor((lon + 180.0) / 360.0 * pow(2.0, z)));
@@ -24,53 +26,54 @@ static double tiley2lat(int y, int z) {
}
static int zoom_from_string(char *string) {
- int z;
- if(!string) goto fail;
- if(1 != sscanf(string, "%d", &z)) goto fail;
- if(z < 0 || 18 < z) goto fail;
- return z;
- fail:
- fprintf(stderr, "expected zoom 0 <= %s <= 18\n", string);
- exit(1);
+ if(string) {
+ int z;
+ if(1 == sscanf(string, "%d", &z)) {
+ if(0 <= z && z <= 18) {
+ return z;
+ }
+ }
+ }
+ fail(1, "expected zoom 0 <= %s <= 18\n", string);
}
-static int lat(int argc, char *argv[]) {
+static int main_lat(int argc, char *argv[]) {
int z = zoom_from_string(argv[0]);
char *value = argv[1];
- if(!value) goto fail;
- int y;
- if(1 != sscanf(value, "%d", &y)) goto fail;
- printf("%lf\n", tiley2lat(y, z));
- return 0;
- fail:
- fprintf(stderr, "unexpected y %s\n", value);
- return 1;
+ if(value) {
+ int y;
+ if(1 == sscanf(value, "%d", &y)) {
+ printf("%lf\n", tiley2lat(y, z));
+ return 0;
+ }
+ }
+ fail(1, "unexpected y %s\n", value);
}
-static int lon(int argc, char *argv[]) {
+static int main_lon(int argc, char *argv[]) {
int z = zoom_from_string(argv[0]);
char *value = argv[1];
- if(!value) goto fail;
- int x;
- if(1 != sscanf(value, "%d", &x)) goto fail;
- printf("%lf\n", tilex2long(x, z));
- return 0;
- fail:
- fprintf(stderr, "unexpected x %s\n", value);
- return 1;
+ if(value) {
+ int x;
+ if(1 == sscanf(value, "%d", &x)) {
+ printf("%lf\n", tilex2long(x, z));
+ return 0;
+ }
+ }
+ fail(1, "unexpected x %s\n", value);
}
static double lon_from_string(char *string) {
- if(!string) goto fail;
- double z;
- if(1 != sscanf(string, "%lf", &z)) goto fail;
- return z;
- fail:
- fprintf(stderr, "unexpected longitude %s\n", string);
- exit(1);
+ if(string) {
+ double z;
+ if(1 == sscanf(string, "%lf", &z)) {
+ return z;
+ }
+ }
+ fail(1, "unexpected longitude %s\n", string);
}
-static int x(int argc, char *argv[]) {
+static int main_x(int argc, char *argv[]) {
int z = zoom_from_string(argv[0]);
double lon = lon_from_string(argv[1]);
printf("%d\n", long2tilex(lon, z));
@@ -78,16 +81,16 @@ static int x(int argc, char *argv[]) {
}
static double lat_from_string(char *string) {
- if(!string) goto fail;
- double z;
- if(1 != sscanf(string, "%lf", &z)) goto fail;
- return z;
- fail:
- fprintf(stderr, "unexpected latitude %s\n", string);
- exit(1);
+ if(string) {
+ double z;
+ if(1 == sscanf(string, "%lf", &z)) {
+ return z;
+ }
+ }
+ fail(1, "unexpected latitude %s\n", string);
}
-static int y(int argc, char *argv[]) {
+static int main_y(int argc, char *argv[]) {
int z = zoom_from_string(argv[0]);
double lat = lat_from_string(argv[1]);
printf("%d\n", lat2tiley(lat, z));
@@ -106,19 +109,13 @@ static int probe(char *path) {
static void run(char *args[]) {
int stat;
switch(fork()) {
- case -1:
- fprintf(stderr, "fork failed\n");
- exit(1);
+ case -1: fail(1, "fork failed\n");
case 0:
execvp(*args, args);
- fprintf(stderr, "exec %s failed\n", *args);
- exit(1);
+ fail(1, "exec %s failed\n", *args);
default:
wait(&stat);
- if(stat) {
- fprintf(stderr, "%s failed %d\n", *args, stat);
- exit(1);
- }
+ if(stat) fail(1, "%s failed %d\n", *args, stat);
}
}
@@ -137,45 +134,27 @@ static int cached_file(int z, int x, int y, char *dir, char file[4096]) {
if(max < y) y = 0;
char d[4096];
int n = snprintf(d, sizeof(d), "%s/%d/%d", dir, z, x);
- if(n < 0 || sizeof(d) < n) {
- fprintf(stderr, "directory path error\n");
- exit(1);
- }
+ if(n < 0 || sizeof(d) < n) fail(1, "directory path error\n");
n = snprintf(file, 4096, "%s/%d.png", d, y);
- if(n < 0 || 4096 < n) {
- fprintf(stderr, "file path error\n");
- exit(1);
- }
+ if(n < 0 || 4096 < n) fail(1, "file path error\n");
if(probe(file)) return 1;
{
char url[4096];
int n = snprintf(url, sizeof(url), "https://tile.openstreetmap.org/%d/%d/%d.png", z, x, y);
- if(n < 0 || sizeof(url) < n) {
- fprintf(stderr, "url error\n");
- exit(1);
- }
+ if(n < 0 || sizeof(url) < n) fail(1, "url error\n");
char *args1[] = {"mkdir", "-p", d, NULL};
run(args1);
char *args2[] = {"curl", "-s", "-o", file, url, NULL};
run(args2);
- if(!probe(file)) {
- fprintf(stderr, "cached file '%s' not found\n", file);
- exit(1);
- }
+ if(!probe(file)) fail(1, "cached file '%s' not found\n", file);
}
return 1;
}
static void screen_size(int *w, int *h) {
FILE *f = fopen("/sys/class/graphics/fb0/virtual_size", "r");
- if(!f) {
- fprintf(stderr, "unknown screen\n");
- exit(1);
- }
- if(2 != fscanf(f, "%d,%d", w, h)) {
- fprintf(stderr, "unknown screen size\n");
- exit(1);
- }
+ if(!f) fail(1, "unknown screen\n");
+ if(2 != fscanf(f, "%d,%d", w, h)) fail(1, "unknown screen size\n");
fclose(f);
}
@@ -204,7 +183,7 @@ static unsigned char key(int timeout) {
return c;
}
-static int tty(int argc, char *argv[]) {
+static int main_tty(int argc, char *argv[]) {
int width, height;
screen_size(&width, &height);
// popen r stty size -> w h
@@ -214,10 +193,7 @@ static int tty(int argc, char *argv[]) {
run(args0b);
atexit(cleanup);
char *dir = argv[0];
- if(!dir) {
- fprintf(stderr, "unexpected dir %s\n", dir);
- return 1;
- }
+ if(!dir) fail(1, "unexpected dir %s\n", dir);
int z0 = zoom_from_string(argv[1]);
double a0 = lat_from_string(argv[2]);
double o0 = lon_from_string(argv[3]);
@@ -227,10 +203,7 @@ static int tty(int argc, char *argv[]) {
int y = lat2tiley(a, z);
for(;;) {
FILE *p = popen("w3mimgdisplay", "w");
- if(!p) {
- fprintf(stderr, "popen w3mimgdisplay failed\n");
- exit(1);
- }
+ if(!p) fail(1, "popen w3mimgdisplay failed\n");
int full = 1;
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
@@ -362,14 +335,14 @@ static int tty(int argc, char *argv[]) {
}
}
-static int version(int argc, char *argv[]) {
+static int main_version(int argc, char *argv[]) {
printf("%s\n",
#include "VERSION"
);
return 0;
}
-static int help(int argc, char *argv[]) {
+static int main_help(int argc, char *argv[]) {
printf("usage: osmtile cmd args\n");
printf(" lat zoom y\n");
printf(" lon zoom x\n");
@@ -383,26 +356,25 @@ static int help(int argc, char *argv[]) {
int main(int argc, char *argv[]) {
char *cmd = argv[1];
- if(!cmd) goto fail;
- static const struct {
- char *cmd;
- int (*fn)(int argc, char *argv[]);
- } dispatch[] = {
- {"lat", lat},
- {"lon", lon},
- {"x", x},
- {"y", y},
- {"tty", tty},
- {"--version", version},
- {"--help", help},
- {NULL}
- };
- for(int i = 0; dispatch[i].cmd; i++) {
- if(!strcmp(dispatch[i].cmd, cmd)) {
- return dispatch[i].fn(argc - 2, &argv[2]);
+ if(cmd) {
+ static const struct {
+ char *cmd;
+ int (*fn)(int argc, char *argv[]);
+ } dispatch[] = {
+ {"lat", main_lat},
+ {"lon", main_lon},
+ {"x", main_x},
+ {"y", main_y},
+ {"tty", main_tty},
+ {"--version", main_version},
+ {"--help", main_help},
+ {NULL}
+ };
+ for(int i = 0; dispatch[i].cmd; i++) {
+ if(!strcmp(dispatch[i].cmd, cmd)) {
+ return dispatch[i].fn(argc - 2, &argv[2]);
+ }
}
}
- fail:
- fprintf(stderr, "unexpected command %s\n", cmd);
- return 1;
+ fail(1, "unexpected command %s\n", cmd);
}