[comp.os.vms] INDEX, Part 5 of 5

JOE@FHCRCVAX.BITNET (Joe Meadows) (09/15/87)

Here's part 5 of INDEX, parts 1-4 having been previously posted.
Since I have not seen part 2 yet, I will be posting it again on
wednesday.

  Cheers,
  Joe Meadows Jr.
  VAX/VMS System Manager / guru in training
  Fred Hutchinson Cancer Research Center
  1124 Columbia St.
  Seattle Wa. 98104
     bitnet - JOE@FHCRCVAX
     arpa   - JOE%FHCRCVAX.BITNET@WISCVM.WISC.EDU
     voice  - (206) 467-4970

$ create/log IODEF.H
$DECK
/* This header file was created by Joe Meadows, and is not copyrighted
   in any way. No guarantee is made as to the accuracy of the contents
   of this header file. This header file was last modified on Sep. 8th,
   1987. */
#define IO$_NOP 0
#define IO$_UNLOAD      1
#define IO$_LOADMCODE   1
#define IO$_SEEK        2
#define IO$_SPACEFILE   2
#define IO$_STARTMPROC  2
#define IO$_RECAL       3
#define IO$_STOP        3
#define IO$_DRVCLR      4
#define IO$_INITIALIZE  4
#define IO$_RELEASE     5
#define IO$_SETCLOCKP   5
#define IO$_OFFSET      6
#define IO$_ERASETAPE   6
#define IO$_STARTDATAP  6
#define IO$_RETCENTER   7
#define IO$_QSTOP       7
#define IO$_PACKACK     8
#define IO$_SEARCH      9
#define IO$_SPACERECORD 9
#define IO$_READRCT     9
#define IO$_WRITECHECK  10
#define IO$_WRITEPBLK   11
#define IO$_READPBLK    12
#define IO$_WRITEHEAD   13
#define IO$_RDSTATS     13
#define IO$_CRESHAD     13
#define IO$_READHEAD    14
#define IO$_ADDSHAD     14
#define IO$_WRITETRACKD 15
#define IO$_COPYSHAD    15
#define IO$_READTRACKD  16
#define IO$_REMSHAD     16
#define IO$_AVAILABLE   17
#define IO$_SETPRFPATH  18
#define IO$_DSE 21
#define IO$_REREADN     22
#define IO$_REREADP     23
#define IO$_WRITERET    24
#define IO$_WRITECHECKH 24
#define IO$_READPRESET  25
#define IO$_STARTSPNDL  25
#define IO$_SETCHAR     26
#define IO$_SENSECHAR   27
#define IO$_WRITEMARK   28
#define IO$_WRTTMKR     29
#define IO$_DIAGNOSE    29
#define IO$_SHADMV      29
#define IO$_FORMAT      30
#define IO$_CLEAN       30
#define IO$_PHYSICAL    31
#define IO$_WRITELBLK   32
#define IO$_READLBLK    33
#define IO$_REWINDOFF   34
#define IO$_SETMODE     35
#define IO$_REWIND      36
#define IO$_SKIPFILE    37
#define IO$_SKIPRECORD  38
#define IO$_SENSEMODE   39
#define IO$_WRITEOF     40
#define IO$_TTY_PORT    41
#define IO$_LOGICAL     47
#define IO$_WRITEVBLK   48
#define IO$_READVBLK    49
#define IO$_ACCESS      50
#define IO$_CREATE      51
#define IO$_DEACCESS    52
#define IO$_DELETE      53
#define IO$_MODIFY      54
#define IO$_NETCONTROL  54
#define IO$_READPROMPT  55
#define IO$_SETCLOCK    55
#define IO$_ACPCONTROL  56
#define IO$_STARTDATA   56
#define IO$_MOUNT       57
#define IO$_TTYREADALL  58
#define IO$_TTYREADPALL 59
#define IO$_CONINTREAD  60
#define IO$_CONINTWRITE 61
#define IO$_VIRTUAL     63
#define IO$M_FCODE      63
#define IO$M_FMODIFIERS 65472
#define IO$M_INHERLOG   2048
#define IO$M_ERASE      1024
#define IO$M_ENCRYPT    8192
#define IO$M_DATACHECK  16384
#define IO$M_INHRETRY   32768
#define IO$M_INHSEEK    4096
#define IO$M_REVERSE    64
#define IO$M_NOWAIT     128
#define IO$M_INHEXTGAP  4096
#define IO$M_MSCPMODIFS 256
#define IO$M_SHADOW     64
#define IO$M_LOCATE     128
#define IO$M_ALLHOSTS   64
#define IO$M_DISSOLVE   128
#define IO$M_NOCLEANUP  256
#define IO$M_SPINDOWN   64
#define IO$M_FORCEPATH  64
#define IO$M_COMMOD     64
#define IO$M_MOVETRACKD 128
#define IO$M_DIAGNOSTIC 256
#define IO$M_SKPSECINH  512
#define IO$M_DELDATA    64
#define IO$M_NOMRSP     64
#define IO$M_SWAP       256
#define IO$M_OPPOSITE   512
#define IO$M_CLSEREXCP  512
#define IO$M_ACCESS     64
#define IO$M_CREATE     128
#define IO$M_DELETE     256
#define IO$M_MOUNT      512
#define IO$M_DMOUNT     1024
#define IO$M_REMOUNT    2048
#define IO$M_BINARY     64
#define IO$M_PACKED     128
#define IO$M_NOW        64
#define IO$M_READATTN   128
#define IO$M_WRTATTN    256
#define IO$M_SETPROT    512
#define IO$M_NORSWAIT   1024
#define IO$M_NOECHO     64
#define IO$M_TIMED      128
#define IO$M_CVTLOW     256
#define IO$M_NOFILTR    512
#define IO$M_DSABLMBX   1024
#define IO$M_PURGE      2048
#define IO$M_TRMNOECHO  4096
#define IO$M_REFRESH    8192
#define IO$M_ESCAPE     16384
#define IO$M_EXTEND     32768
#define IO$M_CANCTRLO   64
#define IO$M_ENABLMBX   128
#define IO$M_NOFORMAT   256
#define IO$M_BREAKTHRU  512
#define IO$M_NEWLINE    1024
#define IO$M_TYPEAHDCNT 64
#define IO$M_MAINT      64
#define IO$M_CTRLYAST   128
#define IO$M_CTRLCAST   256
#define IO$M_HANGUP     512
#define IO$M_OUTBAND    1024
#define IO$M_TT_CONNECT 2048
#define IO$M_TT_DISCON  4096
#define IO$M_TT_PROCESS 8192
#define IO$M_BRDCST     16384
#define IO$M_LOOP       128
#define IO$M_UNLOOP     256
#define IO$M_LINE_OFF   512
#define IO$M_SET_MODEM  1024
#define IO$M_LINE_ON    2048
#define IO$M_LOOP_EXT   4096
#define IO$M_AUTXOF_ENA 8192
#define IO$M_AUTXOF_DIS 16384
#define IO$M_INCLUDE    2048
#define IO$M_TT_ABORT   4096
#define IO$M_INTERRUPT  64
#define IO$M_ABORT      256
#define IO$M_SYNCH      512
#define IO$M_STARTUP    64
#define IO$M_SHUTDOWN   128
#define IO$M_ATTNAST    256
#define IO$M_CTRL       512
#define IO$M_RD_MEM     64
#define IO$M_RD_MODEM   128
#define IO$M_RD_COUNT   256
#define IO$M_CLR_COUNT  1024
#define IO$K_SRRUNOUT   0
#define IO$K_PTPBSC     8192
#define IO$K_LOOPTEST   57344
#define IO$M_MORE       64
#define IO$M_QUALIFIED  128
#define IO$M_REDIRECT   64
#define IO$M_ACCEPT     128
#define IO$M_SETEVF     64
#define IO$M_WORD       64
#define IO$M_SETFNCT    512
#define IO$M_DATAPATH   1024
#define IO$M_CYCLE      4096
#define IO$M_RESET      8192
#define IO$M_SETCUADR   256
#define IO$M_SETBSIZE   512
#define IO$M_SETPOOLSZ  1024
#define IO$M_SETENQCNT  2048
#define IO$M_CLEAR      4096
#define IO$M_LPBEXT     8192
#define IO$M_LPBINT     16384
#define IO$M_READCSR    32768
#define IO$M_NOCTSWAIT  64
#define IO$M_SLAVLOOP   128
#define IO$M_NODSRWAIT  256
#define IO$M_MAINTLOOP  512
#define IO$M_LASTBLOCK  1024
#define IO$M_INTCLOCK   4096
#define IO$S_IODEF      2
#define IO$S_FCODE      6
#define IO$V_FCODE      0
#define IO$S_FMODIFIERS 10
#define IO$V_FMODIFIERS 6
#define IO$V_INHERLOG   11
#define IO$V_ERASE      10
#define IO$V_ENCRYPT    13
#define IO$V_DATACHECK  14
#define IO$V_INHRETRY   15
#define IO$V_INHSEEK    12
#define IO$V_REVERSE    6
#define IO$V_NOWAIT     7
#define IO$V_INHEXTGAP  12
#define IO$V_MSCPMODIFS 8
#define IO$V_SHADOW     6
#define IO$V_LOCATE     7
#define IO$V_ALLHOSTS   6
#define IO$V_DISSOLVE   7
#define IO$V_NOCLEANUP  8
#define IO$V_SPINDOWN   6
#define IO$V_FORCEPATH  6
#define IO$V_COMMOD     6
#define IO$V_MOVETRACKD 7
#define IO$V_DIAGNOSTIC 8
#define IO$V_SKPSECINH  9
#define IO$V_DELDATA    6
#define IO$V_NOMRSP     6
#define IO$V_SWAP       8
#define IO$V_OPPOSITE   9
#define IO$V_CLSEREXCP  9
#define IO$V_ACCESS     6
#define IO$V_CREATE     7
#define IO$V_DELETE     8
#define IO$V_MOUNT      9
#define IO$V_DMOUNT     10
#define IO$V_REMOUNT    11
#define IO$V_BINARY     6
#define IO$V_PACKED     7
#define IO$V_NOW        6
#define IO$V_READATTN   7
#define IO$V_WRTATTN    8
#define IO$V_SETPROT    9
#define IO$V_NORSWAIT   10
#define IO$V_NOECHO     6
#define IO$V_TIMED      7
#define IO$V_CVTLOW     8
#define IO$V_NOFILTR    9
#define IO$V_DSABLMBX   10
#define IO$V_PURGE      11
#define IO$V_TRMNOECHO  12
#define IO$V_REFRESH    13
#define IO$V_ESCAPE     14
#define IO$V_EXTEND     15
#define IO$V_CANCTRLO   6
#define IO$V_ENABLMBX   7
#define IO$V_NOFORMAT   8
#define IO$V_BREAKTHRU  9
#define IO$V_NEWLINE    10
#define IO$V_TYPEAHDCNT 6
#define IO$V_MAINT      6
#define IO$V_CTRLYAST   7
#define IO$V_CTRLCAST   8
#define IO$V_HANGUP     9
#define IO$V_OUTBAND    10
#define IO$V_TT_CONNECT 11
#define IO$V_TT_DISCON  12
#define IO$V_TT_PROCESS 13
#define IO$V_BRDCST     14
#define IO$V_LOOP       7
#define IO$V_UNLOOP     8
#define IO$V_LINE_OFF   9
#define IO$V_SET_MODEM  10
#define IO$V_LINE_ON    11
#define IO$V_LOOP_EXT   12
#define IO$V_AUTXOF_ENA 13
#define IO$V_AUTXOF_DIS 14
#define IO$V_INCLUDE    11
#define IO$V_TT_ABORT   12
#define IO$V_INTERRUPT  6
#define IO$V_ABORT      8
#define IO$V_SYNCH      9
#define IO$V_STARTUP    6
#define IO$V_SHUTDOWN   7
#define IO$V_ATTNAST    8
#define IO$V_CTRL       9
#define IO$V_RD_MEM     6
#define IO$V_RD_MODEM   7
#define IO$V_RD_COUNT   8
#define IO$V_CLR_COUNT  10
#define IO$V_MORE       6
#define IO$V_QUALIFIED  7
#define IO$V_REDIRECT   6
#define IO$V_ACCEPT     7
#define IO$V_SETEVF     6
#define IO$V_WORD       6
#define IO$V_SETFNCT    9
#define IO$V_DATAPATH   10
#define IO$V_CYCLE      12
#define IO$V_RESET      13
#define IO$V_SETCUADR   8
#define IO$V_SETBSIZE   9
#define IO$V_SETPOOLSZ  10
#define IO$V_SETENQCNT  11
#define IO$V_CLEAR      12
#define IO$V_LPBEXT     13
#define IO$V_LPBINT     14
#define IO$V_READCSR    15
#define IO$V_NOCTSWAIT  6
#define IO$V_SLAVLOOP   7
#define IO$V_NODSRWAIT  8
#define IO$V_MAINTLOOP  9
#define IO$V_LASTBLOCK  10
#define IO$V_INTCLOCK   12
$EOD
$ create/log PARSE_UIC.MAR
$DECK
$tpadef

