#ifndef lint
static char *sccsid = "@(#)pre_mus.c	1.2 (UKC) 29/7/88";
#endif  lint
#include "pre_mus.h"

#ifdef unix
#define default1 "mus_default"
#define default2 "/usr/local/lib/music/mus_default"	/* LIBDIR */
#endif
#ifdef vms
#define default1 "default.mus"
#define default2 "user_d:[pdxtmb.pre_mus]default.mus"
#endif

int     get_monitor = 0,
        set_monitor = 0,
	put_monitor = 0,
        root_now = 8,
	octv_now = 0,
	keysharp = 0,
        keysemi = 0;

char    file[64];
char    buff[512];

main (argc, argv) int   argc;
char   *argv[];
{
    char   *p;

 /* global once-and-for-all defaults */

    within_ms = 0;
    root_now = piecev.p_root = 0;/* 'c' */
    key_now = piecev.p_key = 'c';/* 'c' */
    clefs_now[0] = clef_now = 't';/* treble */
    octv_now = piecev.p_octv = '5';/* middle 'c' */
    piecev.p_bars = 8;		/* no of bars */
    tsig_n_now = piecev.p_tsig_n = 4;/* timesig numerator */
    tsig_d_now = piecev.p_tsigd = 4;/* timesig denominator */
    piecev.p_beat_length = SBL / piecev.p_tsigd;
    piecev.p_bar_length = SBL / piecev.p_tsigd * piecev.p_tsig_n;
    piecev.p_lead_notes = 0;
    n_staffs = 1;
    n_parts = 1;
    beamslope = 0;
 /* check argument flags */
    argc--;
    argv++;
    while (argc > 0 && **argv == '-') {
	p = *argv;
	p++;
	switch (*p++) {
	    case 'v': 		/* verbosity */
		verbose = 1;
		switch (*p) {
		    case 'p': 
			put_monitor = atoi (p + 1);
			break;
		    case 's': 
			set_monitor = atoi (p + 1);
			break;
		    case 'g': 
			get_monitor = atoi (p + 1);
			break;
		    default: 
			verbose = atoi (p);
			break;
		}
		break;
	    case 's': 		/* whats in the b_sig */
		while (*p) {
		    if (*p == 'c')
			clefsig = 1;
		    else
			if (*p == 'k')
			    keysig = 1;
			else
			    if (*p == 't')
				timesig = 1;
			    else
				ioerror ("Invalid sig \"%c\"\n", *p, 0);
		    p++;
		}
		break;
	    case 'p': 		/* proportional spacing */
		if (*p)
		    bps_now = atoi (p);
		break;
	    case 'h': 		/* stave height in hundredths of an inch 
				*/
		if (*p)
		    height = atoi (p);
		break;
	    case 'w': 		/* page_width in hundredths of an inch */
		if (*p)
		    width = atoi (p);
		break;
	    case 'g': 		/* inter-note gap */
		if (*p)
		    hgap = atoi (p);
		break;
	    case 'u': 		/* up/down borderline */
		if (*p)
		    up_down_border = atoi (p);
		break;
	    case 'k': 		/* transpose by given no of sharps */
		if (*p) {
		    keysharp = atoi (p);
		    keysemi = mod (keysharp * 7 + 6) - 6;
		}
		break;
	    default: 
		ioerror ("Don't recognise flag \"%c\"\n", *(p - 1), 0);
	}
	argc--;
	argv++;
    }

    if (file_open (default1) < 0)
	if (file_open (default2) < 0) {
	    fprintf (stderr, "No \"mus_default\" file\n");
	}

    if (fd) {
	if (verbose)
	    fprintf (stderr, "Reading default file\n");
	readtoeof ();
    }

    reduction = 2400 / height;	/* stave is 24 units high */
    page_width = (int) ((1.0 * width * reduction) / 100);

    if (argc == 0)
	readtoeof ();
    else
	while (argc > 0) {
	    if ((file_open (*argv)) < 0)
		fprintf (stderr, "Can't read file %s\n", *argv);
	    else {
		if (verbose)
		    fprintf (stderr, "Reading file %s fd %d\n", *argv, fd);
		readtoeof ();
	    }
	    argc--;
	    argv++;
	}
    abandon( 0 );
}


