
/* prf_main.c */
/* V1.1 9-3-92 */

#include "prf.h"

/* ------------------------------------------------------------------- */
/*      for cback.o startup                                            */
/* ------------------------------------------------------------------- */

long                      _stack        = 4000;
char                      *_procname    = "*PrintFiles V1.1*";
long                      priority      = 0;
long                      _BackGroundIO = 0;
extern BPTR               _Backstdout;

/* ----------------------------------------------------------------- */

void CheckCmdLine(struct prf_info *,int,union wbstart);
void SetSTFlags(struct prf_info *,UBYTE *);


struct IntuitionBase *IntuitionBase;
struct Library       *WorkbenchBase;
struct Library       *GadToolsBase;
struct Library       *AslBase;
struct Library       *IconBase;
struct RxsLib        *RexxSysBase;
struct GfxBase       *GfxBase;

void  main(int argc ,union wbstart argv)
{
 struct prf_info *info;
 long end = (long)FALSE;
 if(info = (struct prf_info *)calloc(1,sizeof(struct prf_info)))
 {
  if(OpenLibs(info))
  {
   if(OpenApp(info))
   {
    CheckCmdLine(info,argc,argv);
    SetPrfSignals(info);
    if(info->flags & FLAG_OPENWINDOW)
    {
     info->flags ^= FLAG_OPENWINDOW;
     ChangeApp(info);
    }
    if(info->flags & FLAG_IMMEDIATE)
    {
     info->flags ^= FLAG_IMMEDIATE;
     PrintQueue(info);
    }
    while(!end)
    {
     SetPrfSignals(info);
     Wait(info->signals);
     if(DoCommand(info,HandleMsgs(info)) == CMD_QUIT) end = (long)TRUE;
    }
    CloseApp(info);
   }
  }
  CloseLibs(info);
 }
 exit(0);
}

