.ad 8
.bm 8
.fm 4
.bt $Copyright (c) 2000-2005 SAP AG$$Page %$
.tm 12
.hm 6
.hs 3
.tt 1 $NME$Project Distributed Database System$VOS04U$
.tt 2 $$$
.tt 3 $RaymondR$Laufzeitumgebung_Virtuelles_Terminal$1998-08-28$
***********************************************************
.nf
 
 .nf

.nf

    ========== licence begin  GPL
    Copyright (c) 2000-2005 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

 
.fo
.nf
.sp
Module  :       virtual_terminal_mapper
=========
.sp
Purpose : Wrapper von Pascal (T/31) auf C (virtuelles Terminal
          mit "screenlib").
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :
 
        PROCEDURE
              sqlton    ( multi_task    : boolean ;
                    VAR term_ref : tsp00_Int4 ;
                    VAR desc : tsp00_TerminalDescription ;
                    VAR ok   : boolean ) ;
 
        PROCEDURE
              sqltio ( term_ref : tsp00_Int4 ;
                    VAR   screen_buf      : tsp00_ScreenBufAddr ;
                    VAR   attributes_buf  : tsp00_ScreenBufAddr ;
                    refresh         : boolean ;
                    VAR   cursorline      : tsp00_Int2 ;
                    VAR   cursorcolumn    : tsp00_Int2 ;
                    VAR   hif             : tsp00_HifParms ;
                    VAR   options         : tsp00_VtOptions ;
                    VAR   result          : tsp00_VtResult ;
                    VAR   ok              : boolean ) ;
 
        PROCEDURE
              sqlttable
                    ( i             : tsp00_Int2 ;
                    att             : tsp00_VtAttrib ;
                    foreground      : tsp00_VtColor ;
                    background      : tsp00_VtColor ) ;
 
        PROCEDURE
              sqlwindow
                    ( parent_ref    : tsp00_Int4 ;
                    VAR position    : tsp00_VtRectangle ;
                    VAR desc        : tsp00_TerminalDescription;
                    VAR ok          : boolean ) ;
 
        PROCEDURE
              sqlwsplit (
                    term_ref        : tsp00_Int4 ;
                    nr_screens      : tsp00_Int2 ;
                    VAR desc        : tsp00_TerminalDescription;
                    VAR offset      : tsp00_Int2 ;
                    VAR ok          : boolean ) ;
 
        PROCEDURE
              sqlwoff (
                    term_ref        : tsp00_Int4 ;
                    VAR screen_buf  : tsp00_ScreenBufAddr ;
                    VAR attribute_buf : tsp00_ScreenBufAddr ;
                    VAR color_buf   : tsp00_ScreenBufAddr ) ;
 
        PROCEDURE
              sqlwdgswitch (
                    box_id          : tsp00_Int2 ;
                    trigger         : tsp00_VtKeys ;
                    retrn           : tsp00_VtKey ;
                    VAR ok          : boolean ) ;
 
        PROCEDURE
              sqlwdgclear (
                    box_id          : tsp00_Int2 ) ;
 
        PROCEDURE
              sqlwdgset (
                    box_id          : tsp00_Int2 ;
                    item_id         : tsp00_Int2 ;
                    VAR text        : screenline ;
                    text_len        : tsp00_Int2 ;
                    VAR ok          : boolean ) ;
 
        PROCEDURE
              sqlwdgget (
                    box_id          : tsp00_Int2 ;
                    item_id         : tsp00_Int2 ;
                    VAR text        : screenline ;
                    VAR text_len    : tsp00_Int2 ;
                    VAR ok          : boolean ) ;
 
        PROCEDURE
              sqlwtitle (
                    term_ref        : tsp00_Int4 ;
                    screen_nr       : tsp00_Int2 ;
                    VAR text        : screenline ;
                    text_len        : tsp00_Int2 ;
                    VAR ok          : boolean ) ;
 
        PROCEDURE
              sqlwscroll (
                    term_ref        : tsp00_Int4 ;
                    VAR rect        : tsp00_VtRectangle ;
                    displ_x         : tsp00_Int2 ;
                    displ_y         : tsp00_Int2 ;
                    VAR ok          : boolean ) ;
 
        PROCEDURE
              sqlwscbar (
                    term_ref        : tsp00_Int4 ;
                    screen_nr       : tsp00_Int2 ;
                    t               : tsp00_VtScroll ;
                    range_beg       : tsp00_Int2 ;
                    range_end       : tsp00_Int2 ;
                    pos             : tsp00_Int2 ;
                    VAR ok          : boolean ) ;
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              RTE_driver : VEN102 ;
 
        PROCEDURE
              sqlcton ( VAR returnkeys_array    : c100 ;
                    VAR size_returnkeys     : tsp00_Int2 ;
                    VAR attributes_array    : tsp00_C20;
                    VAR size_attributes     : tsp00_Int2 ;
                    VAR color_array         : tsp00_C20 ;
                    VAR size_color          : tsp00_Int2 ;
                    VAR has_sysline_char    : boolean ;
                    VAR label_char          : char ;
                    VAR maxlines            : tsp00_Int2 ;
                    VAR maxcols             : tsp00_Int2 ;
                    VAR ccontent_buf        : tsp00_ScreenBufAddr;
                    VAR cattribute_buf      : tsp00_ScreenBufAddr;
                    VAR cgraphic            : boolean ;
                    VAR cmark               : boolean ;
                    VAR cwindows            : boolean ;
                    VAR cvton_ok            : boolean ) ;
 
        PROCEDURE
              sqlctio (
                    VAR  screen             : tsp00_ScreenBufAddr ;
                    VAR  attributes         : tsp00_ScreenBufAddr ;
                    VAR  cursorline         : tsp00_Int2 ;
                    VAR  cursorcolumn       : tsp00_Int2 ;
                    VAR  c_sk_text          : c200 ;
                    VAR  c_sys_text         : tsp00_Line ;
                    VAR  c_sys_attr         : tsp00_Line ;
                    VAR  insert_text        : tsp00_VtLabel ;
                    VAR  insert_pos         : i2_2 ;
                    VAR  insert_opt         : tsp00_C2 ;
                    VAR  c_vt_options       : option_string ;
                    VAR  c_returnkeys       : vt_key_string ;
                    VAR  c_reject_keys      : vt_key_string ;
                    VAR  num_of_lines       : tsp00_Int2 ;
                    VAR  num_of_cols        : tsp00_Int2 ;
                    VAR  mark_begin         : tsp00_Int2 ;
                    VAR  mark_end           : tsp00_Int2 ;
                    VAR  screen_changed     : boolean ;
                    VAR  c_keystroke        : vt_keystroke ;
                    c_refresh          : boolean ;
                    VAR  c_ok               : boolean ) ;
 
        PROCEDURE
              sqlcttable (
                    i                  : tsp00_Int2 ;
                    VAR  att_array          : tsp00_C5 ;
                    foreground         : tsp00_VtColor ;
                    background         : tsp00_VtColor ) ;
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
        PROCEDURE
              sqlctio ;
 
              tsp00_C2 vt_keystroke
 
        PROCEDURE
              sqlcttable ;
 
              tsp_vt_attr tsp00_C5
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  :
.sp
.cp 3
Created : 1987-12-01
.sp
.cp 3
Version : 2001-03-19
.sp
.cp 3
Release :      Date : 1998-08-28
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
.sp
Die Routinen des virtuellen Terminals sind im Papier "Laufzeitumgebung"
spezifiziert.
.sp
Dieser Modul wird sowohl fuer Release 2.4.xx als auch fuer 3.y.zz
benutzt, die jeweils richtige Version wird ueber die Definition
des Symbols REL24 bzw. REL30 erzeugt.
.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
 
