home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
300-399
/
ff304.lzh
/
Multic
/
multic.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-01-10
|
5KB
|
250 lines
/*
* Multic : multi-column text formatter
*
* by Joel Swank 1/3/89
*
*/
#include <stdio.h>
#define FALSE 0
#define TRUE 1
/* page format parameters */
/* user selected parms */
int pagesize = 60; /* Number of lines on a page */
int columns = 2; /* number of print columns */
int linesize = 80; /* size of output line */
int skip = 0; /* lines between pages, 0= do '\f' */
int gap = 0; /* space between columns */
/* derived parms */
int colsize; /* size of each column */
int numptrs; /* number of pointers needed */
/* stock of blanks for gap */
char blanks[] = " ";
char *malloc(), *index();
char **pagebuf; /* pointer to array of pointers for lines */
/****************************************************************/
/* Main program starts here */
/****************************************************************/
main(argc,argv)
int argc;
char *argv[];
{
int argindex;
if (argc < 2)
{
usage();
exit(1);
}
/* parse the command line and execute the parameters */
argindex = 0;
while(--argc > 0)
{
argindex++;
do_parm(argv[argindex]);
}
exit(0);
}
/*
* do_file : process an input file
*/
do_file(filename)
char *filename;
{
int curptr, ret, i, j, ptrsize;
char *inbuf, *nlptr;
FILE *in;
int Eoflag = FALSE;
in = fopen(filename,"r");
if (in == NULL)
{
fprintf(stderr,"multic:cannot open %s\n",filename);
exit(7);
}
/* calculate individual column size */
colsize = ((linesize-(columns-1)*gap)/columns);
inbuf = malloc(colsize+1); /* allocate the input buffer */
if (!inbuf) memerr();
/* allocate array of line pointers */
numptrs = (columns-1)*pagesize;
ptrsize = numptrs * sizeof(char *);
if (numptrs)
{
pagebuf = (char **) malloc(ptrsize);
setmem (pagebuf,ptrsize,'\0');
}
while (!Eoflag) /* do each page */
{
/* read in first columns-1 columns and store */
curptr = 0;
while (curptr < numptrs )
{
ret = fgets(inbuf,colsize+1,in);
if (!ret)
{
Eoflag = TRUE;
break;
}
nlptr=index(inbuf,'\n');
if (nlptr) *nlptr = '\0';
pagebuf[curptr] = malloc(strlen(inbuf)+1);
if (!pagebuf[curptr]) memerr();
strcpy(pagebuf[curptr], inbuf);
curptr++;
}
/* print out the page */
for (i=0; i< pagesize; i++) /* do each line */
{
for (j=0; j< columns-1; j++) /* do each column */
{
curptr = i+j*pagesize;
if (j == 0 && pagebuf[i] == NULL && skip == 0) goto filedun;
if (pagebuf[curptr])
{
printf("%-*.*s", colsize, colsize,pagebuf[curptr]);
free (pagebuf[curptr]);
pagebuf[curptr] = NULL;
if (gap) printf("%.*s",gap,blanks);
}
else break;
}
if (!Eoflag)
{
ret = fgets(inbuf,colsize+1,in);
if (!ret)
{
Eoflag = TRUE;
if (columns == 1 && skip == 0) goto filedun;
}
else
{
nlptr=index(inbuf,'\n');
if (nlptr) *nlptr = '\0';
printf("%.*s", colsize, inbuf);
}
}
putchar('\n');
}
filedun:
if (skip)
for (i=0; i< skip; i++) putchar('\n');
else putchar('\f');
} /* end while(!Eoflag) */
fclose(in);
free (inbuf);
if (pagebuf) free (pagebuf);
}
/*
* do_parm : process one parameter
*/
do_parm(parm)
unsigned char *parm;
{
register int i,j;
if (parm[0] == '-')
{
switch (parm[1])
{
case 'g': /* set number of spaces between columns */
gap = atoi(&parm[2]);
if (gap <0 || gap > 100)
{
fprintf(stderr,"multic:Bad gap: %s\n",
parm);
exit(6);
}
break;
case 's': /* set number of lines between pages */
skip = atoi(&parm[2]);
if (skip <0 || skip > 100)
{
fprintf(stderr,"multic:Bad skip: %s\n",
parm);
exit(6);
}
break;
case 'p': /* set number of lines per page */
pagesize = atoi(&parm[2]);
if (pagesize <20 || pagesize > 500)
{
fprintf(stderr,"multic:Bad pagesize: %s\n",
parm);
exit(6);
}
break;
case 'c': /* set number of columns */
columns = atoi(&parm[2]);
if (columns <1 || columns > 9)
{
fprintf(stderr,"multic:Bad columns: %s\n",
parm);
exit(6);
}
break;
case 'l': /* set maximum line size */
linesize = atoi(&parm[2]);
if (linesize <20 || linesize > 999)
{
fprintf(stderr,"multic:Bad linesize: %s\n",
parm);
exit(6);
}
break;
default:
fprintf(stderr,"multic:Bad flag: %s\n",parm);
usage();
exit(21);
} /* end switch */
}else {
/* not a flag, must be a filename, so print it */
do_file(parm);
}
}
/*
* exit for lack of memory.
*/
memerr()
{
fprintf(stderr,"Multic: Ran out of memory\n");
exit(10);
}
usage()
{
fprintf(stderr,"Usage: multic: [[-cn] [-ln] [-pn] [-sn] [-gn] file ...] ...\n");
fprintf(stderr,"Format file into multiple columns - args:\n");
fprintf(stderr,"-cn Format into n column output\n");
fprintf(stderr,"-ln Output line is n chatacters\n");
fprintf(stderr,"-pn Output page is n lines long\n");
fprintf(stderr,"-sn Skip n lines between pages\n");
fprintf(stderr,"-gn Skip n spaces between columns\n");
}