Expire
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);
}