tparse_init:
        .long   tpa$k_count0
        .long   tpa$m_blanks!tpa$m_abbrev
tparse: .blkb   tpa$k_length0

        $init_state     uic_stb,uic_ktb
        $state
        $tran   tpa$_ident,,,,uic
        $state
        $tran   tpa$_eos,tpa$_exit
        $end_state

uic:    .long

        .entry  parse_uic,^m<r2,r3,r4,r5>

        ; initialize tparse block
        movc5   #8,tparse_init,#0,#tpa$k_length0,tparse

        ; set the tparse block string info
        movl    4(ap),r0
        movzwl  (r0),tparse+tpa$l_stringcnt
        movl    4(r0),tparse+tpa$l_stringptr

        ; call lib$tparse
        pushab  uic_ktb
        pushab  uic_stb
        pushab  tparse
        calls   #3,g^lib$tparse

        movl    uic,@8(ap)
        ret

        .end
$EOD
$ create/log SEARCHDEF.H
$DECK
/* This header file was created by Joe Meadows, and is not copyrighted
   in any way. No guarantee is made as to the accuracy of the contents
   of this header file. This header file was last modified on Sep. 8th,
   1987. */
#include descrip

#define DATE { unsigned : 32; unsigned : 32; }

#define SI_K_LBN_LIST_SIZE 40
#define SI_K_OWNER_LIST_SIZE 40
#define SI_K_BACKLINK_LIST_SIZE 40
#define SI_K_ACL_ID_LIST_SIZE 40

