;/*  GDir v2.0 -  Mark Weller (Aug 2000)
;    Copies dir/file name selected from ASL file requester to ClipBoard

dcc -o TsHTML TsHTML.c clipftxt.c
quit
*/

#include <exec/types.h>
#include <exec/ports.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <exec/exec.h>
#include <devices/clipboard.h>
#include <libraries/dosextens.h>
#include <libraries/dos.h>
#include <libraries/asl.h>
#include <sys/stat.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <intuition/intuition.h>

char *version = "$VER: TsHTML v(06-FEB-2001)1.0";

#define CAH_ON              1
#define CAH_OFF             0
#define CAH_EXT             10
#define CAH_MAXPATH         255
#define CAH_MAXFILE         31
#define CAH_MAXSHORT        100
#define CAH_README          ".readme"


char *extension_types[] =
{
 "readme","README","htm","HTM","html","HTML","shtml","SHTML","info","INFO",""
};

/* struct IntuitionBase *IntuitionBase; */

/*--Functions--*/

extern int WriteLong(struct IOClipReq *,long *);
extern struct IOClipReq *CBOpen(ULONG);
extern int CBWFTXT(struct IOClipReq *,char *);
extern void CBClose(struct IOClipReq *);

int GDirectory(char *,char *);

main(int argc, char *argv[])
{
struct IOClipReq *ClipIO;
int    error = '0';
int    err = 0;
char   dirname[200];
char   filename[50];
char   txtbuff[1024];
char   fsize[10];
char   readme_file[CAH_MAXFILE];
char   short_desc[CAH_MAXSHORT];

FILE   *tmpcode;

   /* usage - help */
   if(argv[1][0] == 'h' || argv[1][0] == 'H')
     {
      printf("%s\n",version);
      printf("see readme for help!\n");
      exit(0);
     }

   err = GDirectory(dirname,filename);

   if(err == 1) {  printf("Gdir -: ERROR?\n"); }
   else {
         if(IsDir(dirname,filename) == 1)
           {
            if(IsFileValid(filename) == 1)
              {
               fsize[0] = '\0';
               GetFileSize(dirname,filename,fsize);
               readme_file[0] = '\0';
               GetReadme(filename,readme_file);
               short_desc[0] = '\0';
               GetShort(dirname,readme_file,short_desc);

               if(argc == 1) /*-create temp table entry ram:tshtml.code -*/
                 {
                   if(!(tmpcode = fopen("RAM:tshtml.code","a")))
                     {
                      printf("Can't create temp file in RAM:\n");
                     }
                   else
                     {
                      fprintf(tmpcode,"<tr>\n");
                      fprintf(tmpcode," <td width=40%%><left><a href=%c%s%c>%s</a></left></td>\n",'"',filename,'"',filename);
                      fprintf(tmpcode," <td width=10%%><center><font color=%c%cffff00%c>%s</font></center></td>\n",'"','#','"',fsize);
                      fprintf(tmpcode," <td width=50%%><left><a href=%c%s%c>%s</a></left></td>\n",'"',readme_file,'"',short_desc);
                      fprintf(tmpcode,"</tr>\n");
                      fclose(tmpcode);
                     }

                 }
               else /*- try and copy selected information to clipboard -*/
                 {
                   /* Open clipboard.device unit 0 */
                   if(!(ClipIO=CBOpen(0L)))
                     {
                      printf("exit error - Can't open ClipBoard\n");
                     }
                   else
                     {
                      txtbuff[0] = '\0';
                      switch(argv[1][0])
                         {
                           case 'A' :
                           case 'a' : sprintf(txtbuff,"%s,%s,%s,%s",
                                      filename,readme_file,fsize,short_desc); break;
                           case 'S' :
                           case 's' : sprintf(txtbuff,"%s",fsize); break;
                           case 'D' :
                           case 'd' : sprintf(txtbuff,"%s",short_desc); break;
                         }
                      CBWFTXT(ClipIO,txtbuff);
                      CBClose(ClipIO);
                     }
                 }

              }
           }

        }

   exit(0);
}

int GDirectory(char *dirbuff, char *filebuff)
{
struct Library *AslBase = NULL;

struct TagItem frtags[] =
{
    ASL_Hail,       (ULONG)"TsHTML v1.0    Mark Weller (c)2001",
    ASL_Height,     200,
    ASL_Width,      400,
    ASL_LeftEdge,   50,
    ASL_TopEdge,    25,
    ASL_OKText,     (ULONG)"OK",
    ASL_CancelText, (ULONG)"Cancel",
 /* ASL_File,       (ULONG)"my file", */
 /* ASL_Dir,        (ULONG)"RAM:",    */
    TAG_DONE
};

struct FileRequester *fr;
int err = 0;


    if(AslBase=(struct Library *)OpenLibrary("asl.library",0L))
      {
       if(fr = (struct FileRequester *)AllocAslRequest(ASL_FileRequest, frtags))
         {
            if (AslRequest(fr, NULL))
            {
                sprintf(dirbuff,"%s",fr->rf_Dir);
                sprintf(filebuff,"%s",fr->rf_File);
            }
            FreeAslRequest(fr);
         }
        else  err = 1;

        CloseLibrary(AslBase);
      }

  return(err);
}

