home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 3 / CDPDIII.bin / pd / utilities / cli / foreach / foreach.c < prev    next >
C/C++ Source or Header  |  1993-04-11  |  3KB  |  121 lines

  1. /*  Amiga-ForEach V1.4  (c)1993 Richard A Shipton         */
  2. /*  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         */
  3. /*  This program is public domain.  Do what you want with */
  4. /*  it, but just don't claim you wrote it!                */
  5.  
  6. /*  Include header files  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <dos.h>
  12.  
  13. /*  Prototypes  */
  14.  
  15. void main(int argc, char **argv);
  16. void addarg(char *argument);
  17.  
  18. /*  Global variables  */
  19.  
  20. char filenames[16384],*files[2048],command[255];
  21. char _drive[FNSIZE],_dir[FMSIZE],_node[FNSIZE],_ext[FNSIZE];
  22. int  files_found,current_file;
  23.  
  24. void main(argc,argv)
  25. int argc;
  26. char **argv;
  27. {
  28.   int parse_arg;
  29.   
  30.   if(argc<3)
  31.   {
  32.     if((argc==2) && (!strcmp(argv[1],"?")))
  33.     {
  34.       printf("Amiga-ForEach V1.4  (c)1993 R.A Shipton\n");
  35.       printf("-----------------------------------------\n\n");
  36.       printf("Usage:  foreach <Pattern> <Command...>\n\n");
  37.       
  38.       printf("Filename Substitutes:\n");
  39.       printf("  ! - Substitute Filename\n");
  40.       printf("  @ - Substitute Filename Without Extension(s)\n");
  41.       printf("  £ - Substitute -Just- Filename (No Path/Directory)\n");
  42.       printf("  # - Same as \"£\", But Without Extension(s)\n\n");
  43.       printf("Eg.  foreach #?.icon rename ! @.info\n");
  44.     }
  45.     else
  46.       printf("USAGE: %s <Pattern> <Command...>\n",argv[0]);
  47.  
  48.     exit(0);
  49.   }
  50.   
  51.   /*  Build and check file index  */
  52.   
  53.   files_found=getfnl(argv[1],filenames,sizeof(filenames),0);
  54.   if(files_found==0)
  55.     exit(1);
  56.   
  57.   if(strbpl(files,2048,filenames) != files_found)
  58.     exit(2);
  59.   else
  60.     strsrt(files,files_found);
  61.  
  62.   /*  Everything's O.K - Process the file list  */
  63.   
  64.   for(current_file=0;current_file<files_found;current_file++)
  65.   {
  66.     /*  Build a command line  */
  67.     
  68.     strcpy(command,"");
  69.     strsfn(files[current_file],_drive,_dir,_node,_ext);
  70.     
  71.     for(parse_arg=2;parse_arg<argc;parse_arg++)
  72.     {
  73.       addarg(argv[parse_arg]);
  74.       strcat(command," ");
  75.     }
  76.   
  77.     /*  Execute the command  */
  78.     
  79.     system(command);
  80.   }
  81.  
  82.   exit(0);
  83. }
  84.  
  85. /*  Add an argument to the command  */
  86.  
  87. void addarg(argument)
  88. char *argument;
  89. {
  90.   char tmpfn[FMSIZE];
  91.   unsigned int ch;
  92.   
  93.   for(ch=0;argument[ch]!='\0';ch++)
  94.   {
  95.     switch(argument[ch])
  96.     {
  97.       case '!':
  98.         strcat(command,files[current_file]);
  99.         break;
  100.     
  101.       case '@':
  102.         strmfn(tmpfn,_drive,_dir,_node,NULL);
  103.         strcat(command,tmpfn);
  104.         break;
  105.  
  106.       case '£':
  107.         strmfn(tmpfn,NULL,NULL,_node,_ext);
  108.         strcat(command,tmpfn);
  109.         break;
  110.       
  111.       case '#':
  112.         strcat(command,_node);
  113.         break;
  114.  
  115.       default:
  116.         strncat(command,&argument[ch],1);
  117.         break;
  118.     }
  119.   }
  120. }
  121.