struct search_info {
  variant_union {
    variant_struct {
      long int si_l_srchbits0;
      long int si_l_srchbits1;
    } si_dummy_srchbits_struct;
    variant_struct {
      unsigned si_v_credat : 1;
      unsigned si_v_revdat : 1;
      unsigned si_v_expdat : 1;
      unsigned si_v_bakdat : 1;
      unsigned si_v_revision : 1;
      unsigned si_v_extents : 1;
      unsigned si_v_headers : 1;
      unsigned si_v_lbn : 1;
      unsigned si_v_owner : 1;
      unsigned si_v_char : 1;
      unsigned si_v_journal : 1;
      unsigned si_v_prot : 1;
      unsigned si_v_backlink : 1;
      unsigned si_v_access : 1;
      unsigned si_v_highwater : 1;
      unsigned si_v_ru_active : 1;
      unsigned si_v_rectype : 1;
      unsigned si_v_fileorg : 1;
      unsigned si_v_attrib : 1;
      unsigned si_v_rsize : 1;
      unsigned si_v_alloc : 1;
      unsigned si_v_used : 1;
      unsigned si_v_wasted : 1;
      unsigned si_v_bktsize : 1;
      unsigned si_v_vfcsize : 1;
      unsigned si_v_maxrec : 1;
      unsigned si_v_defext : 1;
      unsigned si_v_gbc : 1;
      unsigned si_v_ffbyte : 1;
      unsigned si_v_version_limit : 1;
      unsigned si_v_filename : 1;
      unsigned si_v_placement : 1;
      unsigned si_v_aclexists : 1;
      unsigned si_v_aclcontains : 1;
    } si_dummy_srchbits;
  } si_dummy_srch_union;
  unsigned si_v_and_match : 1;
  struct DATE si_q_credat_min;
  struct DATE si_q_credat_max;
  struct DATE si_q_revdat_min;
  struct DATE si_q_revdat_max;
  struct DATE si_q_expdat_min;
  struct DATE si_q_expdat_max;
  struct DATE si_q_bakdat_min;
  struct DATE si_q_bakdat_max;
  unsigned long int si_l_revision_min;
  unsigned long int si_l_revision_max;
  unsigned long int si_l_extents_min;
  unsigned long int si_l_extents_max;
  unsigned long int si_l_headers_min;
  unsigned long int si_l_headers_max;
  unsigned long int si_l_alloc_min;
  unsigned long int si_l_alloc_max;
  unsigned long int si_l_used_min;
  unsigned long int si_l_used_max;
  unsigned long int si_l_wasted_min;
  unsigned long int si_l_wasted_max;
  unsigned long si_l_highwater_min;
  unsigned long si_l_highwater_max;
  unsigned short int si_w_rsize_min;
  unsigned short int si_w_rsize_max;
  unsigned char si_b_bktsize_min;
  unsigned char si_b_bktsize_max;
  unsigned char si_b_vfcsize_min;
  unsigned char si_b_vfcsize_max;
  unsigned char si_b_ru_active_min;
  unsigned char si_b_ru_active_max;
  unsigned short int si_w_maxrec_min;
  unsigned short int si_w_maxrec_max;
  unsigned short int si_w_defext_min;
  unsigned short int si_w_defext_max;
  unsigned short int si_w_gbc_min;
  unsigned short int si_w_gbc_max;
  unsigned short int si_w_ffbyte_min;
  unsigned short int si_w_ffbyte_max;
  unsigned short int si_w_version_limit_min;
  unsigned short int si_w_version_limit_max;

