#ifndef lint
static char sccsid[] = "@(#)rdscor.c	1.3 (mg@ukc.ac.uk) 5/18/90";
#endif
#include "cs.h"			/*						RDSCOR.C	*/

extern FILE *scorefp;	/* Where to read score from, set by main() */

rdscor(e)			/* read next score-line */
 register struct event *e;      /* presumes good format from scsort */
{
    register float *pp, *plim;
    int  c;
    static scanflt(), flushline();

    while ((c = getc(scorefp)) != EOF)
	switch (c) {
	case 'w':
	case ';':
	    flushline();
	    break;
	default:
	    e->opcod = c;				           /* opcod */
	    pp = &e->p[0];
	    plim = &e->p[PMAX];
	    if (getc(scorefp) != '\n' && scanflt(++pp))	           /* p1      */
	      if (getc(scorefp) != '\n' && scanflt(&e->p2orig))        /* p2 orig */
		if (getc(scorefp) != '\n' && scanflt(++pp))            /* p2 warp */
		  if (getc(scorefp) != '\n' && scanflt(&e->p3orig))    /* p3 orig */
		    if (getc(scorefp) != '\n' && scanflt(++pp))        /* p3 warp */
		      while (getc(scorefp) != '\n' && scanflt(++pp))   /* p4....  */
			if (pp >= plim) {
			  flushline();
			  ++pp;
			  break;
			}
	    e->pcnt = pp - &e->p[0];
	    return(1);
	}
    return(0);
}

static scanflt(pfld)     /* read a float; return 1 if OK, else 0 */
 float *pfld;
{
    register int  c;
    register long val=0, scale=1;

    while ((c = getc(scorefp)) == ' ' || c == '\t')     /* skip leading white space */
        ;
    if (!(c>='0' && c<='9' || c=='+' || c=='-' || c=='.'))
        return(0);                                  /* fail if not valid float  */
    if (c == '-') {scale = -1; c = getc(scorefp);}
    if (c == '+' || c == '0')  c = getc(scorefp);
    while (c >= '0' && c <= '9') {
        val *= 10;
	val += c - '0';
	c = getc(scorefp);
    }
    if (c == '.')
        c = getc(scorefp);
    while (c >= '0' && c <= '9') {
        val *= 10;
	val += c - '0';
	scale *= 10;
	c = getc(scorefp);
    }
    *pfld = (float) val/scale;          /* write pfield */
    ungetc(c,scorefp);                    /* push next whitespace back */
    return(1);
}

static flushline()			/* flush to next newline */
{
    int c;
                                    
    while ((c = getc(scorefp)) != EOF && c != '\n')
	;
}

