/*----------------------------------------------------------------*/
/* CHGJSNAM       Keven Miller   1998 Mar 13                      */
/* ccxllk chgjsnam.c,chgjsnam.c ;info="-Aa +e +w1"                */
/* link from=$oldpass ;to=chgjsnam.pub; cap=ia,ba,pm;&            */
/*      rl=libcinit.lib.sys                                       */
/*----------------------------------------------------------------*/
#pragma list off
#pragma lines 200
#pragma autopage on

#include <stdio.h>   /* printf sprintf sizeof */
#include <string.h>  /* memset strncpy strchr */

#pragma list on

#define  VERSION           "E.01.00"
#define  JCW_OK            0
#define  JCW_WARN          16384
#define  JCW_FATAL         32768
#define  JCW_SYSTEM        49152
#define  AIF_ID            123456789   /* AIF Manual ID */
#define  ITEMNUM_JOBNAME   1001

#pragma  intrinsic_file "AIFINTR.PUB.SYS"
#pragma  intrinsic   AIFJSGET       mpe_aifjsget
#pragma  intrinsic   AIFJSPUT       mpe_aifjsput
#pragma  intrinsic_file ""

#pragma  intrinsic   GETPRIVMODE    mpe_getprivmode
#pragma  intrinsic   GETUSERMODE    mpe_getusermode
#pragma  intrinsic   HPERRMSG       mpe_hperrmsg

typedef union {
   int   all;
   struct {
      short err;
      short sub;
   } info;
} mpe_status_t;

typedef struct {
   int   err;
   char  msg [160];
} envmpe_t;

envmpe_t envos;

#pragma page
/*----------------------------------------------------------------*/
/* Return the MPE error message for error "uerr" into "buf"       */
/*    with max length "max".                                      */
/*----------------------------------------------------------------*/

int env_hperr ( long uerr )
{
   short ilen;
   int   len;
   long  err, oerr;
   char  *tp, *cp;

   envos.err = uerr >> 16;
   ilen = sizeof ( envos.msg ) -1;
   mpe_hperrmsg ( 3,,, uerr, envos.msg, &ilen, &err );
   if ( ! err )
      envos.msg [ilen] = 0;

   else
   {
      len = sprintf ( envos.msg, "[%d-%d] ",
         uerr >> 16, uerr & 0xFFFF );
      ilen = sizeof ( envos.msg ) -1 - len;
      mpe_hperrmsg ( 3,,, err, &envos.msg [len], &ilen, &oerr );
      if ( ! oerr ) {
         ilen += len;
         envos.msg [ilen] = 0;
      } else {
         sprintf ( &envos.msg [len], "HPERRMSG [%d-%d]",
            err >> 16, err & 0xFFFF );
      }
   }

/* Remove any CRLF in the message */
   for ( tp = cp = envos.msg; *cp; ++cp ) {
      if ( *cp == '\r' )
         continue;
      if ( *cp == '\n' )
         *tp++ = ' ';
      else
         *tp++ = *cp;
   }
   *tp = 0;

   return ( envos.err );
}
/*----------------------------------------------------------------*/

long newjsname ( char* newname )
{
   int            x, inums [2], ierrs [1];
   int            ^items [1];
   char           jobname [17], *cp;
   mpe_status_t   stat;

   inums [0] = ITEMNUM_JOBNAME;
   inums [1] = 0;
   items [0] = (int^) jobname;

   memset ( jobname, ' ', sizeof ( jobname ));
   jobname [16] = 0;
   stat.all = 0;

   mpe_getprivmode ();
   mpe_aifjsget ( &stat.all, inums, items, ierrs, 0, 0, AIF_ID );
   mpe_getusermode ();

   printf ( "Old name: [%s]\n", jobname );
   if ( stat.all )
      printf ( "!! AIFJSGET=%d\n", stat.all );

   memset ( jobname, ' ', sizeof ( jobname ));
   jobname [16] = 0;
   for ( x = 0; x < 16 && *newname; ++x )
      jobname [x] = *newname++;
   stat.all = 0;

   mpe_getprivmode ();
   mpe_aifjsput ( &stat.all, inums, items, ierrs, 0, 0, AIF_ID );
   mpe_getusermode ();

   return ( stat.all );
}
/*----------------------------------------------------------------*/
/* Main                                                           */
/*----------------------------------------------------------------*/

int main ( int argc, char *argv [] )
{
   int   jcw, err;
   char  *cp, name [17];

   if ( argc > 1 )
   {
      memset ( name, ' ', sizeof ( name ));
      name [16] = 0;
      strncpy ( name, argv [1], 16 );
      err = newjsname ( name );
      if ( ! err )
      {
         printf ( "New: [%s]\n", name );
         jcw = JCW_OK;
      } else {
         jcw = JCW_FATAL;
         if ( err != -1 )
         {
            env_hperr ( err );
            printf ( "%s\n", envos.msg );
         }
      }

   } else {
      jcw = JCW_SYSTEM;
      cp = strchr ( argv [0], '.' );
      if ( cp ) *cp = 0;
      printf ( "Usage: %s new-jobname\n", argv [0] );
   }

   printf ( "\n" );
   return   jcw;
}
/*----------------------------------------------------------------*/
