[comp.sys.ibm.pc] Newsort for UULINK

mojo@mp-mojo.UUCP (03/11/87)

Here is source and executable for a UULINK news sorter.  Newsort takes
the filename of the news file as an argument, sorts by newsgroups and
subject line, and writes to the same filename, leaving the original as
a .BAK file.  (Old MicroPro habits.  :-)

This source was written for Lattice C 3.00 with a private library, and
will no doubt require some porting for other development environments.

Executable is a uuencoded .ARC file.

Address comments to mojo@mp-mojo.micropro.UUCP.

---------------begin newsort.c---------------------begin newsort.c------------
/*
 * Sort a news file for UULINK by newsgroup and subject
 *
 * compile in large model
 *
 *
 */

/* Includes */

#include <stdio.h>
#include <errno.h>

/* Local Defines */

#define TRACE 0
#define MAXART 500
#define MAXFNAME 65
/* #define BUFSIZ 512 */	/* defined in stdio.h */
#define FAIL (int)1
#define SUCCESS (int)0

/* External and forward function declarations */

long ftell();
char *malloc();
char *getmem();
int readone();
void perror();
void newsread();
void cleanup();
int artcmp();
void changext();
void newswrite();

/* Global variable definitions */

int _stack = 5120;
typedef struct {
	long offset;		/* beginning of article in input file */
	char *subject;		/* Subject: line */
	char *newsgroups;	/* Newsgroups: line */
	long length;		/* length of article */
} ARTICLE;

ARTICLE articles[MAXART];	/* array of article information */
int n_articles = 0;		/* number of articles in file */

char infile[MAXFNAME];
char outfile[MAXFNAME];
char bakfile[MAXFNAME];
char msgterm[] = "\001\001\r\n";


/* ----------------------------------------------------------------------- */

/* main */

void
main(argc,argv)
int argc;
char *argv[];
{
	int i;


	if (argc < 2) {
		fprintf(stderr,"usage: newsort newsfile\r\n");
		exit(1);
	}

	strcpy(infile,argv[1]);
	strcpy(outfile,infile);
	strcpy(bakfile,infile);

	changext(outfile,".$$$");
	changext(bakfile,".bak");

#if TRACE
	printf("infile: %s\r\n",infile);
	printf("outfile: %s\r\n",outfile);
	printf("bakfile: %s\r\n",bakfile);
#endif

	newsread(infile);
	fprintf(stderr,"sorting...\r\n"); fflush(stderr);
	qsort(articles, n_articles, sizeof(ARTICLE), artcmp);

#if TRACE
	for (i=0;i<n_articles;++i) {
		printf("\r\nArticle %d:\r\n",i);
		printf("   Offset:     %ld\r\n",articles[i].offset);
		printf("   Length:     %ld\r\n",articles[i].length);
		printf("   Subject:    %s",articles[i].subject);
		printf("   Newsgroups: %s",articles[i].newsgroups);
	}
#endif
	
	newswrite(infile,outfile);
	unlink(bakfile);
	if (rename(infile,bakfile)) 
		fprintf(stderr,"rename failed, %s to %s\r\n",infile,bakfile);
	if (rename(outfile,infile)) 
		fprintf(stderr,"rename failed, %s to %s\r\n",outfile,infile);
	cleanup();		/* free all the pointers */

	exit(0);
}

/* ----------------------------------------------------------------------- */

/* change or add an extension to a standard DOS filename */

void
changext(name,ext)
char *name;
char *ext;
{
	char *p;

	p = name + strlen(name);
	while (p > name) {
		if (*p == '.') {
			strcpy(p,ext);
			return;
		}
		if (*p == '/' || *p == '\\' || *p == ':') {
			strcat(name,ext);
			return;
		}
		--p;
	}
	strcat(name,ext);
	return;
}

/* ----------------------------------------------------------------------- */

/* compare two articles */

int
artcmp(a1,a2)
ARTICLE *a1, *a2;
{
	int retval;

	if (retval = strcmp(a1->newsgroups,a2->newsgroups)) return retval;
	return strcmp(a1->subject,a2->subject);
}

/* ----------------------------------------------------------------------- */

/* Free all the allocated space */

void cleanup()
{
	int i;

	if (n_articles == 0) return;
	for (i=0;i<n_articles;++i) {
		if (articles[i].subject != NULL) 
			free(articles[i].subject);
		if (articles[i].newsgroups != NULL) 
			free(articles[i].newsgroups);
	}
}