Das virtuelle Terminal ist eine Schnittstelle zwischen den betriebssystem-
unabhaengigen Komponenten und der betriebssystemabhaengigen
physikalischen Terminal.
.sp
Es ermoeglicht die Ausgabe eines kompletten Bildschirminhalts, der in
einem Bildschirmpuffer uebergeben wurde, das Einlesen von druckbaren
Zeichen von der Tastatur sowie die Reaktion auf die Betaetigung
bestimmter Tasten. Die Art der Ausgabe von Zeichen auf dem Bildschirm
(blinkend, unsichtbar ... ) wird ueber Attribute gesteuert.
.sp
Da die Nixdorf-UNIX-Bildschirmbibliothek "screenlib" nicht von Pascal
aus angesprochen werden kann, erfolgt zunaechst ein Mapping zwischen
den vom Anwenderprogramm angelieferten Datenstrukturen, wie sie im
Dokument "Laufzeitumgebung" spezifiziert wurden, und Datenstrukturen,
die problemlos an ein C-Programm uebergeben werden koennen. Insbesondere
ist es notwendig, Pascal-Records, Pascal-Sets und Pascal-Aufzaehlungsvariable
umzuwandeln, da die interne Darstellung dieser Datentypen stark vom
verwendeten Pascal-Compiler abhaengig ist.
.sp
Nach dem Mapping der Datenstrukturen erfolgt eine Verzweigung in eine
C-Prozedur, in der die eigentlichen Aufgaben der virtuellen Terminals
erfuellt werden. Nach dem Verlassen dieser Prozedur muessen die hoch-
gereichten Datenstrukturen zunaechst wieder in die spezifizierten
Pascal-Datenstrukturen umgewandelt werden, bevor die Kontrolle an die
Komponente zurueckgegeben werden kann.
 
