[mod.computers.vax] Info-Vax Digest V0 #1

Info-Vax-REQUEST@SRI-KL.ARPA.UUCP (03/12/87)

Info-Vax Digest         Wednesday, 11 Mar 1987      Volume 0 : Issue 1

Special note:
    Due to an unusual backlog of info-vax messages we have decided to
    place them all together in a series of digests for more efficient
    mailing.  Please do not mail comments on the digest format to the
    info-vax list.  We anticipate returning to the old direct mailing
    system shortly.  Thank you.

Today's Topics:
  VMS printer symbiont for PostScript
  swing
  Re: LIB$SPAWN
  RE: Improvements to VMS
  Re: LIB$SPAWN
  Display MacPaint images on a VMS workstation
----------------------------------------------------------------------

Date: Sat, 7 Mar 87 03:40 EST
From: Jeffrey Del Papa <dp@JASPER.PALLADIAN.COM>
Reply-to: Jeffrey Del Papa <DP%JASPER@LIVE-OAK.LCS.MIT.EDU>
Subject: VMS printer symbiont for PostScript

    Date: Thu, 5 Mar 87 17:03:12 est
    From: Eric Gisin <egisin%watmath.waterloo.edu@RELAY.CS.NET>

    I have a printer symbiont written in C for PostScript printers.
    It has a feature to spawn a subprocess to run a filter
    (to convert text to PS or DVI to PS) via the job's form type.
    I also have a couple of text to PS filters.
    I'll send it to anyone on InterNet, UUCP, or BITNET (in VMSDUMP format).
    I can also uuencode it if necessary.
            Eric Gisin, egisin@math.waterloo.edu, egisin@wataco.bitnet.



I would love a copy. try mail.. you could mail me just the source (cleartext) if it
isn't too huge.

<dp>

------------------------------

Date: Sat, 7 Mar 87 07:46 MET
From: Arno Diehl <DIEHL%iravcl%germany.csnet@RELAY.CS.NET>
Subject: swing


hallo swingers,

SWING crashed when you tried:

        SET DEFAULT DUA0:[000000]   ! to get all directories on that
                                    ! volume
        RUN SWING

The reason was LIB$FIND_FILE returning: DUA0:[000000]000000.DIR;1
causing SWING to search for DUA0:[000000.000000]*.DIR;
This returned DUA0:[000000.000000]000000.DIR;1 and so on...

A simple modification in procedure LOAD_NODES.FOR will handle this
situation. The only thing you have to do is to change the loops
from:

         icontext(1) = 0
         do while ( lib$find_file( search(1), spec, icontext(1) ) )
          call append_node( 1, spec, search(2) )
          icontext(2) = 0
          do while ( lib$find_file( search(2), spec, icontext(2) ) )
           call append_node( 2, spec, search(3) )
           ...
          end do
          call lib$find_file_end( icontext(2) )
         end do
         call lib$find_file_end( icontext(1) )

to:

         icontext(1) = 0
         do while ( lib$find_file( search(1), spec, icontext(1) ) )
         if (index(spec,'000000.DIR;1').eq.0) then
          call append_node( 1, spec, search(2) )
          icontext(2) = 0
          do while ( lib$find_file( search(2), spec, icontext(2) ) )
          if (index(spec,'000000.DIR;1').eq.0) then
           call append_node( 2, spec, search(3) )
           ...
          end if
          end do
          call lib$find_file_end( icontext(2) )
         end if
         end do
         call lib$find_file_end( icontext(1) )


--------------
arno diehl, university of karlsruhe, west germany

------------------------------

Date: Sat, 7 Mar 87 05:07:13 PST
From: carl@CitHex.Caltech.Edu (Carl J Lydick)
Subject: Re: LIB$SPAWN

  >  Does LIB$SPAWN work from a detached process?  I  have  a  simple  program
  >  that works fine until I try to RUN/DETACH.  Any comments welcome.  I have
  >  included the code to illustrate.

Yes, of course it works from a detached process.  Provided of course, that the
detached  process  has  a  CLI  recognized by LIB$SPAWN (the set of such CLI's
currently consists entirely of DCL).  If by detached process  you  meant  what
could  better  be  described  as  a  "detached image", in that the process was
created by giving the name of the image to $CREPRC rather than passing  it  to
the  CLI that an image was already running, then no, it doesn't.  Quoting from

        LIB$SPAWN  requests the  command  language  interpreter  (CLI)
        of the calling process to spawn a subprocess for executing CLI
        commands.  LIB$SPAWN provides the same  function  as  the  DCL
        SPAWN command.

In a the sort of process to which you seem to be referring, there is no CLI to
which  LIB$SPAWN can present the request.  The LIB$SPAWN exits with the status
%x0015837C, "%LIB-F-NOCLI, no CLI present to perform function",  as  does  (in
the  case  of  your  example, the image which called LIB$SPAWN, and since that
image is the entire process, the process as well; the easiest  way  to  verify
way to verify that this was happening is to examine  the  relevent  accounting
records).

