;/* Arename v1.0  Mark Weller (c)2000
; execute to compile -*- DICE -*-
dcc -o Arename Arename.c
quit
*/

#include <exec/types.h>
#include <dos/dos.h>
#include <sys/dir.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>

#define AAH_PROGRAM        "Arename v1.0 - Mark Weller (c)2000"
#define AAH_MAXPATH         255
#define AAH_MAXFILE         31
#define AAH_ON              1
#define AAH_OFF             0
#define AAH_EXT             2


char *extension_types[] =
{
 "scp","SCP",""
};

int  IsFileValid(char *,char *,int);
int  IsDir(char *,char *);
void Usage(char *);


main(int argc,char *argv[])
{

 DIR           *dirp;
 struct direct *dp;
 char          *name;

 char full_new[AAH_MAXFILE];
 char full_old[AAH_MAXFILE];
 char scp_path[AAH_MAXPATH];
 char rcp_path[AAH_MAXPATH];

 int fname_cnt   = 0;
 int temp_cnt    = 0;
 char *fname     = 0;
 char *exten     = 0;
 char *usr_ext   = 0;

 FILE *lren;  /*-rename script   -*/
 FILE *oren;  /*-orig_rename script-*/

/*-command line switches-*/
 int v_switch   = AAH_OFF; /*-verbose-*/
 int e_switch   = AAH_OFF; /*- by chosen exstension-*/

 full_new[0] = '\0';
 full_old[0] = '\0';
 scp_path[0] = '\0'; /*-undo-*/
 rcp_path[0] = '\0'; /*-rename-*/

        switch(argc)
              {
               case 6 :
               case 5 : if(argv[1][0] == '-')
                          {
                             for(temp_cnt = 0;temp_cnt != strlen(argv[1]);temp_cnt++)
                                {
                                 switch(argv[1][temp_cnt])
                                       {
                                        case '-' : break;
                                        case 'v' : v_switch = AAH_ON; break;
                                        case 'e' : if(argc == 6)
                                                     { e_switch = AAH_ON;
                                                       usr_ext = argv[5];
                                                     }
                                                   else { Usage(NULL); }

                                       }
                                }

                           name = argv[2];
                          }
                        else
                          {
                           Usage(NULL);
                          }
                        fname = argv[3];
                        exten = argv[4];
                        break;
               case 4:  name  = argv[1];
                        fname = argv[2];
                        exten = argv[3];
                        break;
               case 1 : Usage(NULL);     break;
              }

        /*-open rename file (script)-*/
        sprintf(full_old,"%s",name);
        if(full_old[strlen(full_old) -1] == ':')
           { sprintf(rcp_path,"%sAren%s.scp",name,exten); }
        else { sprintf(rcp_path,"%s/Aren%s.scp",name,exten); }

        if(!(lren = fopen(rcp_path,"w")))
          { Usage("ERR: Can not create rename script file ?"); }


        /*-open undo file (script)-*/
        sprintf(full_old,"%s",name);
        if(full_old[strlen(full_old) -1] == ':')
           { sprintf(scp_path,"%sAund%s.scp",name,exten); }
        else { sprintf(scp_path,"%s/Aund%s.scp",name,exten); }

        if(!(oren = fopen(scp_path,"w")))
          { fclose(lren); Usage("ERR: Can not create undo script file ?"); }
        full_old[0] = '\0';

         fprintf(lren,";Rename Script Created by Arename - Mark Weller (c)2000\n");
         fprintf(oren,";Undo Script Created by Arename - Mark Weller (c)2000\n");
        /*-open directory-*/

        if ((dirp = opendir(name)) == NULL) {
                Usage("Can't open directory ?");
                }

        if(v_switch == AAH_ON)
          {
           printf("------------------------------------------------\n");
           printf("%s\n",AAH_PROGRAM);
           printf("------------------------------------------------\n");
           printf("Directory             :  %s\n",name);
           if(e_switch == AAH_ON)
              printf("User Extension        :  %s\n",usr_ext);
          }


        for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
             {
              if(IsDir(name,dp->d_name) == 1)  /*-Not Sub Directory-*/
                {
                 if(IsFileValid(dp->d_name,usr_ext,e_switch) == 1)
                   {
                    sprintf(full_new,"%s%04d.%s",fname,fname_cnt,exten);
                    fprintf(lren,"rename %s %s\n",dp->d_name,full_new);
                    fprintf(oren,"rename %s %s\n",full_new,dp->d_name);

                    if(v_switch == AAH_ON)
                      {
                       printf("%-35.35s -> %-35.35s\n",dp->d_name,full_new);
                      }
                    fname_cnt++;
                   }
                 else
                   {
                    /*-script file-*/
                    if(v_switch == AAH_ON)
                      { printf("%-35.35s  = %-35.35s\n",dp->d_name,"Skipped File Not Valid"); }
                   }
                }
              else
                {
                /*-sub directory-*/

                 if(v_switch == AAH_ON)
                   {
                    printf("%-35.35s  = %-35.35s\n",dp->d_name,"Skipped Sub Directory");
                   }

                }
             }

        closedir(dirp);

        if(v_switch == AAH_ON)
          printf("Rename Script Created : %s\n",rcp_path);
          printf("Undo Script Created   : %s\n",scp_path);
          printf("------------------------------------------------\n");


        if(lren) fclose(lren);
        if(oren) fclose(lren);
        exit(0);
}

