home *** CD-ROM | disk | FTP | other *** search
- /*
- Auto: sc <file>
- */
-
- /* $Revision Header built automatically *************** (do not edit) ************
- **
- ** © Copyright by GuntherSoft
- **
- ** File : SnakeSYS:CPrgs/Utils/Touch.c
- ** Created on : Monday, 26.07.93 22:15:08
- ** Created by : Kai Iske
- ** Current revision : V1.3
- **
- **
- ** Purpose
- ** -------
- ** - Small touch command which will create a file, if it doesn`t
- ** exists yet.
- **
- ** Revision V1.3
- ** --------------
- ** created on Tuesday, 15.03.94 13:42:11 by Kai Iske. LogMessage :
- ** -*- changed on Tuesday, 15.03.94 13:55:24 by Kai Iske. LogMessage :
- ** - For ExAll() a wrong buffer size was supplied; Whoops
- ** -*- changed on Tuesday, 15.03.94 13:48:04 by Kai Iske. LogMessage :
- ** - Pattern buffer wasn`t large enough
- ** - For some calls (like AddPart) the length of the dest buffer
- ** was to small according to the allocation
- ** -*- created on Tuesday, 15.03.94 13:42:11 by Kai Iske. LogMessage :
- ** - For ParsePattern, the FileName wasn`t converted to uppercase
- **
- ** Revision V1.2
- ** --------------
- ** created on Friday, 31.12.93 12:56:39 by Kai Iske. LogMessage :
- ** - Touch will issue a warning if no matching files could be
- ** found for a pattern
- ** (Suggested by : Dan Barret)
- **
- ** Revision V1.1
- ** --------------
- ** created on Wednesday, 08.12.93 22:04:39 by Kai Iske. LogMessage :
- ** - Reduced stack usage
- ** - Reduced executable size
- ** - Recompiled using SAS 6.50
- ** - Added CTRL-C checking
- **
- ** Revision V1.0
- ** --------------
- ** created on Monday, 26.07.93 22:15:08 by Kai Iske. LogMessage :
- ** --- Initial release ---
- **
- *********************************************************************************/
- #define REVISION "1.3"
- #define REVDATE "15.03.94"
- #define REVTIME "13:55:24"
- #define AUTHOR "Kai Iske"
- #define VERNUM 1
- #define REVNUM 3
-
-
- #include <string.h>
- #include <stdlib.h>
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <dos/dos.h>
- #include <dos/exall.h>
- #include <proto/exec.h>
- #include <proto/dos.h>
-
-
-
-
- /**********************************************************************/
- /* Version String */
- /**********************************************************************/
- static const char *MyVer = "$VER: Touch "REVISION" ("REVDATE")\0";
-
-
-
-
- /**********************************************************************/
- /* Template for Commandline Parsing */
- /**********************************************************************/
- static const char *Template = "FILES/M/A";
- enum {FILE_ARG, LAST_ARG};
-
-
-
-
-
- /**********************************************************************/
- /* The small main program */
- /**********************************************************************/
- ULONG __saveds main(void)
- {
- struct ExecBase *SysBase;
- struct DosLibrary *DOSBase;
- struct Process *MyProc;
- struct RDArgs *RDArgs;
- struct ExAllControl *EAC;
- struct ExAllData *EAD;
- struct DateStamp DS;
- APTR *EAB,
- *Args;
- BPTR OutHandle,
- TouchFile;
- char **FileNameList = NULL,
- *MainBuffer,
- *FileName,
- *Pattern,
- *TouchName;
- WORD FileNameType;
- ULONG MySig;
- BOOL GoOn,
- Breaked = FALSE;
-
- // Get Base of Exec
-
- SysBase = *((struct ExecBase **)0x4L);
-
- // Don`t start from WB
-
- MyProc = (struct Process *)FindTask(NULL);
-
- if(!MyProc->pr_CLI)
- {
- struct WBStartup *Msg;
-
- WaitPort(&MyProc->pr_MsgPort);
- Msg = (struct WBStartup *)GetMsg(&MyProc->pr_MsgPort);
- Disable();
- ReplyMsg((struct Message *)Msg);
- return(0);
- }
-
- // Get DOSBase
-
- if(!(DOSBase = (struct DosLibrary *)OpenLibrary("dos.library", 0)))
- return(20);
-
- // Get handle to Output
-
- OutHandle = Output();
-
- // Check for System we`re running on
-
- if(((struct Library *)SysBase)->lib_Version < 37)
- {
- Write(OutHandle, "You must use KickStart 2.04 (37.175) or higher for Touch\n", 55);
- CloseLibrary((struct Library *)DOSBase);
- return(20);
- }
-
- // Get current DateStamp
-
- DateStamp(&DS);
-
-
- // Get buffer for filename etc.
-
- if((MainBuffer = AllocVec(((1026 * 4) + 4), MEMF_CLEAR)))
- {
- // Set up buffers
-
- FileName = MainBuffer;
- TouchName = (FileName + 1026);
- Pattern = (TouchName + 1026);
-
- // Get Buffer for arguments
-
- if((Args = AllocVec((LAST_ARG * sizeof(ULONG)), MEMF_CLEAR)))
- {
- // Parse Commandline
-
- if((RDArgs = ReadArgs((char *)Template, (LONG *)Args, NULL)))
- {
- // Get buffer for ExAll
-
- if((EAB = AllocVec((sizeof(struct ExAllData) * 20), MEMF_CLEAR)))
- {
- // Get ExAllControl Structure
-
- if((EAC = AllocDosObject(DOS_EXALLCONTROL, NULL)))
- {
- // Get pointers to FileNames passed
-
- FileNameList = Args[FILE_ARG];
-
- // Loop for all filenames
-
- while(FileNameList && *FileNameList && !Breaked)
- {
- // Check for CTRL-C
-
- MySig = CheckSignal(SIGBREAKF_CTRL_C);
- if(!(MySig & SIGBREAKF_CTRL_C))
- {
- // Copy current filename
-
- strcpy(FileName, *FileNameList);
- strupr(FileName);
-
- // Create pattern
-
- if((FileNameType = ParsePatternNoCase(FilePart(FileName), Pattern, 2050)) != -1)
- {
- // Check pattern type
-
- if(FileNameType)
- {
- // Real pattern. Remove trailing name
-
- *(PathPart(FileName)) = '\0';
-
- // Try to get lock to directory
-
- if((TouchFile = Lock(FileName, ACCESS_READ)))
- {
- BOOL DoneOnce;
-
- // Set up ExAllControl
-
- EAC->eac_LastKey = 0;
- EAC->eac_MatchString = Pattern;
- EAC->eac_MatchFunc = NULL;
-
- DoneOnce = FALSE;
-
- do
- {
- // Check for CTRL-C
-
- MySig = CheckSignal(SIGBREAKF_CTRL_C);
- if((MySig & SIGBREAKF_CTRL_C))
- Breaked = TRUE;
-
- // Loop directory
-
- GoOn = ExAll(TouchFile, (struct ExAllData *)EAB, (sizeof(struct ExAllData)*20), ED_NAME, EAC);
-
- // Error occured ???
-
- if((!GoOn) && (IoErr() != ERROR_NO_MORE_ENTRIES))
- PrintFault(IoErr(), "Touch ");
-
- // End of dir reached ;
-
- if(EAC->eac_Entries == 0)
- {
- if(!DoneOnce)
- {
- strcpy(TouchName, "Touch : No pattern match for ");
- strcat(TouchName, *FileNameList);
- strcat(TouchName, "\n");
- FPuts(OutHandle, TouchName);
- }
- GoOn = FALSE;
- }
- else if(!Breaked)
- {
- DoneOnce = TRUE;
-
- // Get buffer to ExAll Buffer
-
- EAD = (struct ExAllData *)EAB;
-
- do
- {
- // Check for CTRL-C
-
- MySig = CheckSignal(SIGBREAKF_CTRL_C);
- if((MySig & SIGBREAKF_CTRL_C))
- Breaked = TRUE;
- else
- {
-
- // Clear Touchname and create new one
-
- TouchName[0] = '\0';
- AddPart(TouchName, FileName, 1024);
- AddPart(TouchName, EAD->ed_Name, 1024);
-
- // Set new date
-
- SetFileDate(TouchName, &DS);
-
- // Loop for entries
-
- EAD = EAD->ed_Next;
- }
- } while(EAD && !Breaked);
- }
- } while(GoOn);
-
- // UnLock directory
-
- UnLock(TouchFile);
- }
- }
- else
- {
- // File to be touched there ???
-
- if((TouchFile = Lock(FileName, ACCESS_READ)))
- {
- // Unlock it
-
- UnLock(TouchFile);
-
- // ... and set filedate
-
- SetFileDate(FileName, &DS);
- }
- // Otherwise create new file
-
- else if((TouchFile = Open(FileName, MODE_NEWFILE)))
- Close(TouchFile);
- }
- }
- else
- {
- PrintFault(IoErr(), "Touch ");
- FileNameList = NULL;
- }
- // Loop for files
-
- FileNameList++;
- }
- else
- Breaked = TRUE;
- }
-
- FreeDosObject(DOS_EXALLCONTROL, EAC);
- }
- else
- PrintFault(IoErr(), "Touch ");
-
- FreeVec(EAB);
- }
- else
- FPuts(OutHandle, "Touch : Buffer for Directory Scan could not be allocated\n");
-
- FreeArgs(RDArgs);
- }
- else
- PrintFault(IoErr(), "Touch ");
-
- FreeVec(Args);
- }
- else
- FPuts(OutHandle, "Touch : Buffer for Commandline could not be allocated\n");
-
- FreeVec(MainBuffer);
- }
- else
- PrintFault(ERROR_NO_FREE_STORE, "Touch ");
-
- // Display break status if needed
-
- if(Breaked)
- FPuts(OutHandle, "Touch : ^C...\n");
-
- // Close DOS
-
- CloseLibrary((struct Library *)DOSBase);
-
- // Return appropriate code
-
- if(FileNameList)
- return(0);
- else
- return(20);
- }
-