------------------------------

Date: Sun, 8 Mar 87 00:23:33 est
From: woo@nyu-acf4.arpa (Alex C. Woo)

Subject: VMS disassembler

Are there any VMS disassemblers available?  Hopefully one avaiable from
DECUS?  Please send mail directly.

Alex Woo
woo@nyu-acf4.arpa
wooa@nyuacf.bitnet

------------------------------

Date: Sat, 7 Mar 87 19:14 N
From: <BART%HDETUD53.BITNET@wiscvm.wisc.edu>
Subject: RE: Improvements to VMS

In reply to: Jon Forrest (BLIA.UUCP!FORREST@CGL.UCSF.EDU)

I agree with most of Jon's wishes regarding VMS and its components.

However, one of them is realy simple to accomplish: the UNDEFINE
command can be created with the following CLD

!****************************UNDEFINE******************************
define syntax UNDEFINE_ALL_NAMES
   noparameters
define verb UNDEFINE
   cliroutine DEASSIGN
   parameter P1 , prompt="Log name"
      value (required,type=$inlog)
   qualifier SYSTEM
   qualifier GROUP
   qualifier JOB
   qualifier PROCESS
   qualifier USER_MODE
   qualifier SUPERVISOR_MODE
   qualifier EXECUTIVE_MODE
   qualifier TABLE
      value (required)
   qualifier ALL , syntax=UNDEFINE_ALL_NAMES

Just $ SET COMMAND UNDEFINE, and during your current login session
DCL understands what you mean.

If you want to add the command permanently issue the following commands:

$ SET COMMAND/TABLE=SYS$SHARE:DCLTABLES.EXE/OUTPUT=SYS$SHARE:DCLTABLES.EXE -
        UNDEFINE
$ INSTALL REPLACE SYS$SHARE:DCLTABLES.EXE

If you omit the second command the addition of UNDEFINE will only take
effect after the next reboot of the system.

I used Joe Meadows' VERB program to extract the definition of DEASSIGN
It's really great if you want to change or add something to the command
tables!

Bart Zorn               (BART@HDETUD53.BITNET)
Delft University of Technology
Faculty of Electrical Engineering

------------------------------

Date: Sat, 7 Mar 87 20:12:53 EST
From: garry@tcgould.tn.cornell.edu (Garry Wiegand)
Reply-to: garry@oak.cadif.cornell.edu
Subject: Re: LIB$SPAWN

In a recent article "%*Gayman, Beth" <gayman@ari-hq1.ARPA> wrote:
>Does LIB$SPAWN work from a detached process?  I have a simple program that
>works fine until I try to RUN/DETACH.  Any comments welcome.

Lib$Spawn is purely a DCL callback operation - it consists of DCL starting
itself up in a subprocess and then piping in the current process logical names,
the current DCL symbols, and then the Spawn parameters.

In your case - RUN/DETACH progname - there isn't any DCL to call back to!
All you've got is the naked program.

To rectify this, you need to get DCL itself running detached:

        $ RUN/DETACH SYS$SYSTEM:LOGINOUT/INPUT=cmdfile

where 'cmdfile' then consists of an "immediate" run:

        $ RUN progname

plus pointing SYS$INPUT somewhere appropriate.

One final note: your program was exiting with the Lib$Spawn error as its
final status. To get a look at that status (probably something about "no
command interpreter"), you might do:

        $ SET ACC/ENABLE                (if not already)
        $ SET ACC/ENABLE=DETACH         (if not already)
        $ SET ACC/NEW                   (makes it easier to see your run)
        (run program)
        (wait for it to die)
        $ ACC/FULL                      (look at the reason)
        (disable accounting)

Hope this helps

garry wiegand   (garry@oak.cadif.cornell.edu)

------------------------------

Date: Sat, 7 Mar 87 22:11:56 CST
From: mic@ngp.utexas.edu (Mic Kaczmarczik)
Subject: Display MacPaint images on a VMS workstation

I wrote this program to learn about UIS and FORTRAN (it was my first
"real" FORTRAN program of any size) on our VAXstation-II/GPX.  Enjoy!

Mic Kaczmarczik
User Services Digital Support Group
U.T. Austin Computation Center
ARPA:   mic@ngp.utexas.edu
UUCP:   ...!seismo!ut-sally!ut-ngp!mic
BITNET: ccep001@utadnx.bitnet

$!
$! DAR: DCL text file archiver
$! To unpack, cut on the dotted line and execute as a DCL command procedure
$! - - - - - - - - - - - - - - - CUT HERE- - - - - - - - - - - - - - - - - - -
$!
$! DCL text archive created by DRAGON::MIC  7-MAR-1987 21:45:10.57
$!
$! Files in this archive:
$!      AAAREADME.1ST
$!      MACUIS.RNH
$!      MACUIS.CLD
$!      MACPNTDEF.FOR
$!      MACUIS.FOR
$!      MACUISDEF.FOR
$!
$ verify = f$verify(0)
$ write sys$error "Unpacking AAAREADME.1ST"
$ copy sys$input AAAREADME.1ST
$ deck/dollars=7MAR1987214510
MACUIS is a program that displays Macintosh MacPaint images on a VMS
workstation screen.  It can either be run as a continuous "slide show",
or wait for user input before continuing to the next slide.

I have compiled and run MACUIS successfully using VAX FORTRAN 4.5 on a
8-plane color MicroVAX-II/GPX running MicroVMS 4.5 and VWS 3.0.  Your
mileage may vary, based on road conditions and weather :-).

