Expire

From OpenStreetMap Wiki
Jump to navigation Jump to search

Expire scripts come in all kind of shapes and forms. The following C program allow you to do it in an efficient and fast way. The discussion page can be used as todo list.

#include <unistd.h>
#include <string.h>
#include <stdlib.h>

#define MAXLEN 64
#define MAXCACHE 17*1024

int used_cache = 0;
unsigned int *cache;

int in_cache(unsigned int z, unsigned int x, unsigned int y) {
        unsigned int i;
        for (i = 0; i < used_cache; i++) {
                if (cache[i] == z &&
                    cache[i + (MAXCACHE)] == x &&
                    cache[i + (MAXCACHE * 2)] == y)
                        return 1;
        }

        return 0;
}

int main(int argc, char *argv[]) {
        FILE *expireFile;
        unsigned int i;
        unsigned int maxlen = 0;
        char rpath [ 128 ];
        char spath [ 128 ];

        if (argc < 3) {
                fprintf(stderr, "%s [expirefile] [path-to-files] [styles]\n", argv[0]);
                _exit(-1);
        }

        if (!(expireFile = fopen(argv[1], "r"))) {
                fprintf(stderr, "Can't open expirefile %s\n", argv[1]);
        }

        for (i = 3; i < argc; i++) {
                unsigned int len = strlen(argv[i]);
                if (len > maxlen) maxlen = len;
        }

        if (maxlen > MAXLEN) {
                fprintf(stderr, "Recompile with bigger MAXLEN, for long stylesheetnames\n");
        }

        if (chdir(argv[2]) == -1) {
                fprintf(stderr, "Can't chdir to %s\n", argv[2]);
                _exit(-1);
        }

        cache = (unsigned int *) malloc(MAXCACHE * sizeof(unsigned int) * 3);
        if (cache == NULL) {
                fprintf(stderr, "Can't allocate the cache\n");
                _exit(-1);
        }

        while (fgets ( rpath, sizeof(rpath)-MAXLEN, expireFile ) != NULL ) {
                unsigned int z, x, y;
                if (sscanf(rpath, "%d/%d/%d", &z, &x, &y) == 3) {
                        rpath[strlen(rpath)-1] = '\0';
                        strncat(rpath, ".png", 4);

                        while (z > 12) {
                                x = x >> 1;
                                y = y >> 1;
                                z = z - 1;

                                if (!in_cache(z,x,y)) {
                                        if (used_cache < MAXCACHE) {
                                                cache[used_cache] = z;
                                                cache[used_cache + (MAXCACHE)] = x;
                                                cache[used_cache + (MAXCACHE * 2)] = y;
                                                used_cache++;
                                        } else {
                                                fprintf(stderr, "Cache exhausted\n");
                                        }

                                        snprintf(spath, 127, "%d/%d/%d.png", z, x, y);

                                        for (i = 3; i < argc; i++) {
                                                if (chdir(argv[i]) == 0) {
                                                        if (z == 17) unlink(rpath); /* so this is actually 18 */
//                                                      printf("%s\n", rpath);
                                                        unlink(spath);
                                                        chdir("..");
                                                }
                                        }
                                }
                        }
                }
        }
        free(cache);
        fclose(expireFile);
}