/*********************************************************************/
/* file: ticks.c - functions for the ticker stuff */
/* TINTIN III */
/* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t */
/* coded by peter unold 1992 */
/*********************************************************************/
#include <ctype.h>
#include <string.h>
#include <signal.h>
#include "tintin.h"
#if IRIX
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#endif
#ifndef BADSIG
#define BADSIG (void (*)())-1
#endif
/* externs */
struct session *sessionlist;
/* local globals */
int sec_to_tick, time0, tick_size=75;
int ticker_interrupted;
/*********************/
/* the #tick command */
/*********************/
void tick_command(ses)
struct session *ses;
{
if(ses) {
if(ses->tickstatus) {
char buf[100];
sprintf(buf, "THERE'S NOW %d SECONDS TO NEXT TICK.", sec_to_tick);
tintin_puts(buf, ses);
}
else
tintin_puts("MY TICKER IS OFF! DUNNO SECONDS TO TICK", ses);
}
else
tintin_puts("#NO SESSION ACTIVE => NO TICKER!", ses);
}
/************************/
/* the #tickoff command */
/************************/
void tickoff_command(ses)
struct session *ses;
{
if(ses) {
ses->tickstatus=FALSE;
tintin_puts("#TICKER IS NOW OFF.", ses);
}
else
tintin_puts("#NO SESSION ACTIVE => NO TICKER!", ses);
}
/***********************/
/* the #tickon command */
/***********************/
void tickon_command(ses)
struct session *ses;
{
if(ses) {
ses->tickstatus=TRUE;
tintin_puts("#TICKER IS NOW ON.", ses);
}
else
tintin_puts("#NO SESSION ACTIVE => NO TICKER!", ses);
}
/************************/
/* the #tickset command */
/************************/
void tickset_command(ses)
struct session *ses;
{
if(ses)
time0=time(NULL); /* we don't prompt! too many ticksets... */
else
tintin_puts("#NO SESSION ACTIVE => NO TICKER!", ses);
}
/*************************/
/* the #ticksize command */
/*************************/
void ticksize_command(arg, ses)
char *arg;
struct session *ses;
{
if(*arg!='\0') {
if(isdigit(*arg)) {
tick_size=atoi(arg);
time0=time(NULL);
tintin_puts("#OK NEW TICKSIZE SET", ses);
}
else
tintin_puts("#SPECIFY A NUMBER!!!!TRYING TO CRASH ME EH?", ses);
}
else
tintin_puts("#SET THE TICK-SIZE TO WHAT?", ses);
}
/****************************************/
/* alarm signal handler used for ticker */
/****************************************/
static void tick_func()
{
ticker_interrupted=TRUE;
alarm(1);
if(signal(SIGALRM, tick_func)==BADSIG)
syserr("signal SIGALRM");
sec_to_tick=tick_size-((time(NULL)-time0)%tick_size);
if(sec_to_tick==tick_size || sec_to_tick==10) {
struct session *sesptr;
for(sesptr=sessionlist; sesptr; sesptr=sesptr->next)
if(sesptr->tickstatus)
if(sec_to_tick==tick_size)
tintin_puts("#TICK!!!", sesptr);
else
tintin_puts("#10 SECONDS TO TICK!!!", sesptr);
}
}