home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
oct93
/
cli_util
/
man.lha
/
Man
/
Man.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-27
|
9KB
|
324 lines
/*
Auto: sc <file> LINK NODEBUG NOSTRCONS OPT SINT NOSTACKCHECK DATA=NEAR STARTUP=cres PARM=REGISTER UTILLIB NOSTKCHK
*/
/* $Revision Header built automatically *************** (do not edit) ************
**
** © Copyright by GuntherSoft
**
** File : SnakeSYS:CPrgs/Utils/Man.c
** Created on : Friday, 16.07.93 18:00:23
** Created by : Kai Iske
** Current revision : V1.2
**
**
** Purpose
** -------
** - This is a man program, which may scan different directories
** for man-pages. These directories are set within an ENV-VAR
** called MANPATHS. Additionally a VIEWER may be set using
** ENV-VAR MANVIEW (for plain ASCII) or MANVIEWAG (for
** AMIGAGUIDE). THIS ONE`S PURE AND IN THE PUBLIC DOMAIN
**
** Revision V1.2
** --------------
** created on Tuesday, 27.07.93 15:20:51 by Kai Iske. LogMessage :
** - Used MAN as a keyword for the template which prevented MAN
** to accept inputs like "man man".
**
** Revision V1.1
** --------------
** created on Monday, 26.07.93 17:42:32 by Kai Iske. LogMessage :
** - Accidentially called Exit() instead of exit(), which
** prevented the program to pass the cleanup code of SAS.
** So a lock to the directory was kept and the shell could
** never been left.............
**
** Revision V1.0
** --------------
** created on Friday, 16.07.93 18:00:23 by Kai Iske. LogMessage :
** -*- changed on Saturday, 17.07.93 16:30:41 by Kai Iske. LogMessage :
** - Man now searches for files that end up with .doc/.man/.guide
** If a .guide file is found, the second Viewer (MANVIEWAG)
** will be used to display the AmigaGuide viewer. Otherwise
** the normal viewer (MANVIEW) will be used
** -*- created on Friday, 16.07.93 18:00:23 by Kai Iske. LogMessage :
** --- Initial release ---
**
*********************************************************************************/
#define REVISION "1.2"
#define REVDATE "27.07.93"
#define REVTIME "15:20:51"
#define AUTHOR "Kai Iske"
#define VERNUM 1
#define REVNUM 2
#include <string.h>
#include <stdlib.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/execbase.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <dos/dos.h>
#include <dos/exall.h>
#include <dos/dostags.h>
extern struct SysBase *SysBase;
extern struct WBStartUp *_WBenchMsg;
/**********************************************************************/
/* Prototypes */
/**********************************************************************/
char *GetDir(char *NewName, char *OldName);
/**********************************************************************/
/* Version-String */
/**********************************************************************/
static char *Version = "$VER: Man "REVISION" ("REVDATE")\0";
/**********************************************************************/
/* Template for Command-Line parsing */
/**********************************************************************/
static char *Template = "MANPAGE/A";
enum {MAN_ARG};
/**********************************************************************/
/* This is the main part */
/**********************************************************************/
void main(void)
{
char ManPaths[512];
char ViewCmd[512];
char ViewCmdAG[512];
char CheckDir[512];
char SearchName[512];
char FileName[130];
struct RDArgs *RDArgs = NULL;
struct ExAllControl *EAC = NULL;
APTR *Args;
APTR EAB = NULL;
char *DirOffset = ManPaths;
char Pattern[270];
BPTR TestLock;
BPTR OutHandle;
BOOL Found = FALSE,
GoOn;
// Get Out Handle
OutHandle = Output();
// Check System we`re running on
// Whoops, System checks are "done" by startup code anyway ;)
// Don`t start from WB
if(_WBenchMsg)
exit(0);
// Get buffer for Commandline parsing
if((Args = AllocVec((MAN_ARG + 1)*sizeof(ULONG), MEMF_CLEAR)))
{
// Get structure for ExAll()
if((EAC = AllocDosObject(DOS_EXALLCONTROL, NULL)))
{
// Get buffer for ExAll()
if((EAB = AllocVec(sizeof(struct ExAllData)*20, MEMF_CLEAR)))
{
// Try to parse commandline
if((RDArgs = ReadArgs(Template, (LONG *)Args, NULL)))
{
// Try to get MANPATHS Env-Variable
if(GetVar("MANPATHS", ManPaths, 256, GVF_GLOBAL_ONLY) >= 1)
{
// Try to get MANVIEW Env-Variable
if(GetVar("MANVIEW", ViewCmd, 256, GVF_GLOBAL_ONLY) >= 1)
{
// Try to get MANVIEWAG Env-Variable
if(GetVar("MANVIEWAG", ViewCmdAG, 256, GVF_GLOBAL_ONLY) >= 1)
{
// Set pattern for ExAll() search
strcpy(SearchName, Args[MAN_ARG]);
strcat(SearchName, "(.doc|.man|.guide)");
// Parse the pattern
if(ParsePatternNoCase(SearchName, Pattern, 270) != -1)
{
// Loop for all dirs and wait until file has been found
while(!Found && DirOffset)
{
// Extract next directory from list
DirOffset = GetDir(CheckDir, DirOffset);
// Add "/" if neither "/", nor ":" end the directory
if((CheckDir[strlen(CheckDir) - 1] != '/') && (CheckDir[strlen(CheckDir) - 1] != ':'))
strcat(CheckDir, "/");
// Directory available ???
if((TestLock = Lock(CheckDir, ACCESS_READ)))
{
// Fill in ExAll structure
EAC->eac_LastKey = 0;
EAC->eac_MatchString = Pattern;
EAC->eac_MatchFunc = NULL;
do
{
// Do the scanning
GoOn = ExAll(TestLock, EAB, (108*20), ED_NAME, EAC);
// Error occured ???
if((!GoOn) && (IoErr() != ERROR_NO_MORE_ENTRIES))
PrintFault(IoErr(), "Man ");
// End of dir reached ;
if(EAC->eac_Entries == 0)
GoOn = FALSE;
else
{
// Get name of file
strcpy(FileName, ((struct ExAllData *)EAB)->ed_Name);
// Check extension to decide whether it`s an AmigaGuide file
if(strcmp(&FileName[strlen(FileName) - 6], ".guide"))
strcpy(SearchName, ViewCmd);
else
strcpy(SearchName, ViewCmdAG);
// Append directory and FileName
strcat(SearchName, " ");
strcat(SearchName, CheckDir);
// Copy Filename to place where the last quote used to reside
strcat(SearchName, FileName);
// Set flag that we`ve found the file
Found = TRUE;
}
} while(GoOn);
// Unlock Directory
UnLock(TestLock);
}
else
{
// Display message
FPuts(OutHandle, "Skipping directory; not existent : ");
FPuts(OutHandle, CheckDir);
FPuts(OutHandle, "\n");
}
}
}
else
PrintFault(IoErr(), "Man ");
}
else
PrintFault(IoErr(), "MANVIEWAG ");
}
else
PrintFault(IoErr(), "MANVIEW ");
}
else
PrintFault(IoErr(), "MANPATHS ");
}
else
PrintFault(IoErr(), "Man ");
}
else
FPuts(OutHandle, "Could not allocate buffer for ExAll()\n");
}
else
FPuts(OutHandle, "Could not allocate structure for ExAll()\n");
}
else
FPuts(OutHandle, "Could not allocate buffer for CommandLine Parsing\n");
if(Args && RDArgs && !Found)
strcpy(FileName, Args[MAN_ARG]);
if(EAC)
FreeDosObject(DOS_EXALLCONTROL, (void *)EAC);
if(EAB)
FreeVec(EAB);
if(RDArgs)
FreeArgs(RDArgs);
if(Args)
FreeVec(Args);
if(Found)
{
SystemTags(SearchName, TAG_DONE);
exit(0);
}
else if(Args && RDArgs)
{
FPuts(OutHandle, "Man-Pages not found for : ");
FPuts(OutHandle, FileName);
FPuts(OutHandle, "\n");
exit(10);
}
}
/**********************************************************************/
/* Get portions from the Env-Var -> Next directory */
/**********************************************************************/
char *GetDir(char *NewDir, char *OldDir)
{
while(*OldDir == ' ')
OldDir++;
while((*OldDir != '\n') && (*OldDir != '\0') && (*OldDir != '|') && (*OldDir != ','))
*NewDir++ = *OldDir++;
*NewDir = '\0';
if(*OldDir == '\n' || *OldDir == '\0')
OldDir = NULL;
else
OldDir++;
return(OldDir);
}