On Sun, 22 Feb 1998, Roger Fajman wrote: > Has anyone written a program for doing mass changes to list headers? > We are using LISTSERV on Solaris. I would like to answer this question again, only *this* time I promise to insert the correct version of the program. I apologize that the first little c thing didn't support wildcards... it was an earlier version. Thank you to those who actually tried it and let me know it didn't work. Below is the correct version. --Trish --------- Trish Forrest, Queen's University Kingston On ------------------------- /* * Compile as - * cc -o fandr fandr.c -lgen [-DDEBUG] */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <libgen.h> #include <sys/stat.h> #include <sys/types.h> FILE *Input, *Output; char OutputName[256], *UnixCmd; char *ProgramName; char *CurrentSearchPtr, *Buffer, *BufferPtr; int Character, BufferLen, Pid, Verbose = 0; char *Replace = (char *) NULL, *Search = (char *) NULL; display_help() { fprintf(stderr, "\nUSAGE: %s -s SearchPattern -r ReplacePattern file1 [file2 .....]\n", ProgramName); fprintf(stderr, "\t-r The pattern to search for.\n"); fprintf(stderr, "\t-s The pattern to replace what you found by the -s.\n"); fprintf(stderr, "\nThe pattern MUST be in quotes if it is more than one workd.\n\n"); exit(0); } close_up(char *OutputName) { if (Input != (FILE *) NULL) { fclose(Input); Input = (FILE *) NULL; } if (Output != (FILE *) NULL) { fclose(Output); Output = (FILE *) NULL; if (OutputName != (char *) NULL) remove(OutputName); } } process_file(char *Filename) { char *ShortName; struct stat FileStat; ShortName = basename(Filename); if ((Input = fopen(Filename, "r")) == (FILE *) NULL) { fprintf(stderr, "ERROR: %s: Could not open %s\n", ProgramName, Filename); return; } if (Verbose) printf("Checking file: %s (%s)\n", Filename, ShortName); sprintf(OutputName, "/tmp/%s.%s.%d", ProgramName, ShortName, Pid); if ((Output = fopen(OutputName, "w")) == (FILE *) NULL) { fprintf(stderr, "ERROR: %s: Could not create %s\n", ProgramName, OutputName); close_up((char *) NULL); return; } if (stat(Filename, &FileStat) == -1) { fprintf(stderr, "ERROR: %s: Could not stat %s\n", ProgramName, Filename); close_up(OutputName); return; } CurrentSearchPtr = Search; BufferPtr = Buffer; while ((Character = fgetc(Input)) != EOF) { if (Character != *CurrentSearchPtr) { if (BufferPtr != Buffer) { *BufferPtr = '\0'; fprintf(Output, "%s", Buffer); } fprintf(Output, "%c", Character); CurrentSearchPtr = Search; BufferPtr = Buffer; } else { *CurrentSearchPtr++; *BufferPtr++ = Character; if (*CurrentSearchPtr == '\0') { fprintf(Output, "%s", Replace); if (Verbose) printf("\tFound and occurrence.\n"); CurrentSearchPtr = Search; BufferPtr = Buffer; } } } close_up((char *) NULL); if ((UnixCmd = (char *) malloc (strlen(OutputName) + strlen(Filename) + 8)) == (char *) NULL) { fprintf(stderr, "ERROR: %s: Insufficient memory to complete operation\n", ProgramName); fprintf(stderr, " Enter the following command at the unix command prompt\n\n"); fprintf(stderr, " mv -f %s %s \n\n", OutputName, Filename); return; } sprintf(UnixCmd, "mv -f %s %s", OutputName, Filename); system(UnixCmd); free(UnixCmd); if (chmod(Filename, FileStat.st_mode) == -1) fprintf(stderr, "ERROR: %s: Could not chmod %s to %d perms", ProgramName, Filename, FileStat.st_mode); if (chown(Filename, FileStat.st_uid, FileStat.st_gid) == -1) fprintf(stderr, "ERROR: %s: Could not chown %s to %d.%d", ProgramName, Filename, FileStat.st_uid, FileStat.st_gid); } main(int argc, char *argv[]) { int Option; extern char *optarg; extern int optind; struct stat FileStat; #ifdef DEBUG int i; printf("%d arguments received\n", argc); for (i=0; i< argc; i++) printf("Argv[%d]: %s\n", i, argv[i]); printf("\n"); #endif ProgramName = basename(argv[0]); while ((Option = getopt(argc, argv, "hr:s:v")) != EOF) switch(Option) { case 'h': display_help(); case 'r': Replace = optarg; break; case 's': Search = optarg; break; case 'v': Verbose++; break; case '?': fprintf(stderr, "%s: ERROR: Unknown option -%c\n", ProgramName, Option); display_help(); } if (Replace == (char *) NULL) { fprintf(stderr, "%s: ERROR: Missing the replace string.\n", ProgramName); display_help(); } if (Search == (char *) NULL) { fprintf(stderr, "%s: ERROR: Missing the search string.\n", ProgramName); display_help(); } Pid = getpid(); if (Verbose) { printf(" Searching for \"%s\"\n", Search); printf("Replacing with \"%s\"\n", Replace); } if ((Buffer = (char *) malloc (strlen(Search) + 1)) == (char *) NULL) { fprintf(stderr, "ERROR: %s: Insufficient memory\n", ProgramName); exit(0); } for ( ; optind < argc; optind++) process_file(argv[optind]); }