home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ForCLI / MCommands_1_0.lha / Src / touch.c < prev   
Encoding:
C/C++ Source or Header  |  1994-03-19  |  3.0 KB  |  138 lines

  1. #define __USE_SYSBASE
  2.  
  3. #include <exec/types.h>
  4. #include <exec/execbase.h>
  5. #include <exec/memory.h>
  6. #include <dos/rdargs.h>
  7. #include <dos/dosasl.h>
  8. #include <dos/dosextens.h>
  9. #include <support/types.h>
  10. #include <support/exec.h>
  11.  
  12. #include <string.h>
  13.  
  14. #include <proto/exec.h>
  15. #include <proto/dos.h>
  16.  
  17. #include "touch.rev.h"
  18.  
  19. #define DOS_NAME        "dos.library"
  20. #define DOS_VERN         37L
  21.  
  22. #define TEMPLATE        "FILE/M,ONEDATE/S,ALL/S,QUIET/S"
  23.  
  24. STATIC CONST TEXT VersionString[]=
  25.     VERSION(PROG_NAME,PROG_VERSION,PROG_REVISION,PROG_DATE);
  26.  
  27. #define MSG_TOUCHED            "  Touched\n"
  28. #define MSG_NOT_TOUCHED    "  Not Touched"
  29.  
  30. #define OPT_FILE        0
  31. #define OPT_ONE            1
  32. #define OPT_ALL            2
  33. #define OPT_QUIET        3
  34. #define OPT_COUNT        4
  35.  
  36. #define NAME_SIZE        32
  37. #define PATH_SIZE        256
  38.  
  39. ULONG Touch(VOID)
  40. {
  41.     struct ExecBase *SysBase=*((struct ExecBase **)4);
  42.     struct DosLibrary *DOSBase;
  43.  
  44.     STATIC CONST STRPTR NoArgs[]={"#?",NULL};
  45.  
  46.     LONG Opts[OPT_COUNT];
  47.     ULONG TempRC,RC=RETURN_FAIL;
  48.     CHAR FName[NAME_SIZE],*CurArg,**ArgPtr;
  49.     BPTR CurrLock,OldLock;
  50.     struct RDArgs *Args;
  51.     struct AnchorPath *Anchor;
  52.     struct DateStamp ALIGNED StampData;
  53.     BOOL ErrOccured=FALSE;
  54.  
  55.     unless(DOSBase=(struct DosLibrary *)OpenLibrary(DOS_NAME,DOS_VERN))
  56.     {
  57.         SetResult2(ERROR_INVALID_RESIDENT_LIBRARY);
  58.         goto InvalidDOS;
  59.     }
  60.  
  61.     unless(Anchor=AllocVec(sizeof(struct AnchorPath)+PATH_SIZE,MEMF_CLEAR))
  62.     {
  63.         PrintFault(IoErr(),NULL);                                /* Inform user */
  64.         goto NoMemory;
  65.     }
  66.  
  67.     clear(&Opts);                                                            /* Clear out args buffer */
  68.     unless(Args=ReadArgs(TEMPLATE,Opts,NULL))
  69.     {
  70.         PrintFault(IoErr(),NULL);                                /* Inform user */
  71.         goto NoArgs;
  72.     }
  73.  
  74.     DateStamp(&StampData);
  75.     ArgPtr=Opts[OPT_FILE] ? (STRPTR *)Opts[OPT_FILE] : (STRPTR *)NoArgs;
  76.     while(CurArg=*ArgPtr++)
  77.     {
  78.         clear(Anchor);
  79.         Anchor->ap_BreakBits=SIGBREAKF_CTRL_C;        /* Allow break */
  80.         Anchor->ap_Strlen=PATH_SIZE;                            /* We have a path buffer */
  81.         TempRC=MatchFirst(CurArg,Anchor);
  82.         while(TempRC==0)
  83.         {
  84.             strcpy(FName,Anchor->ap_Info.fib_FileName);
  85.             if(Anchor->ap_Info.fib_DirEntryType>=0)
  86.             {
  87.                 if(Opts[OPT_ALL])
  88.                 {
  89.                     if(!ftst(Anchor->ap_Flags,APF_DIDDIR))
  90.                         fset(Anchor->ap_Flags,APF_DODIR);
  91.                     fclr(Anchor->ap_Flags,APF_DIDDIR);
  92.                 }
  93.                 goto Next;
  94.             }
  95.             CurrLock=DupLock(Anchor->ap_Current->an_Lock);
  96.             OldLock=CurrentDir(CurrLock);
  97.             unless(Opts[OPT_ONE])
  98.                 DateStamp(&StampData);
  99.             if(SetFileDate(FName,&StampData))
  100.             {
  101.                 unless(Opts[OPT_QUIET])
  102.                 {
  103.                     PutStr(Anchor->ap_Buf);                /* Print path... */
  104.                     PutStr(MSG_TOUCHED);
  105.                 }
  106.             }
  107.             else
  108.             {
  109.                 PutStr(Anchor->ap_Buf);                /* Print path... */
  110.                 PrintFault(IoErr(),MSG_NOT_TOUCHED);
  111.                 ErrOccured=TRUE;
  112.             }
  113.             CurrentDir(OldLock);
  114.             UnLock(CurrLock);
  115. Next:
  116.             TempRC=MatchNext(Anchor);
  117.         }
  118.         if(TempRC==ERROR_NO_MORE_ENTRIES)
  119.             RC=(ErrOccured ? RETURN_ERROR : RETURN_OK);
  120.         else
  121.         {
  122.             PrintFault(TempRC,NULL);
  123.             RC=(TempRC==ERROR_BREAK ? RETURN_WARN : RETURN_FAIL);
  124.         }
  125.         MatchEnd(Anchor);
  126.         if(TempRC==ERROR_BREAK)
  127.             break;
  128.     }
  129.  
  130.     FreeArgs(Args);
  131. NoArgs:
  132.     FreeVec(Anchor);
  133. NoMemory:
  134.     CloseLibrary((struct Library *)DOSBase);
  135. InvalidDOS:
  136.     return(RC);
  137. }
  138.