To construct MACUIS, modify MACUIS.CLD to point to where MACUIS
resides on your system, then issue the commands

        $ FORTRAN MACUIS                        ! compile it
        $ LINK MACUIS                           ! link it
        $ SET COMMAND MACUIS                    ! put MACUIS in command tables
        $ MACUIS macpaint_file                  ! run macuis

To construct the help,

        $ RUNOFF MACUIS.RNH

To translate MACUIS.HLP into something you can use with the VMS help system,

        $ LIBRARY/CREATE/HELP MACUIS.HLB MACUIS.HLP
        $ DEFINE HLP$LIBRARY dev:[dir]MACUIS.HLB
        $ HELP @MACUIS MACUIS

Please send any comments or bug reports or bug fixes to

Mic Kaczmarczik
User Services Digital Support Group
U.T. Austin Computation Center

ARPA:   mic@ngp.utexas.edu
UUCP:   ...!ihnp4!seismo!ut-sally!ut-ngp!mic
BITNET: ccep001@utadnx.bitnet
7MAR1987214510
$ write sys$error "Unpacking MACUIS.RNH"
$ copy sys$input MACUIS.RNH
$ deck/dollars=7MAR1987214510
!
! MACUIS.RNH
! Mic Kaczmarczik
! User Services Digital Support Group
! U.T. Austin Computation Center
!
.lm+1
.i-1
1 MACUIS
.br
(07 March 1987)
.sk
The MACUIS command displays Macintosh MacPaint images on a VMS
Workstation running UIS version 3.0 workstation software.
.s
Format
.s
.i+2;MACUIS qualifiers file-spec,...
.i-1
2 Parameters
.s
file-spec,...
.s
The specification(s) of the MacPaint image files to be displayed.  Wildcard
characters are allowed, and the plus sign may be used in place of the
comma between file specifications.  The file type defaults to MPT.
.i-1
2 Qualifiers
.i-1
/CYCLE
.s
/CYCLE
.br
/NOCYCLE [D]
.s
Repeatedly display the specified files.  Useful for continuous "slide
shows" when combined with the /TIMEOUT qualifier.
.s
.i-1
/TIMEOUT
.s
/TIMEOUT
.br
/NOTIMEOUT [D]
.s
Specify an amount of time to display one MacPaint image before displaying
the next.  The default timeout value is 8 seconds.  Can be used with the
/CYCLE qualifier to create continuous "slide shows" on the workstation
display.
.s
Using a /TIMEOUT value much less than 00:00:00.5 (1/2 second) is not
recommended, since such a short timeout does not provide much time to
type a key to pause the current image before the next one is being read.
.i-1
2 Record__Format
.br
MACUIS expects MacPaint image files to be composed of fixed-size
records. To achieve this, enter
.i+5;SET FILE TYPE FIXED
.s;in VMS Kermit before you transfer the MacPaint file.
Other VMS communications packages may write files in other formats, so
check before you upload a MacPaint file from a Macintosh.
.s;On the Macintosh, use the BINARY transfer option when sending the
file using MacKermit, since MacPaint files are composed of 8-bit
binary data.
7MAR1987214510
$ write sys$error "Unpacking MACUIS.CLD"
$ copy sys$input MACUIS.CLD
$ deck/dollars=7MAR1987214510
! MACUIS.CLD
! The image definition is designed to let you test MACUIS while
! you have SET DEFAULT to the directory it's in.
! Modify this location to suit wherever you want to put it.
!
define verb macuis
        image sys$disk:[]macuis
        qualifier timeout, value(type=$deltatime), negatable
        qualifier cycle, negatable
        parameter p1, value(type=$file,list,required),
                        prompt "MacPaint file(s) [.mpt]"