.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
      vt_key_number           = 100 ;
      vt_option_number        = 6 ;
 
TYPE
      c200          = PACKED ARRAY [ 1 .. 200 ]              OF char ;
      c100          = PACKED ARRAY [ 1 .. 100 ]              OF char ;
      i2_2          = ARRAY        [ 1 .. 2 ]                OF tsp00_Int2 ;
      insert_string = PACKED ARRAY [ 1 .. VTLABEL_MXSP00 ]     OF char ;
      option_string = PACKED ARRAY [ 1 .. vt_option_number ] OF char ;
      vt_key_string = PACKED ARRAY [ 1 .. vt_key_number ]    OF char ;
      screenline    = c100 ;
 
      vt_keystroke  = RECORD
            vt_key           : char;
            ch               : char;
            mouse_x          : tsp00_Int4;
            mouse_y          : tsp00_Int4;
      END ;
 
 
VAR
 
      sql04_vt_record : RECORD
            hif_old          : tsp00_HifParms ;
            options_old      : tsp00_VtOptions ;
            insert_label_old : tsp00_VtField ;
            returnkeys_old   : tsp00_VtKeys ;
            reject_keys_old  : tsp00_VtKeys ;
            sk_label_kind    : tsp00_SkLabel ;
            insert_text      : tsp00_VtLabel ;
            insert_pos       : i2_2 ;
            insert_opt       : tsp00_C2 ;
            c_sys_text       : tsp00_Line ;
            c_sys_attr       : tsp00_Line ;
            c_vt_options     : option_string ;
            c_returnkeys     : vt_key_string ;
            c_reject_keys    : vt_key_string ;
            c_sk_text        : c200 ;
      END ;
 
      (* Initilisieren des hif-Backup-Records "hif_old" mit Nullen ( soweit
      moeglich ) *)
 
 
(*------------------------------*) 
 
PROCEDURE
      sql04_init_old_records ;
 
VAR
      i : integer ;
 
