home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 3
/
goldfish_volume_3.bin
/
files
/
util
/
cli
/
man
/
man.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-03-04
|
25KB
|
991 lines
/*
Auto: sc <file>
*/
/* $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.11
**
**
** 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.11
** --------------
** created on Monday, 28.02.94 19:33:29 by Kai Iske. LogMessage :
** -*- changed on Saturday, 05.03.94 02:30:54 by Kai Iske. LogMessage :
** - Man produced an enforcer hit when no manpage was supplied
** (Reported by : Michael van Elst)
** -*- changed on Monday, 28.02.94 20:03:34 by Kai Iske. LogMessage :
** - Man will no longer issue an error if you a) didn`t specify a
** manpage and b) set the MANGETFILE attribute for the File
** Requester. This way the Requester will popup if you
** call MAN without any arguments
** (Requested by : Bill Hogsett)
** -*- changed on Monday, 28.02.94 20:02:39 by Kai Iske. LogMessage :
** - The FileRequester will pop up on the default PubScreen now
** (Requested by : Bill Hogsett)
** - The default path for the FileRequester will be set to the
** first Dir of the MANPATHS now
** (Requested by : Bill Hogsett)
** -*- created on Monday, 28.02.94 19:33:29 by Kai Iske. LogMessage :
** - Support for DVI files added
** - MAN will set the Viewer`s current dir of that where the
** man page resides in
**
** Revision V1.10
** --------------
** created on Tuesday, 25.01.94 14:41:58 by Kai Iske. LogMessage :
** - Mike Barsoom added MANBASENAME attribute for stripping
** off any path names from the manpage name. Useful when
** launching MAN from within (ie) ToolsDaemon
** (Submitted by : Mike Barsoom)
**
** Revision V1.9
** --------------
** created on Sunday, 23.01.94 21:36:26 by Kai Iske. LogMessage :
** - Recompiled using SAS/C 6.51
** - Added MANGETFILE parameter
** (Requested by : Bill Hogsett)
**
** Revision V1.8
** --------------
** created on Saturday, 15.01.94 01:14:17 by Kai Iske. LogMessage :
** - Man now correctly handles multi-assigns, since ExAll
** doesn`t....;)
** (Reported by : Jan Hoeydahl)
**
** Revision V1.7
** --------------
** created on Friday, 31.12.93 14:00:28 by Kai Iske. LogMessage :
** - All config variables have been moved to a single one,
** which will be parsed just like a CommandLine
** (Suggested by : Michael 'Mick' Hohmann)
**
** Revision V1.6
** --------------
** created on Thursday, 16.12.93 16:49:51 by Kai Iske. LogMessage :
** - Added MANRMEXT, MANAGEXT and MANNOVIEW options,
** which may be used for extensibility of MAN
** (Somehow suggested by : Michael 'Mick' Hohmann)
**
** Revision V1.5
** --------------
** created on Thursday, 09.12.93 00:58:47 by Kai Iske. LogMessage :
** - Referenced free memory area
**
** Revision V1.4
** --------------
** created on Wednesday, 08.12.93 22:07:47 by Kai Iske. LogMessage :
** -*- created on Wednesday, 08.12.93 22:07:47 by Kai Iske. LogMessage :
** - DOS-Library wasn`t closed
**
** Revision V1.3
** --------------
** created on Wednesday, 08.12.93 19:26:17 by Kai Iske. LogMessage :
** -*- changed on Wednesday, 08.12.93 19:31:23 by Kai Iske. LogMessage :
** - Added CTRL-C checking
** -*- created on Wednesday, 08.12.93 19:26:17 by Kai Iske. LogMessage :
** - Recompiled using SAS 6.50
** - Reduced stack usage
** - Reduced executable size
**
** 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.11a"
#define REVDATE "05.03.94"
#define REVTIME "02:30:54"
#define AUTHOR "Kai Iske"
#define VERNUM 1
#define REVNUM 11
#define _USE_SYSBASE
/**********************************************************************/
/* This is, so that the code references our Libraries */
/* stored in our structure */
/**********************************************************************/
#define DOSBase MC->mc_DOSBase
#define UtilityBase MC->mc_UtilityBase
#include <string.h>
#include <stdlib.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/execbase.h>
#include <libraries/asl.h>
#include <dos/dos.h>
#include <dos/exall.h>
#include <dos/dostags.h>
#include <proto/exec.h>
#include <proto/asl.h>
#include <clib/dos_protos.h>
#include <clib/utility_protos.h>
#include <pragmas/dos_pragmas.h>
#include <pragmas/utility_pragmas.h>
/**********************************************************************/
/* This is the private structure for all vars */
/**********************************************************************/
struct ManControl
{
struct DOSLibrary *mc_DOSBase;
struct Library *mc_UtilityBase;
struct ExAllControl *mc_EAC;
char mc_ManOpt[1536],
mc_ManPaths[1024],
mc_ViewCmd[1024],
mc_ViewCmdAG[1024],
mc_ViewCmdDVI[1024],
mc_CheckDir[1024],
mc_SearchName[1536],
mc_FileName[1024],
mc_Pattern[3074],
mc_NormExt[1024],
mc_AGExt[1024],
mc_DVIExt[1024],
mc_NameBuffer[1024],
mc_NonExt[1024];
APTR *mc_EAB;
BPTR mc_OutHandle;
BOOL mc_Found,
mc_Breaked;
};
/**********************************************************************/
/* Prototypes */
/**********************************************************************/
static char *GetDir(char *NewName, char *OldName);
static BOOL DoCheckDir(struct ManControl *MC);
static BOOL IsAssign(struct ManControl *MC);
static void DetermineFileType(struct ManControl *MC);
/**********************************************************************/
/* Version-String */
/**********************************************************************/
static const char *Version = "$VER: Man "REVISION" ("REVDATE")\0";
/**********************************************************************/
/* Template for Command-Line parsing */
/**********************************************************************/
static const char *Template = "MANPAGE";
enum {MAN_ARG, TMP_LAST_ARG};
/**********************************************************************/
/* Template for MANOPT settings */
/**********************************************************************/
static const char *ManTemplate = "MANPATHS/K/A,MANVIEW/K/A,MANVIEWAG/K/A,MANVIEWDVI/K/A,MANNRMEXT/K,MANAGEXT/K,MANDVIEXT/K,MANNOVIEW/K,MANGETFILE/S,MANBASENAME/S";
enum {MANPATHS_ARG, MANVIEW_ARG, MANVIEWAG_ARG, MANVIEWDVI_ARG, MANNRMEXT_ARG, MANAGEXT_ARG, MANDVIEXT_ARG, MANNOVIEW_ARG, MANGETFILE_ARG, MANBASENAME_ARG, MAN_LAST_ARG};
/**********************************************************************/
/* This is the main part */
/**********************************************************************/
ULONG __saveds main(void)
{
struct ManControl *MC;
struct Process *MyProc;
struct RDArgs *RDArgs,
*ManRDArgs;
APTR *Args,
*ManArgs;
ULONG MySig;
char *DirOffset;
BOOL StartedSearch = FALSE,
UseAsl = FALSE,
GotManPage;
// Allocate control structure
if(!(MC = AllocVec(sizeof(struct ManControl), MEMF_CLEAR)))
return(20);
MC->mc_Found = FALSE;
MC->mc_Breaked = FALSE;
// 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);
FreeVec(MC);
return(0);
}
// Try to open DOSBase
if(!(DOSBase = (struct DOSLibrary *)OpenLibrary("dos.library", 0)))
{
FreeVec(MC);
return(20);
}
// Get Out Handle
MC->mc_OutHandle = Output();
// Check for System we`re running on
if(((struct Library *)*((ULONG **)0x4L))->lib_Version < 37)
{
Write(MC->mc_OutHandle, "You must use KickStart 2.04 (37.175) or higher for MAN\n", 55);
// Close library
CloseLibrary((struct Library *)DOSBase);
// Free buffer
FreeVec(MC);
return(20);
}
// Try to open UtilityBase
if(!(UtilityBase = OpenLibrary("utility.library", 0)))
{
CloseLibrary((struct Library *)DOSBase);
FreeVec(MC);
return(20);
}
// Get buffer for Commandline parsing
if((Args = AllocVec(TMP_LAST_ARG * sizeof(ULONG), MEMF_CLEAR)))
{
// Get buffer for MANOPT parsing
if((ManArgs = AllocVec(MAN_LAST_ARG * sizeof(ULONG), MEMF_CLEAR)))
{
// Get RDArgs structure for MANOPT parsing
if((ManRDArgs = AllocDosObject(DOS_RDARGS, NULL)))
{
// Get structure for ExAll()
if((MC->mc_EAC = AllocDosObject(DOS_EXALLCONTROL, NULL)))
{
// Get buffer for ExAll()
if((MC->mc_EAB = AllocVec(sizeof(struct ExAllData)*20, MEMF_CLEAR)))
{
// Try to parse commandline
if((RDArgs = ReadArgs((char *)Template, (LONG *)Args, NULL)))
{
// Rearrange pointer to paths
DirOffset = MC->mc_ManPaths;
// Did we get a manpage ?!?
GotManPage = (BOOL)(Args[MAN_ARG] != NULL);
// Try to get MANOPT Env-Variable
if(GetVar("MANOPT", MC->mc_ManOpt, 2048, GVF_GLOBAL_ONLY) >= 1)
{
// Try to parse strings
strcat(MC->mc_ManOpt, "\n");
ManRDArgs->RDA_Source.CS_Buffer = MC->mc_ManOpt;
ManRDArgs->RDA_Source.CS_Length = strlen(MC->mc_ManOpt);
ManRDArgs->RDA_Source.CS_CurChr = 0;
ManRDArgs->RDA_DAList = NULL;
ManRDArgs->RDA_Buffer = NULL;
ManRDArgs->RDA_BufSiz = 0;
ManRDArgs->RDA_ExtHelp = NULL;
ManRDArgs->RDA_Flags = 0;
// Try to parse MANOPT variable
if(ReadArgs((char *)ManTemplate, (LONG *)ManArgs, ManRDArgs))
{
// Get Paths etc.pp
strcpy(MC->mc_ManPaths, (char *)ManArgs[MANPATHS_ARG]);
strcpy(MC->mc_ViewCmd, (char *)ManArgs[MANVIEW_ARG]);
strcpy(MC->mc_ViewCmdAG, (char *)ManArgs[MANVIEWAG_ARG]);
strcpy(MC->mc_ViewCmdDVI, (char *)ManArgs[MANVIEWDVI_ARG]);
// Per default use the ASCII viewer for "non-extension" files
strcpy(MC->mc_NonExt, MC->mc_ViewCmd);
// Get additional patterns for normal texts
if(ManArgs[MANNRMEXT_ARG])
strcpy(MC->mc_NormExt, (char *)ManArgs[MANNRMEXT_ARG]);
// Get additional patterns for AmigaGuide texts
if(ManArgs[MANAGEXT_ARG])
strcpy(MC->mc_AGExt, (char *)ManArgs[MANAGEXT_ARG]);
// Get additional patterns for DVI files
if(ManArgs[MANDVIEXT_ARG])
strcpy(MC->mc_DVIExt, (char *)ManArgs[MANDVIEXT_ARG]);
// Get name of viewer to use when no extension was found
if(ManArgs[MANNOVIEW_ARG])
strcpy(MC->mc_NonExt, (char *)ManArgs[MANNOVIEW_ARG]);
// Check for GetFile attribute
if(ManArgs[MANGETFILE_ARG])
UseAsl = TRUE;
// Do we have a manpage ???
if(GotManPage)
{
// Set pattern for ExAll() search
if(ManArgs[MANBASENAME_ARG])
strcpy(MC->mc_SearchName, (char *)FilePart(Args[MAN_ARG]));
else
strcpy(MC->mc_SearchName, Args[MAN_ARG]);
// Append patterns
strcat(MC->mc_SearchName, "(.doc|.man|.guide|.dvi|");
strcat(MC->mc_SearchName, MC->mc_NormExt);
strcat(MC->mc_SearchName, "|");
strcat(MC->mc_SearchName, MC->mc_AGExt);
strcat(MC->mc_SearchName, "|");
strcat(MC->mc_SearchName, MC->mc_DVIExt);
strcat(MC->mc_SearchName, "|)");
// Parse the pattern
if(ParsePatternNoCase(MC->mc_SearchName, MC->mc_Pattern, 1024) != -1)
{
// Ok, reached this point
StartedSearch = TRUE;
// Loop for all dirs and wait until file has been found
while(!MC->mc_Found && !MC->mc_Breaked && DirOffset)
{
// Check for CTRL-C
MySig = CheckSignal(SIGBREAKF_CTRL_C);
if(!(MySig & SIGBREAKF_CTRL_C))
{
// Extract next directory from list
DirOffset = GetDir(MC->mc_CheckDir, DirOffset);
// This dir an assign ???
if(IsAssign(MC))
{
struct MsgPort *OldSysTask;
struct DevProc *DirProc = NULL;
BOOL ErrLoop = FALSE;
// Get old FileSystemTask
OldSysTask = GetFileSysTask();
// Loop for dirs assigned
do
{
// get the deviceproc for this Assign
if((DirProc = GetDeviceProc(MC->mc_CheckDir, DirProc)))
{
// Set FileSystem task for locking
SetFileSysTask(DirProc->dvp_Port);
// Get full device/path name and try to scan dir
if(NameFromLock(DirProc->dvp_Lock, MC->mc_NameBuffer, 1024) == DOSTRUE)
DoCheckDir(MC);
else
{
PrintFault(IoErr(), "Man ");
ErrLoop = TRUE;
}
}
else
{
ULONG Err = IoErr();
if(Err != ERROR_NO_MORE_ENTRIES)
{
PrintFault(IoErr(), "Man ");
ErrLoop = TRUE;
}
}
// Loop for additional assignments
} while(!ErrLoop && !MC->mc_Found && !MC->mc_Breaked && DirProc && (DirProc->dvp_Flags & DVPF_ASSIGN));
// Restore old FileSystemTask
SetFileSysTask(OldSysTask);
// Still having a DeviceProc ??? -> Release it
if(DirProc)
FreeDeviceProc(DirProc);
// Error occured -> End whole loop
if(ErrLoop)
DirOffset = NULL;
}
else
{
// For "normal" dirs simply check
strcpy(MC->mc_NameBuffer, MC->mc_CheckDir);
DoCheckDir(MC);
}
}
else
MC->mc_Breaked = TRUE;
}
if(!MC->mc_Found)
strcpy(MC->mc_FileName, Args[MAN_ARG]);
}
else
PrintFault(IoErr(), "Man ");
}
else
{
// if no popup wanted, issue error
if(!UseAsl)
PrintFault(ERROR_REQUIRED_ARG_MISSING, "Man ");
}
FreeArgs(ManRDArgs);
}
else
PrintFault(IoErr(), "Man (MANOPT) ");
}
else
PrintFault(IoErr(), "Man (MANOPT) ");
FreeArgs(RDArgs);
}
else
PrintFault(IoErr(), "Man ");
FreeVec(MC->mc_EAB);
}
else
FPuts(MC->mc_OutHandle, "Man : Could not allocate buffer for ExAll()\n");
FreeDosObject(DOS_EXALLCONTROL, (void *)MC->mc_EAC);
}
else
FPuts(MC->mc_OutHandle, "Man : Could not allocate structure for ExAll()\n");
FreeDosObject(DOS_RDARGS, (void *)ManRDArgs);
}
else
FPuts(MC->mc_OutHandle, "Man : Could not allocate structure for MANOPT parsing\n");
FreeVec(ManArgs);
}
else
FPuts(MC->mc_OutHandle, "Man : Could not allocate buffer for MANOPT parsing\n");
FreeVec(Args);
}
else
FPuts(MC->mc_OutHandle, "Could not allocate buffer for CommandLine Parsing\n");
// Found and not breaked ???
if((MC->mc_Found || UseAsl) && !MC->mc_Breaked)
{
if(!MC->mc_Found && UseAsl)
{
struct Library *AslBase;
struct FileRequester *FileReq;
// Open ASL library
if((AslBase = OpenLibrary("asl.library", 37)))
{
// Extract first path of MANPATH
GetDir(MC->mc_CheckDir, MC->mc_ManPaths);
// Create FileRequester
if((FileReq = AllocAslRequestTags(ASL_FileRequest,
ASLFR_PubScreenName, NULL,
ASLFR_PositiveText, "Show",
ASLFR_Flags2, FRF_REJECTICONS,
ASLFR_RejectIcons, TRUE,
ASLFR_TitleText, "Man page not found; please select",
ASLFR_InitialFile, MC->mc_FileName,
ASLFR_InitialDrawer, MC->mc_CheckDir,
TAG_DONE)))
{
// Let the user select
if(AslRequest(FileReq, TAG_DONE))
{
// Copy Drawer part
strcpy(MC->mc_CheckDir, FileReq->fr_Drawer);
// ...and file part
strcpy(MC->mc_FileName, FileReq->fr_File);
// Check for type of file to be displayed
DetermineFileType(MC);
}
// Free FileRequester
FreeAslRequest(FileReq);
}
else
PrintFault(ERROR_NO_FREE_STORE, "Man (FileRequester) ");
// Close library again
CloseLibrary(AslBase);
}
else
PrintFault(ERROR_NO_FREE_STORE, "Man (FileRequester) ");
}
// Really found a man page ???
if(MC->mc_Found)
{
char *Offset = PathPart(MC->mc_CheckDir);
BPTR CurDir;
// Get name of path doc file resides in
memset(MC->mc_FileName, 0, 1024);
strncpy(MC->mc_FileName, MC->mc_CheckDir, (ULONG)(Offset - MC->mc_CheckDir));
// And try to lock directory
CurDir = Lock(MC->mc_FileName, ACCESS_READ);
// Call viewer
if(SystemTags(MC->mc_SearchName, NP_CurrentDir, CurDir, TAG_DONE) == -1)
{
// Free lock on current dir, if command could not be launched
if(CurDir)
UnLock(CurDir);
}
}
// Close libs
CloseLibrary((struct Library *)DOSBase);
CloseLibrary(UtilityBase);
// Free structure
FreeVec(MC);
return(0);
}
// Got buffers ???
else if(Args && RDArgs)
{
// Started search ???
if(StartedSearch)
{
// Not breaked ???
if(!MC->mc_Breaked)
{
// No pages found
FPuts(MC->mc_OutHandle, "Man-Pages not found for : ");
FPuts(MC->mc_OutHandle, MC->mc_FileName);
FPuts(MC->mc_OutHandle, "\n");
}
else
FPuts(MC->mc_OutHandle, "Man : ^C...\n");
}
// Close libs
CloseLibrary((struct Library *)DOSBase);
CloseLibrary(UtilityBase);
// Free structure
FreeVec(MC);
return(10);
}
// Close libs
CloseLibrary((struct Library *)DOSBase);
CloseLibrary(UtilityBase);
// Free structure
FreeVec(MC);
return(20);
}
/**********************************************************************/
/* Get portions from the Env-Var -> Next directory */
/**********************************************************************/
static 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);
}
/**********************************************************************/
/* Check this directory */
/**********************************************************************/
static BOOL DoCheckDir(struct ManControl *MC)
{
BPTR TestLock;
ULONG MySig;
BOOL GoOn;
// Try to lock directory
if((TestLock = Lock(MC->mc_NameBuffer, SHARED_LOCK)))
{
// Fill in ExAll structure
MC->mc_EAC->eac_LastKey = 0;
MC->mc_EAC->eac_MatchString = MC->mc_Pattern;
MC->mc_EAC->eac_MatchFunc = NULL;
do
{
// Check for CTRL-C
MySig = CheckSignal(SIGBREAKF_CTRL_C);
if((MySig & SIGBREAKF_CTRL_C))
MC->mc_Breaked = TRUE;
// Do the scanning
GoOn = ExAll(TestLock, (struct ExAllData *)MC->mc_EAB, (20*sizeof(struct ExAllData)), ED_NAME, MC->mc_EAC);
// Error occured ???
if((!GoOn) && (IoErr() != ERROR_NO_MORE_ENTRIES))
PrintFault(IoErr(), "Man ");
// End of dir reached ;
if(MC->mc_EAC->eac_Entries == 0)
GoOn = FALSE;
else if(!MC->mc_Breaked)
{
// Copy real name of directory to our CheckDir buffer
strcpy(MC->mc_CheckDir, MC->mc_NameBuffer);
// Get first name matching
strcpy(MC->mc_FileName, ((struct ExAllData *)MC->mc_EAB)->ed_Name);
// Check for type of file and set command
DetermineFileType(MC);
}
} while(GoOn);
GoOn = TRUE;
// Unlock Directory
UnLock(TestLock);
}
else
{
// Display message
FPuts(MC->mc_OutHandle, "Man : Skipping directory; not existent : ");
FPuts(MC->mc_OutHandle, MC->mc_CheckDir);
FPuts(MC->mc_OutHandle, "\n");
GoOn = FALSE;
}
return(GoOn);
}
/**********************************************************************/
/* Check if a given name is an assign */
/**********************************************************************/
static BOOL IsAssign(struct ManControl *MC)
{
struct DosList *DList;
UBYTE *AssignName;
UCOUNT AssignLength;
LONG Position;
BOOL RetVal = FALSE;
Position = SplitName(MC->mc_CheckDir, ':', MC->mc_NameBuffer, 0, 1024);
if(Position != -1)
{
if(MC->mc_CheckDir[Position] == '\0')
{
if((DList = AttemptLockDosList(LDF_ASSIGNS | LDF_READ)) > (struct DosList *)1)
{
while(DList = NextDosEntry(DList, LDF_ASSIGNS))
{
AssignName = (UBYTE *)BADDR(DList->dol_Name);
AssignLength = AssignName[0];
if(!Strnicmp(AssignName + 1, MC->mc_NameBuffer, AssignLength))
{
RetVal = TRUE;
break;
}
}
UnLockDosList(LDF_ASSIGNS | LDF_READ);
}
}
}
return(RetVal);
}
/**********************************************************************/
/* Check for the file given and set command to be called */
/**********************************************************************/
static void DetermineFileType(struct ManControl *MC)
{
// Check extension to decide whether it`s an AmigaGuide file
if(strchr(MC->mc_FileName, '.'))
{
char *ExtPtr,
*DelPtr;
int ExtLen;
BOOL FoundAG = FALSE,
FoundDVI = FALSE;
// Append default .guide extension and additional
// seperator for ease of calculating the length
ExtPtr = MC->mc_AGExt;
strcat(ExtPtr, "|.guide|");
// Loop for all extensions
while(!FoundAG && (ExtPtr = strchr(ExtPtr, '.')))
{
// Calc len of extension
DelPtr = strchr(ExtPtr, '|');
ExtLen = DelPtr - ExtPtr;
if(!strnicmp(&MC->mc_FileName[strlen(MC->mc_FileName) - ExtLen], ExtPtr, ExtLen))
FoundAG = TRUE;
ExtPtr++;
}
// Now set view command accordingly
if(FoundAG)
strcpy(MC->mc_SearchName, MC->mc_ViewCmdAG);
else
{
// No AmigaGuide file found, check for DVI
// Append default .guide extension and additional
// seperator for ease of calculating the length
ExtPtr = MC->mc_DVIExt;
strcat(ExtPtr, "|.dvi|");
// Loop for all extensions
while(!FoundDVI && (ExtPtr = strchr(ExtPtr, '.')))
{
// Calc len of extension
DelPtr = strchr(ExtPtr, '|');
ExtLen = DelPtr - ExtPtr;
if(!strnicmp(&MC->mc_FileName[strlen(MC->mc_FileName) - ExtLen], ExtPtr, ExtLen))
FoundDVI = TRUE;
ExtPtr++;
}
if(FoundDVI)
strcpy(MC->mc_SearchName, MC->mc_ViewCmdDVI);
}
// No AmigaGuide, nor DVI file found, use default viewer
if(!FoundAG && !FoundDVI)
strcpy(MC->mc_SearchName, MC->mc_ViewCmd);
}
else
{
// Only use default viewer for non-extension files, when not set to "none"
if(Stricmp(MC->mc_NonExt, "none"))
{
// No extension use default viewer
strcpy(MC->mc_SearchName, MC->mc_NonExt);
}
}
MC->mc_Found = TRUE;
// Append directory and FileName
AddPart(MC->mc_CheckDir, MC->mc_FileName, 1024);
strcat(MC->mc_SearchName, " ");
strcat(MC->mc_SearchName, MC->mc_CheckDir);
}