diff options
-rw-r--r-- | util/mandex.c | 232 |
1 files changed, 132 insertions, 100 deletions
diff --git a/util/mandex.c b/util/mandex.c index 9373f814..9f5a0e55 100644 --- a/util/mandex.c +++ b/util/mandex.c @@ -1,19 +1,13 @@ -/* $Id: mandex.c,v 1.1 2002/03/07 15:13:46 in2 Exp $ */ - -/* - target : 精華區索引程式 (man index) - - syntax : mandex [board] - [board] 有值 ==> 只跑該 board - 空的 ==> 所有的 boards 都跑 -*/ +/* $Id: mandex.c,v 1.2 2002/03/08 09:21:15 in2 Exp $ */ +/* 'mandex -h' to help */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <unistd.h> +#include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include "config.h" @@ -24,33 +18,28 @@ #define MAXPATHLEN 1024 #endif -extern int numboards; -extern boardheader_t *bcache; - -char color[4][10] = -{"[1;33m", "[1;32m", "[1;36m", "[1;37m"}; -char fn_index[] = ".index"; -char fn_new[] = ".index.new"; -char index_title[] = "◎ 精華區目錄索引"; -FILE *fndx; -int ndir; -int nfile; -int index_pos; -char topdir[128], pgem[512], pndx[512]; - -int nb = 0; /* board 數 */ - -struct boardinfo +typedef struct { char bname[40]; - int ndir; - int nfile; - int k; -}; -typedef struct boardinfo boardinfo; + int ndir, nfile, k; +} boardinfo; -boardinfo -board[MAX_BOARD]; +extern int numboards; +extern boardheader_t *bcache; +boardinfo board[MAX_BOARD], *biptr; +char color[4][10] = {"[1;33m", "[1;32m", "[1;36m", "[1;37m"}; +char fn_index[] = ".index"; +char fn_new[] = ".index.new"; +char index_title[] = "◎ 精華區目錄索引"; +char topdir[128], pgem[512], pndx[512]; +FILE *fndx; +int ndir, nfile, index_pos, k; +int nSorted, nb; + +int sortbyname(const void *a, const void *b) +{ + return strcmp(((boardinfo*)b)->bname, ((boardinfo*)a)->bname); +} int k_cmp(b, a) boardinfo *b, *a; @@ -85,34 +74,30 @@ mandex(level, num_header, fpath) return; fname = strrchr(fpath, '.'); - if (!level) - { - + if (!level){ printf("%s\r\n",fpath); strcpy(pgem, fpath); strcpy(fname, fn_new); fndx = fopen(fpath, "w"); - if (fndx == NULL) - { + if (fndx == NULL){ fclose(fgem); return; } fprintf(fndx, "[1;32m序號\t\t\t精華區主題[m\n" - "[36m──────────────────────────────────────[m\n"); + "[36m───────────────────" + "───────────────────[m\n"); strcpy(pndx, fpath); ndir = nfile = 0; index_pos = -1; } count = 0; - while (fread(&fhdr, sizeof(fhdr), 1, fgem) == 1) - { + while (fread(&fhdr, sizeof(fhdr), 1, fgem) == 1){ strcpy(fname, fhdr.filename); if (!fname[0]) continue; if (!level && !strncmp(fhdr.title, index_title, strlen(index_title)) - && index_pos < 0) - { + && index_pos < 0){ index_pos = count; unlink(fpath); } @@ -120,14 +105,12 @@ mandex(level, num_header, fpath) stat(fpath, &st); sprintf(buf, "%.*s%s%3d. %s [m\n", - - 11 * level, num_header, color[level % 4], ++count, fhdr.title); /* Ptt */ + 11 * level, num_header, color[level % 4], ++count, fhdr.title); + /* Ptt */ fputs(buf, fndx); - if (dashd(fpath)) - { + if (dashd(fpath)){ ++ndir; - if (*fhdr.title != '#' && level < 10) - { + if (*fhdr.title != '#' && level < 10){ strcat(fpath, "/.DIR"); mandex(level + 1, buf, fpath); } @@ -136,8 +119,7 @@ mandex(level, num_header, fpath) ++nfile; } - if (!level) - { + if (!level){ char lpath[MAXPATHLEN]; fclose(fndx); @@ -146,8 +128,7 @@ mandex(level, num_header, fpath) strcpy(pndx, fpath); sprintf(buf, "%s.new", pgem); - if (index_pos >= 0 || (fndx = fopen(buf, "w"))) - { + if (index_pos >= 0 || (fndx = fopen(buf, "w"))){ fname[-1] = 0; stamplink(fpath, &fhdr); unlink(fpath); @@ -156,11 +137,10 @@ mandex(level, num_header, fpath) st.st_size = 0; stat(lpath, &st); sprintf(fhdr.title, "%s (%.1fk)", index_title, st.st_size / 1024.); - board[nb].k = st.st_size; /* Ptt */ - printf("(%d)[%dK]", nb, board[nb].k); + k = st.st_size; /* Ptt */ + printf("(%s)[%dK]", fpath, k); symlink(lpath, fpath); - if (index_pos < 0) - { + if (index_pos < 0){ fwrite(&fhdr, sizeof(fhdr), 1, fndx); rewind(fgem); while (fread(&fhdr, sizeof(fhdr), 1, fgem) == 1) @@ -169,8 +149,7 @@ mandex(level, num_header, fpath) fclose(fgem); rename(buf, pgem); } - else - { + else{ fseek(fgem, index_pos * sizeof(fhdr), 0); fwrite(&fhdr, sizeof(fhdr), 1, fgem); fclose(fgem); @@ -182,58 +161,111 @@ mandex(level, num_header, fpath) } -int main(int argc, char* argv[]){ +int main(int argc, char* argv[]) +{ boardheader_t *bptr; - DIR *dirp; - struct dirent *de; - int ch, n; - int place = 0; - char *fname, fpath[MAXPATHLEN]; - + DIR *dirp; + struct dirent *de; + int ch, n, place = 0, fd; + char checkrebuild = 0, *fname, fpath[MAXPATHLEN]; + + while( (ch = getopt(argc, argv, "x")) != -1 ){ + switch( ch ){ + case 'x': + checkrebuild = 1; + break; + case 'h': + printf("NAME \n" + " mandex - 精華區索引程式 (man index)\n\n" + "SYNOPSIS \n" + " mandex [-x] [board] \n\n" + "DESCRIPTION \n" + "精華區索引 (man index) \n\n" + "-x 只有含有 .rebuild的目錄才重製 \n" + "board 全部的板 (default to all) \n\n"); + return 0; + } + } + + argc -= optind; + argv += optind; + resolve_boards(); - nb = 0; - if(argc == 1){ + + if( argc == 0 ){ puts("Creating the whole index..."); - chdir(strcpy(topdir, BBSHOME)); - strcpy(fpath, "man/.DIR"); - mandex(0, "", fpath); + chdir(strcpy(topdir, BBSHOME)); + strcpy(fpath, "man/.DIR"); + mandex(0, "", fpath); } - - + chdir(strcpy(topdir, BBSHOME "/man/boards")); - if(argc > 1) { - sprintf(fpath, "%s/.DIR", argv[1]); - mandex(0, "", fpath); - exit(0); + if( argc == 1 ){ + sprintf(fpath, "%s/.DIR", argv[0]); + mandex(0, "", fpath); + return 0; } /* process all boards */ - - if(!(dirp = opendir(topdir))) { - printf("## unable to enter [man/boards]\n"); - exit(-1); - } - - while((de = readdir(dirp))){ - fname = de->d_name; - ch = fname[0]; - if (ch != '.'){ - board[nb].k = 0; - strcpy(board[nb].bname, fname); - sprintf(fpath, "%s/.DIR", fname); - mandex(0, "", fpath); - printf("%-14sd: %d\tf: %d\n", fname, ndir, nfile); /* report */ - board[nb].ndir = ndir; - board[nb].nfile = nfile; - if (board[nb].k) - nb++; + if( checkrebuild && + (fd = open(BBSHOME "/man/.rank.cache", O_RDONLY)) >= 0 ){ + read(fd, board, sizeof(board)); + close(fd); + qsort(board, MAX_BOARD, sizeof(boardinfo), sortbyname); + for( nb = 0 ; board[nb].bname[0] != 0 ; ++nb ) + ; + nSorted = nb; + } + else{ + memset(board, 0, sizeof(board)); + checkrebuild = 0; + nSorted = nb = 0; + } + + if(!(dirp = opendir(topdir))) { + printf("## unable to enter [man/boards]\n"); + exit(-1); + } + + while((de = readdir(dirp))){ + fname = de->d_name; + ch = fname[0]; + if (ch != '.'){ + k = 0; + if( checkrebuild ){ + sprintf(fpath, "%s/.rebuild", fname); + if( access(fpath, 0) < 0 ){ + printf("skip no modify board %s\n", fname); + continue; + } + unlink(fpath); + } + sprintf(fpath, "%s/.DIR", fname); + mandex(0, "", fpath); + printf("%-14sd: %d\tf: %d\n", fname, ndir, nfile); /* report */ + if( k ){ + if( !(biptr = bsearch(fname, board, nSorted, + sizeof(boardinfo), sortbyname))){ + biptr = &board[nb]; + ++nb; + } + strcpy(biptr->bname, fname); + biptr->ndir = ndir; + biptr->nfile = nfile; + biptr->k = k; } } - closedir(dirp); - - qsort(board, nb, sizeof(boardinfo), k_cmp); + } + closedir(dirp); + qsort(board, nb, sizeof(boardinfo), k_cmp); + unlink(BBSHOME "/man/.rank.cache"); + if( (fd = open(BBSHOME "/man/.rank.cache", + O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0660)) >= 0 ){ + write(fd, board, sizeof(board)); + close(fd); + } if (!(fndx = fopen(BBSHOME "/etc/topboardman", "w"))) exit(0); @@ -259,5 +291,5 @@ int main(int argc, char* argv[]){ ,bptr->BM); } fclose(fndx); - exit(0); + return 0; } |