IsFileValid(char *fname)
{
 char temp_name[31];
 char ext_buff[31];
 int name_length = 0;
 int len_cnt = 0;
 int ext_cnt = 0;
 int check = 0;
 int result = 1;

   temp_name[0] = '\0';
   ext_buff[0] = '\0';

   strcpy(temp_name,fname);
   name_length = strlen(temp_name);

   /*--get file extension--*/
   for(len_cnt = 0;len_cnt != name_length;len_cnt++)
      {
       if(temp_name[len_cnt] == '.') /*-extension start-*/
         {
          if(check == 1)   /*-reset because file must 'my.file.???'-*/
            {
             ext_buff[0] = '\0';
             ext_cnt = 0;
            }
          else
            {
             check = 1;
            }
         }
       else
         {
          if(check == 1) /* copy extension */
            {
             ext_buff[ext_cnt] = temp_name[len_cnt];
             ext_cnt++;
            }
         }
      }
    ext_buff[ext_cnt] = '\0';

    ext_cnt = 0;
    for(ext_cnt = 0;ext_cnt != CAH_EXT;ext_cnt++)
       {
        if(strcmp(ext_buff,extension_types[ext_cnt]) == 0)
           result = 0;
       }
 return(result);
}

char *GetFileSize(char *dname,char *fname,char *fsize)
{

struct stat load_stat;
char gfile_buff[255];
int size = 0;
int rem  = 0;
int ssize= 0;

   gfile_buff[0]='\0';
   strcpy(gfile_buff,dname);
   AddPart(gfile_buff,fname);

   stat(gfile_buff,&load_stat);

   ssize = (int)load_stat.st_size;

   if(ssize < 1024)
     {
      sprintf(fsize,"%db",ssize);             /*bytes*/
     }
   else
     {
      size = ssize / 1024;
      if(size < 1024)
        {
         sprintf(fsize,"%dKb",size);               /*kbytes*/
        }
      else
        {
         rem = size % 1024;
         if(rem < 100) rem = 1; else rem /= 100;

         sprintf(fsize,"%d.%dMb",size / 1024,rem); /*Mbytes*/
        }
     }

}

int IsDir(char *dname,char *fname)
{

struct stat load_stat;
char gfile_buff[255];

   gfile_buff[0]='\0';
   strcpy(gfile_buff,dname);
   AddPart(gfile_buff,fname);

   stat(gfile_buff,&load_stat);

   if(S_ISDIR(load_stat.st_mode) != 0)
     return(0);
   else
     return(1);
}

char *GetReadme(char *fname,char *readme)
{
char temp_buff[CAH_MAXFILE];
int name_len = 0;
int flag = 0;

    temp_buff[0] = '\0';
    strcpy(temp_buff,fname);
    name_len = (strlen(temp_buff) - 1);

    while(flag != 1)
         {
          if(temp_buff[name_len] == '.' || name_len == 0)
            {
             temp_buff[name_len] = '\0';
             flag = 1;
            }
          else
            {
             temp_buff[name_len] = '\0';
            }
          name_len--;
         }

     if(name_len == -1)
        sprintf(readme,"%s%s",fname,CAH_README); /*no extension*/
     else
        sprintf(readme,"%s%s",temp_buff,CAH_README);
}

char *GetShort(char *dir,char *readme,char *s_desc)
{
char temp_path[CAH_MAXPATH];
char temp_sdes[CAH_MAXSHORT];
char temp_sdes2[CAH_MAXSHORT];

int des_len = 0;
int flag = 0;
int counter = 5;
FILE *read;

    temp_path[0] = '\0';
    temp_sdes[0] = '\0';
    temp_sdes2[0] = '\0';

    strcpy(temp_path,dir);
    AddPart(temp_path,readme);

    if(!(read = fopen(temp_path,"r")))  /*text file*/
      {
       sprintf(s_desc,"No Readme File");
      }
    else
      {
       fgets(temp_sdes,CAH_MAXSHORT,read); /*- get first line - should be Short: -*/
       fclose(read);

       /*- check for Short: -*/

        if(temp_sdes[0] == 'S' || temp_sdes[0] == 's' ) flag += 1;
        if(temp_sdes[1] == 'H' || temp_sdes[1] == 'h' ) flag += 1;
        if(temp_sdes[2] == 'O' || temp_sdes[2] == 'o' ) flag += 1;
        if(temp_sdes[3] == 'R' || temp_sdes[3] == 'r' ) flag += 1;
        if(temp_sdes[4] == 'T' || temp_sdes[4] == 't' ) flag += 1;
        if(temp_sdes[5] == ':') flag += 1;

        if(flag == 6)  /*- found Short: -*/
          {
           flag = 0;
           des_len = strlen(temp_sdes); des_len--;

           if(temp_sdes[des_len] == '\n') temp_sdes[des_len] = '\0';

           des_len = strlen(temp_sdes); des_len--;

           for(counter = 6;counter != des_len + 1;counter++)
              {
               temp_sdes2[counter - 6] = temp_sdes[counter];
              }

           sprintf(s_desc,"%s",temp_sdes2);

          }
        else
          {
           temp_sdes[0] = '\0';
           sprintf(s_desc,"%s",readme);
          }
      }
}
