home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_progs
/
shells
/
cutpaste.lzh
/
CUTANDPASTE
/
SPASTE.C
< prev
Wrap
C/C++ Source or Header
|
1991-08-16
|
3KB
|
120 lines
/*
* Serially paste a file together
*
* John Weald
*/
#include <stdio.h>
extern void exit();
spaste(files, c, n)
char *files[]; /* Null terminate list of input files */
char c[]; /* The concatintaion characters */
int n; /* The number of above */
{
int i;
FILE *fp;
if (files[0] == (char *)NULL)
{
spfile(stdin, c, n);
return;
}
for (i = 0; files[i] != (char *)NULL; i++)
{
if (*files[i] == '-')
fp = stdin;
else if ((fp = fopen(files[i], "r")) == (FILE *)NULL)
{
fprintf(stderr, "Failed to open file %s\n", files[i]);
exit(1);
}
spfile(fp, c, n);
(void)fclose(fp);
}
}
/*
* Do the actual paste of a stream.
*
* The method here is to read in the stream and replace all newline
* characters with concatintaion characters.
* Output occurs after each chuck is parsed, or if the concatination character
* is the null seperator (otherwise puts() would screw up on whole chunk).
*
* The stream is read in BUFSIZ chunks using fread. The input buffer is one
* larger than read, so that it can be null terminated.
*
* When we read in each chunk we must check if it needs to be joined to the
* previous one i.e. the last character on the last chunk was a newline.
*/
static
spfile(fp, con, ncons)
FILE *fp; /* serially paste this stream */
char con[]; /* The concatintaion characters */
int ncons; /* The number of above */
{
char *pstart; /* The start of the string */
char *ptr; /* Walks down the stream */
char buf[BUFSIZ + 1]; /* To ensure null termination */
int n; /* Number of bytes read with fread() */
int k = 0; /* Index into concatination character array */
int join; /* Join this chunk to the next? */
char last; /* The very last character looked at. */
join = 0;
while ((n = fread(buf, sizeof(char), sizeof(buf) - 1, fp)) != 0)
{
if (join)
{
/* Join with last chunk */
putchar(con[k]);
k = (k + 1) % ncons;
join = 0;
}
/* Join to next chunk? */
if (buf[n-1] == '\n')
{
join++;
/* Ignore the newline */
n--;
}
/* ensure null terminated buffer */
buf[n] = '\0';
/*
* walk thru this chunk
* replace all newlines with the next concat. char.
*/
for (pstart = ptr = buf; *ptr != '\0'; ptr++)
{
if (*ptr == '\n')
{
*ptr = con[k];
if (con[k] == '\0')
{
fputs(pstart, stdout);
pstart = ptr + 1;
}
k = (k + 1) % ncons;
}
}
fputs(pstart, stdout);
last = *(ptr - 1);
}
/*
* Maybe they asked for the newline as the
* concatination char. We would hate to give them two newlines
* in a row.
*/
if (last != '\n')
putchar('\n');
}