BEGIN
WITH sql04_vt_record DO
    BEGIN
    WITH hif_old DO
        BEGIN
        (* Softkey-Labels fehlen *)
        FOR i := 1 TO LINE_MXSP00 DO
            BEGIN
            sys_text  [i] := chr (0) ;
            sys_attr  [i] := chr (0) ;
            END ;
        (*ENDFOR*) 
        FOR i := 1 TO VTLABEL_MXSP00 DO
            BEGIN
            insert_label.text [i] := chr (0) ;
            END ;
        (*ENDFOR*) 
        insert_label.lno   := 0 ;
        insert_label.colnr := 0 ;
        insert_label.att [1] := chr(0) ;
        END;
    (*ENDWITH*) 
    WITH options_old DO
        BEGIN
        wait_for_input  := false ;
        usage_mode      := vt_form ;
        return_on_last  := false ;
        return_on_first := false ;
        returnkeys      := [] ;
        reject_keys     := [] ;
        bell            := false ;
        END;
    (*ENDWITH*) 
    insert_label_old    := hif_old.insert_label ;
    returnkeys_old      := options_old.returnkeys ;
    reject_keys_old     := options_old.reject_keys ;
    END ;
(*ENDWITH*) 
END ;
 
(* knack_hif zerlegt den hif-Record des sqltinout in Typen, die ohne
      Probleme an ein c-Modul uebergeben werden koennen *)
(*------------------------------*) 
 
PROCEDURE
      sql04_knack_hif ( VAR hif : tsp00_HifParms ) ;
 
VAR
      i , l   : integer ;
 
BEGIN
WITH sql04_vt_record DO
    BEGIN
    WITH hif DO
        BEGIN
        (*      IF  hif_old.insert_label <> insert_label
              THEN    *)
        BEGIN
        (* Setzen der Position und der Attribute fuer das
              INSERT-Label *)
        insert_pos [1] := insert_label.lno ;
        insert_pos [2] := insert_label.colnr ;
        (*
              writeln ('===== insert_label.lno   = ' , insert_label.lno ) ;
              writeln ('===== insert_label.colnr = ' , insert_label.colnr ) ;
              *)
        insert_opt [1] := insert_label.att [1];
        END ;
        (* Speichern der Softkey-Beschriftungen in einem char-Array *)
        IF  sk_label_kind <> no_sk_labels
        THEN
            BEGIN
            FOR i := 1 TO csp_sk_number * 2 * VTLABEL_MXSP00 DO
                c_sk_text [i] := ' ' ;
            (*ENDFOR*) 
            IF  sk_label_kind = short_sk_labels
            THEN
                BEGIN
                (* kurze Softkey-Labels *)
                FOR l := 1 TO csp_sk_number DO
                    FOR i := 1 TO 8 DO
                        c_sk_text[(l-1)*2*VTLABEL_MXSP00+i] := slabels [l][i] ;
                    (*ENDFOR*) 
                (*ENDFOR*) 
                END
            ELSE
                BEGIN
                (* lange Softkey-Labels *)
                FOR l := 1 TO csp_sk_number DO
                    BEGIN
                    FOR i := 1 TO 8 DO
                        c_sk_text[(l-1)*2*VTLABEL_MXSP00+i] := llabels [l][1][i] ;
                    (*ENDFOR*) 
                    FOR i := 9 TO 16 DO
                        c_sk_text[(l-1)*2*VTLABEL_MXSP00+i] := llabels [l][2][i-8] ;
                    (*ENDFOR*) 
                    END ;
                (*ENDFOR*) 
                END ;
            (*ENDIF*) 
            END ;
        (*ENDIF*) 
        END ;
    (*ENDWITH*) 
    END ;
(*ENDWITH*) 
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sql04_knack_options ( VAR options : tsp00_VtOptions ) ;
      (* Aufbereiten der Optionen fuer cvtinout, d.h. umspeichern in
      eine fuer ein c-Modul problemlos verarbeitbare Form *)
 
VAR
      i : integer ;
      k : tsp00_VtKey ;
      returnkeys_vt : tsp00_VtKeys ;
 
