/* select.c - by Daniel Rice, 11/91.
   Permission is granted for any use of this code. */

/* Select a portion of the Tanach by giving beginning and ending
   book, chapter, and verse numbers.  A '#' character may be used in
   place of a number to mean 'as large as possible.' For example,

   select 1 1 1 1 # # < torah

   would output all of Bereshit (Genesis). */

#include <stdio.h>

#define MAXLINE 1000
#define MAXNUM 4
#define HUGE 999999


int
my_atoi(s)
char *s;

{
	if (s[0] == '#')
		return HUGE;
	else
		return atoi(s);
}


int
reverse (s)
char *s;

{
	if (strlen(s) == 1)
		return s[0] - '0';
	else if (strlen(s) == 2)
		return 10 *(s[1] - '0') + (s[0] - '0'); 
	else if (strlen(s) == 3)
		return 100 *(s[2] - '0') + 10*(s[1] - '0') + (s[0] - '0');
	else {
		fprintf (stderr, "Too big!\n");
		exit (1);
	}
}


main (argc, argv)
char **argv;

{
	char line[MAXLINE];
	int sbook, schapter, sverse;
	int dbook, dchapter, dverse;
	int b, c, v;
	char bs[MAXNUM], cs[MAXNUM], vs[MAXNUM];
	int pos = 1;
	int reverse_nums = 0;

	if (argc < 7) {
		fprintf(stderr, "usage: %s [-r] book1 chapter1 verse1 book2 chapter2 verse2\n", argv[0]);
		fprintf(stderr, "Use the -r flag if the numbers are in Hebrew (right-to-left order).\n");
		exit(0);
	}

	/* The -r flag indicates that the numbers are in r-to-l order. */
	if (argv[1][0] == '-' && argv[1][1] == 'r' && argc >= 8) {
		reverse_nums = 1;
		++pos;
	}

	sbook = my_atoi(argv[pos++]);
	schapter = my_atoi(argv[pos++]);
	sverse = my_atoi(argv[pos++]);

	dbook = my_atoi(argv[pos++]);
	dchapter = my_atoi(argv[pos++]);
	dverse = my_atoi(argv[pos++]);

/* This algorithm could be made more efficient -- as it is, it checks every
   line for membership in the desired region. */

	while (fgets(line, MAXLINE, stdin)) {
		sscanf(line, "%[0-9] %[0-9] %[0-9]", &bs, &cs, &vs);
		b = reverse_nums ? reverse(bs) : atoi(bs);
		c = reverse_nums ? reverse(cs) : atoi(cs);
		v = reverse_nums ? reverse(vs) : atoi(vs);

		if ((b >= sbook && b <= dbook) &&
		    (b != sbook || c >= schapter) &&	
			(b != dbook || c <= dchapter) &&
			(b != sbook || c != schapter || v >= sverse) &&
			(b != dbook || c != dchapter || v <= dverse))
			fputs(line, stdout);
	}
}