/* ----------------------------------------------------------------------- */

/* Rewrite the newsfile in the new article order */

void
newswrite(in,out)
char *in, *out;
{
	FILE *fin, *fout;
	int i;
	char buf[BUFSIZ];
	long size;
#if TRACE
	int retval;
#endif

	if (n_articles == 0) return;
	fin = fopen(in,"r");
	if (fin == NULL) perror("can't reopen",in);
	fout = fopen(out,"w");
	if (fout == NULL) perror("can't create",out);

	for (i=0;i<n_articles;++i) {
		if (fseek(fin,articles[i].offset,0)) perror("seek problem",in);
		size = articles[i].length;
		while (size > BUFSIZ) {
			if (fread(buf,1,BUFSIZ,fin) != BUFSIZ)
				perror("read error",in);
			if (fwrite(buf,1,BUFSIZ,fout) != BUFSIZ)
				perror("write error",out);
			size -= BUFSIZ;
		}
		fprintf(stderr,"writing %d...    \r",n_articles-i);
		fflush(stderr);
		if (size > 0) {
			if (fread(buf,1,(int)size,fin) != (int)size) {
				perror("read error",in);
			}
			if (fwrite(buf,1,(int)size,fout) != (int)size)
				perror("write error",out);
		}
	}
	fprintf(stderr,"\n");
	fclose(fin);
	fclose(fout);
}	

/* ----------------------------------------------------------------------- */

/* Read in the article information */

void 
newsread(filename)
char *filename;
{
	FILE *fp;
	int art_index;

	fp = fopen(filename,"r");
	if (fp == NULL) perror("Can't open",filename);

	n_articles = art_index = 0;
	while (readone(fp,art_index) != FAIL) {
		++n_articles;
		fprintf(stderr,"reading %d...     \r",n_articles);
		fflush(stderr);
		++art_index;
	}
	fclose(fp);
	fprintf(stderr,"\n");
	return;
}

/* ----------------------------------------------------------------------- */

/* read one article */

int
readone(fp,index)
FILE *fp;
int index;
{
	char linbuf[BUFSIZ];
	int isheader;
	char *p;

	if (fgets(linbuf,BUFSIZ,fp) == NULL) return FAIL;
	if (strcmp(linbuf,msgterm) != 0) {
		fprintf(stderr,"Wrong format: %s\r\n",linbuf);
		return FAIL;
	}
	isheader = TRUE;
	articles[index].offset = ftell(fp) - 4;
	while (fgets(linbuf,BUFSIZ,fp) != NULL) {
		if (strcmp(linbuf,msgterm) == 0) {
			articles[index].length = ftell(fp) -
			    articles[index].offset;
			return SUCCESS;
		}
		else if (strcmp(linbuf,"\r\n") == 0) isheader = FALSE;
		else if (isheader && strncmp(linbuf,"Newsgroups: ",12) == 0) {
			p = linbuf+12;
			articles[index].newsgroups = getmem(strlen(linbuf)-10);
			strcpy(articles[index].newsgroups,p);
		}
		else if (isheader && strncmp(linbuf,"Subject: Re: ",13) == 0) {
			p=linbuf+13;
			articles[index].subject = getmem(strlen(linbuf)-10);
			strcpy(articles[index].subject,p);
		}
		else if (isheader && strncmp(linbuf,"Subject: ",9) == 0) {
			p=linbuf+9;
			articles[index].subject = getmem(strlen(linbuf)-7);
			strcpy(articles[index].subject,p);
		}
	}
	return FAIL;
}

/* ---------------------------------------------------------------------- */

/* get memory and test for success */

char *getmem(size)
int size;
{
	char *p;

	p = malloc(size);
	if (p == NULL) perror("out of memory!","");
	return p;
}	

/* ---------------------------------------------------------------------- */

/* Print an error and exit */

void
perror(s1,s2)
char *s1;
char *s2;
{
	fprintf(stderr,"newsort: %s %s\r\n",s1,s2);
	exit(1);
}

------------------end newsort.c--------------------end newsort.c--------------
begin 755 newsort.arc
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
! "D4
 
end

Mojo
... Morris Jones, MicroPro Int'l Corp., Product Development
Northern Calif. Motorcycle Safety Council, MSF Instructor
{lll-crg,ptsfa,dual,well,pyramid}!micropro!mojo
Not the opinion of MicroPro!

Democracy: The bludgeoning of the people by the people for the people.
					-- John Galt