7MAR1987214510
$ write sys$error "Unpacking MACPNTDEF.FOR"
$ copy sys$input MACPNTDEF.FOR
$ deck/dollars=7MAR1987214510
c
c       MACPNTDEF.FOR
c
c       Parameter definitions for MacPaint images
c
        parameter mpt$scanlines=720                     ! lines in MacPaint doc
        parameter mpt$scanbytes=72                      ! bytes/line
        parameter mpt$scanbits=mpt$scanbytes*8          ! pixels/scanline
        parameter mpt$imgsiz=mpt$scanlines*mpt$scanbytes! size of image array
7MAR1987214510
$ write sys$error "Unpacking MACUIS.FOR"
$ copy sys$input MACUIS.FOR
$ deck/dollars=7MAR1987214510
c
c  Title:       MACUIS -- show MacPaint pictures using UIS 3.0
c
c  Author:      Mic Kaczmarczik
c               User Services Digital Support Group
c               University of Texas at Austin Computation Center
c               ARPA:   mic@ngp.utexas.edu
c               UUCP:   ...!ihnp4!seismo!ut-sally!ut-ngp!mic
c               BITNET: CCEP001@UTADNX.BITNET
c
c  Created:     28-NOV-1986     MPK     My first "real" FORTRAN program
c  Modified:    03-DEC-1986     RW      Cycle through filespec, other fixes
c               10-DEC-1986     MPK     Rearrange, use CLD, disable resize
c               15-JAN-1987     RW      Allow early EOF in image file
c               17-JAN-1987     MPK     Fix defaults to match documentation,
c                                         get rid of EOF message (since
c                                         we show the picture anyway)
c  Credits:
c       Many thanks to Philip Watson for the code to read MacPaint images.
c       Ditto to Rick Watson for bug fixes, additions, and inspiration.
c
c  Usage:
c       MACUIS filelist[/qualifiers]
c  where
c       filespec        is a list of MacPaint files to display.
c                       MacPaint image files are assumed to be composed of
c                       fixed-length, binary records. You can achieve this
c                       by typing
c                               SET FILE TYPE FIXED
c
c                       in VMS Kermit before you transfer the MacPaint file.
c                       (Be sure to use the BINARY transfer option when
c                       sending the file from the Mac using MacKermit).
c
c                       All MACUIS expects is that the records have fixed
c                       length;  it uses the FORTRAN INQUIRE procedure to
c                       determine the record length for itself.
c  and qualifiers are:
c               /[NO]CYCLE -- repeatedly cycle through files
c               The default is /NOCYCLE
c
c               /TIMEOUT=deltatime -- wait for specified time, then continue
c               /NOTIMEOUT -- always wait for user to type a key
c               The default is /NOTIMEOUT.
c
c       At any time, clicking the right mouse button exits the program.
c
c       When /TIMEOUT is enabled, typing any key pauses the display until
c       another key is typed.  A window with "an informative message"
c       pops up telling you what to do next.
c
c
c  Notes:
c  In all windows, the world coordinate system is the same as the virtual
c  display's coordinate system.
c
        implicit        integer(a-z)

        include         'sys$library:uisentry'
        include         'sys$library:uisusrdef'
        include         '($LIBDEF)'
        include         '($RMSDEF)'
        include         '($SSDEF)'
        include         'macpntdef'                     ! MacPaint constants
        include         'macuisdef'                     ! MACUIS constants

c file specification list
        character*128   filespecs(maxfile)              ! List of file specs
        integer         nfiles                          ! number of files
        integer         context                         ! Search context
        character*128   macfilename                     ! Parsed file name

c
c Macpaint image buffer
c
        byte            image(mpt$imgsiz)               ! image data
        logical         unpack, unpack_sts              ! unpacks MacPaint file

c
c Macpaint image display variables
c
        integer         vd_id,wd_id,vcm_id,kb_id        ! UIS identifiers
        real*4          vd_width, vd_height             ! virtual display size
        real*4          dspwidth, dspheight             ! VAXstation disp. size
        real*4          wd_x, wd_y, wd_h, wd_w          ! viewport size
        real*4          xres,yres                       ! resolution factors
        parameter       vcm_size=2                      ! 1-plane color map
        character*60    windowtitle                     ! window title

c
c "type key to continue" window variables
c
        integer         pause_vd, pause_wd              ! pausing window
        real*4          pause_width /10.0/, pause_height /1.0/
        real*4          pmsg_width, pmsg_height
        structure       /wdpl_attributes/
                        integer*4 code
                union
                        map
                                real*4 position         ! ABS_POS_x
                        end map
                        map
                                integer*4 flags         ! position flags
                        end map
                end union
        end structure

        record          /wdpl_attributes/       pause_attr(4)

c
c qualifier flags/values
c
        character*40    time_str                        ! time out period
        logical*1       keytyped                        ! Key AST flag
        logical*1       repeat                          ! cycle display?
        logical*1       time_out                        ! time out flag
        logical*1       quit                            ! exit now?