  variant_union {
    unsigned char si_b_fileorgset;
    struct si_fileorgdef {
      unsigned v_sequential : 1;
      unsigned v_relative : 1;
      unsigned v_indexed : 1;
      unsigned v_direct : 1;
    } si_fileorgset;
  } si_dummy_fileorgset_union;
  variant_union {
    unsigned char si_b_fileorgclr;
    struct si_fileorgdef si_fileorgclr;
  } si_dummy_fileorgclr_union;

  variant_union {
    unsigned char si_b_rectypeset;
    struct si_rectypedef {
      unsigned v_undefined : 1;
      unsigned v_fixed : 1;
      unsigned v_variable : 1;
      unsigned v_vfc : 1;
      unsigned v_stream : 1;
      unsigned v_streamlf : 1;
      unsigned v_streamcr : 1;
    } si_rectypeset;
  } si_dummy_rectypeset_union;
  variant_union {
    unsigned char si_b_rectypeclr;
    struct si_rectypedef si_rectypeclr;
  } si_dummy_rectypeclr_union;

  variant_union {
    unsigned long int si_l_charset;
    struct si_chardef {
      unsigned : 1;
      unsigned v_nobackup : 1;
      unsigned v_writeback : 1;
      unsigned v_readcheck : 1;
      unsigned v_writcheck : 1;
      unsigned v_contigb : 1;
      unsigned v_locked : 1;
      unsigned v_contig : 1;
      unsigned : 3;
      unsigned v_badacl : 1;
      unsigned v_spool : 1;
      unsigned v_directory : 1;
      unsigned v_badblock : 1;
      unsigned v_markdel : 1;
      unsigned v_nocharge : 1;
      unsigned v_erase : 1;
    } si_charset;
  } si_dummy_charset_union;
  variant_union {
    unsigned long int si_l_charclr;
    struct si_chardef si_charclr;
  } si_dummy_charclr_union;

