#include <stdio.h>
#include <setjmp.h>
#include <time.h>

extern jmp_buf Sjbuf;

extern int Debug;

extern char tty[];		/* terminal we're talking at */
extern long ttycspeed;		/* speed it's at */
extern char ttyprefix[];	/* dial prefix */
extern char ttysuffix[];	/* dial suffix */
extern char ttyinit[];		/* init string */
extern long ttyispeed;		/* init speed */
extern char ttybusy[];
extern char ttyfail[];

extern int (*cdf)();

/*
 * eXaMiNe() matches some reply string against a list of oopsie commands
 */
static
eXaMiNe(list, reply, rx, rsize)
register char *list, *reply;
register rsize;
{
    register lsize;
    register i;
    register rb;
    
    for (; *list; list += (1+lsize)) {
	lsize = strlen(list);
	rb = (rx-lsize) % rsize;

	for (i=0; i<lsize; i++)
	    if (reply[(rb+i)%rsize] != list[i])
		goto next;
	return 1;
    next:
	;
    }
    return 0;
} /* eXaMiNe */


/*
 * dial() - call someone on the telephone.
 */
dial(address, retries)
char *address;
{
    register time_t tick;
    char reply[40];
    register rx;
    int status=1;

    enable();
    ttyspeed(ttyispeed);
    slowputs(ttyinit);
    ttyspeed(ttycspeed);

    do {
	memset(reply, 0, sizeof reply);
	slowputs(ttyprefix);
	slowputs(address);
	slowputs(ttysuffix);

	for (tick=clock()+(45L*(long)CLK_TCK); tick>clock(); ) {
	    if ((*cdf)())
		return 0;
	    else while (ttystat()) {
		reply[rx] = ttyin();
		rx = (1+rx) % sizeof reply;

		if (eXaMiNe(ttybusy, reply, rx, sizeof reply))
		    goto disable;
		else if (eXaMiNe(ttyfail, reply, rx, sizeof reply)) {
		    status=2;
		    goto disable;
		}
	    }
	    sleep(1);
	}
disable:slowputs("\r");
	disable();
	sleep(2);
	enable();
	slowputs("\r");
    } while (status <= 1 && retries-- > 0);
    return status;
}