
 /* SP_InfoSubs.c
    - Functions for ST-Support -
    (c) 1994 by Andreas R. Kleinert
    Last changes : 07.05.1994
 */

#include "spobject.h"

#include <ctype.h>


 /* PUBLIC functions (high level) */

ULONG __saveds __asm SPO_FileInfoRequest( register __a1 struct SPObjectHandle *SPObjectHandle_a1, register __a2 struct Window *window, register __a3 ULONG future);
ULONG __saveds __asm SPO_CheckFileType(register __a1 BPTR handle, register __a2 UBYTE *filename, register __a3 APTR future);
void  __saveds __stdargs SPLI_SPrintf(APTR buffer, char *formatstring, ...);


/* *************************************************** */
/* *                                                 * */
/* * SPO_FileInfoRequest : Display File Information  * */
/* *                                                 * */
/* *************************************************** */

ULONG __saveds __asm SPO_FileInfoRequest( register __a1 struct SPObjectHandle *SPObjectHandle_a1, register __a2 struct Window *window, register __a3 ULONG future)
{
 struct SPObjectHandle *SPObjectHandle = SPObjectHandle_a1;

 ULONG retval = SPERR_NO_ERROR;
 char buffer [2001], h_buf [80], hbuf2[5];
 ULONG idcmp = N, noinfo = TRUE;
 struct EasyStruct *estr;
 struct Window     *disp_win = window;

 if(!SPObjectHandle) return(SPERR_NO_HANDLE);

 buffer[0] = (char) 0;

 if(SPObjectHandle->ah_STModule)
  {
   struct STHeader *STHeader = SPObjectHandle->ah_STModule;
   UWORD i, j;

   noinfo = FALSE;

   strcat(buffer,   "\n File Information"
                  "\n\n File Type : SoundTracker/ProTracker/NoiseTracker (ST)");

   strcat(buffer, "\n");

   strcat(buffer, "\n Module-Name    : ");
   strcat(buffer, SPObjectHandle->ah_ReadName);

   strcat(buffer, "\n Module-Length  : ");
   sprintf(h_buf, "%ld Bytes", SPObjectHandle->ah_STLen);
   strcat(buffer, h_buf);

   strcat(buffer, "\n Module-Type    : ");

   strncpy(hbuf2, &STHeader->st_ID[0], 4);
   hbuf2[4] = (UBYTE) 0;

   sprintf(h_buf, "%4s", hbuf2);
   strcat(buffer, h_buf);

   strcat(buffer, "\n Song-Name      : ");
   strcat(buffer, STHeader->st_SongName);

   for(i=0; i<31; i++) if(!STHeader->st_Instruments[i].st_InstrumentLength) { i++; break; }

   sprintf(h_buf, "\n %-2ld Instruments : \n\n ", i);
   strcat(buffer, h_buf);

   for(i=j=0; j<31; j++)
    {
     if(isprint(STHeader->st_Instruments[j].st_InstrumentName[0]))
      {
       STHeader->st_Instruments[j].st_InstrumentName[21] = (UBYTE) 0;

       sprintf(h_buf, "\42%-21s\42  ", STHeader->st_Instruments[j].st_InstrumentName);
       strcat(buffer, h_buf);

       if(!(++i % 3)) strcat(buffer, "\n ");
      }
    }

  }else retval = SPERR_NO_HANDLE;

 if(!retval)
  {
   if(noinfo)
    {
     strcat(buffer,   "\n File Information"
                    "\n\n No information available\n");
    }

   estr = AllocVec(sizeof(struct EasyStruct), MEMF_CLEAR);
   if(estr)
    {
     estr->es_StructSize   = sizeof(struct EasyStruct);
     estr->es_Flags        = N;
     estr->es_Title        = "SuperPlay InfoRequester";
     estr->es_TextFormat   = buffer;
     estr->es_GadgetFormat = "Confirm";

     if(!disp_win) disp_win = SPObjectHandle->ah_ReqIOWindow;

     EasyRequestArgs(disp_win, estr, &idcmp, N);
     FreeVec(estr);
    }
  }

 return(retval);
}

/* *************************************************** */
/* *						     * */
/* * SPLI_CheckFileType : ...           	     * */
/* *						     * */
/* *************************************************** */

ULONG __saveds __asm SPO_CheckFileType(register __a1 BPTR handle_a1, register __a2 UBYTE *filename, register __a3 APTR future)
{
 UBYTE *nameptr = filename;

 while(*nameptr!=(UBYTE)0)
  {
   while(*nameptr!='.' && *nameptr!=(UBYTE)0) nameptr++;

   if(*nameptr=='.')
    {
     if(!strnicmp("MOD.", nameptr-3, 4)) return(TRUE);
     if(!strnicmp(".MOD", nameptr,   4)) return(TRUE);

    }else nameptr++;
  }

 return(FALSE);
}

extern void Fmt(void); /* Assembler-Routine for RawDoFmt */

void __saveds __stdargs SPLI_SPrintf(APTR buffer, char *formatstring, ...)
{
 RawDoFmt((APTR) formatstring, (APTR) (((ULONG *)&formatstring)+1), (APTR) &Fmt, (APTR) buffer);
}
