allow directories like 48x48x8labs or 48x48x8coraid so .dict's don't need to be merged. Notes: Reference: /n/sources/patch/sorry/facedb Date: Thu Dec 20 05:30:11 CET 2007 Signed-off-by: quanstro@quanstro.net Reviewed-by: jmk --- /sys/src/cmd/faces/facedb.c Thu Dec 20 04:45:48 2007 +++ /sys/src/cmd/faces/facedb.c Thu Dec 20 04:45:46 2007 @@ -238,12 +238,36 @@ return t; } +static int +fcmp(void *p, void *q) +{ + char *a, *b; + int i, j, d; + + a = *(char**)p; + b = *(char**)q; + for(;;){ +//print("[%s] [%s]\n", a, b); + i = strtoul(a, &a, 10); + j = strtoul(b, &b, 10); +//print(" [%s] [%s]\n", a, b); + if(i == 0 || j == 0) + return strcmp(a, b); + if(d = i-j) + return -d; + if(*a != 'x' || *b != 'x') + return strcmp(a, b); + a++; + b++; + } +} + static char* tryfindfiledir(char *dom, char *user, char *dir) { - char *dict, *ndir, *x; + char *dict, ndir[0xff], *x, **tab; int fd; - int i, n; + int i, j, n; Dir *d; /* @@ -268,47 +292,35 @@ /* * If not, recurse into subdirectories. * Ignore 512x512 directories. - * Save 48x48 directories for later. */ + x = 0; if((fd = open(dir, OREAD)) < 0) return nil; - while((n = dirread(fd, &d)) > 0){ - for(i=0; i0; i>>=1){ - ndir[strlen(ndir)-1] = i+'0'; - if(access(ndir, AEXIST) >= 0 && (x = tryfindfiledir(dom, user, ndir)) != nil){ - free(ndir); - free(dom); - return x; - } + qsort(tab, j, sizeof *tab, fcmp); + for(i = 0; i < j; i++){ + snprint(ndir, sizeof ndir, "%s/%s", dir, tab[i]); + if(x = tryfindfiledir(dom, user, ndir)) + break; } - free(ndir); + for(i = 0; i < j; i++) + free(tab[i]); + free(tab); +esc: + free(d); + close(fd); free(dom); - return nil; + + return x; } static char*