c
c UIS keyboard management
c
        logical*1       keybuf(4)                       ! KB input buffer
        integer*4       bintim(2)                       ! used by $SETIMR
        common          /kb/kb_id, keybuf, keytyped, qualifiers, quit
        common          /wd/wd_id

        external        keystroke,timeout,button        ! AST routines
c
c Parse command qualifiers and file names into the appropriate variables.
c
        call parse(filespecs,nfiles,repeat,time_out,time_str)
        if (time_out) then                              ! set timeout period
                status = sys$bintim(time_str,bintim)
                if (.not. status) call lib$stop(%VAL(status))
        endif
c
c Create a virtual display with the right characteristics for the image
c
        call uis$get_display_size('SYS$WORKSTATION',
     *          dspwidth, dspheight, xres, yres)
        vd_width = float(mpt$scanbits) / xres
        vd_height = float(mpt$scanlines) / yres

        vcm_id = uis$create_color_map(vcm_size)
        vd_id = uis$create_display(0.0, 0.0, float(mpt$scanbits),
     *          float(mpt$scanlines), vd_width, vd_height, vcm_id)
c
c Create a virtual display with "type a key" message (displayed when pausing)
c
        if (time_out) then
                pause_vd = uis$create_display(0.0,0.0,
     *                  pause_width, pause_height, pause_width, pause_height)
                pause_attr(1).code = WDPL$C_ABS_POS_X
                pause_attr(2).code = WDPL$C_ABS_POS_Y
                pause_attr(3).code = WDPL$C_ATTRIBUTES
                pause_attr(3).flags = WDPL$M_NOKB_ICON
     *                  + WDPL$M_NOMENU_ICON + WDPL$M_NOBANNER
                pause_attr(4).code = WDPL$C_END_OF_LIST
                call uis$measure_text(pause_vd,0,'Type any key to continue',
     *                  pmsg_width, pmsg_height)
                call uis$set_aligned_position(pause_vd,0,
     *                  (pause_width - pmsg_width) / 2,
     *                  pmsg_height + (pause_height - pmsg_height) / 2)
                call uis$text(pause_vd,0,'Type any key to continue')
        end if
c
c Set up colors (black & white!) and create drawing window that we can
c keep drawing new images into (with mode UIS$C_MODE_REPL)
c
        call uis$set_color(vd_id,0,1.0,1.0,1.0) ! set index 0 (bg) white
        call uis$set_color(vd_id,1,0.0,0.0,0.0) ! set index 1 (fg) black
        call uis$set_writing_mode(vd_id, 0, 1, UIS$C_MODE_REPL)

        if (time_out) then       ! set appropriate window title
                windowtitle =
     *          ' Any key pauses (twice continues), right mouse button exits'
        else
                windowtitle =
     *          '     Type any key to continue, right mouse button exits    '
        end if
        wd_id = uis$create_window(vd_id,'SYS$WORKSTATION',windowtitle)
        call uis$set_resize_ast(vd_id,wd_id)    ! disable resizing!
c
c Create a connection between the window and the physical keyboard
c
        kb_id = uis$create_kb('SYS$WORKSTATION')
        call uis$enable_viewport_kb(kb_id, wd_id)       ! let user select kb
        call uis$enable_kb(kb_id, wd_id)                ! select it for him...
c
c Loop through the list of files and display any file that
c is successfully found and unpacked.
c
 100    do specnum = 1, nfiles

c ... find a file
          context = 0           ! set up search context
 110      status = lib$find_file(filespecs(specnum),macfilename,
     *          context,'.MPT')
          if (status .eq. RMS$_NMF) then
                call lib$find_file_end(context) ! end search
                goto 120                        ! goto end of loop
          else if (status .ne. RMS$_NORMAL) then
                write(*,'('' %MACUIS-F-FNF, file not found'')')
                call lib$find_file_end(context) ! end search
                goto 130                        ! exit!
          end if

c ... unpack it
          unpack_sts = unpack(macfilename,image)        ! unpack image
          if (.not. unpack_sts) then
                write(*,'('' %MACUIS-F-UNPACK, image unpack failed'')')
                goto 130                        ! exit!
          end if

c ... display image
          call uisdc$image(wd_id, 1, 0.0, 0.0, float(mpt$scanbits),
     *          float(mpt$scanlines), mpt$scanbits, mpt$scanlines, 1, image)