  variant_union {
    unsigned char si_b_attrib_set;
    struct  si_attribdef {
      unsigned v_fortrancc : 1;
      unsigned v_impliedcc : 1;
      unsigned v_printcc : 1;
      unsigned v_nospan : 1;
    } si_attribset;
  } si_dummy_attribset_union;
  variant_union {
    unsigned char si_b_attrib_clr;
    struct  si_attribdef si_attribclr;
  } si_dummy_attribclr_union;

  variant_union {
    unsigned short int si_w_place_set;
    struct  si_placementdef {
      unsigned v_exact : 1;
      unsigned v_oncyl : 1;
      unsigned : 10;
      unsigned v_lbn : 1;
      unsigned v_rvn : 1;
    } si_placeset;
  } si_dummy_placeset_union;
  variant_union {
    unsigned short int si_w_place_clr;
    struct  si_placementdef si_placeclr;
  } si_dummy_placeclr_union;

  variant_union {
    unsigned char si_b_journalset;
    struct si_journaldef {
      unsigned v_only_ru : 1;
      unsigned v_rujnl : 1;
      unsigned v_bijnl : 1;
      unsigned v_aijnl : 1;
      unsigned v_atjnl : 1;
      unsigned v_never_ru : 1;
      unsigned v_journal_file:1;
    } si_journalset;
  } si_dummy_journalset_union;

