🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: vmsnet.sources
Article #25

xv-2-21a changes to run on VMS, part 01/08

#25
From: Rick Dyson
Date: Wed, 04 Nov 1992 21:12
1357 lines
50383 bytes
Submitted-by: dyson@iowasp.physics.uiowa.edu (Rick Dyson)
Posting-number: Volume 3, Issue 233
Archive-name: xv-2-21_vms_changes/part01
Supersedes: xv-2-21_vms_changes: Volume 2, Issue 83-86

         [ This package is a new release of the changes needed to
           make XV V2.21 work on VMS systems.  This version works
           with the Tar file currently found on export.lcs.mit.edu
           dated 25-Sep-1992 and supersedes the version previously
           released.  This version also applies the patch necessary
           to make XV version v2.21a. ]

$! ------------------ CUT HERE -----------------------
$ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))'
$!
$! This archive created by VMS_SHARE Version 8.1
$!   On  3-NOV-1992 15:11:12.04   By user BERRYMAN    
$!
$! The VMS_SHARE software that created this archive
$!    was written by  Andy Harper, Kings College London UK
$!    -- September 1992
$!
$! Credit is due to these people for their original ideas:
$!    James Gray, Michael Bednarek 
$!
$!+ THIS PACKAGE DISTRIBUTED IN 8 PARTS, TO KEEP EACH PART
$!  BELOW 100 BLOCKS
$!
$! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER
$! AND EXECUTE AS A COMMAND PROCEDURE  (  @name  )
$!
$! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING:
$!       1. ARGPROC.C;222
$!       2. DESCRIP.MMS;222
$!       3. GIFDECOMP.MAR;222
$!       4. GIFMAPF.C;222
$!       5. INCLUDES.H;222
$!       6. MAKE_JPEG.COM;222
$!       7. MAKE_TIFF.COM;222
$!       8. MAKE_XV.COM;222
$!       9. README.VMS;222
$!      10. SETUP.COM;222
$!      11. VDCOMP.DIF;222
$!      12. XV-221_VMS.DIFF;222
$!      13. XV.DIF;222
$!      14. XV.HLP;222
$!      15. XVDIR.DIF;222
$!      16. XVEVENT.DIF;222
$!      17. XVGIF.DIF;222
$!      18. XVJPEG.DIF;222
$!      19. XVMISC.DIF;222
$!      20. XV_FIXUP_VMS.COM;222
$!      21. [.DOCS]XV.TEX;1
$!      22. [.TIFF]MAKEFILE.VMS;222
$!      23. [.TIFF]MKG3STATES.DIF;222
$!      24. [.TIFF]TIFFCOMPAT.DIF;222
$!      25. [.TIFF]TIFFIO.DIF;222
$!      26. [.TIFF]TIFF_VMS.DIFF;222
$!      27. [.TIFF]TIF_MACHDEP.DIF;222
$!      28. [.TIFF]TIF_SWAB.DIF;222
$!
$set="set"
$set symbol/scope=(nolocal,noglobal)
$f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID"))
$e="write sys$error  ""%UNPACK"", "
$w="write sys$output ""%UNPACK"", "
$ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!"
$ ve=f$getsyi("version")
$ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start
$ e "-E-OLDVER, Must run at least VMS 4.4"
$ v=f$verify(v)
$ exit 44
$unpack: subroutine ! P1=filename, P2=checksum, P3=attributes
$ if f$search(P1) .eqs. "" then $ goto file_absent
$ e "-W-EXISTS, File ''P1' exists. Skipped."
$ delete 'f'*
$ exit
$file_absent:
$ if f$parse(P1) .nes. "" then $ goto dirok
$ dn=f$parse(P1,,,"DIRECTORY")
$ w "-I-CREDIR, Creating directory ''dn'"
$ create/dir 'dn'
$ if $status then $ goto dirok
$ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped."
$ delete 'f'*
$ exit
$dirok:
$ w "-I-UNPACK, Unpacking file ''P1'"
$ n=P1
$ if P3 .nes. "" then $ n=f
$ if .not. f$verify() then $ define/user sys$output nl:
$ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='n'
PROCEDURE GetHex LOCAL x1,x2;x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,
ERASE_CHARACTER(1))-1;RETURN 16*x1+x2;ENDPROCEDURE;
PROCEDURE SkipPartsep LOOP EXITIF INDEX(ERASE_LINE,"-+-+-+-+-+-+-+-+")=1;
ENDLOOP;ENDPROCEDURE;
PROCEDURE ExpandChar CASE CURRENT_CHARACTER FROM ' ' TO 'z' ["`"]
:ERASE_CHARACTER(1);COPY_TEXT(ASCII(GetHex));[" "]:ERASE_CHARACTER(1);[
OUTRANGE,INRANGE]:MOVE_HORIZONTAL(1);ENDCASE;ENDPROCEDURE;
PROCEDURE ProcessLine s:=ERASE_CHARACTER(1);LOOP EXITIF CURRENT_OFFSET>=LENGTH(
CURRENT_LINE);ExpandChar;ENDLOOP;IF s="V" THEN APPEND_LINE;ENDIF;ENDPROCEDURE;
PROCEDURE AdvanceLine MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);
ENDPROCEDURE;PROCEDURE Decode POSITION(BEGINNING_OF(b));LOOP EXITIF MARK(NONE)=
END_OF(b);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")=1 THEN SkipPartSep;
ELSE ProcessLine;AdvanceLine;ENDIF;ENDLOOP;ENDPROCEDURE;SET(FACILITY_NAME,
"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL,OFF);t:="0123456789ABCDEF";f:=
GET_INFO(COMMAND_LINE,"file_name");b:=CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,
GET_INFO(COMMAND_LINE,"output_file"));QUIT;
$ if p3 .eqs. "" then $ goto dl
$ open/write fdl &f
$ write fdl "RECORD"
$ write fdl P3
$ close fdl
$ w "-I-CONVRFM, Converting record format to ", P3
$ convert/fdl=&f &f-1 &P1
$dl: delete 'f'*
$ if P2 .eqs. "" then $ goto ckskip
$ checksum 'P1'
$ if checksum$checksum .nes. P2 then $ -
  e "-E-CHKSMFAIL, Checksum of ''P1' failed."