BEGIN
WITH sql04_vt_record DO
    WITH options DO
        BEGIN
        c_vt_options [1] := chr ( ord ( wait_for_input  ) ) ;
        c_vt_options [2] := chr ( ord ( usage_mode      ) ) ;
        c_vt_options [3] := chr ( ord ( return_on_last  ) ) ;
        c_vt_options [4] := chr ( ord ( return_on_first ) ) ;
        c_vt_options [5] := chr ( ord ( bell            ) ) ;
        c_vt_options [6] := chr ( ord ( mark            ) ) ;
        (* Einfuehren einer neuen Option; ist vt_character_key in dem
              returnkeys-Set enthalten, wird bei dem ersten druckbaren Zeichen
              die Kontrolle an das aufrufende Modul zurueckgegeben *)
        IF  returnkeys <> returnkeys_old
        THEN
            BEGIN
            (* Umspeichern des returnkey-Sets in ein character-Array;
                  das Ende des Arrays wird durch eine binaere Null
                  gekennzeichnet.*)
            returnkeys_vt := returnkeys - [vt_unknown] ;
            i := 1 ;
            FOR k := vt_character_key TO vt_last_key DO
                BEGIN
                IF  k IN returnkeys_vt
                THEN
                    BEGIN
                    c_returnkeys [i] := chr ( ord (k) - ord (vt_unknown) ) ;
                    i := succ (i) ;
                    END ;
                (*ENDIF*) 
                END ;
            (*ENDFOR*) 
            c_returnkeys [i] := chr ( 0 ) ;
            END ;
        (*ENDIF*) 
        IF  reject_keys <> reject_keys_old
        THEN
            BEGIN
            i := 1 ;
            (* Umspeichern des reject_key-Sets in ein character-Array;
                  das Ende des Arrays wird durch eine binaere Null
                  gekennzeichnet.*)
            FOR k := vt_character_key TO vt_last_key DO
                BEGIN
                IF  k IN reject_keys
                THEN
                    BEGIN
                    c_reject_keys [i] := chr (ord (k) - ord (vt_unknown)) ;
                    i := succ (i) ;
                    END ;
                (*ENDIF*) 
                END ;
            (*ENDFOR*) 
            c_reject_keys [i] := chr ( 0 ) ;
            END ;
        (*ENDIF*) 
        END ;
    (*ENDWITH*) 
(*ENDWITH*) 
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sqlton ( multi_task   : boolean ;
            VAR term_ref : tsp00_Int4 ;
            VAR desc     : tsp00_TerminalDescription ;
            VAR ok       : boolean ) ;
      (* In sqlton wird das virtuelle Terminal initialisiert und dem
      aufrufenden Programm mitgeteilt, welche Eigenschaften das
      Terminal (z.B. dap4x, vt220 ...  ) hat.
      Folgende Eigenschaften werden im Record 'desc' von sqlton
      zurueckgeliefert :
      - Anzahl Zeilen auf dem Bildschirm
      - Anzahl Spalten pro Bildschirmzeile
      - Tastenbelegung ( welche Tasten gibt es ? )
      - Attributmoeglichkeiten ( welche Attribute gibt es ? )
      - gibt es Softkeys auf dem Terminal ?
      - hat das Terminal eine Status-Zeile ?
      Da die Benutzung der Bildschirm-Bibliothek
      screenlib von Pascal aus nicht moeglich ist, dient sqlton vor
      allem als Schnittstelle zwischen Pascal und dem in c geschriebenen
      Unterprogramm cvton. sqlton wandelt die von cvton hochgereichten
      Arrays in die Komponenten des Types 'terminal_description' um.
      *)
 
VAR
      x1                      : tsp00_VtKey ;
      x2                      : tsp00_VtMode ;
      x3                      : tsp00_VtColor ;
      size_returnkeys         : tsp00_Int2 ;
      size_attributes         : tsp00_Int2 ;
      size_color              : tsp00_Int2 ;
      returnkeys_array        : c100 ;
      attributes_array        : tsp00_C20 ;
      color_array             : tsp00_C20 ;
      has_sysline_char        : boolean ;
      label_char              : char ;
      cmaxlines               : tsp00_Int2 ;
      cmaxcols                : tsp00_Int2 ;
      ccontent_buf            : tsp00_ScreenBufAddr;
      cattribute_buf          : tsp00_ScreenBufAddr;
      cgraphic                : boolean ;
      cmark                   : boolean ;
      cwindows                : boolean ;
      cok                     : boolean ;
      i                       : integer ;
 