readtoeof () {
    while (getline () >= 0) {
	if (within_ms) {
/* check MS params here */
	    if (strlen (line) > 4 && strncmp (line, ".MS", 3) == 0) {
		if (sscanf ((linep += 3), "%s", file) > 0
			&& strcmp (file, "<") == 0) {
/* if MS followed by < */
		    linep += strlen (file) + 1;
		    while (*linep && *linep == ' ')
			linep++;
/* pick up filename */
		    sscanf (linep, "%s", file);
		    linep += strlen (file);
		    while (*linep && *linep == ' ')
			linep++;
/* save what follows the filename */
		    saveinput (buff);
		    if ((file_open (file)) < 0) {
			ioerror ("Can't open %s\n", file, 0);
			abandon (1);
		    }		/* if open < 0 */
		}
		else {		/* .MS followed by junk */
		    fprintf (stderr, "Junk after .MS %s\n", line);
		    saveinput (buff);
		    buff[0] = 0;
		}
		readtoeof ();
	    }
	    else
		if (strncmp (line, ".MS", 3) != 0) {
				/* if no extra junk on .MS line */
		    execute ();
		}
	}
	else {			/* not within ".MS", ".ME" */
	    putline ();
	}
    }				/* while getline() >= 0 */
}				/* main */

execute () {
    int     i;
 /* set defaults to be reset every ".MS" */
    firstexec = 0;
    beat = 1;
    bar = 0;
    textp = text;
    octv_mode = COCTAVE;
    autobeam = 0;
    chordtransp = 0;
    n_staves = 1;
    staffv[0][0].s_clef = 't';
    staffv[0][0].s_key_offset = 0;
    staffv[0][0].s_octv = 0;
    staffv[0][0].s_join_down = 0;
    n_parts = 1;
    partv[0].pt_end_stave = 0;
    partv[0].pt_updown = 0;
    piecev.p_bps = barv[0].b_bps = 0;
    barv[0].b_s_width = 0;
 /* now get actual parameters */
    getparams (2);
 /* now get params from "buff" */
    if (buff[0] && buff[0] != '\n') {
	pushinput (buff);
	getparams (1);
	buff[0] = 0;
    }
    for (i = 0; i < NBARS; i++) {
	clearbar (i, 1);
    }
    for (i = 0; i < n_staffs; i++)
	barv[0].b_clef[i] = clefsig ? clefs_now[i] : 0;
    barv[0].b_n_tsig = timesig ? tsig_n_now : 0;
    barv[0].b_d_tsig = timesig ? tsig_d_now : 0;
    barv[0].b_root = keysig ? piecev.p_root : 0;

    getscore ();

    if (piecev.p_bars != bar - 1 && bar > 1) {
	if (verbose)
	    fprintf (stderr,
		    "****** No of bars given before .ME is %d; actual %d ******\n",
		    piecev.p_bars, bar - 1);
	piecev.p_bars = bar - 1;
    }
    piecev.p_nnotes = beat;
    if (verbose > 1)
	fprintf (stderr,
		"Finished %d(%2d%%)staffs, %2d(%2d%%)bars, %3d(%2d%%)notes\n",
		n_staffs, n_staffs * 100 / NSTAVES,
		bar,
		bar * 100 / NBARS,
		beat,
		beat * 100 / NNOTES);
    if (bar >= NBARS || beat >= NNOTES) {
	fprintf (stderr, "Abandoning too many bars or notes\n");
	abandon (1);
    }
    if (nerrs ()) {
	fprintf (stderr, "Abandoning because of errors\n");
	abandon (1);
    }
    putpiece ();
}

