/***************************************************************************
 *                                                                         *
 *  Filename : IO.c                                                        *
 *                                                                         *
 *  Description : Input and output routines for the TeXPrt program.        *
 *                                                                         *
 ***************************************************************************
 *                                                                         *
 *                         Modification History                            *
 *                                                                         *
 *  Date      Author       Comments                                        *
 * ----------------------------------------------------------------------  *
 * 10.6.93    R.Bödi       Created.                                        *
 *                                                                         *
 ***************************************************************************
 *                                                                         *
 * Copyright © 1993 Richard Bödi,  All rights reserved.                    *
 *                                                                         *
 ***************************************************************************/

/*----------------------------- INCLUDES ----------------------------------*/

#include "TeXPrt.h"
#include "TexPrt_protos.h"
#include "TexPrt_globals.h"

/*------------------------------- CODE ------------------------------------*/


/***************************************************************************
 *                                                                         *
 *  Function name : ScanDrivers                                            *
 *                                                                         *
 *  Description : Scans the directory given by DriverDrawer for DVI        *
 *                printer driver spec files.                               *
 *                                                                         *
 ***************************************************************************
 *                                                                         *
 *  Synopsis : ScanDrivers (AvailDrivers)                                  *
 *                                                                         *
 *  Parameters :                                                           *
 *       (struct AvailDrivers*) AvailDrivers :                             *
 *          Fills the AvailDrivers structure with the names and the        *
 *          filenames of the drivers found in the DriverDrawer directory.  *
 *          The strings are limited to NAMELENGTH  characters.             *
 *                                                                         *
 *  Return value : (short)                                                 *
 *       >= 0 : Number of Driver spec files found in the Drawer            *
 *        < 0 : DOS error or no memory.                                    *
 *                                                                         *
 ***************************************************************************/

short ScanDrivers (struct AvailDrivers *AvailDrivers)

{
struct FileInfoBlock    FInfo;
BPTR                    DriverLock, OldLock, File;
short                   No = 0;
char                    Buffer[BUFFERLENGTH];
FILE                   *fp;

if (DriverLock = Lock (DriverDrawer, ACCESS_READ))
   {
   OldLock = CurrentDir (DriverLock);

   if (Examine (DriverLock, &FInfo))
      do {
         if (FInfo.fib_DirEntryType < 0)
            {
            if (File = Open (FInfo.fib_FileName, MODE_OLDFILE))
               {
               Read (File, Buffer, strlen (DriverLogo));
               if (!strncmp (Buffer, DriverLogo, strlen (DriverLogo)))
                  No++;
              Close (File);
              }
            }
         } while (ExNext (DriverLock, &FInfo));

   if (No > 0)
      if (AvailDrivers->DriverFiles = calloc (No, NAMELENGTH * 2))
         {
         AvailDrivers->DriverNames = AvailDrivers->DriverFiles + No * NAMELENGTH;
         No = 0;

         if (Examine (DriverLock, &FInfo))
            do {
               if (FInfo.fib_DirEntryType < 0)
                  {
                  if (File = Open (FInfo.fib_FileName, MODE_OLDFILE))
                     {
                     Read (File, Buffer, strlen (DriverLogo));
                     if (!strncmp (Buffer, DriverLogo, strlen (DriverLogo)))
                        {
                        strncpy (AvailDrivers->DriverFiles + No * NAMELENGTH, FInfo.fib_FileName, NAMELENGTH);
                        if (fp = fopen (FInfo.fib_FileName, "r"))
                           {
                           strcpy (Buffer, DriverLogo);
                           strcat (Buffer, " \n Name ; %31s \n");
                           fscanf (fp, Buffer, AvailDrivers->DriverNames + No * NAMELENGTH);
                           fclose (fp);
                           No++;
                           }
                        }
                     Close (File);
                     }
                  }
               } while (ExNext (DriverLock, &FInfo));
         }
      else
         No = -1;

   CurrentDir (OldLock);
   UnLock (DriverLock);
   }

return (No);
}