long  OpenLibs(struct prf_info *info)
{
 if(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",SYSTEM_VERSION))
 {
  if(WorkbenchBase = OpenLibrary("workbench.library",SYSTEM_VERSION))
  {
   if(AslBase = OpenLibrary("asl.library",SYSTEM_VERSION))
   {
    if(GadToolsBase = OpenLibrary("gadtools.library",SYSTEM_VERSION))
    {
     if(IconBase = OpenLibrary("icon.library",SYSTEM_VERSION))
     {
      if(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",SYSTEM_VERSION))
      {
       if(info->PubScr = LockPubScreen( "Workbench" ))
       {
        info->BarHeight = (ULONG)((long)(info->PubScr->BarHeight));
        PwdTags[3].ti_Data    += info->BarHeight ;
        SwdTags[3].ti_Data    += info->BarHeight ;
        if(info->VisualInfo = GetVisualInfo(info->PubScr,TAG_DONE ))
        {
         NewList(&info->FileList);
         AttemptOpenRexx(info);
         Prf_Reset(info);
         return ((long)TRUE);
        }
       }
      }
     }
    }
   }
  }
 }
 return ((long)FALSE);

}

void  CloseLibs(struct prf_info *info)
{
 struct Node *n;
 if(info)
 {
  CloseRexx(info);
  if(info->Swd)CloseSwd(info);
  if(info->Pwd)ClosePwd(info);
  if(info->VisualInfo) FreeVisualInfo(info->VisualInfo);
  if(info->PubScr)UnlockPubScreen(0L,info->PubScr);
  while(n = (struct Node *)RemHead(&info->FileList))free((struct FileNameNode *)n);
  free(info);
 }
 if (GfxBase)         CloseLibrary((struct Library *)GfxBase);
 if (IconBase)        CloseLibrary(IconBase);
 if (GadToolsBase)    CloseLibrary(GadToolsBase);
 if (AslBase)         CloseLibrary(AslBase);
 if (WorkbenchBase)   CloseLibrary(WorkbenchBase);
 if (IntuitionBase)   CloseLibrary((struct Library *)IntuitionBase);
}

void  Prf_Reset(struct prf_info *info)
{
 struct Node *n;
 while(n = (struct Node *)RemHead(&info->FileList))free((struct FileNameNode *)n);
 info->Lines   = DEFAULT_LINES;
 info->Rmargin = DEFAULT_RMARGIN;
 info->Lmargin = DEFAULT_LMARGIN;
 info->Lines   = DEFAULT_LINES;
 info->flags   = DEFAULT_FLAGS;
 info->Columns = DEFAULT_RMARGIN - DEFAULT_LMARGIN;
 strcpy(info->Headline, DEFAULT_HEADLINE);
 strcpy(info->Footline, DEFAULT_FOOTLINE);
 RefreshPwd(info);
 RefreshSwd(info);
}

void SetPrfSignals(struct prf_info *info)
{
 info->signals = 0L;
 if(info->Swd)      info->signals |= (1L << info->Swd->UserPort->mp_SigBit);
 if(info->Pwd)      info->signals |= (1L << info->Pwd->UserPort->mp_SigBit);
 if(info->appPort)  info->signals |= (1L << info->appPort->mp_SigBit);
 if(info->rexxPort) info->signals |= (1L << info->rexxPort->mp_SigBit);
 if(info->prtPort)  info->signals |= (1L << info->prtPort->mp_SigBit);
}

long HandleMsgs(struct prf_info *info)
{
 long rc = CMD_NEUTRAL;
 if(info->Swd)
 {
  while(info->imsg = GT_GetIMsg(info->Swd->UserPort))
  {
   long rc1;
   if((rc1 = HandleImsg(info)) != CMD_NEUTRAL)rc = rc1;
   GT_ReplyIMsg(info->imsg);
  }
 }
 if(info->Pwd)
 {
  while(info->imsg = GT_GetIMsg(info->Pwd->UserPort))
  {
   long rc1;
   if((rc1 = HandleImsg(info)) != CMD_NEUTRAL)rc = rc1;
   GT_ReplyIMsg(info->imsg);
  }
 }
 if(info->appPort)
 {
  while(info->amsg = (struct AppMessage *)GetMsg(info->appPort))
  {
   long rc1;
   if((rc1 = HandleAmsg(info)) != CMD_NEUTRAL)rc = rc1;
   ReplyMsg((struct Message *)info->amsg);
  }
 }
 if(info->rexxPort)
 {
  while(info->rmsg = (struct RexxMsg *)GetMsg(info->rexxPort))
  {
   long rc1;
   if((rc1 = HandleRexxMsg(info)) != CMD_NEUTRAL)rc = rc1;
   ReplyMsg((struct Message *)info->rmsg);
  }
 }
 if(info->prtPort)
 {

 }
 return (rc);
}

void CheckCmdLine(struct prf_info *info,int argc,union wbstart argv)
{
 struct DiskObject *dobj;
 UBYTE *p,buffer[256],**tta;
 ULONG a,b;
 long cmd = CMD_INSERTTAIL;
 int  i;
 if(argc)
 {
  if(argc > 1)
  {
   for(i=1;i<argc;i++)
   {
    switch(argv.args[i][0])
    {
     case  '-': SetSTFlags(info,&argv.args[i][1]);
                break;
     default  : info->flags |= FLAG_IMMEDIATE;
                info->Special1 = (APTR)&argv.args[i][0];
                info->Special2 = (APTR)&cmd;
                InsertName(info);
                info->Special1 = NULL;
                info->Special2 = NULL;
                break;
    }
   }
  }
 }
 else
 {
  if(dobj = GetDiskObject(argv.msg->sm_ArgList->wa_Name))
  {
   tta = dobj->do_ToolTypes;
   if(p = (UBYTE *)FindToolType(tta,TOOLTYPE_WD))
   {
    i = sscanf(p,"%ld %ld",&a,&b);
    if(i == 2)
    {
     SwdTags[0].ti_Data = a;
     SwdTags[1].ti_Data = b;
    }
    info->flags |= FLAG_OPENWINDOW;
   }
   if(p = (UBYTE *)FindToolType(tta,TOOLTYPE_FLAGS))
   {
    strcpy(buffer,p);
    SetSTFlags(info,buffer);
   }
   if(p = (UBYTE *)FindToolType(tta,TOOLTYPE_HEAD))
   {
    strcpy(info->Headline,p);
   }
   if(p = (UBYTE *)FindToolType(tta,TOOLTYPE_FOOT))
   {
    strcpy(info->Footline,p);
   }
   if(p = (UBYTE *)FindToolType(tta,TOOLTYPE_LMARGIN))
   {
    info->Lmargin = atol(p);
    if(info->Lmargin > info->Rmargin)info->Lmargin = DEFAULT_LMARGIN;
    if((info->Columns = (info->Rmargin - info->Lmargin)) == 0)
     info->Columns = 1;
   }
   if(p = (UBYTE *)FindToolType(tta,TOOLTYPE_RMARGIN))
   {
    info->Rmargin = atol(p);
    if(info->Rmargin < info->Lmargin)info->Rmargin = DEFAULT_RMARGIN;
    if((info->Columns = (info->Rmargin - info->Lmargin)) == 0)
     info->Columns = 1;
   }
   if(p = (UBYTE *)FindToolType(tta,TOOLTYPE_LINES))
   {
    info->Lines = atol(p);
   }
  }
  if(argv.msg->sm_NumArgs > 1)
  {
   info->flags |= FLAG_IMMEDIATE;
   for(i = 1; i < argv.msg->sm_NumArgs;i++)
   {
    NameFromLock(argv.msg->sm_ArgList[i].wa_Lock,buffer,STR_SIZE);
    AddPart(buffer,argv.msg->sm_ArgList[i].wa_Name,STR_SIZE);
    info->Special1 = (APTR)buffer;
    info->Special2 = (APTR)&cmd;
    InsertName(info);
    info->Special1 = NULL;
    info->Special2 = NULL;
   }
  }
 }
}

/* ----------------------------------------------------------------- */
void SetSTFlags(struct prf_info *info,UBYTE *buffer)
{
 int i;
 for(i=0;i< strlen(buffer);i++)
 {
  switch(*(buffer+i))
  {
   case CLI_TIME   : info->flags |= FLAG_TIME;
                     break;
   case CLI_FF     : info->flags |= FLAG_FF;
                     break;
   case CLI_FILE   : info->flags |= FLAG_FILE;
                     break;
   case CLI_PAGE   : info->flags |= FLAG_PAGE;
                     break;
   case CLI_LINE   : info->flags |= FLAG_LINE;
                     break;
   case CLI_CRLF   : info->flags |= FLAG_CRLF;
                     break;
   case CLI_DRAFT  : DoCommand(info,CMD_DRAFT);
                     break;
   case CLI_LQ     : DoCommand(info,CMD_LQ);
                     break;
   case CLI_DATE   : info->flags |= FLAG_DATE;
                     break;
   case CLI_WD     : info->flags |= FLAG_OPENWINDOW;
                     break;
   case CLI_10CPI  : DoCommand(info,CMD_10CPI);
                     break;
   case CLI_12CPI  : DoCommand(info,CMD_12CPI);
                     break;
   case CLI_15CPI  : DoCommand(info,CMD_15CPI);
                     break;
   case CLI_PITCH6 : DoCommand(info,CMD_PITCH6);
                     break;
   case CLI_PITCH8 : DoCommand(info,CMD_PITCH8);
                     break;
   default  : break;
  }
 }
}
/* ----------------------------------------------------------------- */
/* ----------------------------------------------------------------- */
/* ----------------------------------------------------------------- */
/* ----------------------------------------------------------------- */
/* ----------------------------------------------------------------- */