BEGIN
WITH sql04_vt_record DO
    BEGIN
    size_returnkeys := ord ( vt_last_key )   - ord ( vt_unknown ) ;
    size_attributes := ord ( vt_last_mode )  - ord ( vt_bright ) ;
    size_color      := ord ( vt_last_color ) - ord ( vt_default_color ) ;
    (* Initialisierung des Return-Parameters *)
    ok := false ;
    (* Aufruf der c-Prozedur cvton, die die eigentliche Initialisierung
          des Terminals vornimmt *)
    sqlcton ( returnkeys_array , size_returnkeys , attributes_array ,
          size_attributes , color_array , size_color, desc.has_sysline ,
          label_char , cmaxlines , cmaxcols , ccontent_buf , cattribute_buf ,
          cgraphic , cmark , cwindows , cok ) ;
    (* Es folgt nun die Umwandlung der von cvton hochgereichten Arrays
          in die entsprechenden Komponenten des Records desc *)
    IF  cok
    THEN
        BEGIN
        ok := true ;
        sql04_init_old_records ;      (* Backups initialisieren *)
        ok := true ;
        WITH desc DO
            BEGIN
            content_buf   := ccontent_buf ;
            attribute_buf := cattribute_buf ;
            num_of_lines  := cmaxlines ;
            num_of_cols   := cmaxcols  ;
            mark          := cmark ;
            windows       := cwindows ;
            (* Fuellen des Sets mit den auf dem aktuellen
                  Terminal vorhandenen Tasten *)
            returnkeys := [] ;
            FOR x1 := vt_unknown TO vt_last_key DO
                BEGIN
                IF  returnkeys_array [ ord(x1) - ord ( vt_unknown ) + 1] = chr (1)
                THEN
                    BEGIN
                    returnkeys   := returnkeys + [x1] ;
                    END;
                (*ENDIF*) 
                END ;
            (*ENDFOR*) 
            (* Fuellen des Sets mit den auf dem aktuellen
                  Terminal vorhandenen Attributen *)
            attributes := [] ;
            FOR x2 := vt_bright TO vt_last_mode  DO
                BEGIN
                IF  attributes_array[ ord(x2) - ord ( vt_unknown ) + 1 ] = chr (1)
                THEN
                    BEGIN
                    attributes   := attributes   + [x2] ;
                    END;
                (*ENDIF*) 
                END ;
            (*ENDFOR*) 
            (* Fuellen des Sets mit den auf dem aktuellen
                  Terminal vorhandenen Farben *)
            colors     := [] ;
            FOR x3 := vt_default_color TO vt_last_color DO
                BEGIN
                IF  color_array [ ord (x3) - ord ( vt_default_color ) + 1 ] = chr (1)
                THEN
                    BEGIN
                    colors  := colors + [x3] ;
                    END;
                (*ENDIF*) 
                END ;
            (*ENDFOR*) 
            (* has_sysline wird true, wenn das Terminal
                  eine Statuszeile besitzt *)
            (* Die Aufzaehlungsvariable sk_label_kind gibt an, ob
                  das Terminal Softkeys besitzt und wie lang gegebenen-
                  falls der Softkey-Text ist *)
            (*x       writeln ( 'label_char = ' , ord ( label_char )    ) ; *)
            CASE ord (label_char) OF
                0 :
                    labels := no_sk_labels ;
                1 :
                    labels := short_sk_labels ;
                2 :
                    labels := long_sk_labels ;
                OTHERWISE :
                    ok := false ;
                END;
            (*ENDCASE*) 
            sk_label_kind := labels ;
            (*x     writeln ( 'sk_label_kind = ' , sk_label_kind ) ;        *)
            (* Anzahl Zeilen auf dem Bildschirm *)
            (*JH        maxlines := cmaxlines ;     *)
            (* Anzahl Spalten pro Zeile *)
            (*JH        maxcols  := cmaxcols ;      *)
            (*x
                  writeln ('sqlton : desc.maxlines =',desc.maxlines ) ;
                  writeln ('sqlton : desc.maxcols  =',desc.maxcols  ) ;
                  *)
            END;
        (*ENDWITH*) 
        END
    ELSE
        BEGIN
        (* bool auf false ; *)
        ok := false ;
        (*  writeln('cvton nicht korrekt verlaufen') ;          *)
        END ;
    (*ENDIF*) 
    sqlttable ( 0 , [              ] , vt_black , vt_white ) ;
    sqlttable ( 1 , [ vt_bright    ] , vt_black , vt_white ) ;
    sqlttable ( 2 , [ vt_invisible ] , vt_black , vt_white ) ;
    FOR i := 3 TO 15 DO
        sqlttable ( i , [            ] , vt_black , vt_white ) ;
    (*ENDFOR*) 
    END;