$ exit
$ckskip: e "-W-CHKSUMSKIP, checksum validation unavailable for ''P1'"
$ endsubroutine
$start:
$!
$ create 'f'
X/*
X`20*`20@(#)argproc.c`201.0`2089/02/01`09`09Mark`20Pizzolato`20(mark@infopiz.uu
Vcp)`09
X`20*/
X
X#ifndef`20lint
Xchar`20argproc_version`5B`5D`20=`20"@(#)argproc.c`20VMS`20uucp`20Version`20inf
Vopiz-1.0";
X#endif
X
X#include`20"includes.h"`09`09/*`20System`20include`20files,`20system`20depende
Vnt`20*/
X
X`0C
X/*
X`20*`20getredirection()`20is`20intended`20to`20aid`20in`20porting`20C`20progra
Vms
X`20*`20to`20VMS`20(Vax-11`20C)`20which`20does`20not`20support`20'>'`20and`20'<
V'
X`20*`20I/O`20redirection,`20along`20with`20a`20command`20line`20pipe`20mechani
Vsm
X`20*`20using`20the`20'`7C'`20AND`20background`20command`20execution`20'`26'.
X`20*`20The`20piping`20mechanism`20will`20probably`20work`20with`20almost`20any
V`20'filter'`20type
X`20*`20of`20program.`20`20With`20suitable`20modification,`20it`20may`20useful
V`20for`20other
X`20*`20portability`20problems`20as`20well.
X`20*
X`20*`20Author:`20`20Mark`20Pizzolato`09mark@infopiz.UUCP
X`20*/
Xstruct`20list_item
X`20`20`20`20`7B
X`20`20`20`20struct`20list_item`20*next;
X`20`20`20`20char`20*value;
X`20`20`20`20`7D;
X
Xint
Xgetredirection(ac,`20av)
Xint`09`09*ac;
Xchar`09`09***av;
X/*
X`20*`20Process`20vms`20redirection`20arg's.`20`20Exit`20if`20any`20error`20is
V`20seen.
X`20*`20If`20getredirection()`20processes`20an`20argument,`20it`20is`20erased
X`20*`20from`20the`20vector.`20`20getredirection()`20returns`20a`20new`20argc
V`20and`20argv`20value.
X`20*`20In`20the`20event`20that`20a`20background`20command`20is`20requested`20(
Vby`20a`20trailing`20"`26"),
X`20*`20this`20routine`20creates`20a`20background`20subprocess,`20and`20simply
V`20exits`20the`20program.
X`20*
X`20*`20Warning:`20do`20not`20try`20to`20simplify`20the`20code`20for`20vms.`20
V`20The`20code
X`20*`20presupposes`20that`20getredirection()`20is`20called`20before`20any`20da
Vta`20is
X`20*`20read`20from`20stdin`20or`20written`20to`20stdout.
X`20*
X`20*`20Normal`20usage`20is`20as`20follows:
X`20*
X`20*`09main(argc,`20argv)
X`20*`09int`09`09argc;
X`20*`20`20`20`20`09char`09`09*argv`5B`5D;
X`20*`09`7B
X`20*`09`09getredirection(`26argc,`20`26argv);
X`20*`09`7D
X`20*/
X`7B
X`20`20`20`20int`09`09`09argc`20=`20*ac;`09/*`20Argument`20Count`09`20`20*/
X`20`20`20`20char`09`09**argv`20=`20*av;`09/*`20Argument`20Vector`09`20`20*/
X`20`20`20`20char`09`09*ap;`20`20`20`09`09/*`20Argument`20pointer`09`20`20*/
X`20`20`20`20int`09`20`20`20`20`20`20`20`09`09j;`09`09/*`20argv`5B`5D`20index
V`09`09`20`20*/
X`20`20`20`20extern`20int`09`09errno;`09`09/*`20Last`20vms`20i/o`20error`20`09
V`20`20*/
X`20`20`20`20int`09`09`09item_count`20=`200;`09/*`20Count`20of`20Items`20in`20L
Vist`20*/
X`20`20`20`20int`09`09`09new_file;`09/*`20flag,`20true`20if`20'>'`20used`20*/
X`20`20`20`20struct`20list_item`20`09*list_head`20=`200;`09/*`20First`20Item
V`20in`20List`09`20`20`20`20*/
X`20`20`20`20struct`20list_item`09*list_tail;`09/*`20Last`20Item`20in`20List
V`09`20`20`20`20*/
X`20`20`20`20char`20`09`09*in`20=`20NULL;`09/*`20Input`20File`20Name`09`20`20
V`20`20*/
X`20`20`20`20char`20`09`09*out`20=`20NULL;`09/*`20Output`20File`20Name`09`20
V`20`20`20*/
X`20`20`20`20char`20`09`09*outmode`20=`20"w";`09/*`20Mode`20to`20Open`20Output
V`20File`20*/
X`20`20`20`20int`09`09`09cmargc`20=`200;`20`20`20`20`09/*`20Piped`20Command`20A
Vrg`20Count`20`20*/
X`20`20`20`20char`09`09**cmargv`20=`20NULL;/*`20Piped`20Command`20Arg`20Vector
V`20*/
X`20`20`20`20stat_t`09`09statbuf;`09/*`20fstat`20buffer`09`09`20`20`20`20*/
X
X`20`20`20`20/*
X`20`20`20`20`20*`20First`20handle`20the`20case`20where`20the`20last`20thing
V`20on`20the`20line`20ends`20with
X`20`20`20`20`20*`20a`20'`26'.`20`20This`20indicates`20the`20desire`20for`20the
V`20command`20to`20be`20run`20in`20a
X`20`20`20`20`20*`20subprocess,`20so`20we`20satisfy`20that`20desire.
X`20`20`20`20`20*/
X`20`20`20`20ap`20=`20argv`5Bargc-1`5D;
X`20`20`20`20if`20(0`20==`20strcmp("`26",`20ap))
X`09exit(background_process(--argc,`20argv));
X`20`20`20`20if`20('`26'`20==`20ap`5Bstrlen(ap)-1`5D)
X`09`7B
X`09ap`5Bstrlen(ap)-1`5D`20=`20'\0';
X`09exit(background_process(argc,`20argv));
X`09`7D
X`20`20`20`20/*
X`20`20`20`20`20*`20Now`20we`20handle`20the`20general`20redirection`20cases`20t
Vhat`20involve`20'>',`20'>>',
X`20`20`20`20`20*`20'<',`20and`20pipes`20'`7C'.
X`20`20`20`20`20*/
X`20`20`20`20for`20(new_file`20=`200,`20j`20=`200;`20j`20<`20argc;`20++j)
X`09`7B
X`09if`20(0`20==`20strcmp("<",`20argv`5Bj`5D))
X`09`20`20`20`20`7B
X`09`20`20`20`20if`20(j+1`20>=`20argc)
X`09`09`7B
X`09`09errno`20=`20EINVAL;
X`09`09perror("No`20input`20file");
X`09`09exit(EXIT_ERR);
X`09`09`7D
X`09`20`20`20`20in`20=`20argv`5B++j`5D;
X`09`20`20`20`20continue;
X`09`20`20`20`20`7D
X`09if`20('<'`20==`20*(ap`20=`20argv`5Bj`5D))
X`09`20`20`20`20`7B
X`09`20`20`20`20in`20=`201`20+`20ap;
X`09`20`20`20`20continue;
X`09`20`20`20`20`7D
X`09if`20(0`20==`20strcmp(">",`20ap))
X`09`20`20`20`20`7B
X`09`20`20`20`20if`20(j+1`20>=`20argc)
X`09`09`7B
X`09`09errno`20=`20EINVAL;
X`09`09perror("No`20output`20file");
X`09`09exit(EXIT_ERR);
X`09`09`7D
X`09`20`20`20`20out`20=`20argv`5B++j`5D;
X`09`20`20`20`20new_file`20=`201;
X`09`20`20`20`20continue;
X`09`20`20`20`20`7D
X`09if`20('>'`20==`20*ap)
X`09`20`20`20`20`7B
X`09`20`20`20`20if`20('>'`20==`20ap`5B1`5D)
X`09`09`7B
X`09`09outmode`20=`20"a";
X`09`09if`20('\0'`20==`20ap`5B2`5D)
X`09`09`20`20`20`20out`20=`20argv`5B++j`5D;
X`09`09else
X`09`09`20`20`20`20out`20=`202`20+`20ap;
X`09`09`7D
X`09`20`20`20`20else
X`09`09`7B`20out`20=`201`20+`20ap;`20`20new_file`20=`201;`20`7D
X`09`20`20`20`20continue;
X`09`20`20`20`20`7D
X`09if`20(0`20==`20strcmp("`7C",`20argv`5Bj`5D))
X`09`20`20`20`20`7B
X`09`20`20`20`20if`20(j+1`20>=`20argc)
X`09`09`7B
X`09`09errno`20=`20EPIPE;
X`09`09perror("No`20command`20to`20Pipe`20to");
X`09`09exit(EXIT_ERR);
X`09`09`7D
X`09`20`20`20`20cmargc`20=`20argc-(j+1);
X`09`20`20`20`20cmargv`20=`20`26argv`5Bj+1`5D;
X`09`20`20`20`20argc`20=`20j;
X`09`20`20`20`20outmode`20=`20"wb";`09/*`20pipes`20are`20binary`20mode`20device
Vs`20*/
X`09`20`20`20`20continue;
X`09`20`20`20`20`7D
X`09if`20('`7C'`20==`20*(ap`20=`20argv`5Bj`5D))
X`09`20`20`20`20`7B
X`09`20`20`20`20++argv`5Bj`5D;
X`09`20`20`20`20cmargc`20=`20argc-j;
X`09`20`20`20`20cmargv`20=`20`26argv`5Bj`5D;
X`09`20`20`20`20argc`20=`20j;
X`09`20`20`20`20outmode`20=`20"wb";`09/*`20pipes`20are`20binary`20mode`20device
Vs`20*/
X`09`20`20`20`20continue;
X`09`20`20`20`20`7D
X`09expand_wild_cards(ap,`20`26list_head,`20`26list_tail,`20`26item_count);
X`09`7D
X`20`20`20`20/*
X`20`20`20`20`20*`20Allocate`20and`20fill`20in`20the`20new`20argument`20vector,
V`20Some`20Unix's`20terminate
X`20`20`20`20`20*`20the`20list`20with`20an`20extra`20null`20pointer.
X`20`20`20`20`20*/
X`20`20`20`20argv`20=`20*av`20=`20calloc(item_count+1,`20sizeof(char`20*));
X`20`20`20`20for`20(j`20=`200;`20j`20<`20item_count;`20++j,`20list_head`20=`20l
Vist_head->next)
X`09argv`5Bj`5D`20=`20list_head->value;
X`20`20`20`20*ac`20=`20item_count;
X`20`20`20`20if`20(cmargv`20!=`20NULL)
X`09`7B
X`09char`20subcmd`5B1024`5D;
X`09static`20char`20*pipe_and_fork();
X
X`09if`20(out`20!=`20NULL)
X`09`20`20`20`20`7B
X`09`20`20`20`20errno`20=`20EINVAL;
X`09`20`20`20`20perror("Invalid`20'`7C'`20and`20'>'`20specified");
X`09`20`20`20`20exit(EXIT_ERR);
X`09`20`20`20`20`7D
X`09strcpy(subcmd,`20cmargv`5B0`5D);
X`09for`20(j`20=`201;`20j`20<`20cmargc;`20++j)
X`09`20`20`20`20`7B
X`09`20`20`20`20strcat(subcmd,`20"`20\"");
X`09`20`20`20`20strcat(subcmd,`20cmargv`5Bj`5D);
X`09`20`20`20`20strcat(subcmd,`20"\"");
X`09`20`20`20`20`7D
X`09out`20=`20pipe_and_fork(subcmd);
X`09outmode`20=`20"wb";
X`09`7D
X`09
X`20`20`20`20/*`20Check`20for`20input`20from`20a`20pipe`20(mailbox)`20*/
X
X`20`20`20`20if(fstat(0,`20`26statbuf)`20==`200)`7B
X`09if(strncmp(statbuf.st_dev,`20"MB",`202)`20==`200`20`7C`7C`20
X`09`20`20`20`20strncmp(statbuf.st_dev,`20"_MB",`203)`20==`200)`7B
X
X`09`20`20`20`20/*`20Input`20from`20a`20pipe,`20reopen`20it`20in`20binary`20mod
Ve`20to`20disable`09*/
X`09`20`20`20`20/*`20carriage`20control`20processing.`09`09`09`09*/
X
X`09`20`20`20`20if`20(in`20!=`20NULL)`7B
X`09`09errno`20=`20EINVAL;
X`09`09perror("Invalid`20'`7C'`20and`20'<'`20specified");
X`09`09exit(EXIT_ERR);
X`09`09`7D
X`09`20`20`20`20freopen(statbuf.st_dev,`20"rb",`20stdin);
X`09`20`20`20`20`7D
X`09`7D
X`20`20`20`20else`20`7B
X`09perror("fstat`20failed");
X`09exit(EXIT_ERR);
X`09`7D
X`20`20`20`20if`20((in`20!=`20NULL)`20`26`26`20(NULL`20==`20freopen(in,`20"r",
V`20stdin,`20"mbc=32",`20"mbf=2")))
X`09`7B
X`09perror(in);`20`20`20`20`09`20`20`20`20`20`20`20`09/*`20Can't`20find`20file
V`09`09*/
X`09exit(EXIT_ERR);`09`09/*`20Is`20a`20fatal`20error`09`09*/
X`09`7D
X`20`20`20`20if`20((out`20!=`20NULL)`20`26`26`20(NULL`20==`20freopen(out,`20out
Vmode,`20stdout,`20"mbc=32",`20"mbf=2")))
X`09`7B`09
X`09perror(ap);`09`09/*`20Error,`20can't`20write`20or`20append`09*/
X`09exit(EXIT_ERR);`09`09/*`20Is`20a`20fatal`20error`09`09*/
X`09`7D
X
X`20`20`20`20`20if`20(`20new_file`20)`20`7B
X`09/*
X`09`20*`20We`20are`20making`20an`20explicit`20output`20file,`20fstat`20the`20f
Vile`20and
X`20`20`20`20`20`20`20`20`20*`20declare`20exit`20handler`20to`20be`20able`20cha
Vnge`20the`20file`20to`20fixed`20length
X`09`20*`20records`20if`20necessary.`20
X`09`20*/
X`09char`20fname`5B256`5D;
X`09static`20int`20outfile_rundown(),`20check_outfile_filetype();
X`09static`20stat_t`20ofile_stat;
X`09static`20struct`20exit_control_block`20`7B
X`20`20`20`20`09`20`20`20`20struct`20exit_control_block`20*flink;
X`20`20`20`20`09`20`20`20`20int`09(*exit_routine)();
X`09`20`20`20`20int`20arg_count;
X`09`20`20`20`20int`20*status_address;`09/*`20arg`201`20*/
X`09`20`20`20`20stat_t`20*stat;`09`09/*`20arg`202`20*/
X`09`20`20`20`20int`20exit_status;
X`09`20`20`20`20int`20skew`5B128`5D;
X`09`7D`20exit_block`20=`20
X`09`20`20`20`20`7B`200,`20outfile_rundown,`202,`20`26exit_block.exit_status,
V`20`26ofile_stat,`200`20`7D;
X
X`09if`20(`20fstat`20(`20fileno(stdout),`20`26ofile_stat`20)`20==`200`20)
X`09`20`20`20`20`20sys$dclexh`20(`20`26exit_block`20);
X`09else`20fprintf(stderr,"Error`20fstating`20stdout`20-`20%s\n",
X`09`09strerror(errno,vaxc$errno)`20);
X
X`09if`20(`20fgetname`20(`20stdout,`20fname,`200`20)`20)`20check_outfile_filety
Vpe`20(`20fname`20);
X`20`20`20`20`20`7D
X#ifdef`20DEBUG
X`20`20`20`20fprintf(stderr,`20"Arglist:\n");
X`20`20`20`20for`20(j`20=`200;`20j`20<`20*ac;`20`20++j)
X`09fprintf(stderr,`20"argv`5B%d`5D`20=`20'%s'\n",`20j,`20argv`5Bj`5D);
X#endif
X`7D
X
Xstatic`20int`20binary_outfile`20=`200;
Xvoid`20set_outfile_binary()`20`7B`20binary_outfile`20=`201;`20return;`20`7D
X
X/*
X`20*`20Check`20if`20output`20file`20should`20be`20set`20to`20binary`20(fixed
V`20512)`20on`20exit`20based
X`20*`20upon`20the`20filetype.
X`20*/
Xstatic`20int`20check_outfile_filetype`20(`20name`20)
X`20`20`20`20char`20*name;
X`7B
X`20`20`20`20char`20*binary_filetypes,`20*ext,`20*p,`20*t;
X`20`20`20`20binary_filetypes`20=`20(char`20*)`20getenv`20(`20"PBM_BINARY_FILET
VYPES"`20);
X`20`20`20`20if`20(`20binary_filetypes`20==`20NULL`20)`20return`200;
X
X`20`20`20`20ext`20=`20strchr`20(`20name,`20'.'`20);`20`20if`20(`20ext`20==`20N
VULL`20)`20return`200;
X`20`20`20`20ext++;
X`20`20`20`20t`20=`20strrchr`20(`20name,`20'.'`20);`20`20`20if`20(`20t`20!=`20N
VULL`20)`20*t`20=`20'\0';
X
X`20`20`20`20for`20(`20p`20=`20binary_filetypes;`20*p`20!=`20'\0';`20p++`20)
V`20`7B
X`09for`20(`20t`20=`20p;
X`09`20`20`20`20`20`20(*p`20!=`20'\0'`20)`20`26`26`20(strchr`20(`20",`20`09",
V`20*p`20)`20==`20NULL);`20
X`09`20`20`20`20`20p++`20)`20*p`20=`20toupper(*p);
X`09*p`20=`20'\0';
X
X`09if`20(`20strcmp`20(`20t,`20ext`20)`20==`200`20)`20`7B
X`09`20`20`20`20binary_outfile`20=`201;
X`09`20`20`20`20break;
X`09`7D
X`20`20`20`20`7D
X`20`20`20`20return`20binary_outfile;
X`7D
X
X
X/*
X`20*`20Exit`20handler`20to`20set`20output`20file`20to`20binary`20on`20image
V`20exit.
X`20*/
Xstatic`20int`20outfile_rundown`20(`20reason,`20statbuf`20)
X`20`20`20`20int`20*reason;
X`20`20`20`20stat_t`20*statbuf;
X`7B
X`20`20`20`20int`20code,`20channel,`20status,`20LIB$GETDVI(),`20sys$assign(),
V`20sys$qiow();
X`20`20`20`20long`20int`20fib_desc`5B2`5D,`20devchar;
X`20`20`20`20short`20int`20iosb`5B4`5D;
X`20`20`20`20$DESCRIPTOR(device,`20statbuf->st_dev);
X`20`20`20`20struct`20fibdef`20fib;`09`09/*`20File`20information`20block`20(XQP
V)`20*/
X`20`20`20`20struct`20atrdef`20atr`5B2`5D;
X`20`20`20`20struct`20fat`20`7B
X`20`20`20`20`20`20unsigned`20char`20rtype,`20ratattrib;
X`20`20`20`20`20`20unsigned`20short`20int`20rsize,`20hiblk`5B2`5D,`20efblk`5B2
V`5D,`20ffbyte,`20maxrec,`20defext,`20gbc;
X`20`20`20`20`20`20unsigned`20short`20int`20reserved`5B4`5D,`20versions;
X`20`20`20`20`7D`20rat;
X
X`20`20`20`20if`20(`20!binary_outfile`20)`20return`201;`09/*`20leave`20file`20a
Vlone`20*/
X`20`20`20`20/*
X`20`20`20`20`20*`20Assign`20channel`20to`20device`20listed`20in`20stat`20block
V`20and`20test`20if`20it`20is
X`20`20`20`20`20*`20a`20directory`20structured`20device,`20returning`20if`20not
V.
X`20`20`20`20`20*/
X`20`20`20`20device.dsc$w_length`20=`20strlen`20(`20statbuf->st_dev`20);
X`20`20`20`20status`20=`20sys$assign`20(`20`26device,`20`26channel,`200,`200
V`20);
X`20`20`20`20if`20((status`20`26`201)`20==`200)`20`7B`20fprintf(stderr,`20
X`09"assign`20error`20to`20%s`20(%d)\n",`20device.dsc$a_pointer,`20status);
X`09`09return`20status;`20`7D
X`20`20`20`20code`20=`20DVI$_DEVCHAR;
X`20`20`20`20status`20=`20LIB$GETDVI`20(`20`26code,`20`26channel,`200,`20`26dev
Vchar`20);
X`20`20`20`20if`20((status`20`26`201)`20==`200)`20`7B`20fprintf(stderr,`20"getd
Vvi`20error:`20%d\n",`20status);
X`09`09return`20status;`20`7D
X`20`20`20`20if`20(`20(devchar`20`26`20DEV$M_DIR)`20==`200`20)`20return`201;
X`20`20`20`20/*
X`20`20`20`20`20*`20Build`20File`20Information`20Block`20and`20Atrribute`20bloc
Vk.
X`20`20`20`20`20*/
X`20`20`20`20fib.fib$r_fid_overlay.fib$w_fid`5B0`5D`20=`20statbuf->st_ino`5B0
V`5D;
X`20`20`20`20fib.fib$r_fid_overlay.fib$w_fid`5B1`5D`20=`20statbuf->st_ino`5B1
V`5D;
X`20`20`20`20fib.fib$r_fid_overlay.fib$w_fid`5B2`5D`20=`20statbuf->st_ino`5B2
V`5D;
X
X`20`20`20`20atr`5B0`5D.atr$w_size`20=`20sizeof(rat);
X`20`20`20`20atr`5B0`5D.atr$w_type`20=`20ATR$C_RECATTR;
X`20`20`20`20atr`5B0`5D.atr$l_addr`20=`20`26rat;
X`20`20`20`20atr`5B1`5D.atr$w_size`20=`200;`20atr`5B1`5D.atr$w_type`20=`200;
X`20`20`20`20/*
X`20`20`20`20`20*`20Perform`20access`20function`20with`20read_attributes`20sub-
Vfunction.
X`20`20`20`20`20*/
X`20`20`20`20freopen`20(`20"SYS$OUTPUT:",`20"a",`20stdout`20);
X`20`20`20`20fib_desc`5B0`5D`20=`2010;`20fib_desc`5B1`5D`20=`20(long`20int)`20
V`26fib;
X`20`20`20`20fib.fib$r_acctl_overlay.fib$l_acctl`20=`20FIB$M_WRITE;
X`20`20`20`20status`20=`20sys$qiow`20(`200,`20channel,`20IO$_ACCESS`7CIO$M_ACCE
VSS,
X`09`09`20`26iosb,`200,`200,`20`26fib_desc,`200,`200,`200,`20`26atr,`200`20);
X`20`20`20`20/*
X`20`20`20`20`20*`20If`20status`20successful,`20update`20record`20byte`20and
V`20perform`20a`20MODIFY.
X`20`20`20`20`20*/
X`20`20`20`20if`20(`20(status`261)`20==`201`20)`20status`20=`20iosb`5B0`5D;
X`20`20`20`20if`20(`20(status`261)`20==`201`20)`20`7B
X`20`20`20`20`20`20rat.rtype`20=`201;`09`09/*`20fixed`20length`20records`20*/
X`20`20`20`20`20`20rat.rsize`20=`20512;`20`20`09/*`20512`20byte`20block`20recro
Vds`20*/
X`20`20`20`20`20`20rat.ratattrib`20=`200;`20`20`20`20`20`20`20`20/*`20Record
V`20attributes:`20none`20*/
X
X`20`20`20`20`20status`20=`20sys$qiow
X`09(`200,`20channel,`20IO$_MODIFY,`20`26iosb,`200,`200,`20`26fib_desc,`200,
V`200,`200,`20`26atr,`200`20);
X`20`20`20`20`20`20`20if`20(`20(status`261)`20==`201`20)`20status`20=`20iosb
V`5B0`5D;
X`20`20`20`7D
X`20`20`20sys$dassgn`20(`20channel`20);
X`20`20`20if`20(`20(status`20`26`201)`20==`200`20)`20fprintf`20(`20stderr,
X`09"Failed`20to`20convert`20output`20file`20to`20binary`20format,`20status:
V`20%d\n",`20status);
X`20`20`20return`20status;
X`7D
X
X
Xstatic`20add_item(head,`20tail,`20value,`20count)
Xstruct`20list_item`20**head;
Xstruct`20list_item`20**tail;
Xchar`20*value;
Xint`20*count;
X`7B
X`20`20`20`20if`20(*head`20==`200)
X`09`7B
X`09if`20(NULL`20==`20(*head`20=`20calloc(1,`20sizeof(**head))))
X`09`20`20`20`20`7B
X`09`20`20`20`20errno`20=`20ENOMEM;
X`09`20`20`20`20perror("");
X`09`20`20`20`20exit(EXIT_ERR);
X`09`20`20`20`20`7D
X`09*tail`20=`20*head;
X`09`7D
X`20`20`20`20else
X`09if`20(NULL`20==`20((*tail)->next`20=`20calloc(1,`20sizeof(**head))))
X`09`20`20`20`20`7B
X`09`20`20`20`20errno`20=`20ENOMEM;
X`09`20`20`20`20perror("");
X`09`20`20`20`20exit(EXIT_ERR);
X`09`20`20`20`20`7D
X`09else
X`09`20`20`20`20*tail`20=`20(*tail)->next;
X`20`20`20`20(*tail)->value`20=`20value;
X`20`20`20`20++(*count);
X`7D
X
Xstatic`20expand_wild_cards(item,`20head,`20tail,`20count)
Xchar`20*item;
Xstruct`20ltem_list`20**head;
Xstruct`20ltem_list`20**tail;
Xint`20*count;
X`7B
Xint`20expcount`20=`200;
Xint`20context`20=`200;
Xint`20status;
Xint`20status_value;
Xint`20had_version;
X$DESCRIPTOR(filespec,`20item);
X$DESCRIPTOR(defaultspec,`20"SYS$DISK:`5B`5D*.*;");
X$DESCRIPTOR(resultspec,`20"");
X
X`20`20`20`20if`20(strcspn(item,`20"*%")`20==`20strlen(item))
X`09`7B
X`09add_item(head,`20tail,`20item,`20count);
X`09return;
X`09`7D
X`20`20`20`20resultspec.dsc$b_dtype`20=`20DSC$K_DTYPE_T;
X`20`20`20`20resultspec.dsc$b_class`20=`20DSC$K_CLASS_D;
X`20`20`20`20resultspec.dsc$a_pointer`20=`20NULL;
X`20`20`20`20filespec.dsc$w_length`20=`20strlen(item);
X`20`20`20`20/*
X`20`20`20`20`20*`20Only`20return`20version`20specs,`20if`20the`20caller`20spec
Vified`20a`20version
X`20`20`20`20`20*/
X`20`20`20`20had_version`20=`20strchr(item,`20';');
X`20`20`20`20while`20(1`20==`20(1`26lib$find_file(`26filespec,`20`26resultspec,
V`20`26context,
X`20`20`20`20`09`09`09`09`20`26defaultspec,`200,`20`26status_value,`20`260)))
X`09`7B
X`09char`20*string;
X`09char`20*c;
X
X`09if`20(NULL`20==`20(string`20=`20calloc(1,`20resultspec.dsc$w_length+1)))
X`09`20`20`20`20`7B
X`09`20`20`20`20errno`20=`20ENOMEM;
X`09`20`20`20`20perror("");
X`09`20`20`20`20exit(EXIT_ERR);
X`09`20`20`20`20`7D
X`09strncpy(string,`20resultspec.dsc$a_pointer,`20resultspec.dsc$w_length);
X`09string`5Bresultspec.dsc$w_length`5D`20=`20'\0';
X`09if`20(NULL`20==`20had_version)
X`09`20`20`20`20*((char`20*)strrchr(string,`20';'))`20=`20'\0';
X`09/*
X`09`20*`20Be`20consistent`20with`20what`20the`20C`20RTL`20has`20already`20done
V`20to`20the`20rest`20of
X`09`20*`20the`20argv`20items`20and`20lowercase`20all`20of`20these`20names.
X`09`20*/
X`09for`20(c`20=`20string;`20*c;`20++c)
X`09`20`20`20`20if`20(isupper(*c))
X`09`09*c`20=`20tolower(*c);
X`09add_item(head,`20tail,`20string,`20count);
X`09++expcount;
X`09`7D
X`20`20`20`20if`20(expcount`20==`200)
X`09add_item(head,`20tail,`20item,`20count);
X`20`20`20`20lib$sfree1_dd(`26resultspec);
X`20`20`20`20lib$find_file_end(`26context);
X`7D
X
Xstatic`20int`20child_st`5B2`5D;`09/*`20Event`20Flag`20set`20when`20child`20pro
Vcess`20completes`09*/
X
Xstatic`20short`20child_chan;/*`20I/O`20Channel`20for`20Pipe`20Mailbox`09`09
V`09*/
X
Xstatic`20exit_handler(status)
Xint`20*status;
X`7B
Xshort`20iosb`5B4`5D;
X
X`20`20`20`20if`20(0`20==`20child_st`5B0`5D)
X`09`7B
X#ifdef`20DEBUG
X`09fprintf(stderr,`20"Waiting`20for`20Child`20Process`20to`20Finnish`20.`20.
V`20.\n");
X#endif
X`09fflush(stdout);`09`20`20`20`20/*`20Have`20to`20flush`20pipe`20for`20binary
V`20data`20to`09*/
X`09`09`09`20`20`20`20/*`20terminate`20properly`20--`20<tp@mccall.com>`09*/
X#ifdef`20DEBUG
X`09fprintf(stderr,`20"`20`20`20`20stdout`20flushed.`20.`20.\n");
X#endif
X`09sys$qio(0,`20child_chan,`20IO$_WRITEOF,`20iosb,`200,`200,`200,`200,`200,
V`200,`200,`200);
X#ifdef`20DEBUG
X`09fprintf(stderr,`20"`20`20`20`20Pipe`20terminated.`20.`20.\n");
X#endif
X`09fclose(stdout);
X#ifdef`20DEBUG
X`09fprintf(stderr,`20"`20`20`20`20stdout`20closed.`20.`20.\n");
X#endif
X`09sys$synch(0,`20child_st);
X`09sys$dassgn(child_chan);
X`09`7D
X#ifdef`20DEBUG
X`09fprintf(stderr,`20"`20`20`20`20sync`20done.`20.`20.\n");
X#endif
X`7D
X
X#include`20syidef`09`09/*`20System`20Information`20Definitions`09*/
X
Xstatic`20sig_child(chan)
Xint`20chan;
X`7B
X#ifdef`20DEBUG
X`20`20`20`20fprintf(stderr,`20"Child`20Completion`20AST,`20st:`20%x\n",`20chil
Vd_st`5B0`5D`20);
X#endif
X`20`20`20`20if`20(child_st`5B0`5D`20==`200)
X`09`7B`20child_st`5B0`5D`20=`201;`20`7D
X`20`20`20`20sys$setef`20(`200`20);
X`7D
X
Xstatic`20struct`20exit_control_block
X`20`20`20`20`7B
X`20`20`20`20struct`20exit_control_block`20*flink;
X`20`20`20`20int`09(*exit_routine)();
X`20`20`20`20int`20arg_count;
X`20`20`20`20int`20*status_address;
X`20`20`20`20int`20exit_status;
X`20`20`20`20`7D`20exit_block`20=
X`20`20`20`20`7B
X`20`20`20`200,
X`20`20`20`20exit_handler,
X`20`20`20`201,
X`20`20`20`20`26exit_block.exit_status,
X`20`20`20`200
X`20`20`20`20`7D;
X
Xstatic`20char`20*pipe_and_fork(cmd)
Xchar`20*cmd;
X`7B
X`20`20`20`20$DESCRIPTOR(cmddsc,`20cmd);
X`20`20`20`20static`20char`20mbxname`5B64`5D,`20ef`20=`200;
X`20`20`20`20$DESCRIPTOR(mbxdsc,`20mbxname);
X`20`20`20`20short`20iosb`5B4`5D;
X`20`20`20`20int`20status;
X`20`20`20`20int`20pid;
X`20`20`20`20struct
X`09`7B
X`09short`20dna_buflen;
X`09short`20dna_itmcod;
X`09char`20*dna_buffer;
X`09short`20*dna_retlen;
X`09int`20listend;
X`09`7D`20itmlst`20=
X`09`7B
X`09sizeof(mbxname),
X`09DVI$_DEVNAM,
X`09mbxname,
X`09`26mbxdsc.dsc$w_length,
X`090
X`09`7D;
X`20`20`20`20int`20mbxsize;
X`20`20`20`20struct
X`09`7B
X`09short`20mbf_buflen;
X`09short`20mbf_itmcod;
X`09int`20*mbf_maxbuf;
X`09short`20*mbf_retlen;
X`09int`20listend;
X`09`7D`20syiitmlst`20=
X`09`7B
X`09sizeof(mbxsize),
X`09SYI$_MAXBUF,
X`09`26mbxsize,
X`090,
X`090
X`09`7D;
X
X`20`20`20`20cmddsc.dsc$w_length`20=`20strlen(cmd);
X`20`20`20`20/*
X`20`20`20`20`20*`20Get`20the`20SYSGEN`20parameter`20MAXBUF,`20and`20the`20smal
Vler`20of`20it`20and`202048`20as
X`20`20`20`20`20*`20the`20size`20of`20the`20'pipe'`20mailbox.
X`20`20`20`20`20*/
X`20`20`20`20if`20(1`20==`20(1`26(vaxc$errno`20=`20sys$getsyiw(0,`200,`200,`20
V`26syiitmlst,`20iosb,`200,`200,`200))))
X`09vaxc$errno`20=`20iosb`5B0`5D;
X`20`20`20`20if`20(0`20==`20(1`26vaxc$errno))
X`09`7B
X`20`09errno`20=`20EVMSERR;
X`09perror("Can't`20get`20SYSGEN`20parameter`20value`20for`20MAXBUF");
X`09exit(EXIT_ERR);
X`09`7D
X`20`20`20`20if`20(mbxsize`20>`202048)
X`09mbxsize`20=`202048;
X`20`20`20`20if`20(0`20==`20(1`26(vaxc$errno`20=`20sys$crembx(0,`20`26child_cha
Vn,`20mbxsize,`20mbxsize,`200,`200,`200))))
X`09`7B
X`09errno`20=`20EVMSERR;
X`09perror("Can't`20create`20pipe`20mailbox");
X`09exit(EXIT_ERR);
X`09`7D
X`20`20`20`20if`20(1`20==`20(1`26(vaxc$errno`20=`20sys$getdviw(0,`20child_chan,
V`200,`20`26itmlst,`20iosb,
X`20`20`20`20`09`09`09`09`09`20`200,`200,`200))))
X`09vaxc$errno`20=`20iosb`5B0`5D;
X`20`20`20`20if`20(0`20==`20(1`26vaxc$errno))
X`09`7B
X`20`09errno`20=`20EVMSERR;
X`09perror("Can't`20get`20pipe`20mailbox`20device`20name");
X`09exit(EXIT_ERR);
X`09`7D
X`20`20`20`20mbxname`5Bmbxdsc.dsc$w_length`5D`20=`20'\0';
X#ifdef`20DEBUG
X`20`20`20`20fprintf(stderr,`20"Pipe`20Mailbox`20Name`20=`20'%s'\n",`20mbxname)
V;
X#endif
X`20`20`20`20if`20(0`20==`20(1`26(vaxc$errno`20=`20lib$spawn(`26cmddsc,`20`26mb
Vxdsc,`200,`20`261,
X`20`20`20`20`09`09`09`09`090,`20`26pid,`20child_st,`20`26ef,`20sig_child,
X`20`20`20`20`09`09`09`09`09`26child_chan))))
X`09`7B
X`09errno`20=`20EVMSERR;
X`09perror("Can't`20spawn`20subprocess");
X`09exit(EXIT_ERR);
X`09`7D
X#ifdef`20DEBUG
X`20`20`20`20fprintf(stderr,`20"Subprocess's`20Pid`20=`20%08X\n",`20pid);
X#endif
X`20`20`20`20sys$dclexh(`26exit_block);
X`20`20`20`20return(mbxname);
X`7D
X
Xbackground_process(argc,`20argv)
Xint`20argc;
Xchar`20**argv;
X`7B
Xchar`20command`5B2048`5D`20=`20"$";
X$DESCRIPTOR(value,`20command);
X$DESCRIPTOR(cmd,`20"BACKGROUND$COMMAND");
X$DESCRIPTOR(null,`20"NLA0:");
Xint`20pid;
X
X`20`20`20`20strcat(command,`20argv`5B0`5D);
X`20`20`20`20while`20(--argc)
X`09`7B
X`09strcat(command,`20"`20\"");
X`09strcat(command,`20*(++argv));
X`09strcat(command,`20"\"");
X`09`7D
X`20`20`20`20value.dsc$w_length`20=`20strlen(command);
X`20`20`20`20if`20(0`20==`20(1`26(vaxc$errno`20=`20lib$set_symbol(`26cmd,`20
V`26value))))
X`09`7B
X`09errno`20=`20EVMSERR;
X`09perror("Can't`20create`20symbol`20for`20subprocess`20command");
X`09exit(EXIT_ERR);
X`09`7D
X`20`20`20`20if`20(0`20==`20(1`26(vaxc$errno`20=`20lib$spawn(`26cmd,`20`26null,
V`200,`20`2617,`200,`20`26pid))))
X`09`7B
X`09errno`20=`20EVMSERR;
X`09perror("Can't`20spawn`20subprocess");
X`09exit(EXIT_ERR);
X`09`7D
X#ifdef`20DEBUG
X`20`20`20`20fprintf(stderr,`20"%s\n",`20command);
X#endif
X`20`20`20`20fprintf(stderr,`20"%08X\n",`20pid);
X`20`20`20`20return(EXIT_OK);
X`7D
X`0C
X/*`20got`20this`20off`20net.sources`20*/
X
X#ifdef`09VMS
X#define`09index`09strchr
X#endif`09/*VMS*/
X
X/*
X`20*`20get`20option`20letter`20from`20argument`20vector
X`20*/
Xint`09opterr`20=`201,`09`09/*`20useless,`20never`20set`20or`20used`20*/
X`09optind`20=`201,`09`09/*`20index`20into`20parent`20argv`20vector`20*/
X`09optopt;`09`09`09/*`20character`20checked`20for`20validity`20*/
Xchar`09*optarg;`09`09/*`20argument`20associated`20with`20option`20*/
X
X#define`20BADCH`09(int)'?'
X#define`20EMSG`09""
X#define`20tell(s)`09fputs(progname,stderr);fputs(s,stderr);`20\
X`09`09fputc(optopt,stderr);fputc('\n',stderr);return(BADCH);
X
Xgetopt(nargc,nargv,ostr)
Xint`09nargc;
Xchar`09**nargv,
X`09*ostr;
X`7B
X`09static`20char`09*place`20=`20EMSG;`09/*`20option`20letter`20processing`20*/
V
X`09register`20char`09*oli;`09`09/*`20option`20letter`20list`20index`20*/
X`09char`09*index();
X`09char`20*progname;
X
X`09if(!*place)`20`7B`09`09`09/*`20update`20scanning`20pointer`20*/
X`09`09if(optind`20>=`20nargc`20`7C`7C`20*(place`20=`20nargv`5Boptind`5D)`20!=
V`20'-'`20`7C`7C`20!*++place)`20return(EOF);
X`09`09if`20(*place`20==`20'-')`20`7B`09/*`20found`20"--"`20*/
X`09`09`09++optind;
X`09`09`09return(EOF);
X`09`09`7D
X`09`7D`09`09`09`09/*`20option`20letter`20okay?`20*/
X`09if`20((optopt`20=`20(int)*place++)`20==`20(int)':'`20`7C`7C`20!(oli`20=`20i
Vndex(ostr,optopt)))`20`7B
X`09`09if(!*place)`20++optind;
X#ifdef`20VMS
X`09`09progname`20=`20strrchr(nargv`5B0`5D,'`5D');
X#else
X`09`09progname`20=`20rindex(nargv`5B0`5D,'/');
X#endif
X`09`09if`20(!progname)`20progname`20=`20nargv`5B0`5D;`20else`20progname++;
X`09`09tell(":`20illegal`20option`20--`20");
X`09`7D
X`09if`20(*++oli`20!=`20':')`20`7B`09`09/*`20don't`20need`20argument`20*/
X`09`09optarg`20=`20NULL;
X`09`09if`20(!*place)`20++optind;
X`09`7D
X`09else`20`7B`09`09`09`09/*`20need`20an`20argument`20*/
X`09`09if`20(*place)`20optarg`20=`20place;`09/*`20no`20white`20space`20*/
X`09`09else`20if`20(nargc`20<=`20++optind)`20`7B`09/*`20no`20arg`20*/
X`09`09`09place`20=`20EMSG;
X#ifdef`20VMS
X`09`09`09progname`20=`20strrchr(nargv`5B0`5D,'`5D');
X#else
X`09`09`09progname`20=`20rindex(nargv`5B0`5D,'/');
X#endif
X`09`09`09if`20(!progname)`20progname`20=`20nargv`5B0`5D;`20else`20progname++;
X`09`09`09tell(":`20option`20requires`20an`20argument`20--`20");
X`09`09`7D
X`09`20`09else`20optarg`20=`20nargv`5Boptind`5D;`09/*`20white`20space`20*/
X`09`09place`20=`20EMSG;
X`09`09++optind;
X`09`7D
X`09return(optopt);`09`09`09/*`20dump`20back`20option`20letter`20*/
X`7D
$ call unpack ARGPROC.C;222 474459103 ""
$!
$ create 'f'
X#`09MMS`20Description`20file`20for`20xv`20(v2.21)
X#`09Written`20by`20Rick`20Dyson`20(dyson@iowasp.physics.uiowa.edu)
X#`09Last`20Modified:`2030-APR-1992`20for`20v2.21
X#`09`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`205-OCT-1992`20for`20v2.21
V`20(export.lcs.mit.edu`20version
X#`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20`20`20`20of`20xv-2.21`20seemed`20to`20change`20about
X#`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20`20`20`2025-Sep-1992`20without`20version`20number
X#`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20
V`20`20`20`20`20`20`20`20`20changing.
X#
X#`20`09Modeled`20after`20the`20original`20Unix`20Makefile`20for`20xv
X#`09Most`20of`20the`20Unix`20comments`20have`20been`20left`20intact`20to`20hel
Vp`20debug`20any
X#`09problems.
X
X#`20your`20C`20compiler`20(and`20options)`20of`20choice
X#
X#`20if`20compiling`20on`20a`20Mips`20machine,`20try`20this:
X#`20`20`20`20CCOPTS`20=`20-Olimit`20600`20-systype`20bsd43
X
X#`20Remember:`20`20if`20you`20change`20the`20C`20compiler`20(to`20gcc,`20or
V`20whatever),`20be`20sure`20to
X#`20do`20the`20same`20thing`20to`20the`20Makefile`20in`20the`20'jpeg'`20and
V`20'tiff'`20subdirectories
X
XCC`20=`20cc
X
X#`20BE`20SURE`20TO`20SET`20THIS`20TO`20YOUR`20SITE'S`20DESTINATION`20DIRECTORY
V...!!!
XBINDIR`20=`20Prclib:`5BXtools`5D
X
X################`20CONFIGURATION`20OPTIONS`20#################
X
X#`20if,`20for`20whatever`20reason,`20you're`20unable`20to`20get`20the`20JPEG
V`20library`20to`20compile
X#`20on`20your`20machine,`20*COMMENT`20OUT*`20the`20following`20lines.
X#
X#`20Also,`20comment`20out`20the`20JPEGLIB`20dependancy`20below.
X#
X#`20`20VMS`20MMS`20USERS!!!
X#
X#`20`09if`20you`20don't`20use`20the`20JPEG`20package`20as`20supplied`20with
V`20XV,`20you
X#`20`09will`20need`20fill`20in`20the`20complete`20directory`20specifications
V`20for
X#`09BOTH`20JPEGDIR`20and`20XVDIR!!
X#
XXVDIR`20=`20`5BXtools.XV-2_21`5D
XJPEGDIR`20=`20`5B.JPEG`5D
XJPEG`20=`20,HAVE_JPEG,HAVE_STDC
XJPEGLIB`20=`20$(JPEGDIR)LIBJPEG.OLB
XJPEGINCLUDE`20=`20,$(JPEGDIR)
X
X
X#`20if,`20for`20whatever`20reason,`20you're`20unable`20to`20get`20the`20TIFF
V`20library`20to`20compile
X#`20on`20your`20machine,`20*COMMENT`20OUT*`20the`20following`20lines
X#
X#`20Also,`20comment`20out`20the`20LIBTIFF`20dependancy`20at`20the`20end`20of
V`20this`20Makefile
X#
X#`20`20VMS`20MMS`20USERS!!!
X#
X#`20`09if`20you`20don't`20use`20the`20TIFF`20package`20as`20supplied`20with
V`20XV,`20you
X#`20`09will`20need`20fill`20in`20the`20complete`20directory`20specifications
V`20for
X#`09BOTH`20TIFFDIR`20and`20XVDIR!!
X#
XTIFF`20=`20,HAVE_TIFF
XTIFFDIR`20=`20`5B.TIFF`5D
XTIFFLIB`20=`20$(TIFFDIR)LIBTIFF.OLB
XTIFFINCLUDE`20=`20,$(TIFFDIR)
X
X
X#`20if,`20for`20whatever`20reason,`20you're`20unable`20to`20get`20the`20PDS/VI
VCAR`20support
X#`20to`20compile`20(xvpds.c,`20and`20vdcomp.c),`20*COMMENT`20OUT*`20the`20foll
Vowing`20line,
X#`20and`20also`20remove`20'vdcomp'`20from`20the`20'all:'`20dependancy
XPDS`20=`20,HAVE_PDS
X
X
X#`09For`20VMS`20USERS`20ONLY:
X#
X#`09There`20is`20a`20decompression`20program`20supplied`20which`20acts`20like
V`20the
X#`09standard`20Unix`20"uncompress"`20which`20is`20the`20default`20for`20XV`20b
Vut,
X#`09if`20you`20have`20and`20want`20to`20use`20the`20DECUS`20version`20of`20Mar
Vtin`20Minow's
X#`09LZW`20Compress/Decompress`20package`20then`20you`20can`20easily`20use`20th
Ve
X#`09autosense`20decompress`20feature`20of`20XV.
X#
X#`09THIS`20MEANS`20THE`20FILE`20NAMES`20MUST`20END`20WITH`20EITHER`20".Z"`20OR
V`20"_Z"
X#
X#`09This`20means`20you`20will`20ALSO`20need`20to`20edit`20the`20XV.H`20file
V`20to`20get
X#`09the`20pointer`20to`20your`20location`20of`20LZDCMP`20defined.
X#`09If`20this`20is`20true`20for`20you,`20uncomment`20the`20next`20line.
X#LZW`20=`20,HAVE_LZW
X
XDEFS`20=`20/Define`20=`20(VMS$(JPEG)$(PDS)$(TIFF)$(LZW)$(FSQUICK))
XINCS`20=`20/Include`20=`20(`5B`5D$(JPEGINCLUDE)$(TIFFINCLUDE))
X
XOPTIMIZE`20=`20/Optimize
XDEBUG`20=`20/NoDebug
XCFLAGS`20=`20$(CFLAGS)`20$(DEFS)`20$(INCS)`20$(DEBUG)`20$(OPTIMIZE)
XLINKFLAGS`20=`20$(LINKFLAGS)`20$(DEBUG)
XOPTS`20=`20Sys$Disk:`5B`5DOPTIONS.OPT
XXVLIB`20=`20XVLIB.OLB
X
XBITMAPS`20=`20`5B.bitmaps`5Dgrasp`20`5B.bitmaps`5Dpenn`20`5B.bitmaps`5Ddown
V`20`5B.bitmaps`5Ddown1`20\
X`09`20`20`5B.bitmaps`5Dup`20`5B.bitmaps`5Dup1`20`5B.bitmaps`5Dscrlgray`20`5B.b
Vitmaps`5Dgray50`20\
X`09`20`20`5B.bitmaps`5Dgray25`20`5B.bitmaps`5Di_fifo`20`5B.bitmaps`5Di_chr`20
V`5B.bitmaps`5Di_dir`20\
X`09`20`20`5B.bitmaps`5Di_blk`20`5B.bitmaps`5Di_lnk`20`5B.bitmaps`5Di_sock`20
V`5B.bitmaps`5Di_reg`20\
X`09`20`20`5B.bitmaps`5Drb_off`20`5B.bitmaps`5Drb_on`20`5B.bitmaps`5Drb_off1
V`20`5B.bitmaps`5Drb_on1`20\
X`09`20`20`5B.bitmaps`5Dfc_left`20`5B.bitmaps`5Dfc_leftm`20`5B.bitmaps`5Dfc_mid
V`20\
X`09`20`20`5B.bitmaps`5Dfc_midm`20`5B.bitmaps`5Dfc_right`20`5B.bitmaps`5Dfc_rig
Vhtm`20\
X`09`20`20`5B.bitmaps`5Dfc_left1`20`5B.bitmaps`5Dfc_left1m`20`5B.bitmaps`5Dfc_r
Vight1`20\
X`09`20`20`5B.bitmaps`5Dfc_right1m`20`5B.bitmaps`5Dicon`20`5B.bitmaps`5Ddial_cw
V1`20\
X`09`20`20`5B.bitmaps`5Ddial_cw2`20`5B.bitmaps`5Ddial_ccw1`20`5B.bitmaps`5Ddial
V_ccw2`20\
X`09`20`20`5B.bitmaps`5Diconmask`20`5B.bitmaps`5Dgf1_addh`20`5B.bitmaps`5Dgf1_d
Velh`20\
X`09`20`20`5B.bitmaps`5Dgf1_line`20`5B.bitmaps`5Dgf1_rst`20`5B.bitmaps`5Dgf1_sp
Vln`20\
X`09`20`20`5B.bitmaps`5Dgf1_gamma`20`5B.bitmaps`5Dh_rotl`20`5B.bitmaps`5Dh_rotr
V`20\
X`09`20`20`5B.bitmaps`5Dh_sinc`20`5B.bitmaps`5Dh_sdec`20`5B.bitmaps`5Dh_flip
V`20`5B.bitmaps`5Dcb_off`20\
X`09`20`20`5B.bitmaps`5Dcb_on`20`5B.bitmaps`5Dcb_off1`20`5B.bitmaps`5Dcb_on1
V`20`5B.bitmaps`5Dh_sat`20\
X`20`20`20`20`20`20`20`20`20`20`5B.bitmaps`5Dh_desat`20`5B.bitmaps`5Droot_weave
V`20`5B.bitmaps`5Dcboard50`20\
X`09`20`20`5B.bitmaps`5Dmb_chk`20`5B.bitmaps`5Dfliph`20`5B.bitmaps`5Dflipv
X
XBITMAPLIST`20=`20grasp,penn,down,down1,up,up1,scrlgray,gray50,gray25,i_fifo,i_
Vchr,i_dir,i_blk,i_lnk,i_sock,i_reg,rb_off,rb_on,rb_off1,rb_on1,fc_left,fc_left
Vm,fc_mid,fc_midm,fc_right,fc_rightm,fc_left1,fc_left1m,fc_right1,fc_right1m,ic
Von,dial_cw1,dial_cw2,dial_ccw1,dial_ccw2,iconmask,gf1_addh,gf1_delh,gf1_line,g
Vf1_rst,gf1_spln,gf1_gamma,h_rotl,h_rotr,h_sinc,h_sdec,h_flip,cb_off,cb_on,cb_o
Vff1,cb_on1,h_sat,h_desat,root_weave,cboard50,mb_chk,fliph,flipv
X
XOBJS`20=`20`09xvevent.obj`20xvroot.obj`20xvmisc.obj`20xvimage.obj`20xvcolor.ob
Vj`20\
X`09xvsmooth.obj`20xv24to8.obj`20xvgif.obj`20xvpm.obj`20xvinfo.obj`20xvctrl.obj
V`20\
X`09xvscrl.obj`20xvgifwr.obj`20xvdir.obj`20xvbutt.obj`20xvpbm.obj`20xvxbm.obj
V`20\
X`09xvgam.obj`20xvdial.obj`20xvgraf.obj`20xvsunras.obj`20xvjpeg.obj`20xvps.obj
V`20\
X`09xvpopup.obj`20xvdflt.obj`20argproc.obj`20vms.obj`20vmsreaddir.obj`20\
X`09gifdecomp.obj`20gifmapf.obj`20pseudo_root.obj`20xvpds.obj`20xvtiff.obj`20\
X`09xvtiffwr.obj`20xvrle.obj`20xvgrab.obj
X
XOBJLIST`20=`20xvevent.obj,xvroot.obj,xvmisc.obj,xvimage.obj,xvcolor.obj,xvsmoo
Vth.obj,xv24to8.obj,xvgif.obj,xvpm.obj,xvinfo.obj,xvctrl.obj,xvscrl.obj,xvgifwr
V.obj,xvdir.obj,xvbutt.obj,xvpbm.obj,xvxbm.obj,xvgam.obj,xvdial.obj,xvgraf.obj,
Vxvsunras.obj,xvjpeg.obj,xvps.obj,xvpopup.obj,xvdflt.obj,argproc.obj,gifdecomp.
Vobj,gifmapf.obj,vms.obj,vmsreaddir.obj,pseudo_root.obj,xvpds.obj,xvtiff.obj,xv
Vtiffwr.obj,xvrle.obj,xvgrab.obj
X
XMISC`20=`20readme`20changelog
X
X.first
X`09@-`20Define`20Sys`20Sys$Library
X`09@-`20Define`20X11`20DECW$Include
X
Xall`20:`20`09`09lib`20xv`20bggen`20decompress`20help
X`09@`20Continue
X
Xlib`20:`20`20`20`09$(XVLIB)
X`09@`20Continue
X
Xxv`20:`09`09xv.exe
X`09@`20Continue
X
Xbggen`20:`09`09bggen.exe
X`09@`20Continue
X
Xhelp`20:`09`09xv.hlb
X`09@`20Continue
X
Xdecompress`20:`09decompress.exe`20vdcomp.exe
X`09@`20Continue
X
Xbggen.exe`20:`20`09bggen.obj`20$(XVLIB)`20$(OPTS)
X`09$(LINK)`20$(LINKFLAGS)`20bggen.obj,$(XVLIB)/Library,$(OPTS)/Option
X
Xxv.exe`20:`20`09xv.obj`20bitmaps.h`20$(XVLIB)`20$(JPEGLIB)`20$(TIFFLIB)`20$(OP
VTS)`20
X`09$(LINK)`20$(LINKFLAGS)`20xv.obj,$(XVLIB)/Library,$(JPEGLIB)/Library,$(TIFFL
VIB)/Library,$(OPTS)/Option
X
X$(JPEGLIB)`20:
X`09Set`20Default`20$(JPEGDIR)
X`09$(MMS)`20$(MMSDEFAULTS)`20/Description`20=`20MAKEFILE.MMS`20LIBJPEG.OLB
X`09Set`20Default`20$(XVDIR)
X
X$(TIFFLIB)`20:
X`09Set`20Default`20$(TIFFDIR)
X`09$(MMS)`20$(MMSDEFAULTS)`20/Description`20=`20MAKEFILE.VMS`20LIBTIFF.OLB
X`09Set`20Default`20$(XVDIR)
X
X$(XVLIB)`20:`09bitmaps.h`20$(OBJS)
X`20`20`20`20`20`20`20`20If`20"''F$Search`20("$(XVLIB)")'"`20.eqs.`20""`20Then
V`20Library`20/Create`20$(XVLIB)
X`09Library`20/Replace`20$(XVLIB)`20$(OBJLIST)
X
Xdecompress.exe`20:`09decompress.obj
X`09$(LINK)`20$(LINKFLAGS)`20decompress.obj,$(OPTS)/Option
X
Xvdcomp.exe`20:`09vdcomp.obj
X`09$(LINK)`20$(LINKFLAGS)`20vdcomp.obj,$(OPTS)/Option
X
Xgifdecomp.obj`20:`09gifdecomp.mar
X`09$(MACRO)`20gifdecomp
X
X#`09various`20dependencies
X$(OBJS)`20:`20`20`20`09`09xv.h
Xxv.obj`20:`09`09bitmaps.h
Xxvbutt.obj`20:`20`20`09`09bitmaps.h
Xxvctrl.obj`20:`20`20`09`09bitmaps.h
Xxvdial.obj`20:`09`09bitmaps.h
Xxvdir.obj`20:`09`09dirent.h
Xxvgraf.obj`20:`09`09bitmaps.h
Xxvinfo.obj`20:`20`20`09`09bitmaps.h
Xxvmisc.obj`20:`20`20`09`09bitmaps.h
Xxvscrl.obj`20:`20`20`09`09bitmaps.h
Xargproc.obj`20:`09`09includes.h
Xvmsreaddir.obj`20:`09dirent.h
Xxvdflt.obj`20:`09`09`5B.bitmaps`5Dxvpic_logo.`20`5B.bitmaps`5Dxvpic_rev.`20
V`5B.bitmaps`5Dxvpic_jhb.
Xxvdflt.obj`20:`09`09`5B.bitmaps`5Dxf_left.`20`5B.bitmaps`5Dxf_right.
Xxv.hlb`20:`09`09xv.hlp
X
Xbitmaps.h`20:`20`09$(BITMAPS)
X`09Set`20Default`20`5B.Bitmaps`5D
X`09-`20Copy`20$(BITMAPLIST)`20`5B-`5Dbitmaps.h
X`09Set`20Default`20`5B-`5D
X
Xinstall`20:`09xv.exe`20vdcomp.exe`20bggen.exe`20decompress.exe
X`09Copy`20*.exe`20$(BINDIR)
X
Xclean`20:
X`09@-`20Set`20Protection`20=`20Owner:RWED`20*.obj,*.*;-1
X`09-`20Delete`20/NoConfirm`20/NoLog`20*.obj;*,*.exe;*
X`09-`20Purge`20/NoConfirm`20/NoLog
X`09Set`20Default`20`5B.JPEG`5D
X`09MMS`20/Description`20=`20MAKEFILE.MMS`20clean
X`09Set`20Default`20`5B-.TIFF`5D
X`09MMS`20/Description`20=`20MAKEFILE.VMS`20clean
X`09Set`20Default`20`5B-`5D
$ call unpack DESCRIP.MMS;222 774632927 ""
$!
$ create 'f'
X`09.title`20GIF_DECOMPRESSOR
X;++
X;`20Define`20optimized`20routines`20for`20decompressing`20GIF`20files.
X;
X;`20procedure`20GIF_DECOMPRESS_INIT
X;`20`20`20`20`20`20`20Initialize`20internal`20tables`20used`20by`20the`20GIF_D
VECOMPRESS`20procedure.
X;`20`20`20`20arguments:
X;`094(AP)`09address`20of`20byte`20containing`20sizeof`20output`20data`20in`20b
Vits.
X;`09`09must`20be`20in`20range`202`20-`208.
X;
X;`20procedure`20GIF_DECOMPRESS
X;`09Decompress`20stream`20of`20input`20codes`20into`20user`20buffer.
X;`20`20`20`20arguments:
X;`094(AP)`09Address`20of`20input`20procedure.
X;`098(AP)`09Unspecified.`20`20Additional`20argument`20for`20input`20procedure.
V
X;`0912(AP)`09Number`20of`20output`20bytes`20to`20produce.
X;`0916(AP)`09Address`20of`20output`20buffer.
X;`20`20`20`20`20`20`20`5B20(AP)`5D`20(optional)`20Address`20of`20longword`20to
V`20store`20last`20byte.
X;
X;`20User-supplied`20input`20procedure:
X;`20`20`20`20arguments:
X;`094(AP)`09Argument`20specified`20in`20call`20to`20GIF_DECOMPRESS
X;`098(AP)`09Address`20of`20quadword`20to`20receive`20output`20descriptor.`20
V`20The
X;`09`09input`20routine`20must`20fill`20in`20the`20count`20and`20buffer`20addre
Vss`20field
X;`09`09of`20this`20descritor.
X;`09
X;--
X;
X;`20Define`20data`20area`20that`20holds`20string`20table
X`09.PSECT`20GIF_DECOMP_STABLE,`20WRT,`20LONG
XGIF_MAC_STABLE::
XCODE_BITS:`09.LONG`200`09`09`09;`20Current`20input`20size
XBITS_USED:`09.LONG`200`09`09`09;`20Number`20of`20bits`20used`20with`20cur`20bu
Vffer.
XTABLE_SIZE:`20`09.LONG`200`09`09`09;`20Highest`20code`20defined`20in`20table
XPREV_CODE:`20`09.LONG`200`09`09`09;`20Previous`20input`20code
XSTACK_PTR:`09.LONG`200`09`09`09;`20Output`20stack`20pointer
XCLEAR_CODE:`20`09.LONG`200`09`09`09;`20Code`20value`20to`20signal`20table`20cl
Vears
XEOI_CODE:`20`09.LONG`200`09`09`09;`20Code`20value`20to`20signal`20data`20end
XINBUF:`09`09.BLKL`202`09`09`09;`20Descriptor`20filled`20in`20by`20input`20rout
Vine
X;`20make`20tables`204100`20instead`20of`204096`20to`20avoid`20cache`20stride.
XPREFIX:`09`09.BLKW`204100`09`09;`20prefix`20code`20table.
XEXTENSION:`09.BLKB`204100`09`09;`20last`20char`20in`20code's`20expansion.
XSTACK:`09`09.BLKB`204100`09`09;`20Decoder`20output`20stack.
XSTACK_TOP:
XARG_LIST:`20.BLKL`205`09`09`09;`20Copy`20of`20argument`20list.
X
X`09.PSECT`20GIF_DECOMP_CODE,`20NOWRT,`20LONG,`20EXE
X;
X;`20Define`20initialization`20routine.`20`20Initialize`20the`20GIF_DECOMP_STAB
VLE`20psect.
X;
X`09.ENTRY`20GIF_DECOMPRESS_INIT,`20`5EM<R2,`20R3>
X;
X;`20Compute`20the`20clear`20and`20EOI`20codes`20for`20the`20specified`20data
V`20size`20and`20initial
X;`20input`20code`20size.
X;
X`09ASHL`20@4(AP),`20#1,`20G`5ECLEAR_CODE`09;`20Convert`20Root`20size`20to`20in
Vput.
X`09ADDL3`20G`5ECLEAR_CODE,`20#1,`20-
X`09`20`20`20`20`20G`5EEOI_CODE
X`09CVTBL`09@4(AP),`20R0
X`09ADDL3`20R0,`20#1,`20G`5ECODE_BITS`09;`20Initial`20code`20size
X;
X;`20Initialize`20the`20decoder`20table`20so,`20each`20code`20less`20than`20CLE
VAR_CODE`20expands
X;`20to`20itself.`20`20`20Clear`20and`20EOI`20have`20special`20prefix`20values
V`20to`20aid`20testing`20for
X;`20those`20special`20codes.
X;
X`09CLRL`20`20R0
X`09MOVAW`09G`5EPREFIX,`20R1`09`09;`20Base`20address`20of`20code`20table
X`09MOVAB`09G`5EEXTENSION,`20R2`09`09;`20Base`20address`20of`20suffix`20table.
X`09MOVL`09G`5ECLEAR_CODE,`20R3`09;`20Loop`20end`20value.
X10$:
X`09MNEGW`09#1,`20(R1)`5BR0`5D`09`09;`20Mark`20code`20as`20having`20no`20prefix
V`20(-1).
X`09MOVB`09R0,`20(R2)`5BR0`5D`09`09;`20Suffix`20value`20is`20save`20as`20code
V`20value.
X`09AOBLSS`09R3,`20R0,`2010$`09`09;`20Do`20next`20code`20value.
X`09MOVW`09#-2,`20(R1)`5BR0`5D`09`09;`20Mark`20clear`20code`20specially
X`09INCL`09R0`09`09`09;`20EOI`20code`20is`201`20after`20clear`20code.
X`09MOVW`09#-2,`20(R1)`5BR0`5D`09`09;`20Mark`20EOI`20code`20specially
X
X`09INCL`20`09R0
X20$:`09CLRW`09(R1)`5BR0`5D
X`09AOBLEQ`09#257,`20R0,`2020$`09`09;`20Zero`20rest`20of`20table`20up`20to`208
V`20bits.
X
X;
X;`20Initialize`20input`20state`20and`20output`20stack`20to`20prepare`20for`20f
Virst`20call`20to
X;`20GIF_DECOMPRESS.
X;
X30$:`09CLRL`09G`5EBITS_USED`09`09;`20Init`20buffer`20pointer.
X`09CLRL`09G`5EINBUF`09`09`09;`20Zero`20length`20of`20input`20buffer.
X`09MNEGL`09#1,`20G`5EPREV_CODE`09`09;`20No`20previous`20code.
X`09MNEGL`09#1,`20G`5ETABLE_SIZE`09;`20Indicates`20table`20just`20cleared.
X`09MOVAB`09G`5ESTACK_TOP,`20-`09`09;`20Output`20stack`20is`20initially`20empty
V.
X`09`09G`5ESTACK_PTR
X`09MOVL`20#1,`20R0`09`09`09;`20Return`20success.
X`09RET
X;
X;`20Define`20main`20routine`20for`20decompressing.
X;
X`09.ENTRY`20GIF_DECOMPRESS,`20`5EM<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
X;
X;`20Move`20variables`20into`20registers`20and`20make`20copy`20of`20argument
V`20list.`20`20Note`20that
X;`20the`20value`20of`20AP`20was`20made`20to`20correspond`20to`20the`20top`20of
V`20the`20output`20stack`20
X;`20in`20order`20to`20simplify`20testing`20for`20an`20empty`20stack`20(R10`20>
V=`20AP).
X;
X`09ASHL`09G`5ECODE_BITS,`20#1,`20R1`09;`20Compute`20new`20max`20value.
X`09DECL`09R1`09`09`09;`20`20`20`20as`202`5Ecode_bits`20-`201
X;`09CLRL`09R2`09`09`09;`20R2`20is`20input`20code`20value.
X`09MOVAW`09G`5EPREFIX,`20R3`09`09;`20Base`20address`20of`20PREFIX`20table
X`09MOVAB`09G`5EEXTENSION,`20R4`09`09;`20Base`20address`20of`20EXTENSION`20tabl
Ve
X`09MOVL`09G`5ETABLE_SIZE,`20R5`09;`20Number`20of`20codes`20defined.
X`09MOVL`09G`5EPREV_CODE,`20R6`09`09;`20Previous`20input`20code
X`09MOVL`09G`5EBITS_USED,`20R7`09`09;`20Number`20of`20bit`20within`20cur.`20buf
Vfer`20used.
X`09MOVL`09G`5ECODE_BITS,`20R8`09`09;`20Input`20code`20size.
X`09MOVZWL`09G`5EINBUF,`20R9`09`09;`20Current`20#`20of`20bytes`20in`20input`20b
Vuffer.
X`09ASHL`09#3,`20R9,`20R9`09`09;`20`20`20Convert`20to`20number`20of`20bits`20in
V`20buffer.
X`09MOVL`09G`5ESTACK_PTR,`20R10`09;`20Recover`20current`20output`20stack`20posi
Vtion.
X`09MOVL`0916(AP),`20R11`09`09;`20Output`20pointer.
X`09MOVQ`094(AP),`20G`5E<ARG_LIST+4>`09;`20Copy`20args`201`20and`202.
X`09MOVQ`0912(AP),`20G`5E<ARG_LIST+12>`09;`20Copy`20args`203`20and`204.
X`09CLRL`09G`5E<ARG_LIST>`09`09;`20Clear`20first`20longword`20for`20our`20own
V`20use,
X`09`09`09`09`09;`20Holds`20optional`20argument.
X`09CMPB`09(AP),`20#5`09`09;`20Is`20optional`20argument`20present?
X`09BLSS`0910$
X`09MOVL`0920(AP),`20G`5E<ARG_LIST>`09;`20Yes,`20Save`20optional`20return`20add
Vress.
X10$:
X`09MOVAL`09G`5E<ARG_LIST>,`20AP`09;`20Make`20new`20AP`20that`20overlaps`20with
V
X`09`09`09`09`09;`20`20`20the`20address`20of`20the`20stack`20top.
X`09MOVL`0912(AP),`20R0`09`09;`20Size`20of`20output`20buffer.
X`09MOVAB`09(R11)`5BR0`5D,`2012(AP)`09;`2012(AP)`20now`20has`20overflow`20addre
Vss
X`09BRB`09CHECK_IF_DONE`09`09;`20Jump`20into`20loop.
X;
X;`20When`20done,`20save`20registers`20back`20to`20memory`20to`20preserve`20for
V`20next`20call.
X;
XDONE:
+-+-+-+-+-+-+-+-  END  OF PART 1 +-+-+-+-+-+-+-+-
Technical Details
Message-ID: <8981987@MVB.SAIC.COM>
Path: arc1-ca.pugleaf.net!sparky!uunet!portal!lll-winken!sun-barr!cs.utexas.edu!swrinde!zaphod.mps.ohio-state.edu!usc!news.service.uci.edu!unogate!mvb.saic.com!vmsnet-sources

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!portal!lll-winken!sun-barr!cs.utexas.edu!swrinde!zaphod.mps.ohio-state.edu!usc!news.service.uci.edu!unogate!mvb.saic.com!vmsnet-sources
From: dyson@iowasp.physics.uiowa.edu (Rick Dyson)
Newsgroups: vmsnet.sources
Subject: xv-2-21a changes to run on VMS, part 01/08
Message-ID: <8981987@MVB.SAIC.COM>
Date: 4 Nov 92 21:12:27 GMT
Organization: Department of Physics and Astronomy, University of Iowa
Lines: 1357
Approved: Mark.Berryman@Mvb.Saic.Com