/***************************************************************************
 *                                                                         *
 *  Function name : LoadDriverSpec                                         *
 *                                                                         *
 *  Description : Loads the data of a printer driver spec file and stores  *
 *                in the TeXDriver structure.                              *
 *                                                                         *
 ***************************************************************************
 *                                                                         *
 *  Synopsis : LoadDriverSpec (DriverNo)                                   *
 *                                                                         *
 *  Parameters :                                                           *
 *       (USHORT) DriverNo :                                               *
 *          Contains the number of the selected printer driver.            *
 *                                                                         *
 *  Return value : (BOOL)                                                  *
 *       TRUE, if printer driver spec file was read successfully.          *
 *      FALSE, if not.                                                     *
 *                                                                         *
 ***************************************************************************/

BOOL LoadDriverSpec (USHORT DriverNo)

{
int               Assigns = 0;
char              Buffer[BUFFERLENGTH];
char             *Token;
BPTR              DriverLock, OldLock;
FILE             *fp;
struct TeXDriver *TempTeXDriver;
struct Menu      *pMenu;
struct MenuItem  *pMenuItem;
long              ItemNumber;

const             NoOfAssigns = 34;


if (TempTeXDriver = calloc (1, sizeof (struct TeXDriver)))
   {
   if (DriverLock = Lock (DriverDrawer, ACCESS_READ))
      {
      OldLock = CurrentDir (DriverLock);

      if (fp = fopen (Drivers.DriverFiles + DriverNo * NAMELENGTH, "r"))
         {
         strcpy (Buffer, DriverLogo);
         strcat (Buffer, " \n Name ; %31s \n");
         Assigns += fscanf (fp, Buffer, TempTeXDriver->DriverName);

         strcpy (Buffer, " \n Node ; %256s \n");
         Assigns += fscanf (fp, Buffer, TempTeXDriver->ProgramNode);

         Assigns += fscanf (fp, "PageSel (DOCUMENT/FROMTO) ; %80s ", Buffer);
         if (!strcmp (Buffer, "DOCUMENT")) TempTeXDriver->def_PageSel = DOCUMENT;
         if (!strcmp (Buffer, "FROMTO")) TempTeXDriver->def_PageSel = FROMTO;
         TempTeXDriver->act_PageSel = TempTeXDriver->def_PageSel;
         Assigns += fscanf (fp, " ; %63s \n", TempTeXDriver->raw_PageSel);
         Token = stptok (TempTeXDriver->raw_PageSel, TempTeXDriver->cmd_From, sizeof (TempTeXDriver->cmd_From), ",");
         Token = stptok (++Token, TempTeXDriver->cmd_To, sizeof (TempTeXDriver->cmd_To), ",");
         stptok (++Token, TempTeXDriver->cmd_NoOfPages, sizeof (TempTeXDriver->cmd_NoOfPages), ",");

         Assigns += fscanf (fp, "Copies ; %80s ", Buffer);
         TempTeXDriver->def_Copies = (unsigned long) atol (Buffer);
         Assigns += fscanf (fp, " ; %63s \n", TempTeXDriver->raw_Copies);
         stpcpy (TempTeXDriver->cmd_Copies, TempTeXDriver->raw_Copies);

         Assigns += fscanf (fp, "PageType (ALL/ODD/EVEN) ; %80s ", Buffer);
         if (!strcmp (Buffer, "ALL")) TempTeXDriver->def_PageType = ALL;
         if (!strcmp (Buffer, "ODD")) TempTeXDriver->def_PageType = ODD;
         if (!strcmp (Buffer, "EVEN")) TempTeXDriver->def_PageType = EVEN;
         TempTeXDriver->act_PageType = TempTeXDriver->def_PageType;
         Assigns += fscanf (fp, " ; %63s \n", TempTeXDriver->raw_PageType);
         Token = stptok (TempTeXDriver->raw_PageType, TempTeXDriver->cmd_AllPages, sizeof (TempTeXDriver->cmd_AllPages), ",");
         Token = stptok (++Token, TempTeXDriver->cmd_OddPages, sizeof (TempTeXDriver->cmd_OddPages), ",");
         stptok (++Token, TempTeXDriver->cmd_EvenPages, sizeof (TempTeXDriver->cmd_EvenPages), ",");

         Assigns += fscanf (fp, "Reverse (ON/OFF) ; %80s ", Buffer);
         if (!strcmp (Buffer, "ON")) TempTeXDriver->def_Reverse = TRUE;
         if (!strcmp (Buffer, "OFF")) TempTeXDriver->def_Reverse = FALSE;
         Assigns += fscanf (fp, " ; %63s \n", TempTeXDriver->raw_Reverse);
         stpcpy (TempTeXDriver->cmd_Reverse, TempTeXDriver->raw_Reverse);

         Assigns += fscanf (fp, "Orientation (PORTRAIT/LANDSCAPE) ; %80s ", Buffer);
         if (!strcmp (Buffer, "PORTRAIT")) TempTeXDriver->def_Orientation = PORTRAIT;
         if (!strcmp (Buffer, "LANDSCAPE")) TempTeXDriver->def_Orientation = LANDSCAPE;
         TempTeXDriver->act_Orientation = TempTeXDriver->def_Orientation;
         Assigns += fscanf (fp, " ; %63s \n", TempTeXDriver->raw_Orientation);
         Token = stptok (TempTeXDriver->raw_Orientation, TempTeXDriver->cmd_Portrait, sizeof (TempTeXDriver->cmd_Portrait), ",");
         stptok (++Token, TempTeXDriver->cmd_LandScape, sizeof (TempTeXDriver->cmd_LandScape), ",");

         Assigns += fscanf (fp, "HOffset ; %80s ", Buffer);
         TempTeXDriver->def_HOffset = atol (Buffer);
         Assigns += fscanf (fp, " ; %63s ; %63s\n", TempTeXDriver->raw_HOffset, TempTeXDriver->raw_unit_HOffset);
         stpcpy (TempTeXDriver->cmd_HOffset, TempTeXDriver->raw_HOffset);
         stpcpy (TempTeXDriver->unit_HOffset, TempTeXDriver->raw_unit_HOffset);
         TempTeXDriver->unit_HOffset[3] = 0;

         Assigns += fscanf (fp, "VOffset ; %80s ", Buffer);
         TempTeXDriver->def_VOffset = atol (Buffer);
         Assigns += fscanf (fp, " ; %63s ; %63s \n", TempTeXDriver->raw_VOffset, TempTeXDriver->raw_unit_VOffset);
         stpcpy (TempTeXDriver->cmd_VOffset, TempTeXDriver->raw_VOffset);
         stpcpy (TempTeXDriver->unit_VOffset, TempTeXDriver->raw_unit_VOffset);
         TempTeXDriver->unit_VOffset[3] = 0;

         Assigns += fscanf (fp, "AdjHOffset ; %80s ", Buffer);
         TempTeXDriver->def_AdjHOffset = atol (Buffer);

         Assigns += fscanf (fp, "AdjVOffset ; %80s ", Buffer);
         TempTeXDriver->def_AdjVOffset = atol (Buffer);

         Assigns += fscanf (fp, "Option1 (ON/OFF) ; %80s ", Buffer);
         if (!strcmp (Buffer, "ON")) TempTeXDriver->def_Option_1 = TRUE;
         if (!strcmp (Buffer, "OFF")) TempTeXDriver->def_Option_1 = FALSE;
         Assigns += fscanf (fp, " ; %63s ; %63s \n", TempTeXDriver->raw_Option_1[0], TempTeXDriver->raw_Option_1[1]);
         TempTeXDriver->raw_Option_1[1][8] = 0;
         stpcpy (TempTeXDriver->cmd_Option_1[0], TempTeXDriver->raw_Option_1[0]);
         stpcpy (TempTeXDriver->cmd_Option_1[1], TempTeXDriver->raw_Option_1[1]);

         Assigns += fscanf (fp, "Option2 (ON/OFF) ; %80s ", Buffer);
         if (!strcmp (Buffer, "ON")) TempTeXDriver->def_Option_2 = TRUE;
         if (!strcmp (Buffer, "OFF")) TempTeXDriver->def_Option_2 = FALSE;
         Assigns += fscanf (fp, " ; %63s ; %63s \n", TempTeXDriver->raw_Option_2[0], TempTeXDriver->raw_Option_2[1]);
         TempTeXDriver->raw_Option_2[1][8] = 0;
         stpcpy (TempTeXDriver->cmd_Option_2[0], TempTeXDriver->raw_Option_2[0]);
         stpcpy (TempTeXDriver->cmd_Option_2[1], TempTeXDriver->raw_Option_2[1]);

         Assigns += fscanf (fp, "Option3 (ON/OFF) ; %80s ", Buffer);
         if (!strcmp (Buffer, "ON")) TempTeXDriver->def_Option_3 = TRUE;
         if (!strcmp (Buffer, "OFF")) TempTeXDriver->def_Option_3 = FALSE;
         Assigns += fscanf (fp, " ; %63s ; %63s \n", TempTeXDriver->raw_Option_3[0], TempTeXDriver->raw_Option_3[1]);
         TempTeXDriver->raw_Option_3[1][8] = 0;
         stpcpy (TempTeXDriver->cmd_Option_3[0], TempTeXDriver->raw_Option_3[0]);
         stpcpy (TempTeXDriver->cmd_Option_3[1], TempTeXDriver->raw_Option_3[1]);

         Assigns += fscanf (fp, "Option4 (ON/OFF) ; %80s ", Buffer);
         if (!strcmp (Buffer, "ON")) TempTeXDriver->def_Option_4 = TRUE;
         if (!strcmp (Buffer, "OFF")) TempTeXDriver->def_Option_4 = FALSE;
         Assigns += fscanf (fp, " ; %63s ; %63s \n", TempTeXDriver->raw_Option_4[0], TempTeXDriver->raw_Option_4[1]);
         TempTeXDriver->raw_Option_4[1][8] = 0;
         stpcpy (TempTeXDriver->cmd_Option_4[0], TempTeXDriver->raw_Option_4[0]);
         stpcpy (TempTeXDriver->cmd_Option_4[1], TempTeXDriver->raw_Option_4[1]);

         Assigns += fscanf (fp, "Device ; %63s ; %63s", TempTeXDriver->raw_DeviceName, TempTeXDriver->raw_Device);
         stpcpy (TempTeXDriver->def_Device, TempTeXDriver->raw_DeviceName);
         stpcpy (TempTeXDriver->cmd_Device, TempTeXDriver->raw_Device);

         fclose (fp);
         }

      CurrentDir (OldLock);
      UnLock (DriverLock);
      }
   }

if (Assigns == NoOfAssigns)
   {
   repchrstr (TempTeXDriver->cmd_From, '"', ' ');
   repchrstr (TempTeXDriver->cmd_To, '"', ' ');
   repchrstr (TempTeXDriver->cmd_NoOfPages, '"', ' ');
   repchrstr (TempTeXDriver->cmd_Copies, '"', ' ');
   repchrstr (TempTeXDriver->cmd_AllPages, '"', ' ');
   repchrstr (TempTeXDriver->cmd_OddPages, '"', ' ');
   repchrstr (TempTeXDriver->cmd_EvenPages, '"', ' ');
   repchrstr (TempTeXDriver->cmd_Reverse, '"', ' ');
   repchrstr (TempTeXDriver->cmd_HOffset, '"', ' ');
   repchrstr (TempTeXDriver->cmd_VOffset, '"', ' ');
   repchrstr (TempTeXDriver->cmd_Portrait, '"', ' ');
   repchrstr (TempTeXDriver->cmd_LandScape, '"', ' ');
   repchrstr (TempTeXDriver->cmd_Option_1[0], '"', ' ');
   repchrstr (TempTeXDriver->cmd_Option_2[0], '"', ' ');
   repchrstr (TempTeXDriver->cmd_Option_3[0], '"', ' ');
   repchrstr (TempTeXDriver->cmd_Option_4[0], '"', ' ');
   repchrstr (TempTeXDriver->cmd_Option_1[1], '"', ' ');
   repchrstr (TempTeXDriver->cmd_Option_2[1], '"', ' ');
   repchrstr (TempTeXDriver->cmd_Option_3[1], '"', ' ');
   repchrstr (TempTeXDriver->cmd_Option_4[1], '"', ' ');
   repchrstr (TempTeXDriver->cmd_Device, '"', ' ');
   repchrstr (TempTeXDriver->unit_HOffset, '"', ' ');
   repchrstr (TempTeXDriver->unit_VOffset, '"', ' ');
   repchrstr (TempTeXDriver->def_Device, '"', ' ');
   memcpy (&TeXDriver, TempTeXDriver, sizeof (struct TeXDriver));
   free (TempTeXDriver);
   TeXDriver.MenuItem = DriverNo;
   return (TRUE);
   }
else
   {
   ClearMenuStrip (Window);      // Restore the selected menu item
   pMenu = Menu->NextMenu;       // pointer to the Drivers menu
   for (pMenuItem = pMenu->FirstItem, ItemNumber = 0; pMenuItem != NULL; pMenuItem = pMenuItem->NextItem, ItemNumber++)
      if (ItemNumber == TeXDriver.MenuItem)
         pMenuItem->Flags |= CHECKED;
      else
         pMenuItem->Flags &= ~CHECKED;
   SetMenuStrip (Window, Menu);
   if (TempTeXDriver) free (TempTeXDriver);
   return (FALSE);
   }
}