c ... wait for user action or timeout
          call uis$set_button_ast(vd_id, wd_id, button,,%ref(qualifiers))
          call uis$set_kb_ast(kb_id, keystroke, 0, keybuf)! set AST's
          if (.not. time_out) then
                  call sys$hiber()                      ! wait for key/button
          else
                  keytyped = .false.                    ! reset key flag
                  call sys$setimr(,bintim,timeout,)     ! set timeout
                  call sys$hiber()                      ! wait for key|timeout
                  call sys$cantim(,)                    ! cancel timeout
                  if (keytyped .and. (.not. quit)) then
                        call uis$get_viewport_position(wd_id,wd_x,wd_y)
                        call uis$get_viewport_size(wd_id,wd_w,wd_h)
                        pause_attr(1).position = wd_x + (wd_w - pause_width) / 2
                        pause_attr(2).position = wd_y + wd_h
                        pause_wd = uis$create_window(pause_vd,'SYS$WORKSTATION',
     *                                  'Type any key to continue',
     *                                  0.0,0.0,pause_width,pause_height,
     *                                  pause_width,pause_height,pause_attr)
                        call sys$hiber()                ! pause
                        call uis$delete_window(pause_wd)! delete it
                  end if
          end if
          call uis$set_button_ast(vd_id, wd_id)         ! reset mouse AST
          if (quit) then
                goto 130                                ! immediate exit
          else
                goto 110                                ! look for next file
          end if
c ... here when done with current file specification (find_file returns NMF)
 120      continue
        end do
c
c Here when done with for loop.  If repeat is set, start the whole thing over.
c
        if (repeat) goto 100
c
c Done! Clean up and exit, deleting items in reverse order of creation.
c
 130    if (context .ne. 0) call lib$find_file_end(context)     ! finish search
        call uis$delete_kb(kb_id)
        call uis$delete_window(wd_id)
        call uis$delete_display(vd_id)
        if (time_out) call uis$delete_display(pause_vd)
        call uis$delete_color_map(vcm_id)
        call sys$exit(%VAL(SS$_NORMAL))
        end

c* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
c
c Parse command line options.
c On return:
c       filespecs       is a list of file specifications
c       nfiles          is the number of file specs in filespecs
c       repeat          indicates the value of /CYCLE
c       time_out        indicates the value of /TIMEOUT
c       time_str        is the delta time value when /TIMEOUT=time is chosen
c
        SUBROUTINE PARSE(filespecs,nfiles,repeat,time_out,time_str)
        implicit        integer(a-z)
        include         'macuisdef'

        character*128   filespecs(maxfile)              ! file names
        integer         nfiles                          ! # filespecs parsed
        logical*1       repeat                          ! cycle?
        logical*1       time_out                        ! time out flag
        character*40    time_str                        ! timeout time string

        integer         present, val_stat

        external        CLI$_PRESENT, CLI$_DEFAULTED, CLI$_NEGATED
        external        CLI$_ABSENT, CLI$_COMMA, CLI$_CONCAT
        external        SS$_NORMAL
c
c Check for /CYCLE qualifier
c
        repeat = .false.                ! don't repeat unless requested.
        present = cli$present('CYCLE')
        if ((present .eq. %LOC(CLI$_PRESENT)) .or.
     *      (present .eq. %LOC(CLI$_DEFAULTED))) then
                repeat = .true.
        else if (present .eq. %LOC(CLI$_NEGATED)) then
                repeat = .false.
        end if
c
c Check for /TIMEOUT qualifier
c
        time_out = .false.              ! wait for user
        present = cli$present('TIMEOUT')
        if ((present .eq. %LOC(CLI$_PRESENT)) .or.
     *      (present .eq. %LOC(CLI$_DEFAULTED))) then
                time_out = .true.
                val_stat = cli$get_value('TIMEOUT',time_str)
                if (val_stat .ne. %LOC(SS$_NORMAL)) then! set default timeout
                         time_str = '0 00:00:08.00'
                end if
        else if (present .eq. %LOC(CLI$_NEGATED)) then
                time_out = .false.
                time_str = '1 00:00:00.00'      ! filewall at 1 day...
        else
                time_out = .false.
                time_str = '0 00:00:08.00'      ! default to 8 seconds
        end if
c
c Get list of file names to show.  We accept wildcards (but not MasterCard :-)
c
        nfiles = 0
        present = cli$present('P1')
        if (present .ne. %LOC(CLI$_PRESENT)) then
                write(*,'('' %MACUIS-F-NOP1, P1 is not present! '')')
                call sys$exit(present)
        end if
 100    if (nfiles .gt. maxfile) then
                write(*,'('' %MACUIS-W-TMF, too many files on command line! '')')
                goto 110
        end if
        val_stat = cli$get_value('P1',filespecs(nfiles + 1))
        nfiles = nfiles + 1
        if ((val_stat .eq. %LOC(CLI$_COMMA)) .or.
     *      (val_stat .eq. %LOC(CLI$_CONCAT))) goto 100 ! more specs in list
 110    continue
        end

c* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
c
c AST routine that is invoked when user types a key.  When invoked,
c it sets the flag keytyped, and wakes the process up
c
        SUBROUTINE KEYSTROKE
        implicit integer(a-z)
        include         'sys$library:uisentry'
        include         'sys$library:uisusrdef'
        common          /kb/kb_id, keybuf, keytyped, qualifiers, quit

        logical*1       keybuf(4)               ! input buffer
        logical*1       keytyped                ! was a key typed?

        status = uis$test_kb(kb_id)             ! should always be true
        keytyped = .true.                       ! key was typed
        call sys$wake(,)                        ! wake up!
        end

c* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
c
c  AST routine activated when button is clicked anywhere in the
c  picture window.  Sets quit when the right mouse button is released,
c  does nothing when it's pressed.
c
        SUBROUTINE BUTTON
        implicit integer(a-z)
        include         'sys$library:uisentry'
        include         'sys$library:uisusrdef'
        common          /kb/kb_id, keybuf, keytyped, qualifiers, quit
        common          /wd/wd_id

        integer         kb_id
        logical*1       keybuf(4)
        logical*1       keytyped
        integer         qualifiers
        logical*1       quit
        integer         wd_id

        logical*1       down
        integer         keycode

        down = btest(qualifiers,UIS$V_KEY_DOWN)
        keycode = ibits(qualifiers,0,16)

        if ((.not. down) .and. (keycode .eq. UIS$C_POINTER_BUTTON_1)) then
                call uis$pop_viewport(wd_id)
        end if
        if ((.not. down) .and. (keycode .eq. UIS$C_POINTER_BUTTON_3)) then
                quit = .true.           ! user wants to quit
                call sys$wake(,)        ! wake up process
        end if
        end

c* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
c
c  AST routine set up by call to sys$setimr (just wakes us up again)
c
        SUBROUTINE TIMEOUT
        call sys$wake(,)
        end

c* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
c
c Unpack the MacPaint image.  On successful return, image contains a
c 8-pixel-per-byte bitmap that represents the MacPaint image.
c
        LOGICAL FUNCTION UNPACK(FILESPEC,IMAGE)
        implicit        integer(a-z)
        include         'macpntdef'
        include         'macuisdef'
        include         '($SSDEF)'

        character*128   filespec                        ! file name
        byte            image(mpt$imgsiz)               ! image data

        byte            byte
        integer         nextbyte                        ! index into array
        logical         getbyte, get_status             ! reads a byte

        character*12    rectype                         ! must be 'FIXED'
        integer         recordsize                      ! i/o common
        integer         maclun /1/

        common          /io/recordsize,maclun
        common          /index/index                    ! getbyte index
c
c  Trans(i) is the 8-bit signed number you get when you take the bit pattern
c  for i and reverse the bits from left to right.  This converts a Mac-style
c  bitmap image byte into a UIS-style image byte.
c
c  Take -128 for example.  Its bit representation is 10000000, so its
c  reverse is 00000001 (=1).
c
        byte trans(-128:127) /
     *      1, -127,   65,  -63,   33,  -95,   97,  -31,  ! -128 - -121
     *     17, -111,   81,  -47,   49,  -79,  113,  -15,  ! -120 - -113
     *      9, -119,   73,  -55,   41,  -87,  105,  -23,  ! -112 - -105
     *     25, -103,   89,  -39,   57,  -71,  121,   -7,  ! -104 -  -97
     *      5, -123,   69,  -59,   37,  -91,  101,  -27,  !  -96 -  -89
     *     21, -107,   85,  -43,   53,  -75,  117,  -11,  !  -88 -  -81
     *     13, -115,   77,  -51,   45,  -83,  109,  -19,  !  -80 -  -73
     *     29,  -99,   93,  -35,   61,  -67,  125,   -3,  !  -72 -  -65
     *      3, -125,   67,  -61,   35,  -93,   99,  -29,  !  -64 -  -57
     *     19, -109,   83,  -45,   51,  -77,  115,  -13,  !  -56 -  -49
     *     11, -117,   75,  -53,   43,  -85,  107,  -21,  !  -48 -  -41
     *     27, -101,   91,  -37,   59,  -69,  123,   -5,  !  -40 -  -33
     *      7, -121,   71,  -57,   39,  -89,  103,  -25,  !  -32 -  -25
     *     23, -105,   87,  -41,   55,  -73,  119,   -9,  !  -24 -  -17
     *     15, -113,   79,  -49,   47,  -81,  111,  -17,  !  -16 -   -9
     *     31,  -97,   95,  -33,   63,  -65,  127,   -1,  !   -8 -   -1
     *      0, -128,   64,  -64,   32,  -96,   96,  -32,  !    0 -    7
     *     16, -112,   80,  -48,   48,  -80,  112,  -16,  !    8 -   15
     *      8, -120,   72,  -56,   40,  -88,  104,  -24,  !   16 -   23
     *     24, -104,   88,  -40,   56,  -72,  120,   -8,  !   24 -   31
     *      4, -124,   68,  -60,   36,  -92,  100,  -28,  !   32 -   39
     *     20, -108,   84,  -44,   52,  -76,  116,  -12,  !   40 -   47
     *     12, -116,   76,  -52,   44,  -84,  108,  -20,  !   48 -   55
     *     28, -100,   92,  -36,   60,  -68,  124,   -4,  !   56 -   63
     *      2, -126,   66,  -62,   34,  -94,   98,  -30,  !   64 -   71
     *     18, -110,   82,  -46,   50,  -78,  114,  -14,  !   72 -   79
     *     10, -118,   74,  -54,   42,  -86,  106,  -22,  !   80 -   87
     *     26, -102,   90,  -38,   58,  -70,  122,   -6,  !   88 -   95
     *      6, -122,   70,  -58,   38,  -90,  102,  -26,  !   96 -  103
     *     22, -106,   86,  -42,   54,  -74,  118,  -10,  !  104 -  111
     *     14, -114,   78,  -50,   46,  -82,  110,  -18,  !  112 -  119
     *     30,  -98,   94,  -34,   62,  -66,  126,   -2   !  120 -  127
     *  /
