This is fsplit.c in view mode; [Download] [Up]
/* Splits a large file into smaller ones ---
This file also creates a descriptor file describing what happened. */
#include <config.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#ifndef sequent
#include <stdlib.h>
#endif
#ifdef VMS
#include <file.h>
#endif
#ifdef unix
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#ifdef SYSV
#include <sys/fcntl.h>
#endif
#endif
#ifdef msdos
#include <fcntl.h>
#include <io.h>
#include <sys/stat.h>
#endif
#include "vfile.h"
void usage(char *prog)
{
char *str = "[-l max_lines] -f infile -o out_file_fmt -d dsc_name";
fprintf(stderr, "%s: Usage: %s\n", prog, str);
exit(1);
}
void error(char *fmt, char *str)
{
fprintf(stderr, fmt, str);
putc('\n', stderr);
exit(1);
}
#ifndef msdos
#define MAX_LEN 65536
int Max_Lines = 2000;
#else
#define MAX_LEN 4096
int Max_Lines = 1000;
#endif
int Quiet = 0;
char *Dsc_File;
char *Split_Fmt;
FILE *open_descriptor_file()
{
FILE *fp;
#ifdef msdos
_fmode = O_TEXT;
#endif
if (NULL == (fp = fopen(Dsc_File, "w")))
{
error("Unable to create descriptor file %s", Dsc_File);
}
#ifdef msdos
_fmode = O_BINARY;
#endif
return (fp);
}
void split(char *file)
{
VFILE *vp;
unsigned int total, len;
register int n = Max_Lines + 1;
int fp_split = -1, ext = -1;
char *buf;
char fsplit[256];
FILE *fd;
register int max_low = Max_Lines - 50;
register int max_hi = Max_Lines + 50;
register int flag;
if (max_low < 0) max_low = Max_Lines;
#ifdef msdos
_fmode = O_BINARY;
#endif
if (NULL == (vp = vopen(file, MAX_LEN)))
{
error("Error opening %s\n", file);
}
fd = open_descriptor_file();
fprintf(fd, "%s\n%s\n", file, Split_Fmt);
while (NULL != (buf = vgets(vp, &len)))
{
if ((n >= max_hi) || flag)
{
if (fp_split != -1)
{
close(fp_split);
fprintf(fd, "%s : %d lines\n", fsplit, n);
}
sprintf(fsplit, Split_Fmt, ++ext);
#ifdef VMS
fp_split = open(fsplit, O_WRONLY | O_CREAT | O_TRUNC, 0, "rat=cr", "rfm=var");
#else
#ifdef unix
fp_split = open(fsplit, O_WRONLY | O_CREAT | O_TRUNC, 0666);
#else
fp_split = open(fsplit, O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
#endif
#endif
if (fp_split < 0)
{
error("Error creating %s", fsplit);
}
else if (!Quiet)
{
fprintf(stderr, "Writing %s\n", fsplit);
}
n = 0;
}
write(fp_split, buf, len);
flag = 0;
if ((n > max_low) && (*buf == '}')) flag = 1;
n++;
}
if (fp_split != -1)
{
close(fp_split);
fprintf(fd, "%s : %d lines\n", fsplit, n);
}
fclose(fd);
vclose(vp);
}
int main(int argc, char **argv)
{
char *file = NULL;
int i;
/* if (argc < 2) usage(argv[0]); */
for (i = 1; i < argc; i++)
{
if (!strcmp(argv[i], "-quiet")) Quiet = 1;
else if (!strcmp(argv[i], "-l"))
{
i++;
if ((i >= argc) || (1 != sscanf(argv[i], "%d", &Max_Lines))) usage(argv[0]);
}
else if (!strcmp(argv[i], "-f"))
{
i++;
if (i >= argc) usage(argv[0]);
file = argv[i];
}
else if (!strcmp(argv[i], "-o"))
{
i++;
if (i >= argc) usage(argv[0]);
Split_Fmt = argv[i];
}
else if (!strcmp(argv[i], "-d"))
{
i++;
if (i >= argc) usage(argv[0]);
Dsc_File = argv[i];
}
else usage(argv[0]);
}
if ((file == NULL) || (Split_Fmt == NULL) || (Dsc_File == NULL)) usage(argv[0]);
split(file);
return(0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.