/******************************************************************************
 *
 * RCS ID
 * $Id: utils,v 1.2 2000/02/08 20:17:58 david Exp $
 *
 * HISTORY
 * $Log: utils,v $
 * Revision 1.2  2000/02/08 20:17:58  david
 * Added Detect!lanman98 and detect extensions - tidied filetype stuff
 * Changed delimiter for files with duplicate names but same extension
 * from / to ALT+\
 *
 * Revision 1.1  1999/11/07 15:14:54  david
 * Updates to support StripExtension, set filetype
 * utils:new stuff!
 *
 *
 *
 *****************************************************************************/                    

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

#include "kernel.h"
#include "includes.h"
#include "toolbox.h"

#include "C:swis.h"
#if 0
#include "C:wimp.h" 
#include "C:wimplib.h"
#endif

#if 0
#include "RiscOSLib:coords.h"
#include "RiscOSLib:colourtran.h"
#include "RiscOSLib:font.h"

#include "utils.h"
#endif

#define CallSWI(a) (ERS = _kernel_swi(a,&regs,&regs))

void get_screen_size(int *x,int *y)
{
    _kernel_swi_regs in,out;  

    in.r[0]=-1;
    in.r[1]=11; 
    _kernel_swi(OS_ReadModeVariable,&in,&out);

    *x=out.r[2];

    in.r[0]=-1;
    in.r[1]=12; 
    _kernel_swi(OS_ReadModeVariable,&in,&out);

    *y=out.r[2];

   
    in.r[0]=-1;
    in.r[1]=4; 
    _kernel_swi(OS_ReadModeVariable,&in,&out);

    *x=(*x)<<out.r[2];  

    in.r[0]=-1;
    in.r[1]=5; 
    _kernel_swi(OS_ReadModeVariable,&in,&out);

    *y=(*y)<<out.r[2];                 
  
}

void CLG(void)
{
   _swix(0x110,0);
}

void VDU(int c)
{
   _swix( 0x100 + (c & 0xff), 0 );
}                            

void VDU7(void)
{
   _swix(0x107,0);
}

void PLOT(int plot_code,int x, int y)
{                                    
    _kernel_swi_regs in,out;
 
    in.r[0]=plot_code;
    in.r[1]=x;
    in.r[2]=y; 
    _kernel_swi(OS_Plot,&in,&out);
}
              
#if 0
int OVERLAP(BBox *b0, BBox *b1 )
{
    if (b0->xmin > b1->xmax)
        return 0;

    if (b0->ymin > b1->ymax)
        return 0;

    if (b0->xmax < b1->xmin)
        return 0;

    if (b0->ymax < b1->ymin)
        return 0;

    return 1;
}


void XDrawLine(BBox *fred)
{


       PLOT(4,fred->xmin,fred->ymin);
       PLOT(5,fred->xmax,fred->ymax);

}

void XDrawRectangle(BBox *fred)
{

       PLOT(4,fred->xmin,fred->ymin);
       PLOT(5+96,fred->xmax,fred->ymax); 
}

#define font_LENGTH    0x80
#define font_TRANSFORM 0x40

void FONT_PAINT(int current_font,char *s, int x, int y,int length,
                int scale,int height,int dir)
{
    _kernel_oserror *ERS=NULL;
    _kernel_swi_regs regs;
    int  trfm[3][2] = {{0,0},{0,0},{0,0}};

    if (!dir) {
       trfm[0][0] = (scale * DM) /100;
       trfm[1][1] = (scale * DM) /100;
    } else {
       trfm[0][1] = (scale * DM) /100;
       trfm[1][0] = - (scale * DM) /100;
       trfm[2][0] = (height * scale * 400) /100;
    }

    regs.r[0]=current_font;
    regs.r[1]=(int)s;
    regs.r[2]=font_ABS | font_RUBOUT | font_LENGTH | font_TRANSFORM;
    regs.r[3]=x*400;
    regs.r[4]=y*400;
    regs.r[5]=0;
    regs.r[6]=(int)&trfm;;
    regs.r[7]=length;    
    
    if (CallSWI(Font_Paint) != NULL)
          wimp_report_error(ERS,0,0);

}

#endif

void RiscosMonoTime(unsigned char *buffer, int bufLen)
{
  int i;
  _kernel_swi_regs r;               
  _kernel_oserror *e;         
 
  for (i=0;i<bufLen-4;i+=4)
  {
    e = _kernel_swi(OS_ReadMonotonicTime, &r, &r);
  
    if (e==NULL)
    {
      buffer[i]   = (unsigned char)((r.r[0] & 0xff000000) >> 24);
      buffer[i+1] = (unsigned char)((r.r[0] & 0x00ff0000) >> 16);
      buffer[i+2] = (unsigned char)((r.r[0] & 0x0000ff00) >>  8);
      buffer[i+3] = (unsigned char) (r.r[0] & 0x000000ff)       ;
    }

  }                                             
                               
  DEBUG(10,("RiscosMonoTime\n"));
  dump_data(10,(char*)buffer,bufLen);
  
}

static int messagesFileOpen = 0;

static int openMessagesFile(MessagesFD *fd)
{
  extern char *getMsgFilename(void);      
  _kernel_swi_regs r;               
  _kernel_oserror *e;
  int result = 0;

  if (messagesFileOpen==1)
  {
    result=1;
  }
  else
  {
    r.r[0] = (int)fd;
    r.r[1] = (int)getMsgFilename();
    r.r[2] = 0;

    e = _kernel_swi ( MessageTrans_OpenFile, &r, &r);

    if (e==NULL)
    {
      DEBUG(5,("opened message file OK\n"));
      messagesFileOpen = 1;
      result = 1;
    }
    else
    {
      DEBUG(0,("Open Message file failed: errnum %d, errmess %s\n", 
            e->errnum,e->errmess));
    }
  }

  return result;
}
                 
void closeMessagesFile(void)
{
  extern MessagesFD *getMsgFd(void);
  _kernel_swi_regs r;               
  _kernel_oserror *e;
  MessagesFD *fd;

  fd = getMsgFd();

  if (fd!=NULL)
  {
    r.r[0] = (int)fd;  
    e = _kernel_swi ( MessageTrans_CloseFile, &r, &r);
    messagesFileOpen = 0;
  }
}

void getHelpText(char **ppHelpText, char *pToken)  
{
  extern MessagesFD *getMsgFd(void);
  MessagesFD *fd;
  _kernel_swi_regs r;               
  _kernel_oserror *e;     
  char *theMsg;
                   
  fd = getMsgFd();

  if (fd!=NULL)
  {

    if (openMessagesFile(fd)==1)
    {
    
      r.r[0] = (int)fd;
      r.r[1] = (int)pToken;
      r.r[2] = 0;
      r.r[3] = 0;
      r.r[4] = 0;
      r.r[5] = 0;
      r.r[6] = 0;
      r.r[7] = 0;   

      e = _kernel_swi ( MessageTrans_Lookup, &r, &r);
      if (e==NULL)
      {

        theMsg = malloc(r.r[3]+1);
        strncpy(theMsg, (const char*)r.r[2], r.r[3]);
        theMsg[r.r[3]]='\0';

        DEBUG(0,("result %s, %s\n",pToken,theMsg));  

        *ppHelpText = theMsg;

      }
      else
      {
        DEBUG(5,("Message loolup failed: errnum %d, errmess %s\n", 
                 e->errnum,e->errmess));
      }

 
    }

  }
}



