home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 324.lha / Sweep / src / sweep.c < prev    next >
C/C++ Source or Header  |  1989-11-30  |  4KB  |  126 lines

  1. #include <stdio.h>
  2. #include <exec/memory.h>
  3. #include <functions.h>
  4. #include <libraries/dos.h>
  5. #include <libraries/dosextens.h>
  6.  
  7. #define MAXCMDLEN  1024L
  8.  
  9. int   cmdTooLong;
  10. char  cmdstr[MAXCMDLEN+1]; /* This is where we put the command string.      */
  11. char  firstchar;           /* '-' Do a pre-order tree traversal.            */
  12.                            /* '+' Do a post-order tree traversal. (default) */
  13.                            /* '?' Show command usage.                       */
  14.                            /* Otherwise, it is part of the command string.  */
  15.  
  16. /* NOTE: dos.library is openned by the compiler startup code.
  17.  * _cli_parse() is called during program startup to parse the command line.
  18.  * We don't really want the command line parsed, so we replace it with our own
  19.  * parser.  This works with Manx C.  I don't know what you would do to
  20.  * make it work with Lattice.
  21.  */
  22.  
  23. void _cli_parse( pp, alen, aptr )
  24.   struct Process *pp;               /* Program's process structure */
  25.   long            alen;             /* Length of the command string */
  26.   char           *aptr;             /* The command string itself */
  27.   {
  28.     long   i, j;
  29.     char *p;
  30.  
  31.     p         = aptr;
  32.     firstchar = *p;
  33.     j         = alen;
  34.  
  35.     switch (*p) {
  36.        case '-' :
  37.        case '+' :
  38.        case '?' : p += 1; j -= 1; break;
  39.        default  : ;
  40.        }
  41.  
  42.     if ( alen < MAXCMDLEN ) {
  43.          cmdTooLong = 0;
  44.          for( i=0; i<j; i++)    /* Copy the pertinent parts of the command   */
  45.              cmdstr[i] = p[i];  /* string to our buffer.  Make sure it fits. */
  46.          cmdstr[i] = '\0';      /* Tack on a null char, just to be safe.     */
  47.          }
  48.        else
  49.          cmdTooLong = 1;
  50.  
  51.     }
  52.  
  53. /*
  54.  * _wb_parse() is called by Manx startup. Since we are only running from
  55.  * the CLI, we can stub this out and reduce our program size.
  56.  */
  57.  
  58. void _wb_parse() { }
  59.  
  60.  
  61. void Syntax()
  62. {
  63.    printf("Sweep: Execute CLI command(s) in current directory and all\n"
  64.           "       subdirectories.                           tml 11/89\n\n");
  65.    printf("USAGE: SWEEP [+|-|?] cmd [ + \n cmd... ]\n\n"
  66.           " '+'  Do a post-order (bottom up) tree traversal.  (default)\n"
  67.           " '-'  Do a pre-order  (top  down) tree traversal.\n");
  68.    printf(" '?'  Show command usage.  (this display)\n"
  69.           " cmd  Command(s) you want executed in each directory.\n"
  70.           "      Multiple commands can be issued as with the RUN command.\n");
  71.    }
  72.  
  73. main()
  74. {
  75.  
  76.     if (firstchar == '?') {
  77.         Syntax();
  78.         exit();
  79.         }
  80.  
  81.     doDir( "\0" );
  82.     }
  83.  
  84. doDir( topDirName )
  85.   char *topDirName;
  86.   {
  87.     struct FileLock *topLock, *tmpLock;
  88.     struct FileInfoBlock *fib;
  89.  
  90.  
  91.     /* Get a lock on the Current Directory */
  92.     topLock = Lock( topDirName, ACCESS_READ );
  93.  
  94.     if (topLock == NULL) {
  95.         return();
  96.         }
  97.  
  98.     tmpLock = CurrentDir( topLock );
  99.  
  100.     if (firstchar == '-')                /* Do a pre-order traversal. */
  101.        Execute( cmdstr , 0L, Output() );
  102.  
  103.     /* The FileInfoBlock structure has to be long-word alligned, so */
  104.     /* we should use AllocMem to insure this condition is met.      */
  105.  
  106.     fib = AllocMem( (long) sizeof( struct FileInfoBlock ), MEMF_PUBLIC );
  107.  
  108.     if ( Examine( topLock, fib ) )  /* We know this is our mother dir, so */
  109.                                     /* don't recurse on this one.         */
  110.        while ( ExNext( topLock, fib) ) {
  111.             if ( fib->fib_DirEntryType > 0 ) {      /* It's a directory */
  112.                     doDir( fib->fib_FileName);
  113.                     }
  114.             };
  115.  
  116.     if (firstchar != '-')                /* Do a Post-order traversal. */
  117.        Execute( cmdstr , 0L, Output() );
  118.  
  119.     FreeMem( fib, ( long ) sizeof ( struct FileInfoBlock ) );
  120.  
  121.     topLock = CurrentDir( tmpLock );
  122.  
  123.     UnLock( topLock );
  124.     }
  125.  
  126.