home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / newc_dev / for16.lha / ForAll.c < prev    next >
C/C++ Source or Header  |  1992-10-10  |  3KB  |  114 lines

  1. #include "struct.c"
  2.  
  3. #define Fail(s) Printf("%s File %s Line %ld\n", s, __FILE__, __LINE__);
  4.  
  5. #define PatternLength  100
  6. #define BufferLength  1024
  7.  
  8. #define ArgDir  0
  9. #define ArgPat  1
  10. #define ArgCmd  2
  11. #define ArgExec 3
  12. #define NumArgs 4
  13.  
  14. char   Version[]  = "$VER: ForAll 1.0 "__DATE__" "__TIME__;
  15. char   Template[] = "DIR,PAT,CMD,EXEC/S";
  16.  
  17. char DefPattern[] = "#?";
  18. char DefCommand[] = "";
  19.  
  20. struct DosLibrary  *DOSBase;
  21.        char         Pattern[PatternLength], Command[255];
  22.        ULONG        ArgArray[NumArgs];
  23.        BOOL         Break = FALSE;
  24.  
  25. void ProcessOne(char *);
  26.  
  27.  
  28. void __saveds main(void)
  29. {
  30.   struct RDArgs *rd;
  31.   char          *Dir;
  32.  
  33.   if (DOSBase = (struct DosLibrary *)OpenLibrary("dos.library", 37))
  34.     {
  35.       ArgArray[ArgDir] = (ULONG)"";
  36.       ArgArray[ArgPat] = (ULONG)DefPattern;
  37.       ArgArray[ArgCmd] = (ULONG)DefCommand;
  38.       ArgArray[ArgExec] = FALSE;
  39.  
  40.       rd = ReadArgs(Template, ArgArray, NULL);
  41.       Dir = (char *)ArgArray[ArgDir];
  42.       if (ParsePatternNoCase((char *)ArgArray[ArgPat], Pattern, PatternLength) != -1)
  43.       {
  44.         ProcessOne(Dir);
  45.         if (Break) Printf("<Break>\n",NULL);
  46.       }
  47.       else
  48.       Printf("Error in Pattern\n", NULL);
  49.   
  50.       if (rd) FreeArgs(rd);
  51.       CloseLibrary(DOSBase);
  52.     }
  53. }
  54.  
  55. void ProcessOne(char *DirName)
  56. {
  57.   struct ExAllControl *eac;
  58.   struct ExAllData    *ead;
  59.   BPTR          lock, olddir;
  60.   void         *Buffer;
  61.   BOOL          more;
  62.  
  63.   Break |= SetSignal(0, 0) & SIGBREAKF_CTRL_C;
  64.   if (lock = Lock(DirName, ACCESS_READ))
  65.     {
  66.       olddir = CurrentDir(lock);
  67.       if (eac = AllocDosObject(DOS_EXALLCONTROL,NULL))
  68.     {
  69.       eac->eac_LastKey = 0;
  70.       if (Buffer = AllocVec(BufferLength, NULL))
  71.         {
  72.           do
  73.         {
  74.           more = ExAll(lock, Buffer, 1024, ED_TYPE, eac);
  75.           if ((!more) && (IoErr() != ERROR_NO_MORE_ENTRIES)) break;
  76.           if (eac->eac_Entries == 0) continue;
  77.           ead = (struct ExAllData *)Buffer;
  78.           do 
  79.             {
  80.               Break |= SetSignal(0, 0) & SIGBREAKF_CTRL_C;
  81.               switch (ead->ed_Type)
  82.             {
  83.             case ST_USERDIR :
  84.               ProcessOne(ead->ed_Name);
  85.               break;
  86.             case ST_FILE :
  87.               if (MatchPatternNoCase(Pattern, ead->ed_Name))
  88.                 {
  89.                   sprintf(Command, "%s %s", ArgArray[ArgCmd], ead->ed_Name);
  90.                   if (ArgArray[ArgExec])
  91.                 SystemTags(Command,
  92.                        SYS_UserShell, TRUE,
  93.                        TAG_END);
  94.                   else Printf("%s\n", Command);
  95.                 }
  96.               break;
  97.             default :
  98.               break;
  99.             }
  100.               ead = ead->ed_Next;
  101.             } while (ead && !Break);
  102.         } while (more && !Break);
  103.           FreeVec(Buffer);
  104.         }
  105.       else Fail("Can't get memory for ExAllBuffer!");
  106.       FreeDosObject(DOS_EXALLCONTROL, eac);
  107.     }
  108.       else Fail("Can't get ExAllControl!");
  109.       CurrentDir(olddir);
  110.       UnLock(lock);
  111.     } else Fail("Can't get lock on dir!");
  112. }
  113.  
  114.