(*ENDWITH*) 
END;
 
(* sqltio  beschreibt die eigentliche Aufgabe des virtuellen Terminals.
      Da die Bildschirmbibliothek screenlib von Pascal aus nicht angesprochen
      werden kann, erschoepft sich die Aufgabe von sqltio vor allem im
      Umspeichern von Pascal-Records in Datenstrukturen, die die
      c-Prozedur cvtinout problemlos verarbeiten kann.
      *)
(*------------------------------*) 
 
PROCEDURE
      sqltio ( term_ref : tsp00_Int4 ;
            VAR   screen_buf      : tsp00_ScreenBufAddr ;
            VAR   attributes_buf  : tsp00_ScreenBufAddr ;
            refresh         : boolean ;
            VAR   cursorline      : tsp00_Int2 ;
            VAR   cursorcolumn    : tsp00_Int2 ;
            VAR   hif             : tsp00_HifParms ;
            VAR   options         : tsp00_VtOptions ;
            VAR   result          : tsp00_VtResult ;
            VAR   ok              : boolean ) ;
 
VAR
      i : integer ;
      c_keystroke : vt_keystroke ;
      x1 : tsp00_VtKey ;
 
BEGIN
WITH sql04_vt_record DO
    BEGIN
    sql04_knack_hif (hif ) ;
    hif_old := hif ;
    IF  options <> options_old
    THEN
        BEGIN
        sql04_knack_options ( options ) ;
        options_old := options ;
        END ;
    (*ENDIF*) 
    sqlctio ( screen_buf , attributes_buf , cursorline, cursorcolumn,
          c_sk_text,
          hif.sys_text, hif.sys_attr, hif.insert_label.text, insert_pos,
          insert_opt, c_vt_options, c_returnkeys, c_reject_keys,
          result.num_of_lines, result.num_of_cols , result.mark_begin,
          result.mark_end, result.screen_changed, c_keystroke,
          refresh, ok ) ;
    (* Belegen des Records mit der zuletzt gedrueckten Taste oder dem
          letzten
          Zeichen *)
    result.keystroke.key := vt_unknown;
    FOR x1 := vt_unknown TO vt_last_key
          DO
        IF  c_keystroke.vt_key = chr ( ord (x1) - ord ( vt_unknown ) )
        THEN
            result.keystroke.key := x1;
        (*ENDIF*) 
    (*ENDFOR*) 
    IF  result.keystroke.key IN [ vt_mouse_down, vt_mouse_up, vt_mouse_dbl ]
    THEN
        BEGIN
        result.keystroke.mouse_x := c_keystroke.mouse_x;
        result.keystroke.mouse_y := c_keystroke.mouse_y;
        END
    ELSE
        BEGIN
        result.keystroke.ch := c_keystroke.ch ;
        END;
    (*ENDIF*) 
    END;
