/*---------------------------------------------------------*
 | Author:  Maurizio Loreti, aka MLO or I3NOO.             |
 | Address: University of Padova - Department of Physics   |
 |          Via F. Marzolo, 8 - 35131 PADOVA - Italy       |
 | Phone:   (39)(49) 844-313         FAX: (39)(49) 844-245 |
 | E-Mail:  LORETI at IPDINFN (BITNET); or VAXFPD::LORETI  |
 |         (DECnet) - VAXFPD is node 38.257 i.e. 39169; or |
 |          LORETI@PADOVA.INFN.IT (INTERNET).              |
 | Home: Via G. Donizetti 6 - 35010 CADONEGHE (PD) - Italy |
 *---------------------------------------------------------*/

/*--------------------------------*
 | PF.c - Short for PRINTFILES.c  |
 | See the Read.Me file for help. |
 *--------------------------------*/

#include <stdio.h>
#include <stdarg.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <graphics/gfxbase.h>
#include <libraries/dos.h>
#include <libraries/reqbase.h>
#include <devices/printer.h>
#include "mlo.h"
#include "pf2.h"
#include "global.h"

main(
  int argc,
  char **argv
){

/**
 | Main program: after having opened intuition library, look
 | if we were started from CLI or Workbench; then process printer
 | parameters; last, print selected files.
**/

  Boolean select = False;             /* 'Some file selected' flag */
  struct ESStructure *pESS;           /* 'Extended selection' pointer */
  char fileName[FIL_MAX];             /* File name */
  char dirName[DIR_MAX];              /* Directory name */
  char target[TOT_MAX];               /* Complete name */
  int i;

  IntuitionBase = LibOpen("intuition.library",  REVISION);

  if (argc) {
    FromCLI = True;
    argv    = Setup(&argc, argv);
  } else {
    FromCLI = False;
    SetupWB();

/**
 | Set file requester parameters
**/

    fr.Title = "File(s) to print:";
    fr.Dir   = dirName;
    fr.File  = fileName;
    fr.Flags = FRQSHOWINFOM | FRQCACHINGM | FRQINFOGADGETM |
               FRQEXTSELECTM | FRQSAVINGM;
    fr.MaxExtendedSelect = MAX_FILES;
    fr.dirnamescolor     = fr.devicenamescolor  = RED_PEN;
    fr.stringnamecolor   = fr.stringgadgetcolor = BLACK_PEN;
    fr.boxbordercolor    = fr.gadgetboxcolor    = BLACK_PEN;
  }

  InitPrinter();
  bufferLength -= nBlanks;

  if (FromCLI) {
    for (; argc--; argv++) {
      DoOutput(*argv);
    }
  } else {
    if (PageMode != SINGLE_PAGE)    SetSpecialMode();
    FOREVER {
      fileName[0] = NIHIL;
      if (FileRequester(&fr)) {
        select = True;
        strcpy(target, dirName);
        if ((i = strlen(target))  &&  target[i-1] != ':') {
          target[i++] = '/';
        }
        if ((pESS = fr.ExtendedSelect) == NULL) {
          strcpy(target+i, fileName);
          DoOutput(target);
        } else {
          do {
            strcpy(target+i, pESS->thefilename);
            DoOutput(target);
          } while ( (pESS = pESS->NextFile) != NULL);
        }
      } else {
        break;
      }
    }

    if (!select) {
      SimpleRequest("Printer initialised ... Good bye!");
      Cleanup(SYS_NORMAL_CODE);
    }
  }

  FlushBuffers();
  ExitProgram();
}

void ErrMes(
  char *mForm,                            /* Format */
  ...                                     /* Optional arguments */
){

/**
 | Print an error message: on stdout if started from CLI,
 | in a requester if started from Workbench.
**/

  char message[LINE_LENGTH];              /* Internal buffer */
  va_list vl;                             /* Input argument pointer */

  va_start(vl, mForm);
  vsprintf(message, mForm, vl);
  va_end(vl);

  if (FromCLI) {
    puts(message);
  } else {
    SimpleRequest(message);
  }
}
