home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fonts 1 / freshfonts1.bin / programs / amiga / pastex / pastex14-beta-6 / specialhost / source / host.c < prev    next >
C/C++ Source or Header  |  1994-07-25  |  50KB  |  2,399 lines

  1. /*
  2. **    SpecialHost for PasTeX
  3. **
  4. **    Copyright © by Olaf Barthel & Georg Heßmann
  5. */
  6.  
  7. #include "Global.h"
  8.  
  9. #include "SpecialHost_rev.h"
  10.  
  11. #define TEMPLATE    "TRANSFER/K,RENDER/K,BASEDEPI/K/N,INVERT/S,USESCREEN/S,NOGUI/S"
  12.  
  13. enum    {    ARG_TRANSFER,ARG_RENDER,ARG_BASEDPI,ARG_INVERT,ARG_USESCREEN,ARG_NOGUI,
  14.         ARGCOUNT
  15.     };
  16.  
  17. STATIC VOID __saveds ChildFunc(VOID);
  18.  
  19. LONG __saveds
  20. Main(VOID)
  21. {
  22.     LONG             Result = RETURN_FAIL;
  23.     BOOL             NeedStack;
  24.     struct WBStartup    *WBenchMsg;
  25.  
  26.     SysBase = *(struct ExecBase **)4;
  27.  
  28.     Father = (struct Process *)SysBase -> ThisTask;
  29.  
  30.     if(Father -> pr_CLI)
  31.     {
  32.         NeedStack = (((struct CommandLineInterface *)BADDR(Father -> pr_CLI)) -> cli_DefaultStack < 8192);
  33.  
  34.         WBenchMsg = NULL;
  35.     }
  36.     else
  37.     {
  38.         WaitPort(&Father -> pr_MsgPort);
  39.  
  40.         WBenchMsg = (struct WBStartup *)GetMsg(&Father -> pr_MsgPort);
  41.  
  42.         NeedStack = ((LONG)SysBase -> ThisTask -> tc_SPUpper - (LONG)SysBase -> ThisTask -> tc_SPLower < 32768);
  43.     }
  44.  
  45.     if(DOSBase = (struct DosLibrary *)OpenLibrary("dos.library",37))
  46.     {
  47.         if(UtilityBase = OpenLibrary("utility.library",37))
  48.         {
  49.             BPTR    OldDir,
  50.                 Stream        = NULL,
  51.                 OldCOS        = NULL;
  52.             APTR    OldConsoleTask    = NULL;
  53.  
  54.             if(WBenchMsg)
  55.                 OldDir = CurrentDir(WBenchMsg -> sm_ArgList[0] . wa_Lock);
  56.  
  57.             ReadConfig(&Configuration);
  58.  
  59.             if(Father -> pr_CLI)
  60.             {
  61.                 struct RDArgs    *ArgsPtr;
  62.                 STRPTR         Arg[ARGCOUNT];
  63.                 LONG         TransferMode    = CYID_Transfer_Memory,
  64.                          RenderMode    = CYID_Render_None,
  65.                          ID;
  66.  
  67.                 memset(Arg,0,sizeof(Arg));
  68.  
  69.                 if(ArgsPtr = ReadArgs(TEMPLATE,(LONG *)Arg,NULL))
  70.                 {
  71.                     if(Arg[ARG_TRANSFER])
  72.                     {
  73.                         if((ID = GetMapCode(TransferTable,Arg[ARG_TRANSFER])) != -1)
  74.                             TransferMode = ID;
  75.                     }
  76.  
  77.                     if(Arg[ARG_RENDER])
  78.                     {
  79.                         if((ID = GetMapCode(RenderTable,Arg[ARG_RENDER])) != -1)
  80.                             RenderMode = ID;
  81.                     }
  82.  
  83.                     if(Arg[ARG_BASEDPI])
  84.                     {
  85.                         if((ID = *(LONG *)Arg[ARG_BASEDPI]) > 0)
  86.                             Configuration . base_dpi = ID;
  87.                     }
  88.  
  89.                     if(Arg[ARG_INVERT])
  90.                         Configuration . invert_bmap = TRUE;
  91.  
  92.                     if(Arg[ARG_USESCREEN])
  93.                         Configuration . use_pubscr = TRUE;
  94.  
  95.                     if(Arg[ARG_NOGUI])
  96.                         UseGUI = FALSE;
  97.  
  98.                     ChangeDrawMode(TransferMode,RenderMode,FALSE);
  99.  
  100.                     FreeArgs(ArgsPtr);
  101.                 }
  102.             }
  103.             else
  104.             {
  105.                 if(IconBase = OpenLibrary("icon.library",37))
  106.                 {
  107.                     struct DiskObject *Icon;
  108.  
  109.                     if(Icon = GetDiskObject(WBenchMsg -> sm_ArgList[0] . wa_Name))
  110.                     {
  111.                         STRPTR    Data;
  112.                         LONG    TransferMode    = CYID_Transfer_Memory,
  113.                             RenderMode    = CYID_Render_None,
  114.                             ID;
  115.  
  116.                         if(Data = FindToolType(Icon -> do_ToolTypes,"TRANSFER"))
  117.                         {
  118.                             if((ID = GetMapCode(TransferTable,Data)) != -1)
  119.                                 TransferMode = ID;
  120.                         }
  121.  
  122.                         if(Data = FindToolType(Icon -> do_ToolTypes,"RENDER"))
  123.                         {
  124.                             if((ID = GetMapCode(RenderTable,Data)) != -1)
  125.                                 RenderMode = ID;
  126.                         }
  127.  
  128.                         if(Data = FindToolType(Icon -> do_ToolTypes,"BASEDPI"))
  129.                         {
  130.                             if(StrToLong(Data,&ID) > 0)
  131.                             {
  132.                                 if(ID > 0)
  133.                                     Configuration . base_dpi = ID;
  134.                             }
  135.                         }
  136.  
  137.                         if(FindToolType(Icon -> do_ToolTypes,"INVERT"))
  138.                             Configuration . invert_bmap = TRUE;
  139.  
  140.                         if(FindToolType(Icon -> do_ToolTypes,"USESCREEN"))
  141.                             Configuration . use_pubscr = TRUE;
  142.  
  143.                         if(FindToolType(Icon -> do_ToolTypes,"NOGUI"))
  144.                             UseGUI = FALSE;
  145.  
  146.                         ChangeDrawMode(TransferMode,RenderMode,FALSE);
  147.  
  148.                         FreeDiskObject(Icon);
  149.                     }
  150.  
  151.                     CloseLibrary(IconBase);
  152.                 }
  153.  
  154.                 if(!UseGUI)
  155.                 {
  156.                     if(Configuration . use_pubscr)
  157.                         Stream = Open("CON:20/20/400/80/SpecialHost/SCREENShowDVI-PubScr",MODE_NEWFILE);
  158.                     else
  159.                         Stream = Open("CON:20/20/400/80/SpecialHost",MODE_NEWFILE);
  160.  
  161.                     if(Stream)
  162.                     {
  163.                         struct FileHandle *Handle = (struct FileHandle *)BADDR(Stream);
  164.  
  165.                         OldConsoleTask = Father -> pr_ConsoleTask;
  166.  
  167.                         Father -> pr_ConsoleTask = (APTR)Handle -> fh_Type;
  168.  
  169.                         OldCOS = Father -> pr_COS;
  170.  
  171.                         if(!(Father -> pr_COS = Open("*",MODE_NEWFILE)))
  172.                         {
  173.                             Father -> pr_COS        = OldCOS;
  174.                             Father -> pr_ConsoleTask    = OldConsoleTask;
  175.  
  176.                             Close(Stream);
  177.  
  178.                             Stream = NULL;
  179.  
  180.                             UseGUI = TRUE;
  181.                         }
  182.                     }
  183.                     else
  184.                         UseGUI = TRUE;
  185.                 }
  186.             }
  187.  
  188.             if(NeedStack)
  189.             {
  190.                 Forbid();
  191.  
  192.                 SetSignal(0,SIGF_SINGLE);
  193.  
  194.                 if(CreateNewProcTags(
  195.                     NP_CommandName,    "SpecialHost Child",
  196.                     NP_Name,    "SpecialHost Child Process",
  197.                     NP_Output,    Father -> pr_COS,
  198.                     NP_CloseOutput,    FALSE,
  199.                     NP_StackSize,    32768,
  200.                     NP_Entry,    ChildFunc,
  201.                     NP_Cli,        (WBenchMsg == NULL),
  202.                 TAG_DONE))
  203.                 {
  204.                     ULONG Signals;
  205.  
  206.                     Result = RETURN_OK;
  207.  
  208.                     Wait(SIGF_SINGLE);
  209.  
  210.                     while(1)
  211.                     {
  212.                         Signals = Wait(SIGF_SINGLE | SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_E);
  213.  
  214.                         if(Signals & SIGF_SINGLE)
  215.                             break;
  216.                         else
  217.                             Signal(ThisProcess,Signals);
  218.                     }
  219.                 }
  220.  
  221.                 Permit();
  222.             }
  223.             else
  224.             {
  225.                 HandleInput();
  226.  
  227.                 Result = RETURN_OK;
  228.             }
  229.  
  230.             if(Stream)
  231.             {
  232.                 BPTR NewCOS = Father -> pr_COS;
  233.  
  234.                 Father -> pr_COS        = OldCOS;
  235.                 Father -> pr_ConsoleTask    = OldConsoleTask;
  236.  
  237.                 Close(Stream);
  238.                 Close(NewCOS);
  239.             }
  240.  
  241.             if(WBenchMsg)
  242.                 CurrentDir(OldDir);
  243.  
  244.             CloseLibrary(UtilityBase);
  245.         }
  246.  
  247.         CloseLibrary(DOSBase);
  248.     }
  249.  
  250.     if(WBenchMsg)
  251.     {
  252.         Forbid();
  253.  
  254.         ReplyMsg(&WBenchMsg -> sm_Message);
  255.     }
  256.     else
  257.         return(Result);
  258. }
  259.  
  260. int _FPERR;
  261. void _CXFERR(int code) {}
  262.  
  263. STATIC VOID __saveds
  264. ChildFunc()
  265. {
  266.     Signal(Father,SIGF_SINGLE);
  267.  
  268.     HandleInput();
  269.  
  270.     Forbid();
  271.  
  272.     Signal(Father,SIGF_SINGLE);
  273. }
  274.  
  275. BOOL __regargs
  276. BuildName(STRPTR LocalBuffer,BPTR Home,STRPTR Source,LONG ResX,LONG ResY,ULONG CRC,LONG *Error)
  277. {
  278.     UBYTE    NewDir[40];
  279.     STRPTR    Index;
  280.     BOOL    Success = FALSE;
  281.  
  282.     *Error = 0;
  283.  
  284.     strcpy(LocalBuffer,Source);
  285.  
  286.     if(FilePart(LocalBuffer) == LocalBuffer)
  287.     {
  288.         if(Home == (BPTR)~0)
  289.             LocalBuffer[0] = 0;
  290.         else
  291.         {
  292.             if(!NameFromLock(Home,LocalBuffer,MAX_FILENAME_LEN))
  293.             {
  294.                 *Error = IoErr();
  295.  
  296.                 return(FALSE);
  297.             }
  298.         }
  299.     }
  300.     else
  301.     {
  302.         Index = PathPart(LocalBuffer);
  303.  
  304.         *Index = 0;
  305.     }
  306.  
  307.     sprintf(NewDir,"SpecialHost_%dx%d",ResX,ResY);
  308.  
  309.     if(AddPart(LocalBuffer,NewDir,MAX_FILENAME_LEN))
  310.     {
  311.         BPTR FileLock;
  312.  
  313.         if(FileLock = Lock(LocalBuffer,ACCESS_READ))
  314.         {
  315.             struct FileInfoBlock *FileInfo;
  316.  
  317.             if(FileInfo = (struct FileInfoBlock *)AllocDosObjectTags(DOS_FIB,TAG_DONE))
  318.             {
  319.                 if(Examine(FileLock,FileInfo))
  320.                 {
  321.                     if(FileInfo -> fib_DirEntryType > 0)
  322.                         Success = TRUE;
  323.                     else
  324.                         *Error = ERROR_OBJECT_WRONG_TYPE;
  325.                 }
  326.                 else
  327.                     *Error = IoErr();
  328.  
  329.                 FreeDosObject(DOS_FIB,FileInfo);
  330.             }
  331.             else
  332.                 *Error = IoErr();
  333.         }
  334.         else
  335.         {
  336.             LONG LocalError = IoErr();
  337.  
  338.             if(LocalError == ERROR_OBJECT_NOT_FOUND)
  339.             {
  340.                 if(FileLock = CreateDir(LocalBuffer))
  341.                 {
  342.                     Success = TRUE;
  343.  
  344.                     UnLock(FileLock);
  345.                 }
  346.                 else
  347.                     *Error = IoErr();
  348.             }
  349.             else
  350.                 *Error = LocalError;
  351.         }
  352.     }
  353.     else
  354.         *Error = IoErr();
  355.  
  356.     if(Success)
  357.     {
  358.         UBYTE Source2[32];
  359.  
  360.         sprintf(Source2,"%.20s_%1s%08lx",FilePart(Source),(Configuration . invert_bmap ? "I" : "N"), CRC);
  361.         
  362.         if(!AddPart(LocalBuffer,Source2,MAX_FILENAME_LEN))
  363.         {
  364.             *Error = IoErr();
  365.  
  366.             Success = FALSE;
  367.         }
  368.     }
  369.  
  370.     return(Success);
  371. }
  372.  
  373. VOID __regargs
  374. SetSleep(BOOL Mode)
  375. {
  376.     if(AP_Application)
  377.     {
  378.         if(Mode)
  379.         {
  380.             struct Window *Window;
  381.  
  382.             Forbid();
  383.  
  384.             if(get(WI_Main,MUIA_Window_Window,&Window))
  385.                 ThisProcess -> pr_WindowPtr = Window;
  386.  
  387.             Permit();
  388.  
  389.             set(AP_Application,MUIA_Application_Sleep,TRUE);
  390.         }
  391.         else
  392.         {
  393.             ThisProcess -> pr_WindowPtr = OldPtr;
  394.  
  395.             set(AP_Application,MUIA_Application_Sleep,FALSE);
  396.         }
  397.     }
  398. }
  399.  
  400. BPTR __regargs
  401. OpenConfigFile(STRPTR Name,LONG Mode)
  402. {
  403.     UBYTE    Env[MAX_FILENAME_LEN],
  404.         Path[MAX_FILENAME_LEN];
  405.     STRPTR    Index;
  406.     LONG    Len;
  407.     BPTR    File;
  408.  
  409.     if(GetVar("TEXCONFIG",Env,MAX_FILENAME_LEN,NULL) < 1)
  410.         strcpy(Env,"TeX:config");
  411.  
  412.     Index = strtok(Env,",;");
  413.  
  414.     do
  415.     {
  416.         strcpy(Path,Index);
  417.  
  418.         Len = strlen(Path);
  419.  
  420.         if(Path[Len - 1] != ':' && Path[Len - 1] != '/')
  421.         {
  422.             Path[Len]    = '/';
  423.             Path[Len + 1]    = 0;
  424.         }
  425.  
  426.         if(!strcmp(Path,"./"))
  427.             Path[0] = 0;
  428.  
  429.         strcat(Path,Name);
  430.  
  431.         if(File = Open(Path,Mode))
  432.             return(File);
  433.     }
  434.     while(Index = strtok(NULL,",;"));
  435.  
  436.     return(NULL);
  437. }
  438.  
  439. BOOL __regargs
  440. ReadConfig(struct config_struct *ConfigPtr)
  441. {
  442.     BPTR File;
  443.     BOOL Result = FALSE;
  444.  
  445.     if(File = OpenConfigFile("SpecialHost.config",MODE_OLDFILE))
  446.     {
  447.         struct config_struct Config;
  448.  
  449.         if(Read(File,&Config,sizeof(str