c
c Inspect the MacPaint file to get the record size and type
c
        inquire(file=filespec,defaultfile='.mpt',recl=recordsize,
     *          recordtype=rectype)
        if (rectype .ne. 'FIXED       ') then
                write(*,'('' %MACUIS-F-NOTFIX, file must have fixed records'')')
                unpack = .false.
                return
        end if
        if (recordsize .eq. 0) then
                write(*,'('' %MACUIS-F-NOTFOUND, file not found'')')
                unpack = .false.
                return
        end if
        if (recordsize .gt. maxrec) then
                write(*,'('' %MACUIS-F-TOOLONG, recl exceeds buffer size'')')
                unpack = .false.
                return
        end if
c
c Reset getbyte and open the MacPaint file
c
        index = recordsize                              ! preset getbyte
        open(unit=maclun,file=filespec,defaultfile='.mpt',type='old',
     *          form='unformatted',recordtype='fixed',recl=recordsize/4,err=100)
        goto 105        ! ...success
c
c...can't find file
c
 100    write(*,'('' %MACUIS-F-OPENIN, error opening file for input'')')
        unpack = .false.
        return
c
c...skip header in file
c
 105    do i=1,512
                get_status=getbyte(byte)
        enddo
c
c  Unpack Mac file into buffer
c
        nextbyte = 1
 110    if(.not.getbyte(byte)) goto 120
        count=byte
        if(count.ge.0) then
                do i=0,count
                        get_status=getbyte(byte)        ! reverse bits
                        image(nextbyte)=trans(byte)
                        nextbyte=nextbyte + 1
                        if (nextbyte .gt. mpt$imgsiz) goto 120 ! done
                enddo
        else
                get_status=getbyte(byte)
                byte = trans(byte)                      ! reverse bits (once)
                do i=0,abs(count)
                        image(nextbyte)=byte
                        nextbyte=nextbyte+1
                        if (nextbyte .gt. mpt$imgsiz) goto 120 ! done!
                enddo
        endif
        if(get_status) goto 110
c
c...unexpected end of file encountered -- ignore it and fill the
c   rest of the image out with 0's
c
        do i = nextbyte, mpt$imgsiz                     ! zero rest of image
                image(i) = 0
        enddo
c
c file unpacked fine
c
 120    unpack=.true.
        close(unit=maclun)
        return
        end

c* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
c
c  Get next byte from common logical unit maclun
c
        LOGICAL FUNCTION GETBYTE(BYTE)
        implicit integer(a-z)

        include         'macuisdef'
        integer         recordsize,maclun
        integer         forterr,rmssts,rmsstv,lunit,condval
        common          /io/recordsize,maclun           ! defined by main
        common          /index/index


        byte            buffer(maxrec), byte
        save            buffer

        index=index+1
        if(index.gt.recordsize) then
                read(maclun,err=90,end=100) (buffer(i),i=1,recordsize)
                index=1
                endif
        byte=buffer(index)
        getbyte=.true.
        goto 110
c
c
c
 90     call errsns(forterr,rmssts,rmsstv,lunit,condval)
        call lib$signal(%val(condval))
        getbyte = .false.
        return
c
c...byte not available
c
 100    byte=0
        getbyte=.false.
        index=recordsize
c
c  Return
c
 110    return
        end

7MAR1987214510
$ write sys$error "Unpacking MACUISDEF.FOR"
$ copy sys$input MACUISDEF.FOR
$ deck/dollars=7MAR1987214510
c
c       MACUISDEF.FOR
c
c       Constant definitions for MACUIS
c
        parameter       maxrec=512                      ! File record size
        parameter       maxfile=40                      ! Max # files in table
7MAR1987214510
$ write sys$error "All done bunky!"
$ if verify then -
        set verify
$ exit

------------------------------

End of Info-Vax Digest
**********************