(*ENDWITH*) 
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sqlttable
            ( i             : tsp00_Int2 ;
            att             : tsp00_VtAttrib ;
            foreground      : tsp00_VtColor ;
            background      : tsp00_VtColor ) ;
 
VAR
      att_array       : tsp00_C5 ;
 
BEGIN
WITH sql04_vt_record DO
    BEGIN
    att_array [1] := chr ( ord ( vt_bright      IN att ) ) ;
    att_array [2] := chr ( ord ( vt_inverse     IN att ) );
    att_array [3] := chr ( ord ( vt_underline   IN att ) );
    att_array [4] := chr ( ord ( vt_blink       IN att ) );
    att_array [5] := chr ( ord ( vt_invisible   IN att ) );
    sqlcttable ( i , att_array , foreground , background ) ;
    END;
(*ENDWITH*) 
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sqlwindow
            ( parent_ref    : tsp00_Int4 ;
            VAR position    : tsp00_VtRectangle ;
            VAR desc        : tsp00_TerminalDescription;
            VAR ok          : boolean ) ;
 
BEGIN
ok := false ;
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sqlwsplit (
            term_ref        : tsp00_Int4 ;
            nr_screens      : tsp00_Int2 ;
            VAR desc        : tsp00_TerminalDescription;
            VAR offset      : tsp00_Int2 ;
            VAR ok          : boolean ) ;
 
BEGIN
ok := false ;
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sqlwoff (
            term_ref        : tsp00_Int4 ;
            VAR screen_buf  : tsp00_ScreenBufAddr ;
            VAR attribute_buf : tsp00_ScreenBufAddr ;
            VAR color_buf   : tsp00_ScreenBufAddr ) ;
 
BEGIN
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sqlwdgswitch (
            box_id          : tsp00_Int2 ;
            trigger         : tsp00_VtKeys ;
            retrn           : tsp00_VtKey ;
            VAR ok          : boolean ) ;
 
BEGIN
ok := false ;
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sqlwdgclear (
            box_id          : tsp00_Int2 ) ;
 
BEGIN
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sqlwdgset (
            box_id          : tsp00_Int2 ;
            item_id         : tsp00_Int2 ;
            VAR text        : screenline ;
            text_len        : tsp00_Int2 ;
            VAR ok          : boolean ) ;
 
BEGIN
ok := false ;
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sqlwdgget (
            box_id          : tsp00_Int2 ;
            item_id         : tsp00_Int2 ;
            VAR text        : screenline ;
            VAR text_len    : tsp00_Int2 ;
            VAR ok          : boolean ) ;
 
BEGIN
ok := false ;
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sqlwtitle (
            term_ref        : tsp00_Int4 ;
            screen_nr       : tsp00_Int2 ;
            VAR text        : screenline ;
            text_len        : tsp00_Int2 ;
            VAR ok          : boolean ) ;
 
BEGIN
ok := false ;
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sqlwscroll (
            term_ref        : tsp00_Int4 ;
            VAR rect        : tsp00_VtRectangle ;
            displ_x         : tsp00_Int2 ;
            displ_y         : tsp00_Int2 ;
            VAR ok          : boolean ) ;
 
BEGIN
ok := false ;
END ;
 
(*------------------------------*) 
 
PROCEDURE
      sqlwscbar (
            term_ref        : tsp00_Int4 ;
            screen_nr       : tsp00_Int2 ;
            t               : tsp00_VtScroll ;
            range_beg       : tsp00_Int2 ;
            range_end       : tsp00_Int2 ;
            pos             : tsp00_Int2 ;
            VAR ok          : boolean ) ;
 
BEGIN
ok := false ;
END ;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
*-PRETTY-*  statements    :        132
*-PRETTY-*  lines of code :        620        PRETTYX 3.10 
*-PRETTY-*  lines in file :        928         1997-12-10 
.PA 