void Usage(char *mess)
{
 printf("----------------------------------------\n");

 if(mess)
   {
    printf("%s\n",AAH_PROGRAM);
    printf("-----------------------------------------------------------\n");
    printf("mess:%s\n",mess);
    printf("---------------------------------------------------------\n");
   }
 else
   {
    printf("%s\n",AAH_PROGRAM);
    printf("Creates Amiga dos scripts to Rename & Undo files\n");
    printf("-----------------------------------------------------------\n");
    printf("USAGE: Arename <-ve> [directory] [name] [ext] <user ext>\n");
    printf(" switches: -\n");
    printf("            v  = verbose - displays output\n");
    printf("            e  = only files with given extension\n");
    printf("    directory  = containing files to rename\n");
    printf("         name  = new file name \n");
    printf("          ext  = extension for new filename\n");
    printf("     user ext  = only files with this extension (use with -e)\n\n");
    printf("example: Arename -v Work:pics holiday jpg\n");
    printf("  this will rename all files in the chosen");
    printf("  directory to:\n");
    printf("  holiday0000.jpg,holiday0001.jpg,...holiday0023.jpg\n");
    printf("example: Arename -v Work:pics %c%c img\n",0x22,0x22);
    printf("  this will rename all files in the chosen");
    printf("  directory to:\n");
    printf("  0000.img,0001.img,0002.img,0003.img,...0023.img\n");
    printf("example: Arename -v Work:pics caves img jpg\n");
    printf("  this will rename all files in the chosen\n");
    printf("  directory with the extension jpg to:");
    printf("  caves0000.img,...caves0023.img\n");
    printf("-----------------------------------------------------------\n");
    printf("See Arename.readme for more information.\n");
    printf("-----------------------------------------------------------\n");
   }
  exit(0);
}



IsFileValid(char *fname,char *usr_ext,int e_switch)
{
 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';

    /*-check invalid extensions array (.scp in this program)-*/
    ext_cnt = 0;
    for(ext_cnt = 0;ext_cnt != AAH_EXT;ext_cnt++)
       {
        if(strcmp(ext_buff,extension_types[ext_cnt]) == 0)
           result = 0;
       }
    /*- user defined extension - if result = 1 not a script (.scp)-*/
    if(result == 1 && e_switch == AAH_ON)
      {
        if(strcmp(ext_buff,usr_ext) == 0)
           result = 1; /*-user defined extension-*/
        else result = 0; /*-invalid another file-*/
      }

 return(result);
}


int IsDir(char *dname,char *fname)
{
struct stat load_stat;
char gfile_buff[255];
int tmp_size = 0;

   gfile_buff[0]='\0';
   strcpy(gfile_buff,dname);
   tmp_size = strlen(gfile_buff);

   if(gfile_buff[tmp_size - 1]  == ':')
     {
      strcat(gfile_buff,fname);
     }
   else
     {
      strcat(gfile_buff,"/");
      strcat(gfile_buff,fname);
     }

   stat(gfile_buff,&load_stat);

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



