home *** CD-ROM | disk | FTP | other *** search
/ CD Shareware Magazine 1996 December / CD_shareware_12-96.iso / DOS / Programa / CCDL122.ZIP / LIBS / CMDLINE / SOURCE / FILE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-12  |  4.0 KB  |  196 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #include <stdlib.h>
  5. #include <dos.h>
  6. #include "cmdline.h"
  7.  
  8. #define MAXFILES 500
  9.  
  10. static char oldcwd[256];
  11. static int oldDrive = 0;
  12. static struct ffblk fileBlock;
  13. static char **filelist=0;
  14. static int filenum=0,filecount=0;
  15.  
  16. BOOL SetDir(char *dir)
  17. {
  18.   if (dir == 0)
  19.     chdir(oldcwd);
  20.   else
  21.     chdir(dir);
  22.   return(TRUE);
  23. }
  24. BOOL SetDrive(int drive)
  25. {
  26.   if (drive == -1)
  27.     setdisk(oldDrive);
  28.   else
  29.     setdisk(drive);
  30.   return(TRUE);
  31. }
  32. void ParseDir(char *spec, int *drive, char **dir, char **file)
  33. {
  34.    char *spec2;
  35.    *drive = -1;
  36.    *dir = 0;
  37.    *file = 0;
  38.  
  39.    while (*spec == ' ') spec++;
  40.  
  41.    spec2 = spec;
  42.    while (*spec2)
  43.      *(spec2++) = toupper(*spec2);
  44.  
  45.    if (*spec) {
  46.      if (*(spec+1) == ':') {
  47.        *drive = *spec - 'A' ;
  48.        *dir = spec + 2 ;
  49.      }
  50.      else
  51.        *dir = spec;
  52.    }
  53.  
  54.    if ((spec2 = strrchr(*dir,'\\')) != 0) {
  55.      *spec2 = 0;
  56.      *file = spec2+1;
  57.    }
  58.    else {
  59.      *dir = 0;
  60.      *file = spec;
  61.    }
  62. }
  63. char *FirstFile(char *spec)
  64. {
  65.   if (findfirst(spec, &fileBlock, _A_NORMAL ))
  66.     return(0);
  67.   return(fileBlock.ff_name) ;
  68. }
  69. char *NextFile(void)
  70. {
  71.   if (findnext( &fileBlock))
  72.     return(0);
  73.   return(fileBlock.ff_name);
  74. }
  75. int rfsort(const void *elem1, const void *elem2)
  76. {
  77.     return(strcmp(*(char **)elem1, *(char **)elem2));
  78. }
  79. char *litlate(char *t)
  80. {
  81.     char *q;
  82.     if (!t)
  83.         return 0;
  84.     q = malloc(strlen(t)+1);
  85.     if (!q)
  86.         fatal("out of memory");
  87.     strcpy(q,t);
  88.     return q;
  89. }
  90. void ClearFiles(void)
  91. {
  92.     int i;
  93.     for (i= 0; i < filecount; i++)    
  94.         free(filelist[i]);
  95.     free(filelist);
  96.     filelist = 0;
  97. }
  98. char *GrabFile(void)
  99. {
  100.     if (filenum < filecount) 
  101.         return filelist[filenum++];
  102.     return 0;
  103. }
  104. char *ReadFiles(char *spec)
  105. {
  106.     filelist = malloc(sizeof(char *)*MAXFILES);
  107.     if (!filelist)
  108.         fatal("no memory");
  109.     filenum = 0;
  110.     filecount = 0;
  111.     if ((filelist[0] = litlate(FirstFile(spec))) == 0) {
  112.         ClearFiles();
  113.         return 0;
  114.     }
  115.     while((filelist[++filecount] = litlate(NextFile())) != 0)
  116.         if (filecount >= MAXFILES-1)
  117.             fatal("Too many files... qualify file names to limit to %d at a time",MAXFILES);
  118.     qsort(filelist,filecount,sizeof(char *),rfsort);
  119.     return GrabFile();
  120. }
  121. char *NewName( char *spec)
  122. {
  123.    static char namebuf[15];
  124.    char *pos;
  125.    strcpy(namebuf, spec);
  126.    if (!(pos = strrchr(namebuf,'.')))
  127.      strcat(namebuf,".~");
  128.    else {
  129.      *(pos+4) = 0;
  130.      *(pos+3) = *(pos+2);
  131.      *(pos+2) = *(pos+1);
  132.      *(pos+1) = '~' ;
  133.    }
  134.    return(namebuf);
  135. }
  136. int FileRecurse( int count , char *FileNames[],
  137.         char *Text, FILEFUNC routine, char *ext, BOOL backup )
  138. {
  139.   int i;
  140.   oldDrive= getdisk();
  141.   getcwd(oldcwd,256);
  142.   for (i=0; i< count; i++) {
  143.     char buffer[256];
  144.     char *dir;
  145.     char *file;
  146.     char *fileName;
  147.     int drive;
  148.  
  149.     strcpy(buffer,FileNames[i]);
  150.         if (ext)
  151.             AddExt(buffer,ext);
  152.     ParseDir(buffer,&drive, &dir, &file);
  153.     if (!SetDrive(drive) ) {
  154.     fprintf(stderr,"Can't change to drive %c:", drive + 'A');
  155.     continue;
  156.     }
  157.     getcwd(oldcwd,256);
  158.     if (!SetDir(dir)) {
  159.     fprintf(stderr,"Can't change to directory %s", dir);
  160.     continue;
  161.     }
  162.     if ((fileName = ReadFiles(file)) == 0) {
  163.        fprintf(stderr,"No Such Files %s.\n",FileNames[i]);
  164.        continue;
  165.     }
  166.     do {
  167.       if (backup) {
  168.     char *newName = NewName(fileName);
  169.     FILE *inf,*outf;
  170.     if (Text)
  171.         printf("%s %s to %s\n",Text, fileName, newName);
  172.     outf = fopen(newName,"w");
  173.     inf = fopen(fileName,"r");
  174.     (*routine)(inf, outf, fileName, dir, oldDrive == drive ? -1 : drive);
  175.     fclose (outf);
  176.     fclose (inf);
  177.     rename (newName,"ztbpjklx.xuz");
  178.     rename (fileName, newName );
  179.     rename ("ztbpjklx.xuz", fileName);
  180.       }
  181.       else {
  182.     FILE *inf;
  183.     if (Text)
  184.         printf("%s %s\n", Text, fileName);
  185.     inf = fopen(fileName,"r");
  186.     (*routine)(inf, 0, fileName, dir, oldDrive == drive ? -1 : drive);
  187.     fclose( inf );
  188.       }
  189.  
  190.           SetDir(0);
  191.           SetDrive(-1);
  192.     } while ((fileName = GrabFile()) != 0);
  193.         ClearFiles();
  194.   }
  195.   return(0);
  196. }