/*
 * ovsplit - distribute mkov output lines into overview files
 * Kinda annoying that not everybody has a modern awk, which can do this...
 * but this is probably faster anyway.
 */

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fgetfln.h>

#define	STREQ(a, b)	(*(a) == *(b) && strcmp((a), (b)) == 0)

/* imports */
extern int optind;
extern char *optarg;
extern char *strsave(), *str3save();
extern FILE *efopen();

/* exports */
char *progname = "";
int debug;

char *dirname = NULL;
char *ovname = NULL;
FILE *ov = NULL;

/*
 * main - do it
 */
main(argc, argv)
int argc;
char *argv[];
{
	int c, errflg = 0;
	char *line;
	register char *t;
	register char *prefix;

	if (argc > 0)
		progname = argv[0];
	while ((c = getopt(argc, argv, "d")) != EOF)
		switch (c) {
		case 'd':
			++debug;
			break;
		default:
			errflg++;
			break;
		}
	if (errflg || optind != argc-1) {
		(void) fprintf(stderr, "usage: %s [-d] $NEWSOV\n",
			progname);
		exit(2);
	}
	prefix = str3save(argv[optind], "/", "");

	while ((line = fgetline(stdin, (size_t *)NULL)) != NULL) {
		t = strchr(line, '\t');
		if (t == NULL)
			error("bad input line %.40s...", line);
		*t = '\0';
		if (dirname == NULL || !STREQ(dirname, line)) {
			if (dirname != NULL)
				free(dirname);
			if (ov != NULL)
				if (nfclose(ov) == EOF)
					error("nfclose(%s) failed", ovname);
			if (ovname != NULL)
				free(ovname);
			dirname = strsave(line);
			ovname = str3save(prefix, dirname, "/.overview");
			ov = efopen(ovname, "a");
		}
		*t = '\t';
		t++;
		if (debug)
			printf("%.40s... to %s\n", t, ovname);
		fputs(t, ov);
		putc('\n', ov);
	}

	if (ov != NULL)
		if (nfclose(ov) == EOF)
			error("nfclose(%s) failed", ovname);
	exit(0);
}


syntax highlighted by Code2HTML, v. 0.9.1