/*
*+
*  Name:
*     UTIL_SPOOL
*  Purpose:
*     Spool a file to a printer
*  Language:
*     Starlink ANSI C
*  Invocation:
*     CALL UTIL_SPOOL( FILE, TYPE, DELETE, STATUS )
*  Description:
*     Spool a file to the printer using a command defined by the ASTERIX
*     environment variable AST__SPOOL. Errors by the spooling process
*     are reported and flushed to the environment. The value of TYPE can
*     be anything as long as the appropriate environment variables set. 
*     Examples might be FORTRAN, PS or TEXT.
*     {routine_description}
*  Arguments:
*     FILE = CHARACTER*(*) (given)
*        The name of the file to be spooled
*     TYPE = CHARACTER*(*) (given)
*        The type describing the contents or format of the file
*     DELETE = LOGICAL (given)
*        Delete the file after it is spooled?
*     STATUS = INTEGER (given and returned)
*        The global status.
*  Examples:
*     {routine_example_text}
*        {routine_example_description}
*  Pitfalls:
*     {pitfall_description}...
*  Notes:
*     {routine_notes}...
*  Prior Requirements:
*     {routine_prior_requirements}...
*  Side Effects:
*     {routine_side_effects}...
*  Algorithm:
*     {algorithm_description}...
*  Accuracy:
*     {routine_accuracy}
*  Timing:
*     {routine_timing}
*  External Routines Used:
*     {name_of_facility_or_package}:
*        {routine_used}...
*  Implementation Deficiencies:
*     {routine_deficiencies}...
*  {machine}-specific features used:
*     {routine_machine_specifics}...
*  References:
*     util Subroutine Guide : http://www.sr.bham.ac.uk/asterix-docs/Programmer/Guides/util.html
*  Keywords:
*     package:util, usage:public
*  Copyright:
*     Copyright (C) University of Birmingham, 1995
*  Authors:
*     DJA: David J. Allan (Jet-X, University of Birmingham)
*     {enter_new_authors_here}
*  History:
*     29 Jul 1993 (DJA):
*        Original version.
*     {enter_changes_here}
*  Bugs:
*     {note_any_bugs_here}
*-
*/
      
/*
 *  Include files
 */
#include "sae_par.h"
#include "f77.h"
#include "cnf.h"
#include "ems.h"                       /* Error handling */
#include                      /* i/o handling */
#include 
#include                     /* String handling */
#include                      /* Character handling */
#ifndef VAX
#include 
#include 
#include 
#endif
/*
 *  Body of code
 */
F77_SUBROUTINE(util_spool)( CHARACTER(file), CHARACTER(type), LOGICAL(del), 
                            INTEGER(status) TRAIL(file) TRAIL(type) )
  {
  GENPTR_CHARACTER(file)
  GENPTR_CHARACTER(type)
  GENPTR_LOGICAL(del)
  GENPTR_INTEGER(status)
  int   cstatus;                        /* Child creation status */
  int   wstatus;                        /* Child creation status */
  char  *esym;                 		/* Environment variable name */
  char	*fname;				/* File to be spooled */
  char	*tname;				/* File type */
  char  *spcmd;                         /* The spool command */
  int   splen;				/* Length of *spcmd */
  DECLARE_CHARACTER(cstr,132);          /* VMS command line */
/* Check inherited global stratus on entry */
  if ( *status != SAI__OK )
    return;
/* Make space for new string */
  esym = (char *) malloc(type_length+1+10);
/* Construct environment variable name */
  strncpy( esym, "AST_", 4 );           
  strncpy( esym+4, type, type_length );
  strcpy( esym+4+type_length, "_SPOOL" );
/* Get spool command */
  spcmd = getenv( esym );		
  free( esym );
/* Spool command defined? */
  if ( spcmd ) {                         
/* Import filename to C string */
    fname = cnf_creim( file, file_length );
    splen = strlen(spcmd);
    strcpy( cstr, spcmd );
    cstr[splen] = ' ';
    strcpy( cstr + splen + 1, fname );
#ifdef VAX
/* Deletion required? */
    if ( F77_ISTRUE(*del) )		
      if ( strncmp(cstr,"PRINT",5) == 0 )	/* Simple print command? */
        {
        strcpy( cstr + splen + 		/* Tack on a delete qualifier */
          strlen(fname) + 1 , "/DELETE" );
        }
    lib$spawn( CHARACTER_ARG(cstr) TRAIL(cstr) );
#else
/* Successful child creation returns zero to the child process and the */
/* +ve PID to the parent */
    if ( (cstatus = vfork()) == 0 ) {
/* Child ok, so try to run command */
      if ( cstatus = execlp( spcmd, spcmd, fname, (char *)0 ) == -1 ) {
        printf( "Failed to execute command %s %s\n", spcmd, fname );
        _exit(1);			/* Kills the child process */
        }
      }
/* Parent only, failed to create child */
    else if ( cstatus <= -1 ) {
      *status = SAI__ERROR;
      ems_rep_c( " ", "Failed to create sub-process", status );
      }
/* Parent, successful child creation */
    else {
/* Wait for child to finish */
      wstatus = wait( &cstatus );	
/* Delete the file? */
      if ( F77_ISTRUE(*del) ) {
/* Try to delete it */
	if ( remove( fname ) ) {
          *status = SAI__ERROR;
          ems_setc_c( "FILE", file, file_length );
          ems_rep_c( " ", "Unable to delete ^FILE after spooling", status );
          }
	}
      }
#endif
/* Free space */
    cnf_free( fname );			
    }
  else {
    *status = SAI__ERROR;
    ems_setc_c( "FILE", file, file_length );
    ems_rep_c( " ", "File ^FILE not spooled", status );
    ems_setc_c( "TYPE", type, type_length );
    ems_rep_c( " ", "No spool command defined for file type ^TYPE", status );
    }
  }