  variant_union {
    unsigned char si_b_journalclr;
    struct si_journaldef si_journalclr;
  } si_dummy_journalset_union;

  variant_union {
    unsigned char si_b_access_set;
    struct si_accessdef {
      unsigned v_user : 1;
      unsigned v_supervisor : 1;
      unsigned v_executive : 1;
      unsigned v_kernel : 1;
    } si_access_set;
  } si_dummy_access_set_union;

  variant_union {
    unsigned char si_b_access_clr;
    struct si_accessdef si_access_clr;
  } si_dummy_access_clr_union;

  variant_union {
    short int si_w_protection;
    struct {
      unsigned read : 1;
      unsigned write : 1;
      unsigned execute : 1;
      unsigned delete : 1;
    } si_v_protection;
  } si_dummy_protection_union;

  unsigned short int si_w_protset;
  unsigned short int si_w_protclr;

  long int si_l_lbn_list[SI_K_LBN_LIST_SIZE+1];
  long int si_l_owner_list[SI_K_OWNER_LIST_SIZE+1];
  unsigned short int si_w_backlink[SI_K_BACKLINK_LIST_SIZE+1];
  long int si_l_acl_id_list[SI_K_ACL_ID_LIST_SIZE+1];
  struct dsc$descriptor si_t_filename;
};
$EOD
$ create/log SECTION.C
$DECK
/* Modification History
   --------------------
   Sep. 8, 1987 JEM - Conversion from BETA to Release

*/
#include descrip
#include iodef
#include ssdef
#include secdef

#include "FileInfo.h"

long int map_section(Filename,Defaultname,PageCount,Offset,Flag,context)
/* This routines maps a file into memory. If no context has been set then
   it allocates a FileInfo structure, and opens the necessary file. Once
   the file has been opened the Filename, Default name, and Flag parameters
   are ignored.

   Filename = Name of file to be opened
   Defaultname = Default name of file to be opened
   PageCount = number of pages to try to read into memory
   Offset = VBN of the file to start reading from (1 is first block)
   Flag = Flag specifies attributes about the file:
        bit 0 = File is opened for write
        bit 1 = File may be appended to
   context = Pointer to a FileInfo structure. Initialize it to zero before
        the first call to MapSection, don't touch it after that.
  */
  struct dsc$descriptor *Filename;
  struct dsc$descriptor *Defaultname;
  long int *PageCount;
  long int *Offset;
  long int *Flag;
  struct FileInfo **context;
{
  long int Status,TmpStatus;
  long int MapFlag=0;
  long int RetAdr[2],DeltAdr[2];
  long int i;

  if (*context==0) {
    /* This is a first call, we need to allocate space, init the FAB etc. */
    Status = LIB$GET_VM(&sizeof(struct FileInfo),context);
    if (!(Status & 1)) return(Status);

    (*context)->fi_l_flag = *Flag;
    (*context)->fi_l_begadr=0;
    (*context)->fi_l_endadr=0;
    (*context)->fi_r_fab = cc$rms_fab;
    (*context)->fi_r_nam = cc$rms_nam;
    (*context)->fi_r_xabfhc = cc$rms_xabfhc;
    (*context)->fi_r_fab.fab$l_fop=FAB$M_UFO;
    (*context)->fi_r_fab.fab$b_fac=FAB$M_GET;
    (*context)->fi_r_fab.fab$l_fna=Filename->dsc$a_pointer;
    (*context)->fi_r_fab.fab$b_fns=Filename->dsc$w_length;
    (*context)->fi_r_fab.fab$l_dna=Defaultname->dsc$a_pointer;
    (*context)->fi_r_fab.fab$b_dns=Defaultname->dsc$w_length;
    (*context)->fi_r_fab.fab$l_nam = &(**context).fi_r_nam ;
    (*context)->fi_r_fab.fab$l_xab = &(**context).fi_r_xabfhc ;

    if ((*context)->fi_m_write)
      (*context)->fi_r_fab.fab$b_fac |= FAB$M_PUT;

    Status=SYS$OPEN(&(*context)->fi_r_fab);
    if (!(Status & 1)) return(Status);

    /* use the xabfhc to find out the end of file block */
    (*context)->fi_l_filsiz = (*context)->fi_r_xabfhc.xab$l_ebk;
    if ((*context)->fi_r_xabfhc.xab$w_ffb == 0)
      --(*context)->fi_l_filsiz;

    MapFlag = SEC$M_EXPREG; /* first time we definitely need to expand */
  };

