/* Part of DoorLib v1.12

   Name   : Utility
   Version: 1.12
   Date   : Saturday, 1st June 1996

   Purpose: DoorLib's utility functions.

   Creator: Richard Murray
*/

#include <stdio.h>
#include <stdlib.h>

#include "ctype.h"
#include "kernel.h"
#include "stdarg.h"
#include "strings.h"
#include "time.h"

#include "doorlib.h"


int doors_yesno(int bs_port, int bs_returncode)
/* Waits for 'Y' or 'y' or 'N' or 'n' or 'Return' or 'Ctrl+C'... */
{
   int bs_reply=-1;
   int bs_done=FALSE;
   int bs_retcode=TRUE;
   int bs_exitcode=0;

   if (bs_returncode!=TRUE && bs_returncode!=FALSE) bs_retcode=FALSE;

   while (bs_done==FALSE)
   {
      poll_the_wimp();
      bs_reply=doors_getbyte(bs_port);
      switch (bs_reply)
      {
         case 'Y' :
         case 'y' : bs_done=TRUE;
              	    bs_exitcode=TRUE;
              	    break;
         case 'N' :
         case 'n' : bs_done=TRUE;
              	    bs_exitcode=FALSE;
              	    break;
         case 13  : if (bs_retcode==TRUE)
              	    {
              	       bs_done=TRUE;
              	       bs_exitcode=bs_returncode;
              	    }
              	    break;
         case  3  : bs_done=TRUE;
               	    bs_exitcode=-1;
               	    break;
         default  : break;
      }
   }
   return bs_exitcode;
}


int doors_scrollrq(int bs_port)
/* Waits for 'Return' or 'N' or 'n' or 'Ctrl+C'... */
{
   int bs_reply=-1;
   int bs_done=FALSE;
   int bs_exitcode=0;

   while (bs_done==FALSE)
   {
      poll_the_wimp();
      bs_reply=doors_getbyte(bs_port);
      switch (bs_reply)
      {
         case 13  : bs_done=TRUE;
              	    bs_exitcode=TRUE;
              	    break;
         case 'N' :
         case 'n' : bs_done=TRUE;
              	    bs_exitcode=FALSE;
              	    break;
         case  3  : bs_done=TRUE;
               	    bs_exitcode=-1;
               	    break;
         default  : break;
      }
   }
   return bs_exitcode;
}


char *doors_centretext(char *bs_string, int bs_width)
/* Takes in a string and centres it. */
{
   int bs_tab;
   int bs_posn;
   char bs_outstr[254];

   if (bs_width==0) bs_width=78;
   if (bs_width<=strlen(bs_string)) return bs_string;

   bs_tab=bs_width-strlen(bs_string);
   bs_tab=bs_tab/2;

   bs_posn=0;
   while (bs_posn < bs_tab)
   {
      bs_outstr[bs_posn]=32;
      bs_posn++;
   }
   bs_outstr[bs_posn]=0;
   strcat(bs_outstr,bs_string);
   return bs_outstr;
}

void doors_strfill(char *bs_string, int bs_fill, int bs_length)
/* fill 'bs_string' with 'fill' for 'length'-1. No validity checks are made... */
{
   while(--bs_length)
   {
      *bs_string++=bs_fill;
   }
   *bs_string++='\0';
}


void doors_substr(char *bs_from, char *bs_to, int bs_start, int bs_length)
/* moves characters from 'bs_from' to 'bs_to' starting at 'bs_start' for 'bs_length' number
   of characters. For beginning of string use 1, not 0. Can be cleverly used as MID$ or
   LEFT$ or RIGHT$. :-) */
{
   int bs_offset=0;

   bs_start--;

   while (bs_from[bs_offset]!=0 && bs_offset!=bs_length)
   {
      bs_to[bs_offset] = bs_from[bs_start];
      bs_start++;
      bs_offset++;
   }
   bs_to[bs_offset]=0;
}


char *doors_itoa(int bs_number)
{
   char *bs_string;
   strcpy(bs_string,"0");
   sprintf(bs_string,"%d",bs_number);
   return bs_string;
}


char *doors_string(int bs_number, int fill)
{
   int loop;
   char bs_string[512];

   bs_number--;

   loop=0;
   while (loop!=bs_number)
   {
      bs_string[loop]=fill;
      loop++;
   }
   bs_string[loop]=0;
   return bs_string;
}


void doors_reset(int bs_port)
/* Flush buffers and totally reset terminal */
{
   doors_inputflush(bs_port);
   doors_outputflush(bs_port);
   doors_txf(bs_port,"%c[0;37;40m%c[2J%c[%d;%dH",27,27,27,0,0);
}


void doors_flush(int bs_port)
{
   doors_inputflush(bs_port);
   doors_outputflush(bs_port);
}


void doors_inputflush(int bs_port)
{
   _kernel_swi_regs bs_rin, bs_rout;
   bs_rin.r[0] = bs_port;
   _kernel_swi(ARCbbsDoors_ClearInput,&bs_rin,&bs_rout);
}


void doors_outputflush(int bs_port)
{
   _kernel_swi_regs bs_rin, bs_rout;
   bs_rin.r[0] = bs_port;
   _kernel_swi(ARCbbsDoors_ClearOutput,&bs_rin,&bs_rout);
}


void doors_includeX5(void)
{
   printf("BUDGIESOFT DOORLIB :: UTILITY");
}
