From ae31e19f92e717919ac8e3db9039eb38d2b89aae Mon Sep 17 00:00:00 2001 From: in2 Date: Thu, 7 Mar 2002 15:13:44 +0000 Subject: Initial revision git-svn-id: http://opensvn.csie.org/pttbbs/pttbbs/trunk/pttbbs@1 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- util/buildir.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 util/buildir.c (limited to 'util/buildir.c') diff --git a/util/buildir.c b/util/buildir.c new file mode 100644 index 00000000..381a657d --- /dev/null +++ b/util/buildir.c @@ -0,0 +1,124 @@ +/* $Id: buildir.c,v 1.1 2002/03/07 15:13:45 in2 Exp $ */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "pttstruct.h" + +int dirselect(struct dirent *dir) { + return strchr("MDSGH", dir->d_name[0]) && dir->d_name[1] == '.'; +} + +int mysort(const struct dirent **a,const struct dirent **b) +{ + return atoi(((*a)->d_name+2))-atoi(((*b)->d_name+2)); +} + +int main(int argc, char **argv) { + int k; + + if(argc < 2) { + fprintf(stderr, "Usage: %s [ ...]\n", argv[0]); + return 1; + } + + for(k = 1; k < argc; k++) { + int fdir, count, total; + char *ptr, path[MAXPATHLEN]; + struct dirent **dirlist; + + sprintf(path, "%s/.DIR", argv[k]); + if((fdir = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1) { + perror(path); + continue; + } + + if((total = scandir(argv[k], &dirlist, dirselect, mysort)) == -1) { + fprintf(stderr, "scandir failed!\n"); + close(fdir); + continue; + } + + ptr = strrchr(path, '.'); + for(count = 0; count < total; count++) { + FILE *fp; + struct stat st; + + strcpy(ptr, dirlist[count]->d_name); + if(stat(path, &st) == 0 && st.st_size > 0 && + (fp = fopen(path, "r")) != NULL) { + char buf[512]; + time_t filetime; + fileheader_t fhdr; + + memset(&fhdr, 0, sizeof(fhdr)); + /* set file name */ + strcpy(fhdr.filename, dirlist[count]->d_name); + + /* set file time */ + filetime = atoi(dirlist[count]->d_name + 2); + if(filetime > 740000000) { + struct tm *ptime = localtime(&filetime); + sprintf(fhdr.date, "%2d/%02d", ptime->tm_mon + 1, + ptime->tm_mday); + } else + strcpy(fhdr.date, " "); + + /* set file mode */ + fhdr.filemode = FILE_READ; + + /* set article owner */ + fgets(buf, sizeof(buf), fp); + if(strncmp(buf, "作者: ", 6) == 0 || + strncmp(buf, "發信人: ", 8) == 0) { + int i, j; + + for(i = 5; buf[i] != ' '; i++); + for(; buf[i] == ' '; i++); + for(j = i + 1; buf[j] != ' '; j++); + j -= i; + if(j > IDLEN + 1) + j = IDLEN + 1; + strncpy(fhdr.owner, buf + i, j); + fhdr.owner[IDLEN + 1] = '\0'; + strtok(fhdr.owner, " .@\t\n\r"); + if(strtok(NULL, " .@\t\n\r")) + strcat(fhdr.owner, "."); + + /* set article title */ + while(fgets(buf, sizeof(buf), fp)) + if(strncmp(buf, "標題: ", 6) == 0 || + strncmp(buf, "標 題: ", 8) == 0) { + for(i = 5; buf[i] != ' '; i++); + for(; buf[i] == ' '; i++); + strtok(buf + i-1, "\n"); + strncpy(fhdr.title, buf + i, TTLEN); + fhdr.title[TTLEN] = '\0'; + break; + } + } else if(strncmp(buf, "☉ 歡迎光臨", 11) == 0) { + strcpy(fhdr.title, "會議記錄"); + } else if(strncmp(buf, "\33[1;33;46m★", 12) == 0|| + strncmp(buf, "To", 2) == 0) { + strcpy(fhdr.title, "熱線記錄"); + } +// if(!fhdr.title[0]) +// strcpy(fhdr.title, dirlist[count]->d_name); + fclose(fp); + write(fdir, &fhdr, sizeof(fhdr)); + } + } + close(fdir); + for(total--; total >= 0; total--) + free(dirlist[total]); + free(dirlist); + } + return 0; +} -- cgit v1.2.3