  if (*Offset==0)
    *Offset=1;

  if ((*Offset+*PageCount-1)>(*context)->fi_l_filsiz) {
    /* they asked for more pages then there are in the file! */
    if ((*context)->fi_m_append) {
      /* okay, extend the file */
      /* Extend by (*Offset+*PageCount-1)-(*context)->fi_l_filsiz bytes */
      /* and update (*context)->fi_l_filsiz += */
      /* for now, it's a no-op. */
    }
  else
    *PageCount=(*context)->fi_l_filsiz - *Offset + 1;
  };

  if ((*context)->fi_m_write)
    MapFlag |= SEC$M_WRT;

  Status=SYS$CRMPSC(&(*context)->fi_l_begadr,RetAdr,0,MapFlag,0,0,0,
                     (*context)->fi_r_fab.fab$l_stv,*PageCount,*Offset,0,0);

  /* see if we lost a chunk while remapping, if so deltva it */
  if ((*context)->fi_l_endadr > RetAdr[1]) {
    /* Hmm, the old end was larger  than the new end, so deltva the diff */
    DeltAdr[0] = RetAdr[1]+1;
    DeltAdr[1] = (*context)->fi_l_endadr;
    TmpStatus = SYS$DELTVA(DeltAdr,0,0);
    if (!(TmpStatus & 1)) return(TmpStatus);
  };
  (*context)->fi_l_begadr = RetAdr[0];
  (*context)->fi_l_endadr = RetAdr[1];

  i = (RetAdr[1]-RetAdr[0]+1)/512;
  if ((i < *PageCount) || (*PageCount==0))
    *PageCount = i;
  (*context)->fi_l_pagcnt = *PageCount;
  (*context)->fi_l_offset = *Offset;

  return(Status);
}

long int delete_section(context)
  struct FileInfo **context;
{
  long int Status;

  Status = SYS$DELTVA(&(*context)->fi_l_begadr,0,0);
  if (!(Status & 1)) return(Status);

  Status = SYS$DASSGN((**context).fi_r_fab.fab$l_stv);
  if (!(Status & 1)) return(Status);

  Status = LIB$FREE_VM(&sizeof(struct FileInfo),context);
  *context = 0;

  return(Status);
}

long int read_section_block (context,blocknum,blockaddr)
  struct FileInfo **context;
  long int *blocknum;
  long int **blockaddr;
{
  static long int block=512;
  long int iosb[2];
  long int Status;

  if (*blockaddr==0) {
    /* they didn't specify where to read the block to, so we'll
       allocate a block and read into there */
    Status = LIB$GET_VM(&block,blockaddr);
    if (!(Status & 1)) return(Status);
  };

  Status = SYS$QIOW(0,(*context)->fi_r_fab.fab$l_stv,IO$_READVBLK,
                    iosb,0,0,*blockaddr,block,*blocknum,0,0,0);
  if (Status & 1)
    Status = iosb[0];
  return(Status);
}
$EOD
$ TYPE SYS$INPUT
$DECK
  To compile and link: $ @INDEX ALL
  Modify INDEX.CLD so that the IMAGE clause points to where you
  want to store INDEX.EXE, then do SET COMMAND INDEX

  Joe Meadows Jr.
  VAX/VMS System Manager / guru in training
  Fred Hutchinson Cancer Research Center
  1124 Columbia St.
  Seattle Wa. 98104
     bitnet - JOE@FHCRCVAX
     arpa   - JOE%FHCRCVAX.BITNET@WISCVM.WISC.EDU
     voice  - (206) 467-4970
$EOD