This is splitter.c in view mode; [Download] [Up]
#include <stdio.h>
#include <strings.h>
#include <sys/param.h>
#define MAX_PREFIX_LENGTH 6
#define MAX_FILENAME_LENGTH 70 /* change here for longer filenames */
void main(int argc,char *argv[])
{
char filename[MAXPATHLEN+1];
char from_line[2048];
char subject_line[2048];
char copy_filename[MAX_FILENAME_LENGTH+1]; /* max limited for tar */
char buffer[2048];
char prefix[MAX_PREFIX_LENGTH+2];
char from[20];
char subject[20], subject1[20];
char reply[20],reply1[20], reply2[20], reply3[20];
int i,j,subject_length,prefix_length,stop_flag,total,offset,max_length;
FILE *infile,*outfile;
/* load test header strings, account for missing spaces, etc. */
sprintf(from, "From:");
sprintf(subject, "Subject: ");
sprintf(subject1, "Subject:");
sprintf(reply, "Subject: Re: ");
sprintf(reply1, "Subject:Re:");
sprintf(reply2, "Subject: Re:");
sprintf(reply3, "Subject:Re: ");
if(argc > 2){ /* check for correct no. of arguments */
/* get desired prefix for all generated files */
strcpy(prefix, argv[1]);
for(i=2; i<argc; i++){ /* loop until all files have been processed */
strcpy(filename, argv[i]);
/* open archived file for reading */
if((infile = fopen(filename, "r")) != NULL){
total = 0;
printf("Successfully opened %s for input...now splitting\n", filename);
stop_flag = 0;
fgets(from_line, 2047, infile); /* read first line */
/* continue reading until an error or EOF */
do{
copy_filename[0] = '\0'; /* reset filename */
/* add prefix */
prefix_length = strlen(prefix);
for(j=0; j<prefix_length; j++)
copy_filename[j] = prefix[j];
copy_filename[j] = '\0'; /* null termination */
strcat(copy_filename, "_"); /* concatenate underscore */
fgets(subject_line, 2047, infile); /* read subject line */
subject_length = strlen(subject_line);
/* the test order is important here */
if(strncmp(subject_line, subject1, 8) == 0){
offset = 8;
}
if(strncmp(subject_line, subject, 9) == 0){
offset = 9;
}
if(strncmp(subject_line, reply2, 12) == 0){
offset = 12;
}
if(strncmp(subject_line, reply, 13) == 0){
offset = 13;
}
if(strncmp(subject_line, reply1, 11) == 0){
offset = 11;
}
if(strncmp(subject_line, reply3, 12) == 0){
offset = 12;
}
/* replace 'bad' characters with a '_' */
max_length = MAX_FILENAME_LENGTH- prefix_length+ offset- 1;
if((subject_length- 1+ prefix_length- offset) < MAX_FILENAME_LENGTH)
max_length = subject_length-1;
for(j=offset; j<max_length; j++){
if(subject_line[j] != '.' && subject_line[j] != '[' &&
subject_line[j] != ']' && subject_line[j] != ' ' &&
subject_line[j] != '/')
strncat(copy_filename, &subject_line[j], 1);
else
strcat(copy_filename, "_");
}
/* open an output file with prefix+modified_subject as name */
/* note this appends to a file with identical subject line */
outfile = fopen(copy_filename, "a");
total++;
/* write the from line, subject lines, and content to outfile */
fputs(from_line, outfile);
fputs(subject_line, outfile);
for(;;){
if(fgets(buffer, 2047, infile) != NULL){
if(strncmp(buffer, from, 5) != 0){
fputs(buffer, outfile);
}
else{
fclose(outfile);
strcpy(from_line, buffer);
break; /* next message found */
}
}
else{
stop_flag = 1; /* EOF reached */
fclose(infile);
printf(" -- %d messages.\n", total);
break;
}
}
}
while(stop_flag == 0); /* continue until EOF */
}
else{
printf("Error opening %s for input\n");
printf(" -- continuing with next file...\n");
}
}
}
else{
printf("Form of command:\n");
printf("splitter prefix filename1 filename2 ...\n");
printf("(prefix can be up to 6 characters)\n");
}
}These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.