Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1exp 10/6/83; site ihuxf.UUCP Path: utzoo!linus!security!genrad!grkermit!masscomp!clyde!ihnp4!ihuxf!larry From: larry@ihuxf.UUCP (Larry Marek) Newsgroups: net.sources Subject: Preen.c - active file cleaner Message-ID: <857@ihuxf.UUCP> Date: Sat, 15-Oct-83 14:18:11 EDT Article-I.D.: ihuxf.857 Posted: Sat Oct 15 14:18:11 1983 Date-Received: Sun, 16-Oct-83 12:00:03 EDT Organization: AT&T Bell Labs, Naperville, Il Lines: 97 Over time we have had some problems with duplicate entries sneeking into our "active" files (and then news reader's .newsrc files). While this has not been disasterous, it has been a pain. Rather than edit each of our almost 100 active files by hand, I came up with this program. When it completes, the active file will be alphabetically sorted and contain only the highest numbered entry from any duplicate lines. TO get the active file in a normal reading order, use "asort" which will be posted next. preen.c: ------ /* * P R E E N . C By: Larry Marek AT&T Bell Labs * * This program takes the netnews "active" file, makes a copy ("active.old" * for safe keeping), alphabetically sorts the "active" file, then proceedes * to preen out the duplicate entries, writing only the line with the highest * article number out to "active.new". When this program completes it will * move this cleaned file to "active". You should then re-order this * "active" file with 'asort active < active.master'. * * Usage: preen filename */ #include #include main(argc, argv) int argc; char *argv[]; { extern int (*signal())(); char cmd_buf[BUFSIZ]; char buf[BUFSIZ]; char oline[BUFSIZ]; char num[BUFSIZ]; char onum[BUFSIZ]; FILE *fdi; FILE *fdo; if (argc != 2) { fprintf(stderr, "Usage: %s filename\n", argv[0]); exit(1); } umask(0); /* * Can we read the named file? */ if (access(argv[1], 04) != 0) { fprintf(stderr, "Can not read %s\n", argv[1]); exit(2); } (void) signal(SIGHUP, SIG_IGN); (void) signal(SIGINT, SIG_IGN); (void) signal(SIGQUIT, SIG_IGN); sprintf(cmd_buf, "cp %s %s.old; sort -o %s %s.old", argv[1], argv[1], argv[1], argv[1]); system(cmd_buf); fdi = fopen(argv[1], "r"); if (fdi == NULL ) { fprintf(stderr, "Can not open %s\n", argv[1]); exit(3); } sprintf(cmd_buf, "%s.new", argv[1]); fdo = fopen(cmd_buf, "w"); if (fdo == NULL) { fprintf(stderr, "Can not create cmd_buf.\n", cmd_buf); exit(4); } fscanf(fdi, "%s %s", oline, onum); while (fscanf(fdi, "%s %s", buf, num) != EOF) { if (strcmp(buf, oline) == 0) { strcpy(oline, buf); strcpy(onum, num); } else { fprintf(fdo, "%s %s\n", oline, onum); strcpy(oline, buf); strcpy(onum, num); } } fprintf(fdo, "%s %s\n", buf, num); fclose(fdo); fclose(fdi); unlink(argv[1]); link(cmd_buf, argv[1]); unlink(cmd_buf); } -- Larry Marek ihnp4!ihuxf!larry