/* @lastChanged: "1999-02-03 12:00"
 
 * @filename:   vut15
 * @purpose:    "UT_diag_scheme_6"
 * @release:    7.2.0.0
 * @see:        "-.-"
 *
 * @copyright:  (c) 1999-2004 SAP AG"
 */
 
.tt 1 $SAP$LiveCache$VUT15$
.tt 3 $$UT_diag_scheme_6$2000-01-11$
 
.nf
 
 .nf


    ========== licence begin  GPL
    Copyright (c) 1999-2004 SAP AG

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end

.fo

 
.fo
***********************************************************
 
Module  : UT_diag_scheme_6
 
Define  :
 
        PROCEDURE
              u15viewtext (
                    VAR term     : tut_terminal;
                    VAR s        : tak_systembuffer;
                    protect_mode : char;
                    VAR modified : boolean;
                    VAR pfkey    : tut_pfkey);
 
        PROCEDURE
              u15viewqual_basis (
                    VAR term     : tut_terminal;
                    VAR s        : tak_viewqual_basis_record;
                    protect_mode : char;
                    VAR modified : boolean;
                    VAR pfkey    : tut_pfkey);
 
        PROCEDURE
              u15viewqual_stack (
                    VAR term     : tut_terminal;
                    VAR s        : tak_viewqual_stack_record;
                    protect_mode : char;
                    VAR modified : boolean;
                    VAR pfkey    : tut_pfkey);
 
        PROCEDURE
              u15viewqual_join (
                    VAR term     : tut_terminal;
                    VAR s        : tak_viewqual_join_record;
                    protect_mode : char;
                    VAR modified : boolean;
                    VAR pfkey    : tut_pfkey);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              UT_diag_scheme_4 : VUT13;
 
        PROCEDURE
              u13stack_entry (
                    VAR st_entry   : tgg00_StackEntry;
                    VAR mask       : tut_term_mask;
                    mask_index     : integer;
                    VAR ok         : tut_ok_array;
                    VAR modified   : boolean);
 
      ------------------------------ 
 
        FROM
              UT_diag_scheme_2 : VUT11;
 
        PROCEDURE
              u11eopin_out (
                    VAR st_entry : tgg00_StackEntry;
                    VAR eop      : tgg00_StackOpType;
                    VAR mask     : tut_term_mask;
                    mask_index   : integer;
                    VAR ok       : boolean;
                    VAR modified : boolean);
 
        PROCEDURE
              u11c64in_out (
                    VAR c64      : tsp00_C64;
                    VAR mask     : tut_term_mask;
                    mask_index   : integer;
                    VAR modified : boolean);
 
        PROCEDURE
              u11maskerror (
                    VAR term      : tut_terminal;
                    VAR ok        : tut_ok_array;
                    VAR mask      : tut_term_mask;
                    mask_size     : integer;
                    VAR pfkey     : tut_pfkey);
 
        PROCEDURE
              u11newpage (
                    VAR term  : tut_terminal;
                    msgheader : tsp00_C20);
 
        PROCEDURE
              u11boolean_in_out (
                    VAR in_out_bool : boolean;
                    VAR mask     : tut_term_mask;
                    mask_index   : integer;
                    VAR ok       : boolean;
                    VAR modified : boolean);
 
        PROCEDURE
              u11int1in_out (
                    VAR int1     : tsp00_Uint1;
                    VAR mask     : tut_term_mask;
                    mask_index   : integer;
                    VAR ok       : boolean;
                    VAR modified : boolean);
 
        PROCEDURE
              u11int2in_out (
                    VAR int2     : tsp00_Int2;
                    VAR mask     : tut_term_mask;
                    mask_index   : integer;
                    VAR ok       : boolean;
                    VAR modified : boolean);
 
        PROCEDURE
              u11int4in_out (
                    VAR int4     : tsp00_Int4;
                    VAR mask     : tut_term_mask;
                    mask_index   : integer;
                    VAR ok       : boolean;
                    VAR modified : boolean);
 
        PROCEDURE
              u11surrogate_in_out (
                    VAR surrogate : tgg00_Surrogate;
                    VAR mask     : tut_term_mask;
                    mask_index   : integer;
                    VAR ok       : boolean;
                    VAR modified : boolean);
 
        PROCEDURE
              u11c1inout (
                    VAR c2       : char;
                    VAR mask     : tut_term_mask;
                    mask_index   : integer;
                    VAR ok       : boolean;
                    VAR modified : boolean);
 
        PROCEDURE
              u11c2inout (
                    VAR c2       : tsp00_C2;
                    VAR mask     : tut_term_mask;
                    mask_index   : integer;
                    VAR ok       : boolean;
                    VAR modified : boolean);
 
        PROCEDURE
              u11setin_out (
                    VAR c2       : tsp00_C2;
                    VAR mask     : tut_term_mask;
                    mask_index   : integer;
                    VAR ok       : boolean;
                    VAR modified : boolean);
 
        PROCEDURE
              u11integer_hex (
                    val      : tsp00_Int4;
                    len      : integer;
                    VAR out  : tsp00_Name);
 
      ------------------------------ 
 
        FROM
              TA_terminal_IO : VTA09;
 
        PROCEDURE
              t09putmsg (
                    VAR term          : tut_terminal;
                    VAR msg           : tsp00_Line;
                    is_warning        : boolean;
                    immediate_display : boolean);
 
        PROCEDURE
              t09mask (
                    VAR t09       : tut_terminal;
                    count_names   : integer;
                    mask_size     : integer;
                    VAR mask_spec : tut_term_mask;
                    return_pf_key : boolean;
                    VAR pfkey     : tut_pfkey);
 
        PROCEDURE
              t09newscreen_page (VAR t09 : tut_terminal);
 
      ------------------------------ 
 
        FROM
              Kernel_move_and_fill : VGG101;
 
        PROCEDURE
              SAPDB_PascalForcedFill (
                    size        : tsp00_Int4;
                    m           : tsp00_MoveObjPtr;
                    pos         : tsp00_Int4;
                    len         : tsp00_Int4;
                    fillchar    : char);
 
        PROCEDURE
              SAPDB_PascalForcedMove (
                    source_upb  : tsp00_Int4;
                    destin_upb  : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;
                    source_pos  : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;
                    destin_pos  : tsp00_Int4;
                    length      : tsp00_Int4);
 
        PROCEDURE
              s10mv (
                    source_upb  : tsp00_Int4;       
                    destin_upb  : tsp00_Int4;
                    source      : tsp00_MoveObjPtr;    
                    source_pos  : tsp00_Int4;
                    destin      : tsp00_MoveObjPtr;    
                    destin_pos  : tsp00_Int4;
                    length      : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              GG_edit_routines : VGG17;
 
        PROCEDURE
              g17int4to_line (
                    intval    : tsp00_Int4;
                    with_zero : boolean;
                    int_len   : integer;
                    ln_pos    : integer;
                    VAR ln    : tsp00_Line);
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : ThomasA
.sp
.cp 3
Created : 1986-01-17
.sp
.cp 3
.sp
.cp 3
Release :      Date : 2000-01-11
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
 
.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
 
.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.nf
.oc _/1
Structure:
 
.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.oc _/1
.CM -lll-
Code    :
 
 
CONST
      msg20_viewtext            = '   VIEWTEXT RECORD  ';
      msg20_viewqual_basis      = 'VIEWQUAL_BASIS REC. ';
      msg20_viewqual_stack      = 'VIEWQUAL_STACK REC. ';
      msg20_viewqual_join       = 'VIEWQUAL_JOIN  REC. ';
      msg20_viewqual_expcol     = 'VIEWQUAL_EXPCOL REC.';
      msg20_viewqual_derivedcol = 'VIEWQUAL_DERIV. REC.';
 
 
(*------------------------------*) 
 
PROCEDURE
      u15viewtext (
            VAR term     : tut_terminal;
            VAR s        : tak_systembuffer;
            protect_mode : char;
            VAR modified : boolean;
            VAR pfkey    : tut_pfkey);
 
VAR
      dummy           : boolean;
      index_modified  : boolean;
      is_input        : boolean;
      mask_cnt        : integer;
      move_len        : integer;
      name_cnt        : integer;
      text_len        : integer;
      i               : integer;
      index           : tsp00_Int2;
      pos             : tsp00_Int2;
      ok              : tut_ok_array;
      c64             : tsp00_C64;
      mask            : tut_term_mask;
 
BEGIN
dummy     := true;
is_input  := false;
FOR i := 1 TO cut_mask_items DO
    BEGIN
    mask[ i ].upper_case       := true;
    mask[ i ].msg_in_attr[ 1 ] := cut_protected;
    mask[ i ].msg_in_attr[ 2 ] := protect_mode;
    mask[ i ].code_input       := false;
    END;
(*ENDFOR*) 
index := 0;
u11newpage (term, msg20_viewtext);
REPEAT
    t09newscreen_page(term);
    index_modified := false;
    IF  NOT is_input
    THEN
        BEGIN
        FOR i := 1 TO cut_mask_items DO
            BEGIN
            mask[ i ].in_name := bsp_name;
            ok   [ i ] := true
            END;
        (*ENDFOR*) 
        END;
    (*ENDIF*) 
    IF  index = 0
    THEN
        BEGIN
        mask[ 1 ].msg  := 'RECORD LENGTH  (HEX)';
        mask[ 1 ].msg_in_attr[ 2 ] := protect_mode;
        u11int2in_out (s.b_sl,
              mask, 1, ok[ 1 ], modified);
        mask[ 2 ].msg  := 'VTSURROGATE    (HEX)';
        u11surrogate_in_out (s.syskey.sauthid,
              mask, 2, ok[ 2 ], modified);
        mask[ 3 ].msg  := 'ENTRYTYPE      (HEX)';
        u11c2inout (s.syskey.sentrytyp,
              mask, 3, ok[ 3 ], modified);
        mask[ 4 ].msg  := 'LINKAGE        (HEX)';
        u11c2inout (s.syskey.slinkage,
              mask, 4, ok[ 4 ], modified);
        mask[ 5 ].msg  := 'VTSEGMENTID    (HEX)';
        u11c2inout (s.sviewtext.vtsegmentid,
              mask, 5, ok[ 5 ], modified);
        mask[ 6 ].msg  := 'VTFROMTABCNT   (HEX)';
        u11int2in_out (s.sviewtext.vtfromtabcnt,
              mask, 6, ok[ 6 ], modified);
        mask[ 7 ].msg  := 'VTTABOUNT      (HEX)';
        u11int2in_out (s.sviewtext.vttabcount,
              mask, 7, ok[ 7 ], modified);
        mask[ 8 ].msg  := 'VTTEXTLENGTH   (HEX)';
        u11int2in_out (s.sviewtext.vttextlength,
              mask, 8, ok[ 8 ], modified);
        mask[ 9 ].msg  := 'VTNEXTEXIST         ';
        u11boolean_in_out (s.sviewtext.vtnextexist,
              mask, 9, ok[ 9 ], modified);
        mask[ 10 ].msg  := 'VTCONTEXT           ';
        u11int1in_out (s.sviewtext.vtcontext,
              mask, 10, ok[ 10 ], modified);
        mask[ 11 ].msg  := 'VTSELECT_POS   (HEX)';
        u11int2in_out (s.sviewtext.vtselect_pos,
              mask, 11, ok[ 11 ], modified);
        name_cnt := 11;
        mask_cnt := 11
        END;
    (*ENDIF*) 
    IF  (index > 0) AND (index <= s.sviewtext.vtfromtabcnt)
    THEN
        BEGIN
        mask[ 1 ].msg_in_attr[ 2 ] := cut_unprotected;
        mask[ 1 ].msg  := 'INDEX ENTRY    (HEX)';
        u11int2in_out (index,
              mask, 1, ok[ 1 ], index_modified);
        IF  NOT index_modified
        THEN
            BEGIN
            mask[ 2 ].msg  := 'VTTABLEID      (HEX)';
            u11surrogate_in_out (s.sviewtext.vttab[ index ].vtttableid,
                  mask, 2, ok[ 2 ], modified);
            mask[ 3 ].msg  := 'VTTREFTABID    (HEX)';
            u11surrogate_in_out (s.sviewtext.vttab[ index ].vttreftabid,
                  mask, 3, ok[ 3 ], modified);
            mask[ 4 ].msg  := 'VTTFILLER      (HEX)';
            u11int2in_out (s.sviewtext.vttab[ index ].vttfiller,
                  mask, 4, ok[ 4 ], modified);
            mask[ 5 ].msg  := 'VTTREFNAME          ';
            u11boolean_in_out (s.sviewtext.vttab[ index ].vttrefname,
                  mask, 5, ok[ 5 ], modified);
            mask[ 6 ].msg  := 'VTTTABCOUNT    (HEX)';
            u11int1in_out (s.sviewtext.vttab[ index ].vtttabcount,
                  mask, 6, ok[ 6 ], modified);
            mask[ 7 ].msg  := 'VTTSYNONYM          ';
            u11boolean_in_out (s.sviewtext.vttab[ index ].vttsynonym,
                  mask, 7, ok[ 7 ], modified);
            mask[ 8 ].msg  := 'VTTCOMPLEX_VIEW     ';
            u11boolean_in_out (
                  s.sviewtext.vttab[ index ].vttcomplex_view,
                  mask, 8, ok[ 8 ], modified);
            mask[ 9 ].msg  := 'VTTTAB_N_POS   (HEX)';
            u11int2in_out (s.sviewtext.vttab[ index ].vtttab_n_pos,
                  mask, 9, ok[ 9 ], modified);
            name_cnt := 9;
            mask_cnt := 9
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  index > s.sviewtext.vtfromtabcnt
    THEN
        BEGIN
        IF  NOT is_input
        THEN
            FOR i := 1 TO cut_mask_items DO
                mask[ i ].in_c256 := term.blankfilename;
            (*ENDFOR*) 
        (*ENDIF*) 
        name_cnt := 0;
        IF  index = s.sviewtext.vtfromtabcnt + 1
        THEN
            pos := s.sviewtext.vttabcount * mxak_vttabdef + 1;
        (*ENDIF*) 
        text_len := s.b_sl - cgg_rec_key_offset - mxak_viewtext_offset -
              s.b_kl - s.sviewtext.vttabcount * mxak_vttabdef;
        i := 1;
        WHILE text_len > 0 DO
            BEGIN
            mask[ i ].msg  := 'VIEWTEXT            ';
            IF  text_len > mxsp_c50
            THEN
                move_len := mxsp_c50
            ELSE
                move_len := text_len;
            (*ENDIF*) 
            s10mv (sizeof (s.sviewtext.vttbuf), sizeof (c64),
                  @s.sviewtext.vttbuf, pos,
                  @c64, 1, move_len);
            SAPDB_PascalForcedFill (mxsp_c64, @c64, move_len + 1,
                  mxsp_c64 - move_len, bsp_c1);
            u11c64in_out (c64, mask, i, modified);
            s10mv (sizeof (c64), sizeof (s.sviewtext.vttbuf), @c64, 1,
                  @s.sviewtext.vttbuf, pos, move_len);
            pos      := pos + move_len;
            text_len := text_len - move_len;
            mask_cnt := i;
            i        := i + 1
            END;
        (*ENDWHILE*) 
        END;
    (*ENDIF*) 
    IF  NOT is_input
    THEN
        BEGIN
        t09newscreen_page(term);
        t09mask (term, name_cnt, mask_cnt, mask, true, pfkey);
        t09putmsg (term, term.blankline, false, false);
        CASE pfkey OF
            pf_up, pf_down, pf_end, pf_run :
                is_input := true;
            pf_cancel :
                modified := false;
            OTHERWISE;
            END;
        (*ENDCASE*) 
        END
    ELSE
        BEGIN
        u11maskerror (term, ok, mask, cut_mask_items, pfkey);
        IF  ok[ 1 ]
        THEN
            CASE pfkey OF
                pf_up :
                    BEGIN
                    IF  index > 0
                    THEN
                        index := index - 1;
                    (*ENDIF*) 
                    IF  index > s.sviewtext.vtfromtabcnt
                    THEN
                        pos := pos -
                              cut_mask_items * mxsp_c50;
                    (*ENDIF*) 
                    pfkey := pf_none
                    END;
                pf_down :
                    BEGIN
                    index := index + 1;
                    IF  (index > 1) AND (pos > text_len)
                    THEN
                        BEGIN
                        pos   := 0;
                        index := 0
                        END;
                    (*ENDIF*) 
                    pfkey := pf_none
                    END;
                pf_run :
                    pfkey := pf_none;
                OTHERWISE ;
                END;
            (*ENDCASE*) 
        (*ENDIF*) 
        is_input := false
        END;
    (*ENDIF*) 
UNTIL
    (pfkey <> pf_none) AND NOT is_input;
(*ENDREPEAT*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      u15viewqual_basis (
            VAR term     : tut_terminal;
            VAR s        : tak_viewqual_basis_record;
            protect_mode : char;
            VAR modified : boolean;
            VAR pfkey    : tut_pfkey);
 
VAR
      _dummy           : boolean;
      _index_modified  : boolean;
      _is_input        : boolean;
      _j1tabno         : tsp00_Uint1;
      _j1cntst         : tsp00_Uint1;
      _j2tabno         : tsp00_Uint1;
      _j12inout        : tsp00_Int2;
      _j2cntst         : tsp00_Uint1;
      _mask_cnt        : integer;
      _name_cnt        : integer;
      _i               : integer;
      _expected_reclen : integer;
      _index           : tsp00_Int2;
      _st_entry        : tgg00_StackEntry;
      _ok              : tut_ok_array;
      _mask            : tut_term_mask;
      _error           : tsp00_Name;
      _warning_line    : tsp00_Line;
 
BEGIN
_dummy     := true;
_is_input  := false;
FOR _i := 1 TO cut_mask_items DO
    BEGIN
    _mask[ _i ].upper_case       := true;
    _mask[ _i ].msg_in_attr[ 1 ] := cut_protected;
    _mask[ _i ].msg_in_attr[ 2 ] := protect_mode;
    _mask[ _i ].code_input       := false;
    END;
(*ENDFOR*) 
_index := 0;
u11newpage (term, msg20_viewqual_basis);
_expected_reclen := cak_sysbufferoffset + sizeof( s.vsegmentid ) +
      sizeof( s.vstack_exists ) + sizeof( s.vjoin_exists ) +
      sizeof( s.vderived_exists ) + sizeof( s.vfiller ) +
      sizeof( s.vbasetabcnt ) + s.vbasetabcnt * sizeof( tak_viewtabdef );
REPEAT
    t09newscreen_page(term);
    _index_modified := false;
    IF  NOT _is_input
    THEN
        BEGIN
        FOR _i := 1 TO cut_mask_items DO
            BEGIN
            _mask[ _i ].in_name := bsp_name;
            _ok  [ _i ] := true
            END;
        (*ENDFOR*) 
        END;
    (*ENDIF*) 
    IF  _index = 0
    THEN
        BEGIN
        IF  s.vreclen <> _expected_reclen
        THEN
            BEGIN
            _error := 'reclen mismatch:  ';
            _warning_line := term.blankline;
            s10mv( sizeof( _error  ), sizeof( _warning_line ),
                  @_error, 1, @_warning_line, 1, sizeof( _error ) );
            _error := 'expected          ';
            s10mv( sizeof( _error ), sizeof( _warning_line ),
                  @_error, 1, @_warning_line, sizeof( _error ), sizeof( _error ) );
            u11integer_hex( _expected_reclen, 2, _error );
            s10mv( sizeof( _error ), sizeof( _warning_line ),
                  @_error, 1, @_warning_line, 27, sizeof( _error ) );
            t09putmsg( term, _warning_line, true, false );
            END;
        (*ENDIF*) 
        _mask[ 1 ].msg  := 'RECORD LENGTH  (HEX)';
        _mask[ 1 ].msg_in_attr[ 2 ] := protect_mode;
        u11int2in_out (s.vreclen, _mask, 1, _ok[ 1 ], modified);
        _mask[ 2 ].msg  := 'VSURROGATE     (HEX)';
        u11surrogate_in_out (s.vsurrogate, _mask, 2, _ok[ 2 ], modified);
        _mask[ 3 ].msg  := 'ENTRYTYPE      (HEX)';
        u11c2inout (s.ventrytype, _mask, 3, _ok[ 3 ], modified);
        _mask[ 4 ].msg  := 'LINKAGE        (HEX)';
        u11c2inout (s.vlinkage, _mask, 4, _ok[ 4 ], modified);
        _mask[ 5 ].msg  := 'VSEGMENTID     (HEX)';
        u11c2inout (s.vsegmentid, _mask, 5, _ok[ 5 ], modified);
        _mask[ 6 ].msg  := 'VJOIN_EXISTS        ';
        u11boolean_in_out (s.vjoin_exists, _mask, 6, _ok[ 6 ], modified);
        _mask[ 7 ].msg  := 'VSTACK_EXISTS       ';
        u11boolean_in_out (s.vstack_exists, _mask, 7, _ok[ 7 ], modified);
        _mask[ 8 ].msg  := 'VDERIVED_EXISTS     ';
        u11boolean_in_out (s.vderived_exists, _mask, 8, _ok[ 8 ], modified);
        _mask[ 9 ].msg  := 'VFILLER             ';
        u11boolean_in_out (s.vfiller, _mask, 9, _ok[ 9 ], modified);
        _mask[ 10 ].msg  := 'VBASETABCNT    (HEX)';
        u11int2in_out (s.vbasetabcnt, _mask, 10, _ok[ 10 ], modified);
        _name_cnt := 10;
        _mask_cnt := 10
        END;
    (*ENDIF*) 
    IF  ( _index > 0 )
    THEN
        BEGIN
        _mask[ 1 ].msg_in_attr[ 2 ] := cut_unprotected;
        _mask[ 1 ].msg  := 'INDEX ENTRY    (HEX)';
        u11int2in_out (_index, _mask, 1, _ok[ 1 ], _index_modified);
        IF  ( NOT _index_modified ) AND
            ( _index > 0 ) AND ( _index <= s.vbasetabcnt )
        THEN
            BEGIN
            _mask[ 2 ].msg  := '                    ';
            _mask[ 3 ].msg  := 'VTTABLEID      (HEX)';
            u11surrogate_in_out( s.vtable[ _index ].vttableid, _mask, 3,
                  _ok[ 3 ], modified );
            _mask[ 4 ].msg  := 'VTFILLER       (HEX)';
            u11int2in_out( s.vtable[ _index ].vtfiller, _mask, 4,
                  _ok[ 4 ], modified );
            _mask[ 5 ].msg  := 'VTINS_FOR_UPD       ';
            u11boolean_in_out( s.vtable[ _index ].vtins_for_upd, _mask, 5,
                  _ok[ 5 ], modified );
            _mask[ 6 ].msg  := 'VTONE_TO_ONE        ';
            u11boolean_in_out( s.vtable[ _index ].vtone_to_one, _mask, 6,
                  _ok[ 6 ], modified);
            (*
                  u13columnset ('VTNOT_USED_LINKS    ',
                  vtnot_used_links, _mask, 1, modified, _ok);
                  *)
            _name_cnt := 6;
            _mask_cnt := 6;
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  NOT _is_input
    THEN
        BEGIN
        t09newscreen_page( term );
        t09mask( term, _name_cnt, _mask_cnt, _mask, true, pfkey );
        t09putmsg( term, term.blankline, false, false );
        CASE pfkey OF
            pf_up, pf_down, pf_end, pf_run :
                _is_input := true;
            pf_cancel :
                modified := false;
            OTHERWISE;
            END;
        (*ENDCASE*) 
        END
    ELSE
        BEGIN
        u11maskerror( term, _ok, _mask, cut_mask_items, pfkey );
        IF  _ok[ 1 ]
        THEN
            CASE pfkey OF
                pf_up :
                    BEGIN
                    IF  _index > 0
                    THEN
                        _index := _index - 1;
                    (*ENDIF*) 
                    pfkey := pf_none
                    END;
                pf_down :
                    BEGIN
                    _index := _index + 1;
                    pfkey := pf_none
                    END;
                pf_run :
                    pfkey := pf_none;
                OTHERWISE ;
                END;
            (*ENDCASE*) 
        (*ENDIF*) 
        _is_input := false
        END;
    (*ENDIF*) 
    IF  ( _index > s.vbasetabcnt ) OR ( _index > cak_max_viewqual_tab )
    THEN
        _index := 0;
    (*ENDIF*) 
UNTIL
    (pfkey <> pf_none) AND NOT _is_input;
(*ENDREPEAT*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      u15viewqual_stack (
            VAR term     : tut_terminal;
            VAR s        : tak_viewqual_stack_record;
            protect_mode : char;
            VAR modified : boolean;
            VAR pfkey    : tut_pfkey);
 
VAR
      _dummy           : boolean;
      _index_modified  : boolean;
      _is_input        : boolean;
      _j1tabno         : tsp00_Uint1;
      _j1cntst         : tsp00_Uint1;
      _j2tabno         : tsp00_Uint1;
      _j12inout        : tsp00_Int2;
      _j2cntst         : tsp00_Uint1;
      _mask_cnt        : integer;
      _name_cnt        : integer;
      _i               : integer;
      _expected_reclen : integer;
      _rel_stcount     : integer;
      _rel_datapos     : integer;
      _index           : tsp00_Int2;
      _st_entry        : tgg00_StackEntry;
      _ok              : tut_ok_array;
      _mask            : tut_term_mask;
      _error           : tsp00_Name;
      _warning_line    : tsp00_Line;
 
BEGIN
_dummy     := true;
_is_input  := false;
FOR _i := 1 TO cut_mask_items DO
    BEGIN
    _mask[ _i ].upper_case       := true;
    _mask[ _i ].msg_in_attr[ 1 ] := cut_protected;
    _mask[ _i ].msg_in_attr[ 2 ] := protect_mode;
    _mask[ _i ].code_input       := false;
    END;
(*ENDFOR*) 
_index := 0;
u11newpage (term, msg20_viewqual_stack);
_rel_stcount := s.vstcount -
      ( ord( s.vlinkage[ 2 ] ) - 1 ) * cak_max_viewqual_stack;
IF  _rel_stcount >= cak_max_viewqual_stack
THEN
    (* hence s.vdatapos > cak_max_viewqual_data *)
    BEGIN
    _expected_reclen := cak_sysbufferoffset + sizeof( s.vsegmentid ) +
          sizeof( s.vfiller ) + sizeof( s.vview_offs ) + sizeof( s.vstcount ) +
          sizeof( s.vdatapos ) + sizeof( s.vdatalen ) +
          cak_max_viewqual_stack * sizeof( tgg00_StackEntry );
    END
ELSE
    (* _rel_stcount < cak_max_viewqual_stack *)
    IF  _rel_stcount * sizeof( tgg00_StackEntry ) + s.vdatalen >
        sizeof( s.vstack )
    THEN
        _expected_reclen := sizeof( s )
    ELSE
        (* partial filled record *)
        BEGIN
        _expected_reclen := cak_sysbufferoffset +
              sizeof( s.vsegmentid ) + sizeof( s.vfiller ) +
              sizeof( s.vview_offs ) + sizeof( s.vstcount ) +
              sizeof( s.vdatapos ) + sizeof( s.vdatalen ) +
              _rel_stcount * sizeof( tgg00_StackEntry ) + s.vdatalen;
        END;
    (*ENDIF*) 
(*ENDIF*) 
REPEAT
    t09newscreen_page(term);
    _index_modified := false;
    IF  NOT _is_input
    THEN
        BEGIN
        FOR _i := 1 TO cut_mask_items DO
            BEGIN
            _mask[ _i ].in_name := bsp_name;
            _ok  [ _i ] := true
            END;
        (*ENDFOR*) 
        END;
    (*ENDIF*) 
    IF  _index = 0
    THEN
        BEGIN
        IF  s.vreclen <> _expected_reclen
        THEN
            BEGIN
            _error := 'reclen mismatch:  ';
            _warning_line := term.blankline;
            s10mv( sizeof( _error  ), sizeof( _warning_line ),
                  @_error, 1, @_warning_line, 1, sizeof( _error ) );
            _error := 'expected          ';
            s10mv( sizeof( _error ), sizeof( _warning_line ),
                  @_error, 1, @_warning_line, sizeof( _error ), sizeof( _error ) );
            u11integer_hex( _expected_reclen, 2, _error );
            s10mv( sizeof( _error ), sizeof( _warning_line ),
                  @_error, 1, @_warning_line, 27, sizeof( _error ) );
            t09putmsg( term, _warning_line, true, false );
            END;
        (*ENDIF*) 
        _mask[ 1 ].msg  := 'RECORD LENGTH  (HEX)';
        _mask[ 1 ].msg_in_attr[ 2 ] := protect_mode;
        u11int2in_out (s.vreclen, _mask, 1, _ok[ 1 ], modified);
        _mask[ 2 ].msg  := 'VSURROGATE     (HEX)';
        u11surrogate_in_out (s.vsurrogate, _mask, 2, _ok[ 2 ], modified);
        _mask[ 3 ].msg  := 'ENTRYTYPE      (HEX)';
        u11c2inout (s.ventrytype, _mask, 3, _ok[ 3 ], modified);
        _mask[ 4 ].msg  := 'LINKAGE        (HEX)';
        u11c2inout (s.vlinkage, _mask, 4, _ok[ 4 ], modified);
        _mask[ 5 ].msg  := 'VSEGMENTID     (HEX)';
        u11c2inout (s.vsegmentid, _mask, 5, _ok[ 5 ], modified);
        _mask[ 6 ].msg  := 'VFILLER        (HEX)';
        u11c2inout (s.vfiller, _mask, 6, _ok[ 6 ], modified);
        _mask[ 7 ].msg  := 'VVIEW_OFFS     (HEX)';
        u11int2in_out (s.vview_offs, _mask, 7, _ok[ 7 ], modified);
        _mask[ 8 ].msg  := 'VSTCOUNT       (HEX)';
        u11int2in_out (s.vstcount, _mask, 8, _ok[ 8 ], modified);
        _mask[ 9 ].msg  := 'VDATAPOS       (HEX)';
        u11int4in_out (s.vdatapos, _mask, 9, _ok[ 9 ], modified);
        _mask[ 10 ].msg  := 'VDATALEN       (HEX)';
        u11int4in_out (s.vdatalen, _mask, 10, _ok[ 10 ], modified);
        _name_cnt := 10;
        _mask_cnt := 10;
        END;
    (*ENDIF*) 
    IF  ( _index > 0 )
    THEN
        BEGIN
        _mask[ 1 ].msg_in_attr[ 2 ] := cut_unprotected;
        _mask[ 1 ].msg  := 'INDEX ENTRY    (HEX)';
        u11int2in_out( _index, _mask, 1, _ok[ 1 ], _index_modified );
        _mask[ 2 ].msg  := '                    ';
        IF  ( NOT _index_modified ) AND
            ( _index > 0 ) AND ( _index <= _rel_stcount ) AND
            ( _index <= cak_max_viewqual_stack )
        THEN
            BEGIN
            u13stack_entry( s.vstack[ _index ], _mask, 2, _ok, modified );
            _name_cnt := 8;
            _mask_cnt := 8;
            END;
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  NOT _is_input
    THEN
        BEGIN
        t09newscreen_page(term);
        t09mask (term, _name_cnt, _mask_cnt, _mask, true, pfkey);
        t09putmsg (term, term.blankline, false, true);
        CASE pfkey OF
            pf_up, pf_down, pf_end, pf_run :
                _is_input := true;
            pf_cancel :
                modified := false;
            OTHERWISE;
            END;
        (*ENDCASE*) 
        END
    ELSE
        BEGIN
        u11maskerror (term, _ok, _mask, cut_mask_items, pfkey);
        IF  _ok[ 1 ]
        THEN
            CASE pfkey OF
                pf_up :
                    BEGIN
                    IF  _index > 0
                    THEN
                        _index := _index - 1;
                    (*ENDIF*) 
                    pfkey := pf_none
                    END;
                pf_down :
                    BEGIN
                    _index := _index + 1;
                    pfkey := pf_none
                    END;
                pf_run :
                    pfkey := pf_none;
                OTHERWISE ;
                END;
            (*ENDCASE*) 
        (*ENDIF*) 
        _is_input := false
        END;
    (*ENDIF*) 
    IF  ( _index > _rel_stcount )
    THEN
        _index := 0;
    (*ENDIF*) 
UNTIL
    (pfkey <> pf_none) AND NOT _is_input;
(*ENDREPEAT*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      u15viewqual_join (
            VAR term     : tut_terminal;
            VAR s        : tak_viewqual_join_record;
            protect_mode : char;
            VAR modified : boolean;
            VAR pfkey    : tut_pfkey);
 
VAR
      _dummy           : boolean;
      _index_modified  : boolean;
      _is_input        : boolean;
      _j1tabno         : tsp00_Uint1;
      _j1cntst         : tsp00_Uint1;
      _j2tabno         : tsp00_Uint1;
      _j12inout        : tsp00_Int2;
      _j2cntst         : tsp00_Uint1;
      _mask_cnt        : integer;
      _name_cnt        : integer;
      _i               : integer;
      _rel_jcount      : integer;
      _index           : tsp00_Int2;
      _st_entry        : tgg00_StackEntry;
      _ok              : tut_ok_array;
      _mask            : tut_term_mask;
 
      _j1prop, _j2prop : RECORD
            CASE boolean OF
                true :
                    (c2 : tsp00_C2);
                false :
                    (s : tak_jcolpropset);
                END;
            (*ENDCASE*) 
 
 
BEGIN
_dummy     := true;
_is_input  := false;
FOR _i := 1 TO cut_mask_items DO
    BEGIN
    _mask[ _i ].upper_case       := true;
    _mask[ _i ].msg_in_attr[ 1 ] := cut_protected;
    _mask[ _i ].msg_in_attr[ 2 ] := protect_mode;
    _mask[ _i ].code_input       := false;
    END;
(*ENDFOR*) 
_index := 0;
u11newpage (term, msg20_viewqual_join);
_rel_jcount := s.vjoincount -
      ( ord( s.vlinkage[ 2 ] ) - 1 ) * cak_max_viewqual_join;
REPEAT
    t09newscreen_page(term);
    _index_modified := false;
    IF  NOT _is_input
    THEN
        BEGIN
        FOR _i := 1 TO cut_mask_items DO
            BEGIN
            _mask[ _i ].in_name := bsp_name;
            _ok  [ _i ] := true
            END;
        (*ENDFOR*) 
        END;
    (*ENDIF*) 
    IF  _index = 0
    THEN
        BEGIN
        _mask[ 1 ].msg  := 'RECORD LENGTH  (HEX)';
        _mask[ 1 ].msg_in_attr[ 2 ] := protect_mode;
        u11int2in_out (s.vreclen, _mask, 1, _ok[ 1 ], modified);
        _mask[ 2 ].msg  := 'VSURROGATE     (HEX)';
        u11surrogate_in_out (s.vsurrogate, _mask, 2, _ok[ 2 ], modified);
        _mask[ 3 ].msg  := 'ENTRYTYPE      (HEX)';
        u11c2inout (s.ventrytype, _mask, 3, _ok[ 3 ], modified);
        _mask[ 4 ].msg  := 'LINKAGE        (HEX)';
        u11c2inout (s.vlinkage, _mask, 4, _ok[ 4 ], modified);
        _mask[ 5 ].msg  := 'VSEGMENTID     (HEX)';
        u11c2inout (s.vsegmentid, _mask, 5, _ok[ 5 ], modified);
        _mask[ 6 ].msg  := 'VJOINCOUNT     (HEX)';
        u11int2in_out (s.vjoincount, _mask, 6, _ok[ 6 ], modified);
        _name_cnt := 6;
        _mask_cnt := 6
        END;
    (*ENDIF*) 
    IF  ( _index > 0 )
    THEN
        BEGIN
        _mask[ 1 ].msg_in_attr[ 2 ] := cut_unprotected;
        _mask[ 1 ].msg  := 'INDEX ENTRY    (HEX)';
        u11int2in_out (_index, _mask, 1, _ok[ 1 ], _index_modified);
        IF  ( NOT _index_modified ) AND ( _rel_jcount <= s.vjoincount )
            AND ( _rel_jcount <= cak_max_viewqual_join )
        THEN
            WITH s.vjoin[ _rel_jcount ] DO
                BEGIN
                _mask[ 2 ].msg  := 'J1TABLENO      (HEX)';
                _j1tabno := j1tableno;
                u11int1in_out (_j1tabno, _mask, 2, _ok[ 2 ], modified);
                j1tableno := _j1tabno;
                _mask[ 3 ].msg  := 'J1FIELDNO           ';
                u11int2in_out (j1fieldno, _mask, 3, _ok[ 3 ], modified);
                _mask[ 4 ].msg  := 'J1STARTSTACK        ';
                u11int2in_out (j1startstack, _mask, 4, _ok[ 4 ],
                      _index_modified);
                _mask[ 5 ].msg  := 'J1CNTSTACK     (HEX)';
                _j1cntst := j1cntstack;
                u11int1in_out (_j1cntst, _mask, 5, _ok[ 5 ], modified);
                j1cntstack := _j1cntst;
                _j1prop.c2[ 2 ] := chr(0);
                _j1prop.s       := j1propset;
                _mask[ 6 ].msg  := 'J1PROPSET      (BIN)';
                u11setin_out (_j1prop.c2, _mask, 6, _ok[ 6 ], modified);
                j1propset := _j1prop.s;
                _mask[ 7 ].msg  := 'J2TABLENO      (HEX)';
                _j2tabno := j2tableno;
                u11int1in_out (_j2tabno, _mask, 7, _ok[ 7 ], modified);
                j2tableno := _j2tabno;
                _mask[ 8 ].msg  := 'J2FIELDNO      (HEX)';
                u11int2in_out (j2fieldno, _mask, 8, _ok[ 8 ], modified);
                _mask[ 9 ].msg  := 'J12OPERATOR    (HEX)';
                _st_entry.etype := st_op;
                _st_entry.eop   := j12operator;
                u11eopin_out (_st_entry, _st_entry.eop, _mask, 9, _ok[ 9 ],
                      modified);
                j12operator := _st_entry.eop;
                _mask[ 10 ].msg  := 'J1INOUTLEN     (HEX)';
                _j12inout := j1inoutlen;
                u11int2in_out (_j12inout, _mask, 10, _ok[ 10 ], modified);
                j1inoutlen := _j12inout;
                _mask[ 11 ].msg  := 'J2CNTSTACK     (HEX)';
                _j2cntst := j2cntstack;
                u11int1in_out (_j2cntst, _mask, 11, _ok[ 11 ], modified);
                j2cntstack := _j2cntst;
                _j2prop.c2[ 2 ] := chr(0);
                _j2prop.s       := j2propset;
                _mask[ 12 ].msg  := 'J2PROPSET      (BIN)';
                u11setin_out (_j1prop.c2, _mask, 12, _ok[ 12 ], modified);
                j2propset := _j2prop.s;
                _mask[ 13 ].msg  := 'J2INOUTLEN     (HEX)';
                _j12inout := j2inoutlen;
                u11int2in_out (_j12inout, _mask, 13, _ok[ 13 ], modified);
                j2inoutlen := _j12inout;
                _name_cnt := 13;
                _mask_cnt := 13;
                END;
            (*ENDWITH*) 
        (*ENDIF*) 
        END;
    (*ENDIF*) 
    IF  NOT _is_input
    THEN
        BEGIN
        t09newscreen_page(term);
        t09mask (term, _name_cnt, _mask_cnt, _mask, true, pfkey);
        t09putmsg (term, term.blankline, false, false);
        CASE pfkey OF
            pf_up, pf_down, pf_end, pf_run :
                _is_input := true;
            pf_cancel :
                modified := false;
            OTHERWISE;
            END;
        (*ENDCASE*) 
        END
    ELSE
        BEGIN
        u11maskerror (term, _ok, _mask, cut_mask_items, pfkey);
        IF  _ok[ 1 ]
        THEN
            CASE pfkey OF
                pf_up :
                    BEGIN
                    IF  _index > 0
                    THEN
                        _index := _index - 1;
                    (*ENDIF*) 
                    pfkey := pf_none
                    END;
                pf_down :
                    BEGIN
                    _index := _index + 1;
                    pfkey := pf_none
                    END;
                pf_run :
                    pfkey := pf_none;
                OTHERWISE ;
                END;
            (*ENDCASE*) 
        (*ENDIF*) 
        _is_input := false
        END;
    (*ENDIF*) 
    IF  ( _index > _rel_jcount )
    THEN
        _index := 0;
    (*ENDIF*) 
UNTIL
    (pfkey <> pf_none) AND NOT _is_input;
(*ENDREPEAT*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