/***************************************************************************
 *                                                                         *
 *  Function name : SaveDriverSpec                                         *
 *                                                                         *
 *  Description : Restores the data of a printer driver spec file.         *
 *                                                                         *
 ***************************************************************************
 *                                                                         *
 *  Synopsis : SaveDriverSpec (DriverNo, Gadgets)                          *
 *                                                                         *
 *  Parameters :                                                           *
 *       (USHORT) DriverNo :                                               *
 *          Contains the number of the selected printer driver.            *
 *       (struct Gadget **) Gadgets :                                      *
 *          Pointer array for the window's gadgets.                        *
 *                                                                         *
 *  Return value : (BOOL)                                                  *
 *       TRUE, if printer driver spec file was written successfully.       *
 *      FALSE, if not.                                                     *
 *                                                                         *
 ***************************************************************************/

BOOL SaveDriverSpec (USHORT DriverNo, struct Gadget **Gadgets)

{
BOOL              NoError = FALSE;
BPTR              DriverLock, OldLock;
FILE             *fp;

if (DriverLock = Lock (DriverDrawer, ACCESS_READ))
   {
   OldLock = CurrentDir (DriverLock);

   if (fp = fopen (Drivers.DriverFiles + DriverNo * NAMELENGTH, "w"))
      {
      fprintf (fp, "%s\n", DriverLogo);
      fprintf (fp, "Name ; %s\n", TeXDriver.DriverName);
      fprintf (fp, "Node ; %s\n", TeXDriver.ProgramNode);
      fprintf (fp, "PageSel (DOCUMENT/FROMTO) ; ");
      if (TeXDriver.act_PageSel == DOCUMENT)
         fprintf (fp, "DOCUMENT ");
      if (TeXDriver.act_PageSel == FROMTO)
         fprintf (fp, "FROMTO ");
      fprintf (fp, "; %s\n", TeXDriver.raw_PageSel);

      fprintf (fp, "Copies ; %d ; %s\n", ((struct StringInfo *)(Gadgets[ID_NO_COPIES]->SpecialInfo))->LongInt, TeXDriver.raw_Copies);

      fprintf (fp, "PageType (ALL/ODD/EVEN) ; ");
      if (TeXDriver.act_PageType == ALL)
         fprintf (fp, "ALL ");
      if (TeXDriver.act_PageType == ODD)
         fprintf (fp, "ODD ");
      if (TeXDriver.act_PageType == EVEN)
         fprintf (fp, "EVEN ");
      fprintf (fp, "; %s\n", TeXDriver.raw_PageType);

      fprintf (fp, "Reverse (ON/OFF) ; ");
      if (Gadgets[ID_REVERSE]->Flags & GFLG_SELECTED)
         fprintf (fp, "ON ");
      else
         fprintf (fp, "OFF ");
      fprintf (fp, "; %s\n", TeXDriver.raw_Reverse);

      fprintf (fp, "Orientation (PORTRAIT/LANDSCAPE) ; ");
      if (TeXDriver.act_Orientation == PORTRAIT)
         fprintf (fp, "PORTRAIT ");
      if (TeXDriver.act_Orientation == LANDSCAPE)
         fprintf (fp, "LANDSCAPE ");
      fprintf (fp, "; %s\n", TeXDriver.raw_Orientation);

      fprintf (fp, "HOffset ; %d ; %s ; %s\n",
               ((struct StringInfo *)(Gadgets[ID_HOFFSET]->SpecialInfo))->LongInt,
               TeXDriver.raw_HOffset, TeXDriver.raw_unit_HOffset);
      fprintf (fp, "VOffset ; %d ; %s ; %s\n",
               ((struct StringInfo *)(Gadgets[ID_VOFFSET]->SpecialInfo))->LongInt,
               TeXDriver.raw_VOffset, TeXDriver.raw_unit_VOffset);

      fprintf (fp, "AdjHOffset ; %d\n", TeXDriver.def_AdjHOffset);
      fprintf (fp, "AdjVOffset ; %d\n", TeXDriver.def_AdjVOffset);

      fprintf (fp, "Option1 (ON/OFF) ; ");
      if (Gadgets[ID_OPT_1]->Flags & GFLG_SELECTED)
         fprintf (fp, "ON ");
      else
         fprintf (fp, "OFF ");
      fprintf (fp, "; %s ; %s\n", TeXDriver.raw_Option_1[0], TeXDriver.raw_Option_1[1]);

      fprintf (fp, "Option2 (ON/OFF) ; ");
      if (Gadgets[ID_OPT_2]->Flags & GFLG_SELECTED)
         fprintf (fp, "ON ");
      else
         fprintf (fp, "OFF ");
      fprintf (fp, "; %s ; %s\n", TeXDriver.raw_Option_2[0], TeXDriver.raw_Option_2[1]);

      fprintf (fp, "Option3 (ON/OFF) ; ");
      if (Gadgets[ID_OPT_3]->Flags & GFLG_SELECTED)
         fprintf (fp, "ON ");
      else
         fprintf (fp, "OFF ");
      fprintf (fp, "; %s ; %s\n", TeXDriver.raw_Option_3[0], TeXDriver.raw_Option_3[1]);

      fprintf (fp, "Option4 (ON/OFF) ; ");
      if (Gadgets[ID_OPT_4]->Flags & GFLG_SELECTED)
         fprintf (fp, "ON ");
      else
         fprintf (fp, "OFF ");
      fprintf (fp, "; %s ; %s\n", TeXDriver.raw_Option_4[0], TeXDriver.raw_Option_4[1]);

      fprintf (fp, "Device ; %s ; %s\n", TeXDriver.raw_DeviceName, TeXDriver.raw_Device);

      fclose (fp);
      }

   CurrentDir (OldLock);
   UnLock (DriverLock);
   NoError = TRUE;
   }

return (NoError);
}


/*---------------------------- END OF FILE --------------------------------*/
