home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fonts 1
/
freshfonts1.bin
/
programs
/
amiga
/
pastex
/
pastex14-beta-6
/
specialhost
/
source
/
host.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-07-25
|
50KB
|
2,399 lines
/*
** SpecialHost for PasTeX
**
** Copyright © by Olaf Barthel & Georg Heßmann
*/
#include "Global.h"
#include "SpecialHost_rev.h"
#define TEMPLATE "TRANSFER/K,RENDER/K,BASEDEPI/K/N,INVERT/S,USESCREEN/S,NOGUI/S"
enum { ARG_TRANSFER,ARG_RENDER,ARG_BASEDPI,ARG_INVERT,ARG_USESCREEN,ARG_NOGUI,
ARGCOUNT
};
STATIC VOID __saveds ChildFunc(VOID);
LONG __saveds
Main(VOID)
{
LONG Result = RETURN_FAIL;
BOOL NeedStack;
struct WBStartup *WBenchMsg;
SysBase = *(struct ExecBase **)4;
Father = (struct Process *)SysBase -> ThisTask;
if(Father -> pr_CLI)
{
NeedStack = (((struct CommandLineInterface *)BADDR(Father -> pr_CLI)) -> cli_DefaultStack < 8192);
WBenchMsg = NULL;
}
else
{
WaitPort(&Father -> pr_MsgPort);
WBenchMsg = (struct WBStartup *)GetMsg(&Father -> pr_MsgPort);
NeedStack = ((LONG)SysBase -> ThisTask -> tc_SPUpper - (LONG)SysBase -> ThisTask -> tc_SPLower < 32768);
}
if(DOSBase = (struct DosLibrary *)OpenLibrary("dos.library",37))
{
if(UtilityBase = OpenLibrary("utility.library",37))
{
BPTR OldDir,
Stream = NULL,
OldCOS = NULL;
APTR OldConsoleTask = NULL;
if(WBenchMsg)
OldDir = CurrentDir(WBenchMsg -> sm_ArgList[0] . wa_Lock);
ReadConfig(&Configuration);
if(Father -> pr_CLI)
{
struct RDArgs *ArgsPtr;
STRPTR Arg[ARGCOUNT];
LONG TransferMode = CYID_Transfer_Memory,
RenderMode = CYID_Render_None,
ID;
memset(Arg,0,sizeof(Arg));
if(ArgsPtr = ReadArgs(TEMPLATE,(LONG *)Arg,NULL))
{
if(Arg[ARG_TRANSFER])
{
if((ID = GetMapCode(TransferTable,Arg[ARG_TRANSFER])) != -1)
TransferMode = ID;
}
if(Arg[ARG_RENDER])
{
if((ID = GetMapCode(RenderTable,Arg[ARG_RENDER])) != -1)
RenderMode = ID;
}
if(Arg[ARG_BASEDPI])
{
if((ID = *(LONG *)Arg[ARG_BASEDPI]) > 0)
Configuration . base_dpi = ID;
}
if(Arg[ARG_INVERT])
Configuration . invert_bmap = TRUE;
if(Arg[ARG_USESCREEN])
Configuration . use_pubscr = TRUE;
if(Arg[ARG_NOGUI])
UseGUI = FALSE;
ChangeDrawMode(TransferMode,RenderMode,FALSE);
FreeArgs(ArgsPtr);
}
}
else
{
if(IconBase = OpenLibrary("icon.library",37))
{
struct DiskObject *Icon;
if(Icon = GetDiskObject(WBenchMsg -> sm_ArgList[0] . wa_Name))
{
STRPTR Data;
LONG TransferMode = CYID_Transfer_Memory,
RenderMode = CYID_Render_None,
ID;
if(Data = FindToolType(Icon -> do_ToolTypes,"TRANSFER"))
{
if((ID = GetMapCode(TransferTable,Data)) != -1)
TransferMode = ID;
}
if(Data = FindToolType(Icon -> do_ToolTypes,"RENDER"))
{
if((ID = GetMapCode(RenderTable,Data)) != -1)
RenderMode = ID;
}
if(Data = FindToolType(Icon -> do_ToolTypes,"BASEDPI"))
{
if(StrToLong(Data,&ID) > 0)
{
if(ID > 0)
Configuration . base_dpi = ID;
}
}
if(FindToolType(Icon -> do_ToolTypes,"INVERT"))
Configuration . invert_bmap = TRUE;
if(FindToolType(Icon -> do_ToolTypes,"USESCREEN"))
Configuration . use_pubscr = TRUE;
if(FindToolType(Icon -> do_ToolTypes,"NOGUI"))
UseGUI = FALSE;
ChangeDrawMode(TransferMode,RenderMode,FALSE);
FreeDiskObject(Icon);
}
CloseLibrary(IconBase);
}
if(!UseGUI)
{
if(Configuration . use_pubscr)
Stream = Open("CON:20/20/400/80/SpecialHost/SCREENShowDVI-PubScr",MODE_NEWFILE);
else
Stream = Open("CON:20/20/400/80/SpecialHost",MODE_NEWFILE);
if(Stream)
{
struct FileHandle *Handle = (struct FileHandle *)BADDR(Stream);
OldConsoleTask = Father -> pr_ConsoleTask;
Father -> pr_ConsoleTask = (APTR)Handle -> fh_Type;
OldCOS = Father -> pr_COS;
if(!(Father -> pr_COS = Open("*",MODE_NEWFILE)))
{
Father -> pr_COS = OldCOS;
Father -> pr_ConsoleTask = OldConsoleTask;
Close(Stream);
Stream = NULL;
UseGUI = TRUE;
}
}
else
UseGUI = TRUE;
}
}
if(NeedStack)
{
Forbid();
SetSignal(0,SIGF_SINGLE);
if(CreateNewProcTags(
NP_CommandName, "SpecialHost Child",
NP_Name, "SpecialHost Child Process",
NP_Output, Father -> pr_COS,
NP_CloseOutput, FALSE,
NP_StackSize, 32768,
NP_Entry, ChildFunc,
NP_Cli, (WBenchMsg == NULL),
TAG_DONE))
{
ULONG Signals;
Result = RETURN_OK;
Wait(SIGF_SINGLE);
while(1)
{
Signals = Wait(SIGF_SINGLE | SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_E);
if(Signals & SIGF_SINGLE)
break;
else
Signal(ThisProcess,Signals);
}
}
Permit();
}
else
{
HandleInput();
Result = RETURN_OK;
}
if(Stream)
{
BPTR NewCOS = Father -> pr_COS;
Father -> pr_COS = OldCOS;
Father -> pr_ConsoleTask = OldConsoleTask;
Close(Stream);
Close(NewCOS);
}
if(WBenchMsg)
CurrentDir(OldDir);
CloseLibrary(UtilityBase);
}
CloseLibrary(DOSBase);
}
if(WBenchMsg)
{
Forbid();
ReplyMsg(&WBenchMsg -> sm_Message);
}
else
return(Result);
}
int _FPERR;
void _CXFERR(int code) {}
STATIC VOID __saveds
ChildFunc()
{
Signal(Father,SIGF_SINGLE);
HandleInput();
Forbid();
Signal(Father,SIGF_SINGLE);
}
BOOL __regargs
BuildName(STRPTR LocalBuffer,BPTR Home,STRPTR Source,LONG ResX,LONG ResY,ULONG CRC,LONG *Error)
{
UBYTE NewDir[40];
STRPTR Index;
BOOL Success = FALSE;
*Error = 0;
strcpy(LocalBuffer,Source);
if(FilePart(LocalBuffer) == LocalBuffer)
{
if(Home == (BPTR)~0)
LocalBuffer[0] = 0;
else
{
if(!NameFromLock(Home,LocalBuffer,MAX_FILENAME_LEN))
{
*Error = IoErr();
return(FALSE);
}
}
}
else
{
Index = PathPart(LocalBuffer);
*Index = 0;
}
sprintf(NewDir,"SpecialHost_%dx%d",ResX,ResY);
if(AddPart(LocalBuffer,NewDir,MAX_FILENAME_LEN))
{
BPTR FileLock;
if(FileLock = Lock(LocalBuffer,ACCESS_READ))
{
struct FileInfoBlock *FileInfo;
if(FileInfo = (struct FileInfoBlock *)AllocDosObjectTags(DOS_FIB,TAG_DONE))
{
if(Examine(FileLock,FileInfo))
{
if(FileInfo -> fib_DirEntryType > 0)
Success = TRUE;
else
*Error = ERROR_OBJECT_WRONG_TYPE;
}
else
*Error = IoErr();
FreeDosObject(DOS_FIB,FileInfo);
}
else
*Error = IoErr();
}
else
{
LONG LocalError = IoErr();
if(LocalError == ERROR_OBJECT_NOT_FOUND)
{
if(FileLock = CreateDir(LocalBuffer))
{
Success = TRUE;
UnLock(FileLock);
}
else
*Error = IoErr();
}
else
*Error = LocalError;
}
}
else
*Error = IoErr();
if(Success)
{
UBYTE Source2[32];
sprintf(Source2,"%.20s_%1s%08lx",FilePart(Source),(Configuration . invert_bmap ? "I" : "N"), CRC);
if(!AddPart(LocalBuffer,Source2,MAX_FILENAME_LEN))
{
*Error = IoErr();
Success = FALSE;
}
}
return(Success);
}
VOID __regargs
SetSleep(BOOL Mode)
{
if(AP_Application)
{
if(Mode)
{
struct Window *Window;
Forbid();
if(get(WI_Main,MUIA_Window_Window,&Window))
ThisProcess -> pr_WindowPtr = Window;
Permit();
set(AP_Application,MUIA_Application_Sleep,TRUE);
}
else
{
ThisProcess -> pr_WindowPtr = OldPtr;
set(AP_Application,MUIA_Application_Sleep,FALSE);
}
}
}
BPTR __regargs
OpenConfigFile(STRPTR Name,LONG Mode)
{
UBYTE Env[MAX_FILENAME_LEN],
Path[MAX_FILENAME_LEN];
STRPTR Index;
LONG Len;
BPTR File;
if(GetVar("TEXCONFIG",Env,MAX_FILENAME_LEN,NULL) < 1)
strcpy(Env,"TeX:config");
Index = strtok(Env,",;");
do
{
strcpy(Path,Index);
Len = strlen(Path);
if(Path[Len - 1] != ':' && Path[Len - 1] != '/')
{
Path[Len] = '/';
Path[Len + 1] = 0;
}
if(!strcmp(Path,"./"))
Path[0] = 0;
strcat(Path,Name);
if(File = Open(Path,Mode))
return(File);
}
while(Index = strtok(NULL,",;"));
return(NULL);
}
BOOL __regargs
ReadConfig(struct config_struct *ConfigPtr)
{
BPTR File;
BOOL Result = FALSE;
if(File = OpenConfigFile("SpecialHost.config",MODE_OLDFILE))
{
struct config_struct Config;
if(Read(File,&Config,sizeof(str