home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / the25.zip / thesrc251.zip / query.c < prev    next >
C/C++ Source or Header  |  1998-06-08  |  156KB  |  4,609 lines

  1. /***********************************************************************/
  2. /* QUERY.C - Functions related to QUERY,STATUS and EXTRACT             */
  3. /***********************************************************************/
  4. /*
  5.  * THE - The Hessling Editor. A text editor similar to VM/CMS xedit.
  6.  * Copyright (C) 1991-1997 Mark Hessling
  7.  *
  8.  * This program is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License as
  10.  * published by the Free Software Foundation; either version 2 of
  11.  * the License, or any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16.  * General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to:
  20.  *
  21.  *    The Free Software Foundation, Inc.
  22.  *    675 Mass Ave,
  23.  *    Cambridge, MA 02139 USA.
  24.  *
  25.  *
  26.  * If you make modifications to this software that you feel increases
  27.  * it usefulness for the rest of the community, please email the
  28.  * changes, enhancements, bug fixes as well as any and all ideas to me.
  29.  * This software is going to be maintained and enhanced as deemed
  30.  * necessary by the community.
  31.  *
  32.  * Mark Hessling                 Email:             M.Hessling@qut.edu.au
  33.  * PO Box 203                    Phone:                    +617 3802 0800
  34.  * Bellara                       http://www.gu.edu.au/gext/the/markh.html
  35.  * QLD 4507                      **** Maintainer PDCurses & REXX/SQL ****
  36.  * Australia                     ************* Author of THE ************
  37.  */
  38.  
  39. /*
  40. $Id: query.c 2.1 1995/06/24 16:30:52 MH Rel MH $
  41. */
  42.  
  43. #include <the.h>
  44. #include <proto.h>
  45.  
  46. #include <query.h>
  47.  
  48. #ifdef HAVE_PROTO
  49. static short extract_pending(short,CHARTYPE *);
  50. static short extract_point(short,CHARTYPE *);
  51. static short extract_prefix(short,CHARTYPE *);
  52. static short extract_reserved(short,CHARTYPE *,CHARTYPE);
  53. static short extract_ring(short,CHARTYPE *,CHARTYPE);
  54. static short extract_colour(short,CHARTYPE *,CHARTYPE,CHARTYPE *,bool);
  55. static void get_etmode(CHARTYPE *,CHARTYPE *);
  56. #else
  57. static short extract_pending();
  58. static short extract_point();
  59. static short extract_prefix();
  60. static short extract_reserved();
  61. static short extract_ring();
  62. static short extract_colour();
  63. static void get_etmode();
  64. #endif
  65.  
  66. /*man-start*********************************************************************
  67.  
  68.  
  69. ========================================================================
  70. QUERY, EXTRACT and STATUS
  71. ========================================================================
  72.  
  73.      The following lists the valid variables that can be queried and
  74.      also shows what values are returned. For both <QUERY> and <STATUS>,
  75.      the values are concatenated together and displayed as a single
  76.      line. For <EXTRACT> the REXX variables that are set are defined.
  77.      The capitalised portion of the variable is the minimum abbreviation
  78.      recognised.
  79.  
  80.      The bracketed text at the end of the description indicates from
  81.      which commands a valid response will be supplied.
  82.      (Q-Query, E-Extract, M-Modify and S-Status).
  83.  
  84. ALT
  85.      The number of alterations to the current file since the last <SAVE>
  86.      or automatic save via <SET AUTOSAVE>.
  87.      (QES)
  88.  
  89.      alt.0           - 2
  90.      alt.1           - Number of alterations since last SAVE or autosave
  91.      alt.2           - Number of alterations since last SAVE
  92.  
  93. ARBchar
  94.      The status of <SET ARBCHAR> and the ARBCHAR characters.
  95.      (QEMS)
  96.  
  97.      arbchar.0       - 3
  98.      arbchar.1       - ON|OFF
  99.      arbchar.2       - multiple match character
  100.      arbchar.3       - single match character
  101.  
  102. AUtosave
  103.      The status of <SET AUTOSAVE> and/or the frequency setting.
  104.      (QEMS)
  105.  
  106.      autosave.0      - 1
  107.      autosave.1      - OFF|n
  108.  
  109. BACKup
  110.      Indicates if a .bak file is kept after editing.
  111.      (QEMS)
  112.  
  113.      backup.0        - 1
  114.      backup.1        - ON|OFF|TEMP|KEEP
  115.  
  116. BEEP
  117.      Indicates if the bell is sounded on display of error messages.
  118.      Set by <SET BEEP>
  119.      (QEMS)
  120.  
  121.      beep.0          - 1
  122.      beep.1          - ON|OFF
  123.  
  124. BLOCK
  125.      Returns information about the marked <block>, if any.
  126.      (QE)
  127.  
  128.      block.0         - 6 if a marked block exists, or 1 for NONE
  129.      block.1         - type of marked block (LINE|BOX|NONE|WORD|COLUMN)
  130.      block.2         - line number of start of block
  131.      block.3         - column number of start of block
  132.      block.4         - line number of end of block
  133.      block.5         - column number of end of block
  134.      block.6         - file name containing marked block
  135.  
  136. CASE
  137.      The settings related to the CASE of characters entered, searched
  138.      for, changed and sorted. Set by <SET CASE>
  139.      (QEMS)
  140.  
  141.      case.0          - 4
  142.      case.1          - MIXED|UPPER|LOWER
  143.      case.2          - RESPECT|IGNORE
  144.      case.3          - RESPECT|IGNORE
  145.      case.4          - RESPECT|IGNORE
  146.  
  147. CLEARScreen
  148.      Indicates if the screen is cleared on exit from THE. Set by
  149.      <SET CLEARSCREEN>.
  150.      (QEMS)
  151.  
  152.      clearscreen.0   - 1
  153.      clearscreen.1   - ON|OFF
  154.  
  155. CLOCK
  156.      Indicates if the time is displayed on the status line. Set by
  157.      <SET CLOCK>.
  158.      (QEMS)
  159.  
  160.      clock.0         - 1
  161.      clock.1         - ON|OFF
  162.  
  163. CMDArrows
  164.      Returns the settings for arrow key behaviour on <command line>.
  165.      Set by <SET CMDARROWS>.
  166.      (QEMS)
  167.  
  168.      cmdarrows.0     - 1
  169.      cmdarrows.1     - RETRIEVE|TAB
  170.  
  171. CMDline
  172.      The settings for the <command line>. Set by <SET CMDLINE>.
  173.      (QEMS)
  174.  
  175.      If CMDLINE OFF
  176.  
  177.      cmdline.0       - 1
  178.      cmdline.1       - OFF
  179.  
  180.      If CMDLINE ON, BOTTOM or TOP
  181.  
  182.      cmdline.0       - 3
  183.      cmdline.1       - ON|TOP|BOTTOM
  184.      cmdline.2 *     - line number within window of command line
  185.      cmdline.3 *     - contents of command line
  186.  
  187.      * these values are only returned with <EXTRACT>
  188.  
  189. COLOR [*|area]
  190. COLOUR [*|area]
  191.      Displays the current color settings for the file.
  192.      Set by <SET COLOR>.
  193.  
  194.      With the ['*'] option, (or no option), returns color settings
  195.      for all areas of the screen.
  196.      (QE)
  197.  
  198.      color.0         - 23
  199.      color.1         - FILEAREA   followed by its color
  200.      color.2         - CURLINE    followed by its color
  201.      color.3         - BLOCK      followed by its color
  202.      color.4         - CBLOCK     followed by its color
  203.      color.5         - CMDLINE    followed by its color
  204.      color.6         - IDLINE     followed by its color
  205.      color.7         - MSGLINE    followed by its color
  206.      color.8         - ARROW      followed by its color
  207.      color.9         - PREFIX     followed by its color
  208.      color.10        - PENDING    followed by its color
  209.      color.11        - SCALE      followed by its color
  210.      color.12        - TOFEOF     followed by its color
  211.      color.13        - CTOFEOF    followed by its color
  212.      color.14        - TABLINE    followed by its color
  213.      color.15        - SHADOW     followed by its color
  214.      color.16        - STATAREA   followed by its color
  215.      color.17        - DIVIDER    followed by its color
  216.      color.18        - RESERVED   followed by its color
  217.      color.19        - NONDISP    followed by its color
  218.      color.20        - HIGHLIGHT  followed by its color
  219.      color.21        - CHIGHLIGHT followed by its color
  220.      color.22        - SLK        followed by its color
  221.      color.23        - GAP        followed by its color
  222.  
  223.      With the ['area'] option, returns color settings
  224.      for the specified  area of the screen.
  225.      (E)
  226.  
  227.      color.0         - 1
  228.      color.1         - ['area'] followed by its color
  229.  
  230. COLUMN
  231.      Displays the current value of the focus column.
  232.      (QE)
  233.  
  234.      column.0        - 1
  235.      column.1        - Column number of focus column
  236.  
  237. COMPAT
  238.      The settings for the compatibility mode. Set by <SET COMPAT>.
  239.      (QEMS)
  240.  
  241.      compat.0        - 3
  242.      compat.1        - THE|XEDIT|KEDIT (compatibility LOOK)
  243.      compat.2        - THE|XEDIT|KEDIT (compatibility FEEL)
  244.      compat.3        - THE|XEDIT|KEDIT (compatibility KEYS)
  245.  
  246. CURline
  247.      The value and position of the <current line> within the current file.
  248.      Set by <SET CURLINE>. Also provides the contents of the <focus line>
  249.      and an indication of the status of the <focus line> for the current
  250.      session.
  251.      (QEMS)
  252.  
  253.      With <EXTRACT> command:
  254.  
  255.      curline.0       - 6
  256.      curline.1       - curline setting
  257.      curline.2       - line number within window of current line
  258.      curline.3       - contents of focus line
  259.      curline.4       - ON|OFF (ON if line has changed or been added this session)
  260.      curline.5       - OLD|OLD CHANGED|NEW CHANGED
  261.      curline.6       - selection level of focus line (same as select.1)
  262.  
  263.      The setting of curline.5 is as follows:
  264.        OLD:            The line existed in its current form in the
  265.                        file before THE began.
  266.        OLD CHANGED:    The line was in the file before THE started, 
  267.                        but has been changed during the current editing
  268.                        session.
  269.        NEW CHANGED:    The line has been added to the file during
  270.                        the current editing session.
  271.  
  272.      With <QUERY>, <MODIFY> and <STATUS> commands:
  273.  
  274.      curline.0       - 1
  275.      curline.1       - curline setting
  276.  
  277. CURSor
  278.      The position of the cursor within the displayed screen and file
  279.      at the time the <EXTRACT> /CURSOR/ is issued and the position of
  280.      the cursor at the time the <macro> was issued.
  281.      If the cursor is not in the <filearea>, then line and column
  282.      values will be set to -1.
  283.      (QE)
  284.  
  285.      cursor.0        - 8
  286.      cursor.1        - line number of cursor in screen (current)
  287.      cursor.2        - column number of cursor in screen (current)
  288.      cursor.3        - line number of cursor in file (current)
  289.      cursor.4        - column number of cursor in file (current)
  290.      cursor.5        - line number of cursor in screen (original)
  291.      cursor.6        - column number of cursor in screen (original)
  292.      cursor.7        - line number of cursor in file (original)
  293.      cursor.8        - column number of cursor in file (original)
  294.  
  295. CURSORSTay
  296.      The setting for the behaviour of the cursor after a file scroll.
  297.      Set by <SET CURSORSTAY>.
  298.      (QEMS)
  299.  
  300.      cursorstay.0    - 1
  301.      cursorstay.1    - ON|OFF
  302.  
  303. DEFSORT
  304.      Specifies the order in which files are sorted in the DIR.DIR file.
  305.      Set by <SET DEFSORT>.
  306.      (QEMS)
  307.  
  308.      defsort.0       - 2
  309.      defsort.1       - DIRECTORY|NAME|SIZE|TIME|DATE|OFF
  310.      defsort.2       - ASCENDING|DESCENDING
  311.  
  312. DIRFILEID
  313.      The value of the path and filename of the focus line in a DIR.DIR
  314.      file.
  315.      (E)
  316.  
  317.      dirfileid.0     - 2
  318.      dirfileid.1     - full path of directory
  319.      dirfileid.2     - file name at focus line
  320.  
  321. DISPlay
  322.      Indicates the range of selection levels current. Set by
  323.      <SET DISPLAY>.
  324.      (QEMS)
  325.  
  326.      display.0       - 2
  327.      display.1       - display low value
  328.      display.2       - display high value
  329.  
  330. EOF
  331.      Indicates if the <current line> is on the <Bottom-of-File line>.
  332.      (QES)
  333.  
  334.      eof.0           - 1
  335.      eof.1           - ON|OFF
  336.  
  337. EOLout
  338.      Returns the value of the end-of-line character(s).
  339.      (QEMS)
  340.  
  341.      eolout.0        - 1
  342.      eolout.1        - LF|CRLF|CR|NONE
  343.  
  344. ETMODE
  345.      Indicates if extended display mode is set. Set by <SET ETMODE>.
  346.      (QEMS)
  347.  
  348.      etmode.0        - 2
  349.      etmode.1        - ON|OFF
  350.      etmode.2        - character ranges if not all ON or OFF
  351.  
  352. FExt
  353.      The extension of the current file. The characters following
  354.      the trailing '.' character. Same as FType.
  355.      (QEM)
  356.  
  357.      fext.0          - 1
  358.      fext.1          - File extension.
  359.  
  360. FIELD
  361.      Details about the current cursor field.
  362.      (QE)
  363.  
  364.      field.0         - 4
  365.      field.1         - contents of the cursor field
  366.      field.2         - character under the cursor
  367.      field.3         - column position in the cursor field
  368.      field.4         - COMMAND|TEXT|PREFIX
  369.  
  370. FILEName
  371.      The full filename of the current file, including any file
  372.      extension.
  373.      (QEM)
  374.  
  375.      filename.0      - 1
  376.      filename.1      - Full file name.
  377.  
  378. FMode
  379.      The file mode of the current file. Undex Un*x, theis will
  380.      always return an empty string. Other platforms returns the
  381.      first character of the file's path. ie the disk drive.
  382.      (QEM)
  383.  
  384.      fmode.0         - 1
  385.      fmode.1         - File mode.
  386.  
  387. FName
  388.      The fname portion of the current file. See <SET FILENAME> for a
  389.      full description of the components of a file name.
  390.      (QEM)
  391.  
  392.      fname.0         - 1
  393.      fname.1         - File name.
  394.  
  395. FPath
  396.      The path name of the current file. This includes a trailing
  397.      directory separator.
  398.      (QEM)
  399.  
  400.      fpath.0         - 1
  401.      fpath.1         - File path.
  402.  
  403. FType
  404.      The extension of the current file. The characters following
  405.      the trailing '.' character.
  406.      (QEM)
  407.  
  408.      ftype.0         - 1
  409.      ftype.1         - File extension.
  410.  
  411. FULLFName
  412.      Indicates if the fully qualified filename is displayed on the
  413.      <idline>.
  414.      (QEMS)
  415.  
  416.      fullfname.0     - 1
  417.      fullfname.1     - ON|OFF
  418.  
  419. GETENV variable
  420.      The value of the supplied environment 'variable' or ***invalid***
  421.      if the 'variable' does not exist. On platforms other than Unix
  422.      the supplied variable name is uppercased before obtaining the
  423.      environment variable value.
  424.      (E)
  425.  
  426.      getenv.0        - 1
  427.      getenv.1        - value of variable
  428.  
  429. HEX
  430.      Indicates if hexadecimal values in commands are interpreted
  431.      as hexadecimal values or not. Set by <SET HEX>.
  432.      (QEMS)
  433.  
  434.      hex.0           - 1
  435.      hex.1           - ON|OFF
  436.  
  437. HEXDISPlay
  438.      Indicates if the current character is displayed on the <status line>.
  439.      Set by <SET HEXDISPLAY>.
  440.      (QEMS)
  441.  
  442.      hexdisplay.0    - 1
  443.      hexdisplay.1    - ON|OFF
  444.  
  445. HEXShow
  446.      Returns details of HEXSHOW placement. Set by <SET HEXSHOW>.
  447.      (QEMS)
  448.  
  449.      hexshow.0       - 2
  450.      hexshow.1       - ON|OFF
  451.      hexshow.2       - line displaying first hexshow line
  452.  
  453. HIGHlight
  454.      Returns details of HIGHLIGHT settings. Set by <SET HIGHLIGHT>.
  455.      (QEMS)
  456.  
  457.      highlight.0     - 1 or 3 (if highlight.1 = SELECT)
  458.      highlight.1     - OFF|ALTERED|TAGGED|SELECT
  459.      highlight.2     - minimum (or only) selection level for SELECT
  460.      highlight.3     - maximum selection level for SELECT
  461.  
  462. IDline
  463.      Indicates if the <idline> is displayed for a file. Set by
  464.      <SET IDLINE>.
  465.      (QEMS)
  466.  
  467.      idline.0        - 1
  468.      idline.1        - ON|OFF
  469.  
  470. IMPMACro
  471.      Indicates if implied <macro> processing is on or off. Set by
  472.      <SET IMPMACRO>.
  473.      (QEMS)
  474.  
  475.      impmacro.0      - 1
  476.      impmacro.1      - ON|OFF
  477.  
  478. IMPOS
  479.      Indicates if implied operating system command processing is on 
  480.      or off. Set by <SET IMPOS> or <SET IMPCMSCP>.
  481.      (QEMS)
  482.  
  483.      impos.0         - 1
  484.      impos.1         - ON|OFF
  485.  
  486. INPUTMode
  487.      Indicates the inputmode for the current view.
  488.      Set by <SET INPUTMODE>.
  489.      (QEMS)
  490.  
  491.      inputmode.0     - 1
  492.      inputmode.1     - OFF|FULL|LINE
  493.  
  494. INSERTmode
  495.      Indicates if currently in insert mode or overstrike mode. Set by
  496.      <SET INSERTMODE>.
  497.      (QEMS)
  498.  
  499.      insertmode.1    - 1
  500.      insertmode.1    - ON|OFF
  501.  
  502. LASTmsg
  503.      Return the text of the last error message generated.
  504.      (E)
  505.  
  506.      lastmsg.0       - 1
  507.      lastmsg.1       - text of last message.
  508.  
  509. LASTRC
  510.      Return code from last command issued from <command line>.
  511.      (QES)
  512.  
  513.      lastrc.0        - 1
  514.      lastrc.1        - Last return code.
  515.  
  516. LENgth
  517.      Length of the current line.
  518.      (QES)
  519.  
  520.      length.0        - 1
  521.      length.1        - Length of current line.
  522.  
  523. LIne
  524.      Line number of <focus line> in current file.
  525.      (QES)
  526.  
  527.      line.0          - 1
  528.      line.1          - Line number
  529.  
  530. LINEFLAG
  531.      Returns information about the flags set on the <focus line>
  532.      (QEMS)
  533.  
  534.      lineflag.0      - 3
  535.      lineflag.1      - NEW|NONEW
  536.      lineflag.2      - CHANGE|NOCHANGE
  537.      lineflag.3      - TAG|NOTAG
  538.  
  539. LINENd
  540.      Indicates if multiple commands allowed on command line
  541.      and the delimiter. Set by <SET LINEND>.
  542.      (QEMS)
  543.  
  544.      linend.0        - 2
  545.      linend.1        - ON|OFF
  546.      linend.2        - delimiter
  547.  
  548. LScreen
  549.      Displays the size of the current screen and window. Also
  550.      shows the upper left corner of the window.
  551.      (QE)
  552.  
  553.      lscreen.0       - 6
  554.      lscreen.1       - height of current window
  555.      lscreen.2       - width of current window
  556.      lscreen.3       - screen line of upper left corner of window
  557.      lscreen.4       - screen column of upper left corner of window
  558.      lscreen.5       - height of screen
  559.      lscreen.6       - width of screen
  560.  
  561. MACRO
  562.      Indicates if macros are executed before commands. Set by
  563.      <SET MACRO>.
  564.      (QEMS)
  565.  
  566.      macro.0         - 1
  567.      macro.1         - ON|OFF
  568.  
  569. MACROExt
  570.      The current setting for a macro's file extension. Set by
  571.      <SET MACROEXT>.
  572.      (QEMS)
  573.  
  574.      macroext.0      - 1
  575.      macroext.1      - Default file extension
  576.  
  577. MACROPath
  578.      The path that THE looks for by default for macro files. Set by
  579.      <SET MACROPATH>.
  580.      (QEMS)
  581.  
  582.      macropath.0     - 1
  583.      macropath.1     - Path for macro files.
  584.  
  585. MARgins
  586.      The settings for left and right margins and paragraph indent.
  587.      Set by <SET MARGINS>.
  588.      (QEMS)
  589.  
  590.      margins.0       - 3
  591.      margins.1       - left column
  592.      margins.2       - right column
  593.      margins.3       - indent value (column or offset from left margin)
  594.  
  595. MONITOR
  596.      Indicates if the combination of monitor and the curses package
  597.      supports colour. If the curses package supports colour, then
  598.      monitor.1 is set to COLOR and monitor.2 can be COLOR or MONO
  599.      depending on whether the monitor supports colour. If monitor.1
  600.      is MONO then monitor.2 will also be set to MONO.
  601.      (QES)
  602.  
  603.      monitor.0       - 2
  604.      monitor.1       - COLOR|MONO
  605.      monitor.2       - COLOR|MONO
  606.  
  607. MSGLine
  608.      Returns details of where the <message line> is displayed. Set by
  609.      <SET MSGLINE>.
  610.      (QEMS)
  611.  
  612.      msgline.0       - 4
  613.      msgline.1       - ON
  614.      msgline.2       - line position of <message line>
  615.      msgline.3       - number of message lines available
  616.      msgline.4       - OVERLAY (returned for compatibility reasons)
  617.  
  618. MSGMode
  619.      Indicates if messages are suppressed. Set by <SET MSGMODE>.
  620.      (QEMS)
  621.  
  622.      msgmode.0       - 1
  623.      msgmode.1       - ON|OFF
  624.  
  625. NBFile
  626.      Returns with the number of files currently in the <ring>.
  627.      (QES)
  628.  
  629.      nbfile.0        - 1
  630.      nbfile.1        - Number of files in ring
  631.  
  632. NEWLines
  633.      Indicates if NEWLINES variable is set to LEFT or ALIGNED.
  634.      Set by <SET NEWLINES>.
  635.      (QEMS)
  636.  
  637.      newlines.0      - 1
  638.      newlines.1      - ALIGNED|LEFT
  639.  
  640. NONDisp
  641.      Returns the character that is displayed for extended characters
  642.      that are not displayed. Set by <SET NONDISP>.
  643.      (QEMS)
  644.  
  645.      nondisp.0       - 1
  646.      nondisp.1       - char
  647.  
  648. MOUSE
  649.      Indicates if mouse support has been enabled.
  650.      Set by <SET MOUSE>.
  651.      (QEMS)
  652.  
  653.      mouse.0         - 1
  654.      mouse.1         - ON|OFF
  655.  
  656. NUMber
  657.      Indicates if line numbers are displayed in the prefix area.
  658.      Set by <SET NUMBER>.
  659.      (QEMS)
  660.  
  661.      number.0        - 1
  662.      number.1        - ON|OFF
  663.  
  664. PENDing [BLOCK] [OLDNAME] name|*
  665.      Returns information about pending prefix commands.
  666.      (E)
  667.  
  668.      pending.0       - 4
  669.      pending.1       - line number in file
  670.      pending.2       - newname - actual name entered in prefix area
  671.      pending.3       - oldname - original name of macro after synonym resolution
  672.      pending.4       - BLOCK or null
  673.  
  674. Point [*]
  675.      Returns the name and line number of the focus line, or names and
  676.      line numbers of all lines in a file if '*' is specified.
  677.      (QE)
  678.  
  679.      With no arguments:
  680.  
  681.      point.0         - 0 or 1       (0 if focus line not named)
  682.      point.1         - line number and name of line (if line is named)
  683.  
  684.      With ['*'] argument:
  685.      (E)
  686.  
  687.      point.0         - number of named lines in the file
  688.      point.1         - line number and name for first named line
  689.      point.n         - line number and name for nth named line
  690.  
  691. POSition
  692.      Indicates if LINE/COL is displayed on <idline>. Set by
  693.      <SET POSITION>.
  694.      (QMS)
  695.  
  696.      position.0      - 1
  697.      position.1      - ON|OFF
  698.  
  699.      The current/focus line/column is also returned via <EXTRACT>.
  700.      (E)
  701.  
  702.      position.0      - 3
  703.      position.1      - ON|OFF
  704.      position.2      - current or focus line
  705.      position.3      - current or focus column
  706.  
  707. PREfix [Synonym [*]]
  708.      Indicates if prefix is displayed for the view and if displayed
  709.      where is is displayed. See <SET PREFIX>.
  710.      (QEMS)
  711.  
  712.      prefix.0        - 1 or 2     (1 if prefix.1 is OFF, 2 otherwise)
  713.      prefix.1        - ON|OFF|NULLS
  714.      prefix.2        - LEFT|RIGHT        (if prefix.1 is ON or NULLS)
  715.      prefix.3        - width of prefix area
  716.      prefix.4        - width of prefix gap
  717.  
  718.      With ['Synonym'] option, the name of the macrofile (oldname)
  719.      is returned that is associated with the synonym. If name 
  720.      is not a synonym then name is returned.
  721.      (E)
  722.  
  723.      prefix.0        - 1
  724.      prefix.1        - oldname
  725.  
  726.      With ['Synonym' ['*']] option, all prefix synonyms are returned.
  727.      (E)
  728.  
  729.      prefix.0        - number of prefix synonyms
  730.      prefix.1        - newname oldname
  731.      prefix.n        - newname oldname
  732.  
  733. PRINTER
  734.      Returns the value of the printer port or spooler. Set by
  735.      <SET PRINTER>
  736.      (QEMS)
  737.  
  738.      printer.0       - 1
  739.      printer.1       - port or spooler name
  740.  
  741. REPROFile
  742.      Indicates if the <profile> is to be re-executed for each
  743.      subsequent file to be edited. Set by <SET REPROFILE>.
  744.      (QEMS)
  745.  
  746.      reprofile.0     - 1
  747.      reprofile.1     - ON|OFF
  748.  
  749. RESERved [*]
  750.      Return with list of the screen rows that have been reserved.
  751.      Set by <SET RESERVED>.
  752.      (QES)
  753.  
  754.      reserved.0      - 0 if no reserved lines; 1 otherwise
  755.      reserved.1      - list of screen row numbers reserved
  756.  
  757.      With ['*'] option, the line number, followed by the colour
  758.      specification and <reserved line> contents are returned; one
  759.      variable for each reserved line.
  760.      (E)
  761.  
  762.      reserved.0      - the number of reserved lines
  763.      reserved.1      - first reserved line
  764.      reserved.2      - second reserved line
  765.      reserved.n      - nth reserved line
  766.  
  767. REXXOUTput
  768.      Indicates if <REXX> output is captured to a file or not and the
  769.      line number limit of lines to be displayed. Set by <SET REXXOUTPUT>.
  770.      (QEMS)
  771.  
  772.      rexxoutput.0    - 2
  773.      rexxoutput.1    - FILE|DISPLAY
  774.      rexxoutput.2    - line number limit
  775.  
  776. RING
  777.      Returns details of each file being edited.
  778.      (QE)
  779.  
  780.      With COMPAT set to XEDIT(feel), the values set are:
  781.  
  782.      ring.0          - number of variables returned (ring.1 + 1)
  783.      ring.1          - number of files in the <ring>
  784.      ring.2          - IDLINE of first file in the ring
  785.      ring.3          - IDLINE of second file in the ring
  786.      ring.n          - IDLINE of nth file in the ring
  787.  
  788.      With COMPAT set to THE or KEDIT(feel), the values set are:
  789.  
  790.      ring.0          - number of files in the <ring>
  791.      ring.1          - IDLINE of first file in the ring
  792.      ring.2          - IDLINE of second file in the ring
  793.      ring.n          - IDLINE of nth file in the ring
  794.  
  795. SCALe
  796.      Returns details of <scale line>. Set by <SET SCALE>.
  797.      (QEMS)
  798.  
  799.      scale.0         - 2
  800.      scale.1         - ON|OFF
  801.      scale.2         - line displaying scale line
  802.  
  803. SCOPE
  804.      Returns information about whether <shadow line>s will be affected by
  805.      commands or not. Set by <SET SCOPE>.
  806.      (QEMS)
  807.  
  808.      scope.0         - 1
  809.      scope.1         - ALL|DISPLAY
  810.  
  811. SCReen
  812.      Returns the number and orientation of THE screens. Set by 
  813.      <SET SCREEN>.
  814.      (QEMS)
  815.  
  816.      screen.0        - 2
  817.      screen.1        - Number of screens displayed
  818.      screen.2        - HORIZONTAL|VERTICAL
  819.  
  820. SELect
  821.      Returns the selection level of the <focus line> and the
  822.      maximum selection level for the file. Set by <SET SELECT> and
  823.      <ALL> commands.
  824.      (QES)
  825.  
  826.      select.0        - 2
  827.      select.1        - selection level of focus line
  828.      select.2        - maximum selection level for file
  829.  
  830. SHADow
  831.      Returns the status of the display of shadow lines. Set by
  832.      <SET SHADOW>.
  833.      (QEMS)
  834.  
  835.      shadow.0        - 1
  836.      shadow.1        - ON|OFF
  837.  
  838. SHOWkey key
  839.      Returns the commands and parameters assigned to the 'key'
  840.      passed as an argument.  This keyvalue is returned as
  841.      READV.3 from a call to <READV> KEY.
  842.      (E)
  843.  
  844.      showkey.0       - the number of commands assigned
  845.      showkey.1       - first command/parameter assigned
  846.      showkey.n       - last command/parameter assigned
  847.  
  848.      If no 'key' supplied as a parameter:
  849.  
  850.      showkey.0       - 1
  851.      showkey.1       - INVALID KEY
  852.  
  853. SIze
  854.      Returns the number of lines in the current file.
  855.      (QES)
  856.  
  857.      size.0          - 1
  858.      size.1          - Lines in current file.
  859.  
  860. STATUSLine
  861.      Indicates if the <status line> is displayed and if so, where.
  862.      Set by <SET STATUSLINE>.
  863.      (QEMS)
  864.  
  865.      statusline.0    - 1
  866.      statusline.1    - TOP|BOTTOM|OFF
  867.  
  868. STAY
  869.      Indicates if the focus line stays where it is after a successful
  870.      THE command or an unsuccessful <LOCATE> command.  Set by <SET STAY>.
  871.      (QEMS)
  872.  
  873.      stay.0          - 1
  874.      stay.1          - ON|OFF
  875.  
  876. TABKey
  877.      Returns settings about behaviour of TAB key.
  878.      tabkey.1 indicates behaviour while not in insert mode
  879.      tabkey.2 indicates behaviour while in insert mode
  880.      Set by <SET TABKEY>.
  881.      (QEMS)
  882.  
  883.      tabkey.0        - 2
  884.      tabkey.1        - TAB|CHARACTER
  885.      tabkey.2        - TAB|CHARACTER
  886.  
  887. TABLine
  888.      Returns details of if and where the <tab line> is displayed.
  889.      Set by <SET TABLINE>.
  890.      (QEMS)
  891.  
  892.      tabline.0       - 2
  893.      tabline.1       - ON|OFF
  894.      tabline.2       - line displaying tab line
  895.  
  896. TABS
  897.      Returns settings about tab columns. Set by <SET TABS>.
  898.      (QEMS)
  899.  
  900.      tabs.0          - 1
  901.      tabs.1          - actual tab columns or "INCR n"
  902.  
  903. TABSIn
  904.      Indicates if TABSIN processing is on or off and the size of the
  905.      tabs setting. Set by <SET TABSIN>.
  906.      (QEMS)
  907.  
  908.      tabsin.0        - 2
  909.      tabsin.1        - ON|OFF
  910.      tabsin.2        - size of tabs
  911.  
  912. TABSOut
  913.      Indicates if TABSOUT processing is on or off and the size of the
  914.      tabs setting. Set by <SET TABSOUT>.
  915.      (QEMS)
  916.  
  917.      tabsout.0       - 2
  918.      tabsout.1       - ON|OFF
  919.      tabsout.2       - size of tabs
  920.  
  921. TERMinal
  922.      Identifies the terminal type currently being used.
  923.      (QES)
  924.  
  925.      terminal.0      - 1
  926.      terminal.1      - DOS|OS2|X11|WIN32|$TERM value under Unix
  927.  
  928. TOF
  929.      Indicates if the <current line> is on the <Top-of-File line>.
  930.      (QES)
  931.  
  932.      tof.0           - 1
  933.      tof.1           - ON|OFF
  934.  
  935. TYPEAhead
  936.      Indicates if THE will wait until all keyboard input has been
  937.      processed before updating the screen display. Set by
  938.      <SET TYPEAHEAD>.
  939.      (QEMS)
  940.  
  941.      typeahead.0     - 1
  942.      typeahead.1     - ON|OFF
  943.  
  944. UNDOING
  945.      Indicates if the undo facility is available or not.
  946.      Set by <SET UNDOING>
  947.      (QEMS)
  948.  
  949.      undoing.0       - 1
  950.      undoing.1       - ON|OFF
  951.  
  952. UNTAA
  953.      Indicates if "unsigned numbers are absolute".
  954.      Set by <SET UNTAA>
  955.      (QEMS)
  956.  
  957.      untaa.0         - 1
  958.      untaa.1         - ON|OFF
  959.  
  960. Verify
  961.      Returns verify column settings. Set by <SET VERIFY>.
  962.      (QEMS)
  963.  
  964.      verify.0        - 1
  965.      verify.1        - Column pair of verify start and end columns.
  966.  
  967. VERShift
  968.      Returns the value of the <vershift> internal variable.
  969.      (QES)
  970.  
  971.      vershift.0      - 1
  972.      vershift.1      - VERSHIFT value
  973.  
  974. VERSION
  975.      Returns information about name of application (THE) and version
  976.      information.
  977.      (QES)
  978.  
  979.      version.0       - 4
  980.      version.1       - THE
  981.      version.2       - version string eg. 1.5
  982.      version.3       - platform version (DOS,OS2,UNIX,X11,WIN32)
  983.      version.4       - version status information eg. release date, beta
  984.  
  985. Width
  986.      Returns maximum line width setting. Set by -w command line switch
  987.      on starting THE.
  988.      (QEMS)
  989.  
  990.      width.0         - 1
  991.      width.1         - Maximum line width value.
  992.  
  993. WORD
  994.      Specifies how THE defines a word. Set by <SET WORD>.
  995.      (QEMS)
  996.  
  997.      word.0          - 1
  998.      word.1          - ALPHANUM|NONBLANK
  999.  
  1000. WORDWrap
  1001.      Indicates if WORDWRAP is on or off. Set by <SET WORDWRAP>.
  1002.      (QEMS)
  1003.  
  1004.      wordwrap.0      - 1
  1005.      wordwrap.1      - ON|OFF
  1006.  
  1007. WRap
  1008.      Indicates if WRAP is on or off. Set by <SET WRAP>.
  1009.      (QEMS)
  1010.  
  1011.      wrap.0          - 1
  1012.      wrap.1          - ON|OFF
  1013.  
  1014. XTERMinal
  1015.      Returns the current value of the X11 terminal program.
  1016.      Only applicable in X version. Set by <SET XTERMINAL>.
  1017.      (QEMS)
  1018.  
  1019.      xterminal.0     - 1
  1020.      xterminal.1     - X11 terminal program
  1021.  
  1022. Zone
  1023.      Returns zone column settings. Set by <SET ZONE>.
  1024.      (QEMS)
  1025.  
  1026.      zone.0          - 2
  1027.      zone.1          - Zone start column
  1028.      zone.2          - Zone end column
  1029.  
  1030.  
  1031.  
  1032. ========================================================================
  1033. IMPLIED EXTRACT
  1034. ========================================================================
  1035.  
  1036.      The above <REXX> variables set by the <EXTRACT> command may also
  1037.      be obtained by a REXX macro as an implied EXTRACT. Each variable
  1038.      above that may be set by an explicit EXTRACT command may also be
  1039.      used as an external function to REXX to obtain the same information.
  1040.      eg. The REXX commands:
  1041.  
  1042.          'EXTRACT /SIZE/CURLINE/'
  1043.          Say size.1 curline.1
  1044.  
  1045.      may be substituted with:
  1046.  
  1047.          Say size.1() curline.1()
  1048.  
  1049.  
  1050. ========================================================================
  1051. BOOLEAN FUNCTIONS
  1052. ========================================================================
  1053.  
  1054.      THE also provides other information to the REXX interpreter via
  1055.      boolean functions. These functions return either '1' or '0'
  1056.      depending on the information queried.
  1057.  
  1058. after()
  1059.      Returns '1' if the cursor is currently after the last non-blank
  1060.      character on the line, or if the line is blank.
  1061.  
  1062. blank()
  1063.      Returns '1' if the line the <cursor field> is completely blank.
  1064.  
  1065. batch()
  1066.      Returns '1' if THE is being run in batch mode. ie THE was
  1067.      started with the -b switch.
  1068.  
  1069. block()
  1070.      Returns '1' if the marked <block> is within the current view.
  1071.  
  1072. before()
  1073.      Returns '1' if the cursor is currently before the first non-blank
  1074.      character on the line, or if the line is blank.
  1075.  
  1076. bottomedge()
  1077.      Returns '1' if the cursor is on the bottom edge of the <filearea>
  1078.      or <prefix area>.
  1079.  
  1080. command()
  1081.      Returns '1' if the <command line> is on. This is different to
  1082.      the definition in KEDIT; "Returns '1' if the cursor is on the
  1083.      command line." To get the equivalent KEDIT functionality
  1084.      use incommand();
  1085.  
  1086. current()
  1087.      Returns '1' if the cursor is on the <current line>.
  1088.  
  1089. dir()
  1090.      Returns '1' if the current file is the special DIR.DIR file.
  1091.  
  1092. end()
  1093.      Returns '1' if the cursor is on the last non-blank character on
  1094.      the line.
  1095.  
  1096. eof()
  1097.      Returns '1' if the cursor is on the <Bottom-of-File> line
  1098.      and the cursor is not on the <command line>.
  1099.  
  1100. first()
  1101.      Returns '1' if the cursor is in column 1 of the current window.
  1102.  
  1103. focuseof()
  1104.      Returns '1' if the focus line is the <Bottom-of-File> line
  1105.      whether the cursor is on it or not.
  1106.  
  1107. focustof()
  1108.      Returns '1' if the <focus line> is the <Top-of-File> line
  1109.      whether the cursor is on it or not.
  1110.  
  1111. inblock()
  1112.      Returns '1' if the cursor is in the marked <block>.
  1113.  
  1114. incommand()
  1115.      Returns '1' if the cursor is on the <command line>.
  1116.  
  1117. initial()
  1118.      Returns '1' if the function is called from the <profile>.
  1119.  
  1120. inprefix()
  1121.      Returns '1' if the cursor is located in the <prefix area>.
  1122.  
  1123. leftedge()
  1124.      Returns '1' if the cursor is on the left edge of the <filearea>.
  1125.  
  1126. modifiable()
  1127.      Returns '1' if the cursor is located in an area that can be changed.
  1128.      ie. not on <Top-of-File line> or <Bottom-of-File line> nor on a
  1129.      <shadow line>.
  1130.  
  1131. rightedge()
  1132.      Returns '1' if the cursor is on the right edge of the <filearea>.
  1133.  
  1134. shadow()
  1135.      Returns '1' if the cursor is on a <shadow line>.
  1136.  
  1137. spacechar()
  1138.      Returns '1' if the cursor is on a space character.
  1139.  
  1140. tof()
  1141.      Returns '1' if the cursor is on the <Top-of-File line>
  1142.      and the cursor is not on the <command line>.
  1143.  
  1144. topedge()
  1145.      Returns '1' if the cursor is on the top edge of the <filearea>.
  1146.  
  1147. verone()
  1148.      Returns '1' if the column 1 of the file is being displayed in
  1149.      column 1.
  1150.  
  1151. ========================================================================
  1152. OTHER FUNCTIONS
  1153. ========================================================================
  1154.  
  1155.      The following functions provide features to simplify THE macros
  1156.      written in REXX.
  1157.  
  1158. valid_target(target[,anything])
  1159.      The first argument is the <target> to be validated. If a second,
  1160.      optional argument is supplied, the target to be validated can
  1161.      consist of a target followed by any optional characters. This can
  1162.      be useful if the arguments to a macro consist of a target followed
  1163.      by another argument. If a valid target is supplied, the remainder
  1164.      of the string passed to valid_target() is returned following the
  1165.      first line affected and the number of lines to the target.
  1166.  
  1167.      Returns 'ERROR' if the supplied target is invalid.
  1168.      Returns 'NOTFOUND' if the supplied target is valid, but not found.
  1169.  
  1170.      If a valid target, returns the first line affected by the target
  1171.      followed by the number of lines to the target, and optionally the
  1172.      remainder of the argument. eg. 
  1173.  
  1174.      if the focus line is 12 and valid_target() is called as
  1175.  
  1176.          result = valid_target(":7")      ===> result = "12 -5"
  1177.  
  1178.      if the focus line is 12 and valid_target is called as
  1179.  
  1180.          result = valid_target(":7 /fred/",junk), ===> result = "12 -5 /fred/"
  1181.  
  1182. run_os(command[,stdin_stem[,stdout_stem[,stderr_stem]]])
  1183.      This function allows the macro writer to call an operating system
  1184.      command and have the standard streams; 'stdin', 'stdout' and 'stderr'
  1185.      redirected to or from REXX arrays.
  1186.  
  1187.      The first argument is the operating system command to execute.
  1188.      The command can include any command line switches appropriate 
  1189.      to the command.
  1190.  
  1191.      All other arguments comprise a stem name (including a trailing '.')
  1192.      which refers to the REXX arrays where 'stdin', 'stdout' and 'stderr'
  1193.      are to be redirected.
  1194.  
  1195.      As with all REXX arrays, the value of the 0th element (stem.0)
  1196.      contains the number of elements in the array.
  1197.  
  1198.      The only restriction with the names of the stem variables is
  1199.      that the stem name for the 'stdin' stem cannot be the same as the
  1200.      stem for 'stdout' or 'stderr'.
  1201.  
  1202.      The stem name for 'stdout' and 'stderr' can be the same; the contents
  1203.      of the resulting output stems will consist of 'stdout' and 'stderr' in
  1204.      the order that the command generates this output.
  1205.  
  1206.      Return values:
  1207.  
  1208.           0    - successful
  1209.           1005 - invalid argument or syntax
  1210.           1012 - problems with system redirection of streams
  1211.           1094 - out of memory
  1212.           1099 - error interfacing to REXX interpreter
  1213.  
  1214.      all other numbers, return code from operating system command
  1215.  
  1216.      eg. to spell check the words "The Hessling Editr" with ispell
  1217.  
  1218.          in.0 = 3
  1219.          in.1 = "The"
  1220.          in.2 = "Hessling"
  1221.          in.3 = "Editr"
  1222.          rc = run_os("ispell -a","in.","out.")
  1223.          
  1224.      sets:
  1225.  
  1226.           out.0 --> 3
  1227.           out.1 --> "*"
  1228.           out.2 --> "#"
  1229.           out.3 --> "& edits edit editor"
  1230.  
  1231. **man-end**********************************************************************/
  1232.  
  1233. struct query_item
  1234.  {
  1235.   CHARTYPE query;                            /* valid query response ? */
  1236.   CHARTYPE *name;                                      /* name of item */
  1237.   short min_len;                     /* minimum length of abbreviation */
  1238.   short item_number;                         /* unique number for item */
  1239.   short number_values;                    /* number of values returned */
  1240.  };
  1241. typedef struct query_item QUERY_ITEM;
  1242.  
  1243. /***********************************************************************/
  1244. /* Keep the following items in alphabetic order of name.               */
  1245. /***********************************************************************/
  1246. #ifdef MSWIN
  1247.  static QUERY_ITEM __far query_item[] =
  1248. #else
  1249.  static QUERY_ITEM query_item[] =
  1250. #endif
  1251.   {
  1252.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"alt",3,ITEM_ALT,2},
  1253.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"arbchar",3,ITEM_ARBCHAR,3},
  1254.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"autosave",2,ITEM_AUTOSAVE,1},
  1255.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"backup",4,ITEM_BACKUP,1},
  1256.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"beep",4,ITEM_BEEP,1},
  1257.    {QUERY_QUERY             |QUERY_EXTRACT             ,(CHARTYPE *)"block",5,ITEM_BLOCK,0},
  1258.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"case",4,ITEM_CASE,4},
  1259.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"clearscreen",6,ITEM_CLEARSCREEN,1},
  1260.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"clock",5,ITEM_CLOCK,1},
  1261.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"cmdarrows",4,ITEM_CMDARROWS,1},
  1262.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"cmdline",3,ITEM_CMDLINE,2},
  1263.    {QUERY_QUERY             |QUERY_EXTRACT             ,(CHARTYPE *)"color",5,ITEM_COLOR,1},
  1264.    {QUERY_QUERY             |QUERY_EXTRACT             ,(CHARTYPE *)"colour",5,ITEM_COLOUR,1},
  1265.    {QUERY_QUERY             |QUERY_EXTRACT             ,(CHARTYPE *)"column",3,ITEM_COLUMN,1},
  1266.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"compat",6,ITEM_COMPAT,3},
  1267.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"curline",3,ITEM_CURLINE,6},
  1268.    {QUERY_QUERY             |QUERY_EXTRACT             ,(CHARTYPE *)"cursor",4,ITEM_CURSOR,8},
  1269.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"cursorstay",8,ITEM_CURSORSTAY,1},
  1270.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"defsort",7,ITEM_DEFSORT,2},
  1271.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"dirfileid",9,ITEM_DIRFILEID,2},
  1272.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"display",4,ITEM_DISPLAY,2},
  1273.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"eof",3,ITEM_EOF,1},
  1274.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"eolout",3,ITEM_EOLOUT,1},
  1275.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"etmode",6,ITEM_ETMODE,2},
  1276.    {QUERY_QUERY|             QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"fext",2,ITEM_FEXT,1},
  1277.    {QUERY_QUERY|             QUERY_EXTRACT             ,(CHARTYPE *)"field",5,ITEM_FIELD,4},
  1278.    {QUERY_QUERY|             QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"filename",5,ITEM_FILENAME,1},
  1279.    {QUERY_QUERY|             QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"fmode",2,ITEM_FMODE,1},
  1280.    {QUERY_QUERY|             QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"fname",2,ITEM_FNAME,1},
  1281.    {QUERY_QUERY|             QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"fpath",2,ITEM_FPATH,1},
  1282.    {QUERY_QUERY|             QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"ftype",2,ITEM_FTYPE,1},
  1283.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"fullfname",6,ITEM_FULLFNAME,1},
  1284.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"getenv",6,ITEM_GETENV,1},
  1285.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"hex",3,ITEM_HEX,1},
  1286.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"hexdisplay",7,ITEM_HEXDISPLAY,1},
  1287.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"hexshow",4,ITEM_HEXSHOW,2},
  1288.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"highlight",4,ITEM_HIGHLIGHT,1},
  1289.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"idline",2,ITEM_IDLINE,1},
  1290.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"impmacro",6,ITEM_IMPMACRO,1},
  1291.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"impos",5,ITEM_IMPOS,1},
  1292.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"inputmode",6,ITEM_INPUTMODE,1},
  1293.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"insertmode",6,ITEM_INSERTMODE,1},
  1294.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"lastmsg",4,ITEM_LASTMSG,1},
  1295.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"lastrc",6,ITEM_LASTRC,1},
  1296.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"length",3,ITEM_LENGTH,1},
  1297.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"line",2,ITEM_LINE,1},
  1298.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"lineflag",8,ITEM_LINEFLAG,3},
  1299.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"linend",5,ITEM_LINEND,2},
  1300.    {QUERY_QUERY             |QUERY_EXTRACT             ,(CHARTYPE *)"lscreen",2,ITEM_LSCREEN,6},
  1301.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"macro",5,ITEM_MACRO,1},
  1302.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"macroext",6,ITEM_MACROEXT,1},
  1303.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"macropath",6,ITEM_MACROPATH,1},
  1304.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"margins",3,ITEM_MARGINS,3},
  1305.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"monitor",7,ITEM_MONITOR,2},
  1306.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"mouse",5,ITEM_MOUSE,1},
  1307.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"msgline",4,ITEM_MSGLINE,4},
  1308.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"msgmode",4,ITEM_MSGMODE,1},
  1309.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"nbfile",3,ITEM_NBFILE,1},
  1310.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"newlines",4,ITEM_NEWLINES,1},
  1311.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"nondisp",4,ITEM_NONDISP,1},
  1312.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"number",3,ITEM_NUMBER,1},
  1313.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"pending",4,ITEM_PENDING,4},
  1314.    {QUERY_QUERY             |QUERY_EXTRACT             ,(CHARTYPE *)"point",1,ITEM_POINT,1},
  1315.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"position",3,ITEM_POSITION,3},
  1316.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"prefix",3,ITEM_PREFIX,0},
  1317.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"printer",7,ITEM_PRINTER,1},
  1318.    {QUERY_READV                                        ,(CHARTYPE *)"readv",5,ITEM_READV,3},
  1319.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"reprofile",6,ITEM_REPROFILE,1},
  1320.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"reserved",5,ITEM_RESERVED,1},
  1321.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"rexxoutput",7,ITEM_REXXOUTPUT,2},
  1322.    {QUERY_QUERY             |QUERY_EXTRACT             ,(CHARTYPE *)"ring",4,ITEM_RING,1},
  1323.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"scale",4,ITEM_SCALE,2},
  1324.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"scope",5,ITEM_SCOPE,1},
  1325.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"screen",3,ITEM_SCREEN,2},
  1326.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"select",3,ITEM_SELECT,2},
  1327.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"shadow",4,ITEM_SHADOW,1},
  1328.    {                         QUERY_EXTRACT             ,(CHARTYPE *)"showkey",4,ITEM_SHOWKEY,1},
  1329.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"size",2,ITEM_SIZE,1},
  1330.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"statusline",7,ITEM_STATUSLINE,1},
  1331.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"stay",4,ITEM_STAY,1},
  1332.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"tabkey",4,ITEM_TABKEY,2},
  1333.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"tabline",4,ITEM_TABLINE,2},
  1334.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"tabs",4,ITEM_TABS,1},
  1335.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"tabsin",5,ITEM_TABSIN,2},
  1336.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"tabsout",5,ITEM_TABSOUT,2},
  1337.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"terminal",4,ITEM_TERMINAL,1},
  1338.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"tof",3,ITEM_TOF,1},
  1339.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"typeahead",5,ITEM_TYPEAHEAD,1},
  1340.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"undoing",7,ITEM_UNDOING,1},
  1341.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"untaa",5,ITEM_UNTAA,1},
  1342.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"verify",1,ITEM_VERIFY,1},
  1343.    {QUERY_QUERY             |QUERY_EXTRACT             ,(CHARTYPE *)"vershift",4,ITEM_VERSHIFT,1},
  1344.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT             ,(CHARTYPE *)"version",7,ITEM_VERSION,4},
  1345.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"width",1,ITEM_WIDTH,1},
  1346.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"word",4,ITEM_WORD,1},
  1347.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"wordwrap",5,ITEM_WORDWRAP,1},
  1348.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"wrap",2,ITEM_WRAP,1},
  1349.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"xterminal",5,ITEM_XTERMINAL,1},
  1350.    {QUERY_QUERY|QUERY_STATUS|QUERY_EXTRACT|QUERY_MODIFY,(CHARTYPE *)"zone",1,ITEM_ZONE,2},
  1351.    {0                                                   ,NULL,0,0,0},
  1352.   };
  1353. CHARTYPE *block_name[] = {
  1354.                           (CHARTYPE *)"",
  1355.                           (CHARTYPE *)"LINE",
  1356.                           (CHARTYPE *)"BOX",
  1357.                           (CHARTYPE *)"STREAM",
  1358.                           (CHARTYPE *)"COLUMN",
  1359.                           (CHARTYPE *)"WORD"
  1360.                          };
  1361.  
  1362. VALUE item_values[MAX_VARIABLES_RETURNED];
  1363.  
  1364. /***********************************************************************/
  1365. #ifdef HAVE_PROTO
  1366. short find_item(CHARTYPE *item_name,CHARTYPE query_type)
  1367. #else
  1368. short find_item(item_name,query_type)
  1369. CHARTYPE *item_name;
  1370. CHARTYPE query_type;
  1371. #endif
  1372. /***********************************************************************/
  1373. {
  1374. /*--------------------------- local data ------------------------------*/
  1375.  register short i=0;
  1376.  short itemno = (-1);
  1377. /*--------------------------- processing ------------------------------*/
  1378. #ifdef TRACE
  1379.  trace_function("query.c   :find_item");
  1380. #endif
  1381. /*---------------------------------------------------------------------*/
  1382. /* Using the supplied abbreviation for an item, find the entry in the  */
  1383. /* query_item[] array. It should return with the index pointer (for    */
  1384. /* QUERY_EXTRACT) or an index to the first item in the function_item[] */
  1385. /* rexx.c for other query types.                                       */
  1386. /*---------------------------------------------------------------------*/
  1387.  for (i=0;query_item[i].name != NULL;i++)
  1388.     {
  1389.      if (equal(query_item[i].name,item_name,query_item[i].min_len)
  1390.      && (query_item[i].query & query_type))
  1391.        {
  1392.         if (query_type == QUERY_EXTRACT)
  1393.            itemno = i;
  1394.         else
  1395.            itemno = query_item[i].item_number;
  1396.         break;
  1397.        }
  1398.     }
  1399. #ifdef TRACE
  1400.  trace_return();
  1401. #endif
  1402.  return(itemno);
  1403. }
  1404. /***********************************************************************/
  1405. #ifdef HAVE_PROTO
  1406. short show_status(void)
  1407. #else
  1408. short show_status()
  1409. #endif
  1410. /***********************************************************************/
  1411. {
  1412. #define STATUS_COLS 5
  1413. /*-------------------------- external data ----------------------------*/
  1414.  extern short terminal_lines;
  1415. /*--------------------------- local data ------------------------------*/
  1416.  register short i=0,j=0,k=0;
  1417.  short lineno=0,colno=0;
  1418.  short number_variables=0;
  1419.  short item_width=0,column=0,column_width=0,col[STATUS_COLS];
  1420. /*--------------------------- processing ------------------------------*/
  1421. #ifdef TRACE
  1422.  trace_function("query.c   :show_status");
  1423. #endif
  1424. /*---------------------------------------------------------------------*/
  1425. /* For each item that is displayable, display it...                    */
  1426. /*---------------------------------------------------------------------*/
  1427.  column = 0;
  1428.  column_width = COLS / STATUS_COLS;
  1429.  col[0] = 0;
  1430.  for (i=1;i<STATUS_COLS;i++)
  1431.     col[i] = col[i-1]+column_width+1;
  1432.  wclear(stdscr);
  1433.  for (i=0;query_item[i].name != NULL;i++)
  1434.     {
  1435. /*---------------------------------------------------------------------*/
  1436. /* Get only those settings that are queryable...                       */
  1437. /*---------------------------------------------------------------------*/
  1438.      if (query_item[i].query & QUERY_STATUS)
  1439.        {
  1440.         number_variables = get_item_values(query_item[i].item_number,(CHARTYPE *)"",QUERY_STATUS,0L,NULL,0L);
  1441.         item_width = 0;
  1442. /*---------------------------------------------------------------------*/
  1443. /* Obtain the total length of the setting values...                    */
  1444. /*---------------------------------------------------------------------*/
  1445.         for (j=0;j<number_variables+1;j++)
  1446.            item_width += item_values[j].len+1;
  1447.         item_width--;     /* reduce by 1 for last value's blank at end */
  1448. /*---------------------------------------------------------------------*/
  1449. /* If the length of the variables is > the screen width, go to next    */
  1450. /* line.                                                               */
  1451. /*---------------------------------------------------------------------*/
  1452.         if (item_width+col[column] > COLS)
  1453.           {
  1454.            column = colno = 0;
  1455.            lineno++;
  1456.           }
  1457.         else
  1458.            colno = col[column];
  1459. /*---------------------------------------------------------------------*/
  1460. /* Display the variables. For the first value, display in BOLD.        */
  1461. /*---------------------------------------------------------------------*/
  1462.         for (j=0;j<number_variables+1;j++)
  1463.           {
  1464.            if (j == 0)
  1465.               attrset(A_BOLD);
  1466.            mvaddstr(lineno,colno,(DEFCHAR *)item_values[j].value);
  1467.            attrset(A_NORMAL);
  1468.            colno += item_values[j].len+1;
  1469.           }
  1470.         colno--;
  1471. /*---------------------------------------------------------------------*/
  1472. /* Now have to determine where to display the next set of variables... */
  1473. /* If the just-displayed values go past the last column, or we are     */
  1474. /* already in the last column, go to the next line...                  */
  1475. /*---------------------------------------------------------------------*/
  1476.         if (colno >= col[STATUS_COLS-1] || column == STATUS_COLS-1)
  1477.           {
  1478.            lineno++;
  1479.            column = 0;
  1480.           }
  1481.         else
  1482.           {
  1483. /*---------------------------------------------------------------------*/
  1484. /* ...else if the the just-displayed values go past the 2nd column...  */
  1485. /* If the just-displayed values go past the last column, go on to the  */
  1486. /* next line...                                                        */
  1487. /*---------------------------------------------------------------------*/
  1488.            for (k=0;k<STATUS_COLS;k++)
  1489.               if (colno < col[k])
  1490.                 {
  1491.                  column = k;
  1492.                  break;
  1493.                 }
  1494.           }
  1495.        }
  1496.     }
  1497.  mvaddstr(terminal_lines-2,0,HIT_ANY_KEY);
  1498.  refresh();
  1499.  
  1500. #ifdef TRACE
  1501.  trace_return();
  1502. #endif
  1503.  return(RC_OK);
  1504. }
  1505. /***********************************************************************/
  1506. #ifdef HAVE_PROTO
  1507. short save_status(CHARTYPE *filename)
  1508. #else
  1509. short save_status(filename)
  1510. CHARTYPE *filename;
  1511. #endif
  1512. /***********************************************************************/
  1513. {
  1514. /*-------------------------- external data ----------------------------*/
  1515.  extern CHARTYPE sp_path[MAX_FILE_NAME+1] ;
  1516.  extern CHARTYPE sp_fname[MAX_FILE_NAME+1] ;
  1517.  extern CHARTYPE *the_version;
  1518.  extern CHARTYPE *the_release;
  1519. /*--------------------------- local data ------------------------------*/
  1520.  register short i=0,j=0;
  1521.  short number_variables=0,rc=RC_OK;
  1522.  FILE *fp=NULL;
  1523. /*--------------------------- processing ------------------------------*/
  1524. #ifdef TRACE
  1525.  trace_function("query.c   :save_status");
  1526. #endif
  1527. /*---------------------------------------------------------------------*/
  1528. /* Get the fully qualified filename from the supplied filename.        */
  1529. /*---------------------------------------------------------------------*/
  1530.  strrmdup(strtrans(filename,OSLASH,ISLASH),ISLASH);
  1531.  if ((rc = splitpath(filename)) != RC_OK)
  1532.    {
  1533.     display_error(10,filename,FALSE);
  1534. #ifdef TRACE
  1535.     trace_return();
  1536. #endif
  1537.     return(rc);
  1538.    }
  1539. /*---------------------------------------------------------------------*/
  1540. /* splitpath() has set up sp_path  and sp_fname. Append the filename.  */
  1541. /*---------------------------------------------------------------------*/
  1542.  strcat((DEFCHAR *)sp_path,(DEFCHAR *)sp_fname);
  1543. /*---------------------------------------------------------------------*/
  1544. /* If the file already exists, display an error.                       */
  1545. /*---------------------------------------------------------------------*/
  1546.   if (file_exists(sp_path))
  1547.    {
  1548.     display_error(8,filename,FALSE);
  1549. #ifdef TRACE
  1550.     trace_return();
  1551. #endif
  1552.     return(rc);
  1553.    }
  1554.  fp = fopen((DEFCHAR *)sp_path,"w");
  1555. /*---------------------------------------------------------------------*/
  1556. /* For each item that is modifiable, get its value...                  */
  1557. /*---------------------------------------------------------------------*/
  1558.  fprintf(fp,"/* This file generated by STATUS command of THE %s %s*/\n",the_version,the_release);
  1559.  for (i=0;query_item[i].name != NULL;i++)
  1560.     {
  1561. /*---------------------------------------------------------------------*/
  1562. /* Get only those settings that are modifiable...                      */
  1563. /*---------------------------------------------------------------------*/
  1564.      if (query_item[i].query & QUERY_MODIFY)
  1565.        {
  1566.         number_variables = get_item_values(query_item[i].item_number,(CHARTYPE *)"",QUERY_MODIFY,0L,NULL,0L);
  1567.         fputs("'set",fp);
  1568. /*---------------------------------------------------------------------*/
  1569. /* Write the variables to the file...                                  */
  1570. /*---------------------------------------------------------------------*/
  1571.         for (j=0;j<number_variables+1;j++)
  1572.           {
  1573.            fputc(' ',fp);
  1574.            fputs((DEFCHAR *)item_values[j].value,fp);
  1575.           }
  1576.         fprintf(fp,"'\n");
  1577.        }
  1578.     }
  1579.  fflush(fp);
  1580.  fclose(fp);
  1581. #ifdef TRACE
  1582.  trace_return();
  1583. #endif
  1584.  return(RC_OK);
  1585. }
  1586. /***********************************************************************/
  1587. #ifdef HAVE_PROTO
  1588. short set_extract_variables(short itemno)
  1589. #else
  1590. short set_extract_variables(itemno)
  1591. short itemno;
  1592. #endif
  1593. /***********************************************************************/
  1594. {
  1595. /*-------------------------- external data ----------------------------*/
  1596.  extern VALUE item_values[MAX_VARIABLES_RETURNED];
  1597. /*--------------------------- local data ------------------------------*/
  1598.  register short i=0;
  1599.  short rc=RC_OK,number_values=0;
  1600. /*--------------------------- processing ------------------------------*/
  1601. #ifdef TRACE
  1602.  trace_function("query.c:   set_extract_variables");
  1603. #endif
  1604.  number_values = atoi((DEFCHAR *)item_values[0].value);
  1605.  for (i=0;i<number_values+1;i++)
  1606.   {
  1607.    if ((rc = set_rexx_variable(query_item[itemno].name,item_values[i].value,item_values[i].len,i)) != RC_OK)
  1608.       break;
  1609.   } 
  1610.  return(rc);
  1611. }
  1612. /***********************************************************************/
  1613. #ifdef HAVE_PROTO
  1614. short get_item_values(short itemno,CHARTYPE *itemargs,CHARTYPE query_type,LINETYPE argc,CHARTYPE *arg,LINETYPE arglen)
  1615. #else
  1616. short get_item_values(itemno,itemargs,query_type,argc,arg,arglen)
  1617. short itemno;
  1618. CHARTYPE *itemargs;
  1619. CHARTYPE query_type;
  1620. LINETYPE argc;
  1621. CHARTYPE *arg;
  1622. LINETYPE arglen;
  1623. #endif
  1624. /***********************************************************************/
  1625. {
  1626. /*-------------------------- external data ----------------------------*/
  1627. /*
  1628.  * DO NOT USE temp_cmd as temporary working space, use trec
  1629.  */
  1630.  extern CHARTYPE term_name[20];
  1631.  extern CHARTYPE dir_path[MAX_FILE_NAME+1];
  1632.  extern CHARTYPE xterm_program[MAX_FILE_NAME+1];
  1633.  extern CHARTYPE *trec;
  1634.  extern unsigned short file_start;
  1635.  extern CHARTYPE *the_version;
  1636.  extern CHARTYPE *the_release;
  1637.  extern CHARTYPE the_macro_path[MAX_FILE_NAME+1];
  1638.  extern CHARTYPE macro_suffix[12];
  1639.  extern CHARTYPE CLEARSCREENx;
  1640.  extern CHARTYPE CMDARROWSTABCMDx;
  1641.  extern bool REPROFILEx;
  1642.  extern bool CAPREXXOUTx;
  1643.  extern int DEFSORTx;
  1644.  extern int DIRORDERx;
  1645.  extern LINETYPE CAPREXXMAXx;
  1646.  extern CHARTYPE TABI_ONx;
  1647.  extern CHARTYPE TABI_Nx;
  1648.  extern bool BEEPx;
  1649.  extern bool UNTAAx;
  1650.  extern bool CLOCKx;
  1651.  extern bool HEXDISPLAYx;
  1652.  extern CHARTYPE number_of_files;
  1653.  extern bool INSERTMODEx;
  1654.  extern CHARTYPE tabkey_insert;
  1655.  extern CHARTYPE tabkey_overwrite;
  1656.  extern short lastrc;
  1657.  extern CHARTYPE *last_message;
  1658.  extern bool in_profile;
  1659.  extern bool batch_only;
  1660.  extern bool rexx_support;
  1661.  extern bool scroll_cursor_stay;
  1662.  extern unsigned short rec_len;
  1663.  extern unsigned short cmd_rec_len;
  1664.  extern unsigned short pre_rec_len;
  1665.  extern bool colour_support;
  1666.  extern bool NONDISPx;
  1667.  extern bool MOUSEx;
  1668.  extern ROWTYPE STATUSLINEx;
  1669.  extern CHARTYPE *cmd_rec;
  1670.  extern CHARTYPE *rec;
  1671.  extern CHARTYPE *pre_rec;
  1672.  extern short compatible_look;
  1673.  extern short compatible_feel;
  1674.  extern short compatible_keys;
  1675.  extern LINETYPE original_screen_line;
  1676.  extern LINETYPE original_screen_column;
  1677.  extern LINETYPE original_file_line;
  1678.  extern LINETYPE original_file_column;
  1679.  extern short terminal_lines;
  1680.  extern bool TYPEAHEADx;
  1681.  extern bool horizontal;
  1682.  extern CHARTYPE display_screens;
  1683.  
  1684. #if defined(UNIX) || defined(OS2) || defined(EMX)
  1685.  extern CHARTYPE *spooler_name;
  1686. #endif
  1687.  extern VIEW_DETAILS *vd_mark;
  1688. /*--------------------------- local data ------------------------------*/
  1689.  static CHARTYPE num0[3];
  1690.  static CHARTYPE num1[10];
  1691.  static CHARTYPE num2[10];
  1692.  static CHARTYPE num3[40];
  1693.  static CHARTYPE num4[40];
  1694.  static CHARTYPE num5[10];
  1695.  static CHARTYPE num6[10];
  1696.  static CHARTYPE num7[10];
  1697.  static CHARTYPE num8[10];
  1698.  static CHARTYPE rsrvd[MAX_FILE_NAME+1];
  1699.  static LINE *curr;
  1700.  register int i=0;
  1701.  short y=0,x=0;
  1702.  short number_variables = 1;
  1703.  LINETYPE true_line=0L;
  1704.  bool bool_flag=FALSE;
  1705.  CHARTYPE cursor_char=0;
  1706.  CHARTYPE *tmpbuf=NULL;
  1707.  LINETYPE current_screen_line=(-1L);
  1708.  LINETYPE current_screen_column=(-1L);
  1709.  LINETYPE current_file_line=(-1L);
  1710.  LINETYPE current_file_column=(-1L);
  1711.  int key=0;
  1712.  CHARTYPE *keyname=NULL;
  1713.  LENGTHTYPE col=0;
  1714. /*--------------------------- processing ------------------------------*/
  1715. #ifdef TRACE
  1716.  trace_function("query.c:   get_item_values");
  1717. #endif
  1718. /*---------------------------------------------------------------------*/
  1719. /* Only use itemno to reference query_item[] array if it is NOT a      */
  1720. /* boolean function...                                                 */
  1721. /*---------------------------------------------------------------------*/
  1722.  if (itemno < ITEM_START_BOOLEANS)
  1723.     number_variables = query_item[itemno].number_values;
  1724. /*---------------------------------------------------------------------*/
  1725. /* Now that we have a valid item, set up its values...                 */
  1726. /*---------------------------------------------------------------------*/
  1727.  switch(itemno)
  1728.    {
  1729.     case ITEM_AFTER_FUNCTION:
  1730.          if (batch_only)
  1731.            {
  1732.             item_values[1].value = (CHARTYPE *)"0";
  1733.             item_values[1].len = 1;
  1734.             break;
  1735.            }
  1736.          getyx(CURRENT_WINDOW,y,x);
  1737.          bool_flag = FALSE;
  1738.          switch(CURRENT_VIEW->current_window)
  1739.            {
  1740.             case WINDOW_FILEAREA:
  1741.                  if ((x+CURRENT_VIEW->verify_col-1) >= rec_len)
  1742.                     bool_flag = TRUE;
  1743.                  break;
  1744.             case WINDOW_COMMAND:
  1745.                  if (x >= cmd_rec_len)
  1746.                     bool_flag = TRUE;
  1747.                  break;
  1748.             case WINDOW_PREFIX:
  1749.                  if (x >= pre_rec_len)
  1750.                     bool_flag = TRUE;
  1751.                  break;
  1752.            }
  1753.          if (bool_flag)
  1754.            {
  1755.             item_values[1].value = (CHARTYPE *)"1";
  1756.             item_values[1].len = 1;
  1757.            }
  1758.           else
  1759.            {
  1760.             item_values[1].value = (CHARTYPE *)"0";
  1761.             item_values[1].len = 1;
  1762.            }
  1763.          break;
  1764.     case ITEM_BATCH_FUNCTION:
  1765.          if (batch_only)
  1766.            {
  1767.             item_values[1].value = (CHARTYPE *)"1";
  1768.             item_values[1].len = 1;
  1769.            }
  1770.           else
  1771.            {
  1772.             item_values[1].value = (CHARTYPE *)"0";
  1773.             item_values[1].len = 1;
  1774.            }
  1775.          break;
  1776.     case ITEM_ALT:
  1777.          sprintf((DEFCHAR *)num1,"%d",CURRENT_FILE->autosave_alt);
  1778.          sprintf((DEFCHAR *)num2,"%d",CURRENT_FILE->save_alt);
  1779.          item_values[1].value = num1;
  1780.          item_values[2].value = num2;
  1781.          item_values[1].len = strlen((DEFCHAR *)num1);
  1782.          item_values[2].len = strlen((DEFCHAR *)num2);
  1783.          break;
  1784.     case ITEM_ARBCHAR:
  1785.          if (CURRENT_VIEW->arbchar_status)
  1786.            {
  1787.             item_values[1].value = (CHARTYPE *)"ON";
  1788.             item_values[1].len = 2;
  1789.            }
  1790.          else
  1791.            {
  1792.             item_values[1].value = (CHARTYPE *)"OFF";
  1793.             item_values[1].len = 3;
  1794.            }
  1795.          num1[0] = CURRENT_VIEW->arbchar_multiple;
  1796.          num1[1] ='\0';
  1797.          item_values[2].value = num1;
  1798.          item_values[2].len = 1;
  1799.          num2[0] = CURRENT_VIEW->arbchar_single;
  1800.          num2[1] ='\0';
  1801.          item_values[3].value = num2;
  1802.          item_values[3].len = 1;
  1803.          break;
  1804.     case ITEM_AUTOSAVE:
  1805.          sprintf((DEFCHAR *)num1,"%d",CURRENT_FILE->autosave);
  1806.          item_values[1].value = num1;
  1807.          item_values[1].len = strlen((DEFCHAR *)num1);
  1808.          if (CURRENT_FILE->autosave == 0)
  1809.            {
  1810.             item_values[1].value = (CHARTYPE *)"OFF";
  1811.             item_values[1].len = 3;
  1812.            }
  1813.          break;
  1814.     case ITEM_BACKUP:
  1815.          switch(CURRENT_FILE->backup)
  1816.            {
  1817.             case BACKUP_OFF:
  1818.                  item_values[1].value = (CHARTYPE *)"OFF";
  1819.                  break;
  1820.             case BACKUP_TEMP:
  1821.                  item_values[1].value = (CHARTYPE *)"TEMP";
  1822.                  break;
  1823.             case BACKUP_KEEP:
  1824.                  item_values[1].value = (CHARTYPE *)"KEEP";
  1825.                  break;
  1826.            }
  1827.          item_values[1].len = strlen((DEFCHAR *)item_values[1].value);
  1828.          break;
  1829.     case ITEM_BEFORE_FUNCTION:
  1830.          if (batch_only)
  1831.            {
  1832.             item_values[1].value = (CHARTYPE *)"0";
  1833.             item_values[1].len = 1;
  1834.             break;
  1835.            }
  1836.          getyx(CURRENT_WINDOW,y,x);
  1837.          bool_flag = FALSE;
  1838.          switch(CURRENT_VIEW->current_window)
  1839.            {
  1840.             case WINDOW_FILEAREA:
  1841.                  if ((x+CURRENT_VIEW->verify_col-1) < memne(rec,' ',rec_len))
  1842.                     bool_flag = TRUE;
  1843.                  break;
  1844.             case WINDOW_COMMAND:
  1845.                  if (x < memne(cmd_rec,' ',cmd_rec_len))
  1846.                     bool_flag = TRUE;
  1847.                  break;
  1848.             case WINDOW_PREFIX:/* cursor can't go before 1st non-blank */
  1849.                  break;
  1850.            }
  1851.          if (bool_flag)
  1852.            {
  1853.             item_values[1].value = (CHARTYPE *)"1";
  1854.             item_values[1].len = 1;
  1855.            }
  1856.           else
  1857.            {
  1858.             item_values[1].value = (CHARTYPE *)"0";
  1859.             item_values[1].len = 1;
  1860.            }
  1861.          break;
  1862.     case ITEM_BEEP:
  1863.          if (BEEPx)
  1864.            {
  1865.             item_values[1].value = (CHARTYPE *)"ON";
  1866.             item_values[1].len = 2;
  1867.            }
  1868.           else
  1869.            {
  1870.             item_values[1].value = (CHARTYPE *)"OFF";
  1871.             item_values[1].len = 3;
  1872.            }
  1873.          break;
  1874.     case ITEM_BLANK_FUNCTION:
  1875.          item_values[1].value = (CHARTYPE *)"0"; /* FALSE by default */
  1876.          switch(CURRENT_VIEW->current_window)
  1877.            {
  1878.             case WINDOW_FILEAREA:
  1879.                  if (rec_len == 0)
  1880.                     item_values[1].value = (CHARTYPE *)"1";
  1881.                  break;
  1882.             case WINDOW_PREFIX:
  1883.                  if (pre_rec_len == 0)
  1884.                     item_values[1].value = (CHARTYPE *)"1";
  1885.                  break;
  1886.             case WINDOW_COMMAND:
  1887.                  if (cmd_rec_len == 0)
  1888.                     item_values[1].value = (CHARTYPE *)"1";
  1889.                  break;
  1890.            }
  1891.          item_values[1].len = 1;
  1892.          break;
  1893.     case ITEM_BLOCK:
  1894.          if (MARK_VIEW == NULL)
  1895.            {
  1896.             item_values[1].value = (CHARTYPE *)"NONE";
  1897.             item_values[1].len = 4;
  1898.             number_variables = 1;
  1899.            }
  1900.           else
  1901.            {
  1902.             number_variables = 6;
  1903.             item_values[1].value = block_name[MARK_VIEW->mark_type];
  1904.             item_values[1].len = strlen((DEFCHAR *)item_values[1].value);
  1905.             sprintf((DEFCHAR *)num1,"%ld",MARK_VIEW->mark_start_line);
  1906.             item_values[2].value = num1;
  1907.             item_values[2].len = strlen((DEFCHAR *)num1);
  1908.             sprintf((DEFCHAR *)num2,"%d",MARK_VIEW->mark_start_col);
  1909.             item_values[3].value = num2;
  1910.             item_values[3].len = strlen((DEFCHAR *)num2);
  1911.             sprintf((DEFCHAR *)num3,"%ld",MARK_VIEW->mark_end_line);
  1912.             item_values[4].value = num3;
  1913.             item_values[4].len = strlen((DEFCHAR *)num3);
  1914.             sprintf((DEFCHAR *)num4,"%d",MARK_VIEW->mark_end_col);
  1915.             item_values[5].value = num4;
  1916.             item_values[5].len = strlen((DEFCHAR *)num4);
  1917.             strcpy((DEFCHAR *)trec,(DEFCHAR *)MARK_FILE->fpath);
  1918.             strcat((DEFCHAR *)trec,(DEFCHAR *)MARK_FILE->fname);
  1919.             item_values[6].value = (CHARTYPE *)trec;
  1920.             item_values[6].len = strlen((DEFCHAR *)trec);
  1921.            }
  1922.          break;
  1923.     case ITEM_BLOCK_FUNCTION:
  1924.          if (CURRENT_VIEW == MARK_VIEW)
  1925.            {
  1926.             item_values[1].value = (CHARTYPE *)"1";
  1927.             item_values[1].len = 1;
  1928.            }
  1929.           else
  1930.            {
  1931.             item_values[1].value = (CHARTYPE *)"0";
  1932.             item_values[1].len = 1;
  1933.            }
  1934.          break;
  1935.     case ITEM_BOTTOMEDGE_FUNCTION:
  1936.          if (batch_only)
  1937.            {
  1938.             item_values[1].value = (CHARTYPE *)"0";
  1939.             item_values[1].len = 1;
  1940.             break;
  1941.            }
  1942.          getyx(CURRENT_WINDOW,y,x);
  1943.          if (CURRENT_VIEW->current_window == WINDOW_FILEAREA
  1944.          &&  y == CURRENT_SCREEN.rows[WINDOW_FILEAREA]-1)
  1945.            {
  1946.             item_values[1].value = (CHARTYPE *)"1";
  1947.             item_values[1].len = 1;
  1948.            }
  1949.           else
  1950.            {
  1951.             item_values[1].value = (CHARTYPE *)"0";
  1952.             item_values[1].len = 1;
  1953.            }
  1954.          break;
  1955.     case ITEM_CASE:
  1956.          switch(CURRENT_VIEW->case_enter)
  1957.            {
  1958.             case CASE_MIXED:
  1959.                  item_values[1].value = (CHARTYPE *)"MIXED";
  1960.                  break;
  1961.             case CASE_UPPER:
  1962.                  item_values[1].value = (CHARTYPE *)"UPPER";
  1963.                  break;
  1964.             case CASE_LOWER:
  1965.                  item_values[1].value = (CHARTYPE *)"LOWER";
  1966.                  break;
  1967.             default:
  1968.                  break;
  1969.            }
  1970.          item_values[1].len = 5;
  1971.          switch(CURRENT_VIEW->case_locate)
  1972.            {
  1973.             case CASE_IGNORE:
  1974.                  item_values[2].value = (CHARTYPE *)"IGNORE";
  1975.                  item_values[2].len = 6;
  1976.                  break;
  1977.             case CASE_RESPECT:
  1978.                  item_values[2].value = (CHARTYPE *)"RESPECT";
  1979.                  item_values[2].len = 7;
  1980.                  break;
  1981.             default:
  1982.                  break;
  1983.            }
  1984.          switch(CURRENT_VIEW->case_change)
  1985.            {
  1986.             case CASE_IGNORE:
  1987.                  item_values[3].value = (CHARTYPE *)"IGNORE";
  1988.                  item_values[3].len = 6;
  1989.                  break;
  1990.             case CASE_RESPECT:
  1991.                  item_values[3].value = (CHARTYPE *)"RESPECT";
  1992.                  item_values[3].len = 7;
  1993.                  break;
  1994.             default:
  1995.                  break;
  1996.            }
  1997.          switch(CURRENT_VIEW->case_sort)
  1998.            {
  1999.             case CASE_IGNORE:
  2000.                  item_values[4].value = (CHARTYPE *)"IGNORE";
  2001.                  item_values[4].len = 6;
  2002.                  break;
  2003.             case CASE_RESPECT:
  2004.                  item_values[4].value = (CHARTYPE *)"RESPECT";
  2005.                  item_values[4].len = 7;
  2006.                  break;
  2007.             default:
  2008.                  break;
  2009.            }
  2010.          break;
  2011.     case ITEM_CLEARSCREEN:
  2012.          if (CLEARSCREENx)
  2013.            {
  2014.             item_values[1].value = (CHARTYPE *)"ON";
  2015.             item_values[1].len = 2;
  2016.            }
  2017.           else
  2018.            {
  2019.             item_values[1].value = (CHARTYPE *)"OFF";
  2020.             item_values[1].len = 3;
  2021.            }
  2022.          break;
  2023.     case ITEM_CLOCK:
  2024.          if (CLOCKx)
  2025.            {
  2026.             item_values[1].value = (CHARTYPE *)"ON";
  2027.             item_values[1].len = 2;
  2028.            }
  2029.           else
  2030.            {
  2031.             item_values[1].value = (CHARTYPE *)"OFF";
  2032.             item_values[1].len = 3;
  2033.            }
  2034.          break;
  2035.     case ITEM_COMMAND_FUNCTION:
  2036.          if (CURRENT_WINDOW_COMMAND != NULL)
  2037.            {
  2038.             item_values[1].value = (CHARTYPE *)"1";
  2039.             item_values[1].len = 1;
  2040.            }
  2041.           else
  2042.            {
  2043.             item_values[1].value = (CHARTYPE *)"0";
  2044.             item_values[1].len = 1;
  2045.            }
  2046.          break;
  2047.     case ITEM_CMDARROWS:
  2048.          if (CMDARROWSTABCMDx)
  2049.            {
  2050.             item_values[1].value = (CHARTYPE *)"TAB";
  2051.             item_values[1].len = 3;
  2052.            }
  2053.           else
  2054.            {
  2055.             item_values[1].value = (CHARTYPE *)"RETRIEVE";
  2056.             item_values[1].len = 8;
  2057.            }
  2058.          break;
  2059.     case ITEM_CMDLINE:
  2060.          switch(CURRENT_VIEW->cmd_line)
  2061.            {
  2062.             case 'B':
  2063.                  item_values[1].value = (CHARTYPE *)"BOTTOM";
  2064.                  item_values[1].len = 6;
  2065.                  break;
  2066.             case 'T':
  2067.                  item_values[1].value = (CHARTYPE *)"TOP";
  2068.                  item_values[1].len = 3;
  2069.                  break;
  2070.             case 'O':
  2071.                  item_values[1].value = (CHARTYPE *)"OFF";
  2072.                  item_values[1].len = 3;
  2073.                  number_variables = 1;
  2074.                  break;
  2075.            }
  2076.          if (CURRENT_VIEW->cmd_line == 'O')
  2077.             break;
  2078.          if (query_type == QUERY_EXTRACT
  2079.          ||  query_type == QUERY_FUNCTION)
  2080.            {
  2081.             sprintf((DEFCHAR *)num1,"%d",CURRENT_SCREEN.start_row[WINDOW_COMMAND]+1);
  2082.             item_values[2].value = num1;
  2083.             item_values[2].len = strlen((DEFCHAR *)num1);
  2084.             item_values[3].value = cmd_rec;
  2085.             item_values[3].len = cmd_rec_len;
  2086.             number_variables = 3;
  2087.            }
  2088.          else
  2089.             number_variables = 1;
  2090.          break;
  2091.     case ITEM_COLOR:
  2092.          number_variables = extract_colour(itemno,rsrvd,query_type,itemargs,1);
  2093.          break;
  2094.     case ITEM_COLOUR:
  2095.          number_variables = extract_colour(itemno,rsrvd,query_type,itemargs,0);
  2096.          break;
  2097.     case ITEM_COLUMN:
  2098.          if (batch_only
  2099.          ||  CURRENT_VIEW->current_window != WINDOW_FILEAREA)
  2100.             sprintf((DEFCHAR *)num1,"%d",CURRENT_VIEW->current_column);
  2101.          else
  2102.            {
  2103.             getyx(CURRENT_WINDOW,y,x);
  2104.             sprintf((DEFCHAR *)num1,"%d",x+CURRENT_VIEW->verify_col);
  2105.            }
  2106.          item_values[1].value = num1;
  2107.          item_values[1].len = strlen((DEFCHAR *)num1);
  2108.          break;                       
  2109.     case ITEM_COMPAT:
  2110.          switch(compatible_look)
  2111.            {
  2112.             case COMPAT_THE:
  2113.                  item_values[1].value = (CHARTYPE *)"THE";
  2114.                  item_values[1].len = 3;
  2115.                  break;
  2116.             case COMPAT_XEDIT:
  2117.                  item_values[1].value = (CHARTYPE *)"XEDIT";
  2118.                  item_values[1].len = 5;
  2119.                  break;
  2120.             case COMPAT_KEDIT:
  2121.                  item_values[1].value = (CHARTYPE *)"KEDIT";
  2122.                  item_values[1].len = 5;
  2123.                  break;
  2124.            }
  2125.          switch(compatible_feel)
  2126.            {
  2127.             case COMPAT_THE:
  2128.                  item_values[2].value = (CHARTYPE *)"THE";
  2129.                  item_values[2].len = 3;
  2130.                  break;
  2131.             case COMPAT_XEDIT:
  2132.                  item_values[2].value = (CHARTYPE *)"XEDIT";
  2133.                  item_values[2].len = 5;
  2134.                  break;
  2135.             case COMPAT_KEDIT:
  2136.                  item_values[2].value = (CHARTYPE *)"KEDIT";
  2137.                  item_values[2].len = 5;
  2138.                  break;
  2139.            }
  2140.          switch(compatible_keys)
  2141.            {
  2142.             case COMPAT_THE:
  2143.                  item_values[3].value = (CHARTYPE *)"THE";
  2144.                  item_values[3].len = 3;
  2145.                  break;
  2146.             case COMPAT_XEDIT:
  2147.                  item_values[3].value = (CHARTYPE *)"XEDIT";
  2148.                  item_values[3].len = 5;
  2149.                  break;
  2150.             case COMPAT_KEDIT:
  2151.                  item_values[3].value = (CHARTYPE *)"KEDIT";
  2152.                  item_values[3].len = 5;
  2153.                  break;
  2154.            }
  2155.          break;
  2156.     case ITEM_CURLINE:
  2157.          if (CURRENT_VIEW->current_base == POSITION_MIDDLE)
  2158.            {
  2159.             if (CURRENT_VIEW->current_off == 0)
  2160.                strcpy((DEFCHAR *)rsrvd,"M");
  2161.             else
  2162.                sprintf((DEFCHAR *)rsrvd,"M%+d",CURRENT_VIEW->current_off);
  2163.            }
  2164.          else
  2165.             sprintf((DEFCHAR *)rsrvd,"%d",CURRENT_VIEW->current_off);
  2166.          item_values[1].value = rsrvd;
  2167.          item_values[1].len = strlen((DEFCHAR *)rsrvd);
  2168.          if (query_type == QUERY_EXTRACT
  2169.          ||  query_type == QUERY_FUNCTION)
  2170.            {
  2171.             sprintf((DEFCHAR *)num1,"%d",CURRENT_VIEW->current_row+1);
  2172.             item_values[2].value = num1;
  2173.             item_values[2].len = strlen((DEFCHAR *)num1);
  2174.             curr = lll_find(CURRENT_FILE->first_line,CURRENT_FILE->last_line,
  2175.                            (compatible_feel==COMPAT_XEDIT)?CURRENT_VIEW->current_line:get_true_line(TRUE),
  2176.                            CURRENT_FILE->number_lines);
  2177.             item_values[3].value = (CHARTYPE *)curr->line;
  2178.             item_values[3].len = curr->length;
  2179.             item_values[4].value = (curr->new_flag||curr->changed_flag)?(CHARTYPE *)"ON":(CHARTYPE *)"OFF";
  2180.             item_values[4].len = strlen((DEFCHAR *)item_values[4].value);
  2181.             if (curr->new_flag)
  2182.                item_values[5].value = (CHARTYPE *)"NEW CHANGED";
  2183.             else
  2184.                if (curr->changed_flag)
  2185.                   item_values[5].value = (CHARTYPE *)"OLD CHANGED";
  2186.                else
  2187.                   item_values[5].value = (CHARTYPE *)"OLD";
  2188.             item_values[5].len = strlen((DEFCHAR *)item_values[5].value);
  2189.             sprintf((DEFCHAR *)num2,"%d",curr->select);
  2190.             item_values[6].value = num2;
  2191.             item_values[6].len = strlen((DEFCHAR *)num2);
  2192.            }
  2193.          else
  2194.             number_variables = 1;
  2195.          break;
  2196.     case ITEM_CURSOR:
  2197.          get_cursor_position(¤t_screen_line,¤t_screen_column,
  2198.                              ¤t_file_line,¤t_file_column);
  2199.          sprintf((DEFCHAR *)num1,"%ld",current_screen_line);
  2200.          item_values[1].value = num1;
  2201.          item_values[1].len = strlen((DEFCHAR *)num1);
  2202.          sprintf((DEFCHAR *)num2,"%ld",current_screen_column);
  2203.          item_values[2].value = num2;
  2204.          item_values[2].len = strlen((DEFCHAR *)num2);
  2205.          sprintf((DEFCHAR *)num3,"%ld",current_file_line);
  2206.          item_values[3].value = num3;
  2207.          item_values[3].len = strlen((DEFCHAR *)num3);
  2208.          sprintf((DEFCHAR *)num4,"%ld",current_file_column);
  2209.          item_values[4].value = num4;
  2210.          item_values[4].len = strlen((DEFCHAR *)num4);
  2211.          sprintf((DEFCHAR *)num5,"%ld",original_screen_line);
  2212.          item_values[5].value = num5;
  2213.          item_values[5].len = strlen((DEFCHAR *)num5);
  2214.          sprintf((DEFCHAR *)num6,"%ld",original_screen_column);
  2215.          item_values[6].value = num6;
  2216.          item_values[6].len = strlen((DEFCHAR *)num6);
  2217.          sprintf((DEFCHAR *)num7,"%ld",original_file_line);
  2218.          item_values[7].value = num7;
  2219.          item_values[7].len = strlen((DEFCHAR *)num7);
  2220.          sprintf((DEFCHAR *)num8,"%ld",original_file_column);
  2221.          item_values[8].value = num8;
  2222.          item_values[8].len = strlen((DEFCHAR *)num8);
  2223.          break;
  2224.     case ITEM_CURSORSTAY:
  2225.          if (scroll_cursor_stay)
  2226.            {
  2227.             item_values[1].value = (CHARTYPE *)"ON";
  2228.             item_values[1].len = 2;
  2229.            }
  2230.           else
  2231.            {
  2232.             item_values[1].value = (CHARTYPE *)"OFF";
  2233.             item_values[1].len = 3;
  2234.            }
  2235.          break;
  2236.     case ITEM_CURRENT_FUNCTION:
  2237.          if (CURRENT_VIEW->current_window != WINDOW_COMMAND
  2238.          &&  CURRENT_VIEW->focus_line == CURRENT_VIEW->current_line)
  2239.            {
  2240.             item_values[1].value = (CHARTYPE *)"1";
  2241.             item_values[1].len = 1;
  2242.            }
  2243.           else
  2244.            {
  2245.             item_values[1].value = (CHARTYPE *)"0";
  2246.             item_values[1].len = 1;
  2247.            }
  2248.          break;
  2249.     case ITEM_DIR_FUNCTION:
  2250.          if (CURRENT_FILE->pseudo_file == PSEUDO_DIR)
  2251.            {
  2252.             item_values[1].value = (CHARTYPE *)"1";
  2253.             item_values[1].len = 1;
  2254.            }
  2255.          else
  2256.            {
  2257.             item_values[1].value = (CHARTYPE *)"0";
  2258.             item_values[1].len = 1;
  2259.            }
  2260.          break;
  2261.     case ITEM_DEFSORT:
  2262.          switch(DEFSORTx)
  2263.            {
  2264.             case DIRSORT_DIR:
  2265.                  item_values[1].value = (CHARTYPE *)"DIRECTORY";
  2266.                  break;
  2267.             case DIRSORT_NAME:
  2268.                  item_values[1].value = (CHARTYPE *)"NAME";
  2269.                  break;
  2270.             case DIRSORT_SIZE:
  2271.                  item_values[1].value = (CHARTYPE *)"SIZE";
  2272.                  break;
  2273.             case DIRSORT_TIME:
  2274.                  item_values[1].value = (CHARTYPE *)"TIME";
  2275.                  break;
  2276.             case DIRSORT_DATE:
  2277.                  item_values[1].value = (CHARTYPE *)"DATE";
  2278.                  break;
  2279.             case DIRSORT_NONE:
  2280.                  item_values[1].value = (CHARTYPE *)"OFF";
  2281.                  break;
  2282.            }
  2283.          item_values[1].len = strlen((DEFCHAR*)item_values[1].value);
  2284.          if (DIRORDERx == DIRSORT_ASC)
  2285.            {
  2286.             item_values[2].value = (CHARTYPE *)"ASCENDING";
  2287.             item_values[2].len = 9;
  2288.            }
  2289.          else
  2290.            {
  2291.             item_values[2].value = (CHARTYPE *)"DESCENDING";
  2292.             item_values[2].len = 10;
  2293.            }
  2294.          break;
  2295.     case ITEM_DIRFILEID:
  2296.          true_line = (-1L);
  2297.          if (CURRENT_FILE->pseudo_file == PSEUDO_DIR)
  2298.            {
  2299.             if (CURRENT_VIEW->current_window == WINDOW_COMMAND)
  2300.                if (CURRENT_TOF || CURRENT_BOF)
  2301.                   true_line = (-1L);
  2302.                else
  2303.                   true_line = CURRENT_VIEW->current_line;
  2304.             else
  2305.                if (FOCUS_TOF || FOCUS_BOF)
  2306.                   true_line = (-1L);
  2307.                else
  2308.                   true_line = CURRENT_VIEW->focus_line;
  2309.            }
  2310.          if (true_line == (-1L))
  2311.            {
  2312.             item_values[1].value = (CHARTYPE *)"";
  2313.             item_values[1].len = 0;
  2314.             item_values[2].value = (CHARTYPE *)"";
  2315.             item_values[2].len = 0;
  2316.            }
  2317.          else
  2318.            {
  2319.             curr = lll_find(CURRENT_FILE->first_line,CURRENT_FILE->last_line,true_line,CURRENT_FILE->number_lines);
  2320.             item_values[1].value = (CHARTYPE *)dir_path;
  2321.             item_values[1].len = strlen((DEFCHAR *)dir_path);
  2322.             if (curr->length < file_start)
  2323.               {
  2324.                item_values[2].value = (CHARTYPE *)"";
  2325.                item_values[2].len = 0;
  2326.               }
  2327.             else
  2328.               {
  2329.                item_values[2].value = (CHARTYPE *)curr->line+file_start;
  2330.                item_values[2].len = strlen((DEFCHAR *)curr->line+file_start);
  2331.               }
  2332.            }
  2333.          break;
  2334.     case ITEM_END_FUNCTION:
  2335.          if (batch_only)
  2336.            {
  2337.             item_values[1].value = (CHARTYPE *)"0";
  2338.             item_values[1].len = 1;
  2339.             break;
  2340.            }
  2341.          item_values[1].value = (CHARTYPE *)"0"; /* set FALSE by default */
  2342.          getyx(CURRENT_WINDOW,y,x);
  2343.          switch(CURRENT_VIEW->current_window)
  2344.            {
  2345.             case WINDOW_FILEAREA:
  2346.                  if (x+CURRENT_VIEW->verify_col == rec_len)
  2347.                     item_values[1].value = (CHARTYPE *)"1";
  2348.                  break;
  2349.             case WINDOW_PREFIX:
  2350.                  if (pre_rec_len > 0
  2351.                  &&  pre_rec_len-1 == x)
  2352.                     item_values[1].value = (CHARTYPE *)"1";
  2353.                  break;
  2354.             case WINDOW_COMMAND:
  2355.                  if (cmd_rec_len > 0
  2356.                  &&  cmd_rec_len-1 == x)
  2357.                     item_values[1].value = (CHARTYPE *)"1";
  2358.                  break;
  2359.            }
  2360.          item_values[1].len = 1;
  2361.          break;
  2362.     case ITEM_DISPLAY:
  2363.          sprintf((DEFCHAR *)num1,"%d",CURRENT_VIEW->display_low);
  2364.          item_values[1].value = num1;
  2365.          item_values[1].len = strlen((DEFCHAR *)num1);
  2366.          sprintf((DEFCHAR *)num2,"%d",CURRENT_VIEW->display_high);
  2367.          item_values[2].value = num2;
  2368.          item_values[2].len = strlen((DEFCHAR *)num2);
  2369.          break;
  2370.     case ITEM_EOF:
  2371.          if (CURRENT_BOF)
  2372.            {
  2373.             item_values[1].value = (CHARTYPE *)"ON";
  2374.             item_values[1].len = 2;
  2375.            }
  2376.           else
  2377.            {
  2378.             item_values[1].value = (CHARTYPE *)"OFF";
  2379.             item_values[1].len = 3;
  2380.            }
  2381.          break;
  2382.     case ITEM_EOF_FUNCTION:
  2383.          if (FOCUS_BOF && CURRENT_VIEW->current_window != WINDOW_COMMAND)
  2384.            {
  2385.             item_values[1].value = (CHARTYPE *)"1";
  2386.             item_values[1].len = 1;
  2387.            }
  2388.           else
  2389.            {
  2390.             item_values[1].value = (CHARTYPE *)"0";
  2391.             item_values[1].len = 1;
  2392.            }
  2393.          break;
  2394.     case ITEM_EOLOUT:
  2395.          switch(CURRENT_FILE->eolout)
  2396.            {
  2397.             case EOLOUT_LF:
  2398.                  item_values[1].value = (CHARTYPE *)"LF";
  2399.                  item_values[1].len = 2;
  2400.                  break;
  2401.             case EOLOUT_CR:
  2402.                  item_values[1].value = (CHARTYPE *)"CR";
  2403.                  item_values[1].len = 2;
  2404.                  break;
  2405.             case EOLOUT_CRLF:
  2406.                  item_values[1].value = (CHARTYPE *)"CRLF";
  2407.                  item_values[1].len = 4;
  2408.                  break;
  2409.             case EOLOUT_NONE:
  2410.                  item_values[1].value = (CHARTYPE *)"NONE";
  2411.                  item_values[1].len = 4;
  2412.                  break;
  2413.            }
  2414.          break;
  2415.     case ITEM_ETMODE:
  2416.          get_etmode(num1,rsrvd);
  2417.          item_values[1].value = num1;
  2418.          item_values[1].len = strlen((DEFCHAR *)num1);
  2419.          item_values[2].value = rsrvd;
  2420.          item_values[2].len = strlen((DEFCHAR *)rsrvd);
  2421.          break;
  2422.     case ITEM_FIELD:
  2423.          if (batch_only)
  2424.            {
  2425.             item_values[1].value = (CHARTYPE *)"0";
  2426.             item_values[1].len = 1;
  2427.             break;
  2428.            }
  2429.          getyx(CURRENT_WINDOW,y,x);
  2430.          switch(CURRENT_VIEW->current_window)
  2431.            {
  2432.             case WINDOW_FILEAREA:
  2433.                  item_values[1].value = rec;
  2434.                  item_values[1].len = rec_len;
  2435.                  i = x+CURRENT_VIEW->verify_col;
  2436.                  num1[0] = rec[i-1];
  2437.                  item_values[4].value = (CHARTYPE*)"TEXT";
  2438.                  item_values[4].len = 4;
  2439.                  break;
  2440.             case WINDOW_PREFIX:
  2441.                  item_values[1].value = pre_rec;
  2442.                  item_values[1].len = pre_rec_len;
  2443.                  i = x+1;
  2444.                  num1[0] = pre_rec[i-1];
  2445.                  item_values[4].value = (CHARTYPE*)"PREFIX";
  2446.                  item_values[4].len = 6;
  2447.                  break;
  2448.             case WINDOW_COMMAND:
  2449.                  item_values[1].value = cmd_rec;
  2450.                  item_values[1].len = cmd_rec_len;
  2451.                  i = x+1;
  2452.                  num1[0] = cmd_rec[i-1];
  2453.                  item_values[4].value = (CHARTYPE*)"COMMAND";
  2454.                  item_values[4].len = 7;
  2455.                  break;
  2456.            }
  2457.          num1[1] = '\0';
  2458.          item_values[2].value = num1;
  2459.          item_values[2].len = 1;
  2460.          sprintf((DEFCHAR*)num2,"%d",i);
  2461.          item_values[3].value = num2;
  2462.          item_values[3].len = strlen((DEFCHAR*)num2);
  2463.          break;
  2464.     case ITEM_FIRST_FUNCTION:
  2465.          if (batch_only)
  2466.            {
  2467.             item_values[1].value = (CHARTYPE *)"0";
  2468.             item_values[1].len = 1;
  2469.             break;
  2470.            }
  2471.          getyx(CURRENT_WINDOW,y,x);
  2472.          if (x == 0)
  2473.            {
  2474.             item_values[1].value = (CHARTYPE *)"1";
  2475.             item_values[1].len = 1;
  2476.            }
  2477.          else
  2478.            {
  2479.             item_values[1].value = (CHARTYPE *)"0";
  2480.             item_values[1].len = 1;
  2481.            }
  2482.          break;
  2483.     case ITEM_FOCUSEOF_FUNCTION:
  2484.          if (FOCUS_BOF)
  2485.            {
  2486.             item_values[1].value = (CHARTYPE *)"1";
  2487.             item_values[1].len = 1;
  2488.            }
  2489.          else
  2490.            {
  2491.             item_values[1].value = (CHARTYPE *)"0";
  2492.             item_values[1].len = 1;
  2493.            }
  2494.          break;
  2495.     case ITEM_FOCUSTOF_FUNCTION:
  2496.          if (FOCUS_TOF)
  2497.            {
  2498.             item_values[1].value = (CHARTYPE *)"1";
  2499.             item_values[1].len = 1;
  2500.            }
  2501.          else
  2502.            {
  2503.             item_values[1].value = (CHARTYPE *)"0";
  2504.             item_values[1].len = 1;
  2505.            }
  2506.          break;
  2507.     case ITEM_FILENAME:
  2508.          item_values[1].value = (CHARTYPE *)CURRENT_FILE->fname;
  2509.          item_values[1].len = strlen((DEFCHAR *)CURRENT_FILE->fname);
  2510.          break;
  2511.     case ITEM_FMODE:
  2512. #if defined(UNIX)
  2513.          item_values[1].value = (CHARTYPE *)"";
  2514.          item_values[1].len = 0;
  2515. #else
  2516.          num0[0] = (CHARTYPE)*(CURRENT_FILE->fpath);
  2517.          num0[1] = '\0';
  2518.          item_values[1].value = num0;
  2519.          item_values[1].len = 1;
  2520. #endif
  2521.          break;
  2522.     case ITEM_FNAME:
  2523.          strcpy((DEFCHAR*)rsrvd,(DEFCHAR*)CURRENT_FILE->fname);
  2524.          x = strzreveq(rsrvd,'.');
  2525.          if (x != (-1))
  2526.             rsrvd[x] = '\0';
  2527.          item_values[1].value = rsrvd;
  2528.          item_values[1].len = strlen((DEFCHAR *)rsrvd);
  2529.          break;
  2530.     case ITEM_FPATH:
  2531.          item_values[1].value = (CHARTYPE *)CURRENT_FILE->fpath;
  2532.          item_values[1].len = strlen((DEFCHAR *)CURRENT_FILE->fpath);
  2533.          break;
  2534.     case ITEM_FTYPE:
  2535.     case ITEM_FEXT:
  2536.          x = strzreveq(CURRENT_FILE->fname,'.');
  2537.          if (x == (-1))
  2538.            {
  2539.             item_values[1].value = (CHARTYPE *)"";
  2540.             item_values[1].len = 0;
  2541.            }
  2542.          else
  2543.            {
  2544.             item_values[1].value = (CHARTYPE *)CURRENT_FILE->fname+x+1;
  2545.             item_values[1].len = strlen((DEFCHAR *)CURRENT_FILE->fname+x+1);
  2546.            }
  2547.          break;
  2548.     case ITEM_FULLFNAME:
  2549.          if (CURRENT_FILE->display_actual_filename)
  2550.            {
  2551.             item_values[1].value = (CHARTYPE *)"ON";
  2552.             item_values[1].len = 2;
  2553.            }
  2554.           else
  2555.            {
  2556.             item_values[1].value = (CHARTYPE *)"OFF";
  2557.             item_values[1].len = 3;
  2558.            }
  2559.          break;
  2560.     case ITEM_GETENV:
  2561. #if defined(UNIX)
  2562.          if (query_type == QUERY_FUNCTION)
  2563.             tmpbuf = (CHARTYPE *)getenv((DEFCHAR *)arg);
  2564.          else
  2565.             tmpbuf = (CHARTYPE *)getenv((DEFCHAR *)itemargs);
  2566. #else
  2567.          if (query_type == QUERY_FUNCTION)
  2568.             tmpbuf = (CHARTYPE *)getenv((DEFCHAR *)make_upper(arg));
  2569.          else
  2570.             tmpbuf = (CHARTYPE *)getenv((DEFCHAR *)make_upper(itemargs));
  2571. #endif
  2572.          if (tmpbuf == NULL)
  2573.             item_values[1].value = (CHARTYPE *)"***invalid***";
  2574.          else
  2575.             item_values[1].value = tmpbuf;
  2576.          item_values[1].len = strlen((DEFCHAR *)item_values[1].value);
  2577.          break;
  2578.     case ITEM_HEX:
  2579.          if (CURRENT_VIEW->hex)
  2580.            {
  2581.             item_values[1].value = (CHARTYPE *)"ON";
  2582.             item_values[1].len = 2;
  2583.            }
  2584.           else
  2585.            {
  2586.             item_values[1].value = (CHARTYPE *)"OFF";
  2587.             item_values[1].len = 3;
  2588.            }
  2589.          break;
  2590.     case ITEM_HEXDISPLAY:
  2591.          if (HEXDISPLAYx)
  2592.            {
  2593.             item_values[1].value = (CHARTYPE *)"ON";
  2594.             item_values[1].len = 2;
  2595.            }
  2596.           else
  2597.            {
  2598.             item_values[1].value = (CHARTYPE *)"OFF";
  2599.             item_values[1].len = 3;
  2600.            }
  2601.          break;
  2602.     case ITEM_HEXSHOW:
  2603.          if (CURRENT_VIEW->hexshow_on)
  2604.            {
  2605.             item_values[1].value = (CHARTYPE *)"ON";
  2606.             item_values[1].len = 2;
  2607.            }
  2608.           else
  2609.            {
  2610.             item_values[1].value = (CHARTYPE *)"OFF";
  2611.             item_values[1].len = 3;
  2612.            }
  2613.          if (CURRENT_VIEW->hexshow_base == POSITION_MIDDLE)
  2614.             sprintf((DEFCHAR *)rsrvd,"M%+d",CURRENT_VIEW->hexshow_off);
  2615.          else
  2616.             sprintf((DEFCHAR *)rsrvd,"%d",CURRENT_VIEW->hexshow_off);
  2617.          item_values[2].value = rsrvd;
  2618.          item_values[2].len = strlen((DEFCHAR *)rsrvd);
  2619.          break;
  2620.     case ITEM_HIGHLIGHT:
  2621.          switch (CURRENT_VIEW->highlight)
  2622.            {
  2623.             case HIGHLIGHT_NONE:
  2624.                  item_values[1].value = (CHARTYPE *)"OFF";
  2625.                  break;
  2626.             case HIGHLIGHT_ALT:
  2627.                  item_values[1].value = (CHARTYPE *)"ALTERED";
  2628.                  break;
  2629.             case HIGHLIGHT_TAG:
  2630.                  item_values[1].value = (CHARTYPE *)"TAGGED";
  2631.                  break;                                    
  2632.             case HIGHLIGHT_SELECT:
  2633.                  item_values[1].value = (CHARTYPE *)"SELECT";
  2634.                  sprintf((DEFCHAR *)num1,"%d",CURRENT_VIEW->highlight_low);
  2635.                  item_values[2].value = num1;
  2636.                  item_values[2].len = strlen((DEFCHAR *)num1);
  2637.                  sprintf((DEFCHAR *)num2,"%d",CURRENT_VIEW->highlight_high);
  2638.                  item_values[3].value = num2;
  2639.                  item_values[3].len = strlen((DEFCHAR *)num2);
  2640.                  number_variables = 3;
  2641.                  break;                                    
  2642.             default:
  2643.                  break;                                    
  2644.            }
  2645.          item_values[1].len = strlen((DEFCHAR *)item_values[1].value);
  2646.          break;
  2647.     case ITEM_IDLINE:
  2648.          if (CURRENT_VIEW->id_line)
  2649.            {
  2650.             item_values[1].value = (CHARTYPE *)"ON";
  2651.             item_values[1].len = 2;
  2652.            }
  2653.           else
  2654.            {
  2655.             item_values[1].value = (CHARTYPE *)"OFF";
  2656.             item_values[1].len = 3;
  2657.            }
  2658.          break;
  2659.     case ITEM_IMPMACRO:
  2660.          if (CURRENT_VIEW->imp_macro)
  2661.            {
  2662.             item_values[1].value = (CHARTYPE *)"ON";
  2663.             item_values[1].len = 2;
  2664.            }
  2665.           else
  2666.            {
  2667.             item_values[1].value = (CHARTYPE *)"OFF";
  2668.             item_values[1].len = 3;
  2669.            }
  2670.          break;
  2671.     case ITEM_IMPOS:
  2672.          if (CURRENT_VIEW->imp_os)
  2673.            {
  2674.             item_values[1].value = (CHARTYPE *)"ON";
  2675.             item_values[1].len = 2;
  2676.            }
  2677.           else
  2678.            {
  2679.             item_values[1].value = (CHARTYPE *)"OFF";
  2680.             item_values[1].len = 3;
  2681.            }
  2682.          break;
  2683.     case ITEM_INBLOCK_FUNCTION:
  2684.          if (batch_only)
  2685.            {
  2686.             item_values[1].value = (CHARTYPE *)"0";
  2687.             item_values[1].len = 1;
  2688.             break;
  2689.            }
  2690.          bool_flag = FALSE;
  2691.          if (CURRENT_VIEW == MARK_VIEW
  2692.          &&  CURRENT_VIEW->current_window == WINDOW_FILEAREA)
  2693.            {
  2694.             getyx(CURRENT_WINDOW_FILEAREA,y,x);
  2695.             switch(MARK_VIEW->mark_type)
  2696.               {
  2697.                case M_LINE:
  2698.                     if ((CURRENT_VIEW->focus_line >= MARK_VIEW->mark_start_line)
  2699.                     &&  (CURRENT_VIEW->focus_line <= MARK_VIEW->mark_end_line))
  2700.                       bool_flag = TRUE;
  2701.                     break;
  2702.                case M_BOX:
  2703.                case M_WORD:
  2704.                case M_COLUMN:
  2705.                     if ((CURRENT_VIEW->focus_line >= MARK_VIEW->mark_start_line)
  2706.                     &&  (CURRENT_VIEW->focus_line <= MARK_VIEW->mark_end_line)
  2707.                     &&  (x + CURRENT_VIEW->verify_start >= MARK_VIEW->mark_start_col)
  2708.                     &&  (x + CURRENT_VIEW->verify_start <= MARK_VIEW->mark_end_col))
  2709.                       bool_flag = TRUE;
  2710.                     break;
  2711.                case M_STREAM:
  2712.                     break;
  2713.                default:
  2714.                     break;
  2715.               }
  2716.            }
  2717.          if (bool_flag)
  2718.            {
  2719.             item_values[1].value = (CHARTYPE *)"1";
  2720.             item_values[1].len = 1;
  2721.            }
  2722.           else
  2723.            {
  2724.             item_values[1].value = (CHARTYPE *)"0";
  2725.             item_values[1].len = 1;
  2726.            }
  2727.          break;
  2728.     case ITEM_INCOMMAND_FUNCTION:
  2729.          if (CURRENT_VIEW->current_window == WINDOW_COMMAND)
  2730.            {
  2731.             item_values[1].value = (CHARTYPE *)"1";
  2732.             item_values[1].len = 1;
  2733.            }
  2734.           else
  2735.            {
  2736.             item_values[1].value = (CHARTYPE *)"0";
  2737.             item_values[1].len = 1;
  2738.            }
  2739.          break;
  2740.     case ITEM_INITIAL_FUNCTION:
  2741.          if (in_profile)
  2742.            {
  2743.             item_values[1].value = (CHARTYPE *)"1";
  2744.             item_values[1].len = 1;
  2745.            }
  2746.           else
  2747.            {
  2748.             item_values[1].value = (CHARTYPE *)"0";
  2749.             item_values[1].len = 1;
  2750.            }
  2751.          break;
  2752.     case ITEM_INPREFIX_FUNCTION:
  2753.          if (CURRENT_VIEW->current_window == WINDOW_PREFIX)
  2754.            {
  2755.             item_values[1].value = (CHARTYPE *)"1";
  2756.             item_values[1].len = 1;
  2757.            }
  2758.           else
  2759.            {
  2760.             item_values[1].value = (CHARTYPE *)"0";
  2761.             item_values[1].len = 1;
  2762.            }
  2763.          break;
  2764.     case ITEM_INPUTMODE:
  2765.          if (CURRENT_VIEW->inputmode == INPUTMODE_OFF)
  2766.            {
  2767.             item_values[1].value = (CHARTYPE *)"OFF";
  2768.             item_values[1].len = 3;
  2769.            }
  2770.          if (CURRENT_VIEW->inputmode == INPUTMODE_FULL)
  2771.            {
  2772.             item_values[1].value = (CHARTYPE *)"FULL";
  2773.             item_values[1].len = 4;
  2774.            }
  2775.          if (CURRENT_VIEW->inputmode == INPUTMODE_LINE)
  2776.            {
  2777.             item_values[1].value = (CHARTYPE *)"LINE";
  2778.             item_values[1].len = 4;
  2779.            }
  2780.          break;
  2781.     case ITEM_INSERTMODE:
  2782.          if (INSERTMODEx)
  2783.            {
  2784.             item_values[1].value = (CHARTYPE *)"ON";
  2785.             item_values[1].len = 2;
  2786.            }
  2787.           else
  2788.            {
  2789.             item_values[1].value = (CHARTYPE *)"OFF";
  2790.             item_values[1].len = 3;
  2791.            }
  2792.          break;
  2793.     case ITEM_LASTMSG:
  2794.          item_values[1].value = (CHARTYPE *)last_message;
  2795.          item_values[1].len = strlen((DEFCHAR *)last_message);
  2796.          break;
  2797.     case ITEM_LASTRC:
  2798.          sprintf((DEFCHAR *)num1,"%d",lastrc);
  2799.          item_values[1].value = num1;
  2800.          item_values[1].len = strlen((DEFCHAR *)num1);
  2801.          break;
  2802.     case ITEM_LEFTEDGE_FUNCTION:
  2803.          if (batch_only)
  2804.            {
  2805.             item_values[1].value = (CHARTYPE *)"0";
  2806.             item_values[1].len = 1;
  2807.             break;
  2808.            }
  2809.          getyx(CURRENT_WINDOW,y,x);
  2810.          if (CURRENT_VIEW->current_window == WINDOW_FILEAREA
  2811.          &&  x == 0)
  2812.            {
  2813.             item_values[1].value = (CHARTYPE *)"1";
  2814.             item_values[1].len = 1;
  2815.            }
  2816.           else
  2817.            {
  2818.             item_values[1].value = (CHARTYPE *)"0";
  2819.             item_values[1].len = 1;
  2820.            }
  2821.          break;
  2822.     case ITEM_LENGTH:
  2823.          curr = lll_find(CURRENT_FILE->first_line,CURRENT_FILE->last_line,CURRENT_VIEW->current_line,CURRENT_FILE->number_lines);
  2824.          sprintf((DEFCHAR *)num1,"%d",curr->length);
  2825.          item_values[1].value = num1;
  2826.          item_values[1].len = strlen((DEFCHAR *)num1);
  2827.          break;
  2828.     case ITEM_LINE:
  2829.          sprintf((DEFCHAR *)num1,"%ld",
  2830.                  (compatible_feel==COMPAT_XEDIT)?CURRENT_VIEW->current_line:get_true_line(TRUE));
  2831.          item_values[1].value = num1;
  2832.          item_values[1].len = strlen((DEFCHAR *)num1);
  2833.          break;
  2834.     case ITEM_LINEFLAG:
  2835.          curr = lll_find(CURRENT_FILE->first_line,CURRENT_FILE->last_line,
  2836.                          (compatible_feel==COMPAT_XEDIT)?CURRENT_VIEW->current_line:get_true_line(TRUE),
  2837.                          CURRENT_FILE->number_lines);
  2838.          if (curr->new_flag)
  2839.             item_values[1].value = (CHARTYPE *)"NEW";
  2840.          else
  2841.             item_values[1].value = (CHARTYPE *)"NONEW";
  2842.          item_values[1].len = strlen((DEFCHAR *)item_values[1].value);
  2843.          if (curr->changed_flag)
  2844.             item_values[2].value = (CHARTYPE *)"CHANGE";
  2845.          else
  2846.             item_values[2].value = (CHARTYPE *)"NOCHANGE";
  2847.          item_values[2].len = strlen((DEFCHAR *)item_values[2].value);
  2848.          if (curr->tag_flag)
  2849.             item_values[3].value = (CHARTYPE *)"TAG";
  2850.          else
  2851.             item_values[3].value = (CHARTYPE *)"NOTAG";
  2852.          item_values[3].len = strlen((DEFCHAR *)item_values[3].value);
  2853.          break;
  2854.     case ITEM_LINEND:
  2855.          if (CURRENT_VIEW->linend_status)
  2856.            {
  2857.             item_values[1].value = (CHARTYPE *)"ON";
  2858.             item_values[1].len = 2;
  2859.            }
  2860.           else
  2861.            {
  2862.             item_values[1].value = (CHARTYPE *)"OFF";
  2863.             item_values[1].len = 3;
  2864.            }
  2865.          num1[0] = CURRENT_VIEW->linend_value;
  2866.          num1[1] = '\0';
  2867.          item_values[2].value = num1;
  2868.          item_values[2].len = 1;
  2869.          break;
  2870.     case ITEM_LSCREEN:
  2871.          sprintf((DEFCHAR *)num1,"%d",CURRENT_SCREEN.screen_rows);
  2872.          item_values[1].value = num1;
  2873.          item_values[1].len = strlen((DEFCHAR *)num1);
  2874.          sprintf((DEFCHAR *)num2,"%d",CURRENT_SCREEN.screen_cols);
  2875.          item_values[2].value = num2;
  2876.          item_values[2].len = strlen((DEFCHAR *)num2);
  2877.          sprintf((DEFCHAR *)num3,"%d",CURRENT_SCREEN.screen_start_row+1);
  2878.          item_values[3].value = num3;
  2879.          item_values[3].len = strlen((DEFCHAR *)num3);
  2880.          sprintf((DEFCHAR *)num4,"%d",CURRENT_SCREEN.screen_start_col+1);
  2881.          item_values[4].value = num4;
  2882.          item_values[4].len = strlen((DEFCHAR *)num4);
  2883.          sprintf((DEFCHAR *)num5,"%d",terminal_lines);
  2884.          item_values[5].value = num5;
  2885.          item_values[5].len = strlen((DEFCHAR *)num5);
  2886.          sprintf((DEFCHAR *)num6,"%d",COLS);
  2887.          item_values[6].value = num6;
  2888.          item_values[6].len = strlen((DEFCHAR *)num6);
  2889.          break;
  2890.     case ITEM_MACRO:
  2891.          if (CURRENT_VIEW->macro)
  2892.            {
  2893.             item_values[1].value = (CHARTYPE *)"ON";
  2894.             item_values[1].len = 2;
  2895.            }
  2896.           else
  2897.            {
  2898.             item_values[1].value = (CHARTYPE *)"OFF";
  2899.             item_values[1].len = 3;
  2900.            }
  2901.          break;
  2902.     case ITEM_MACROEXT:
  2903.          if (strlen((DEFCHAR *)macro_suffix) == 0)
  2904.             item_values[1].value = (CHARTYPE *)macro_suffix;
  2905.          else
  2906.             item_values[1].value = (CHARTYPE *)macro_suffix+1;
  2907.          item_values[1].len = strlen((DEFCHAR *)macro_suffix);
  2908.          break;
  2909.     case ITEM_MACROPATH:
  2910.          item_values[1].value = (CHARTYPE *)the_macro_path;
  2911.          item_values[1].len = strlen((DEFCHAR *)the_macro_path);
  2912.          break;
  2913.     case ITEM_MARGINS:
  2914.          sprintf((DEFCHAR *)num1,"%d",CURRENT_VIEW->margin_left);
  2915.          item_values[1].value = num1;
  2916.          item_values[1].len = strlen((DEFCHAR *)num1);
  2917.          sprintf((DEFCHAR *)num2,"%d",CURRENT_VIEW->margin_right);
  2918.          item_values[2].value = num2;
  2919.          item_values[2].len = strlen((DEFCHAR *)num2);
  2920.          if (CURRENT_VIEW->margin_indent_offset_status)
  2921.             sprintf((DEFCHAR *)num3,"%+d",CURRENT_VIEW->margin_indent);
  2922.          else
  2923.             sprintf((DEFCHAR *)num3,"%d",CURRENT_VIEW->margin_indent);
  2924.          item_values[3].value = num3;
  2925.          item_values[3].len = strlen((DEFCHAR *)num3);
  2926.          break;
  2927.     case ITEM_MODIFIABLE_FUNCTION:
  2928.          switch(CURRENT_VIEW->current_window)
  2929.            {
  2930.             case WINDOW_FILEAREA:
  2931.                  if (batch_only)
  2932.                    {
  2933.                     bool_flag = FALSE;
  2934.                     break;
  2935.                    }
  2936.                  getyx(CURRENT_WINDOW,y,x);
  2937.                  if (FOCUS_TOF 
  2938.                  ||  FOCUS_BOF
  2939.                  ||  CURRENT_SCREEN.sl[y].line_type == LINE_SHADOW)
  2940.                     bool_flag = FALSE;
  2941.                  else
  2942.                     bool_flag = TRUE;
  2943.                  break;
  2944.             default:
  2945.                  bool_flag = TRUE;
  2946.                  break;
  2947.            }
  2948.          if (bool_flag)
  2949.            {
  2950.             item_values[1].value = (CHARTYPE *)"1";
  2951.             item_values[1].len = 1;
  2952.            }
  2953.           else
  2954.            {
  2955.             item_values[1].value = (CHARTYPE *)"0";
  2956.             item_values[1].len = 1;
  2957.            }
  2958.          break;
  2959.     case ITEM_MONITOR:
  2960. #ifdef A_COLOR
  2961.          if (colour_support)
  2962.            {
  2963.             item_values[1].value = (CHARTYPE *)"COLOR";
  2964.             item_values[1].len = 5;
  2965.            }
  2966.           else
  2967.            {
  2968.             item_values[1].value = (CHARTYPE *)"MONO";
  2969.             item_values[1].len = 4;
  2970.            }
  2971.           item_values[2].value = (CHARTYPE *)"COLOR";
  2972.           item_values[2].len = 5;
  2973.           break;
  2974. #else
  2975.           item_values[1].value = (CHARTYPE *)"MONO";
  2976.           item_values[1].len = 4;
  2977.           item_values[2].value = (CHARTYPE *)"MONO";
  2978.           item_values[2].len = 4;
  2979.          break;
  2980. #endif
  2981.     case ITEM_MOUSE:
  2982.          if (MOUSEx)
  2983.            {
  2984.             item_values[1].value = (CHARTYPE *)"ON";
  2985.             item_values[1].len = 2;
  2986.            }
  2987.          else
  2988.            {
  2989.             item_values[1].value = (CHARTYPE *)"OFF";
  2990.             item_values[1].len = 3;
  2991.            }
  2992.          break;
  2993.     case ITEM_MSGLINE:
  2994.          item_values[1].value = (CHARTYPE *)"ON";
  2995.          item_values[1].len = 2;
  2996.          if (CURRENT_VIEW->msgline_base == POSITION_MIDDLE)
  2997.             sprintf((DEFCHAR *)rsrvd,"M%+d",CURRENT_VIEW->msgline_off);
  2998.          else
  2999.             sprintf((DEFCHAR *)rsrvd,"%d",CURRENT_VIEW->msgline_off);
  3000.          item_values[2].value = rsrvd;
  3001.          item_values[2].len = strlen((DEFCHAR *)rsrvd);
  3002.          sprintf((DEFCHAR *)num1,"%d",CURRENT_VIEW->msgline_rows);
  3003.          item_values[3].value = num1;
  3004.          item_values[3].len = strlen((DEFCHAR *)num1);
  3005.          item_values[4].value = (CHARTYPE *)"OVERLAY";
  3006.          item_values[4].len = 7;
  3007.          break;
  3008.     case ITEM_MSGMODE:
  3009.          if (CURRENT_VIEW->msgmode_status)
  3010.            {
  3011.             item_values[1].value = (CHARTYPE *)"ON";
  3012.             item_values[1].len = 2;
  3013.            }
  3014.           else
  3015.            {
  3016.             item_values[1].value = (CHARTYPE *)"OFF";
  3017.             item_values[1].len = 3;
  3018.            }
  3019.          break;
  3020.     case ITEM_NBFILE:
  3021.          sprintf((DEFCHAR *)num1,"%d",number_of_files);
  3022.          item_values[1].value = num1;
  3023.          item_values[1].len = strlen((DEFCHAR *)num1);
  3024.          break;
  3025.     case ITEM_NEWLINES:
  3026.          if (CURRENT_VIEW->newline_aligned)
  3027.            {
  3028.             item_values[1].value = (CHARTYPE *)"ALIGNED";
  3029.             item_values[1].len = 7;
  3030.            }
  3031.           else
  3032.            {
  3033.             item_values[1].value = (CHARTYPE *)"LEFT";
  3034.             item_values[1].len = 4;
  3035.            }
  3036.          break;
  3037.     case ITEM_NONDISP:
  3038.          num1[0] = NONDISPx;
  3039.          num1[1] ='\0';
  3040.          item_values[1].value = num1;
  3041.          item_values[1].len = 1;
  3042.          break;
  3043.     case ITEM_NUMBER:
  3044.          if (CURRENT_VIEW->number)
  3045.            {
  3046.             item_values[1].value = (CHARTYPE *)"ON";
  3047.             item_values[1].len = 2;
  3048.            }
  3049.          else
  3050.            {
  3051.             item_values[1].value = (CHARTYPE *)"OFF";
  3052.             item_values[1].len = 3;
  3053.            }
  3054.          break;
  3055.     case ITEM_PENDING:
  3056.          number_variables = extract_pending(itemno,itemargs);
  3057.          break;
  3058.     case ITEM_POINT:
  3059.          switch(query_type)
  3060.            {
  3061.             case QUERY_QUERY:
  3062.             case QUERY_MODIFY:
  3063.                  true_line = (compatible_feel==COMPAT_XEDIT)?CURRENT_VIEW->current_line:get_true_line(TRUE);
  3064.                  curr = lll_find(CURRENT_FILE->first_line,CURRENT_FILE->last_line,true_line,CURRENT_FILE->number_lines);
  3065.                  if (curr->name == NULL)  /* line not named */
  3066.                    {
  3067.                     item_values[1].value = (CHARTYPE *)"";
  3068.                     item_values[1].len = 0;
  3069.                    }
  3070.                  else
  3071.                    {
  3072.                     item_values[1].value = curr->name;
  3073.                     item_values[1].len = strlen((DEFCHAR *)curr->name);
  3074.                    }
  3075.                  break;
  3076.             default:
  3077.                  number_variables = extract_point(itemno,itemargs);
  3078.                  break;
  3079.            }
  3080.          break;
  3081.     case ITEM_POSITION:
  3082.          if (CURRENT_VIEW->position_status)
  3083.            {
  3084.             item_values[1].value = (CHARTYPE *)"ON";
  3085.             item_values[1].len = 2;
  3086.            }
  3087.           else
  3088.            {
  3089.             item_values[1].value = (CHARTYPE *)"OFF";
  3090.             item_values[1].len = 3;
  3091.            }
  3092.          if (query_type == QUERY_EXTRACT
  3093.          ||  query_type == QUERY_FUNCTION)
  3094.            {
  3095.             get_current_position(current_screen,&true_line,&col);
  3096.             sprintf((DEFCHAR *)num1,"%ld",true_line);
  3097.             item_values[2].value = num1;
  3098.             item_values[2].len = strlen((DEFCHAR *)num1);
  3099.             sprintf((DEFCHAR *)num2,"%d",col);
  3100.             item_values[3].value = num2;
  3101.             item_values[3].len = strlen((DEFCHAR *)num2);
  3102.            }
  3103.          else
  3104.             number_variables = 1;
  3105.          break;
  3106.     case ITEM_PREFIX:
  3107.          if (rexx_support)
  3108.            {
  3109.             if (strcmp((DEFCHAR *)itemargs,"") != 0)
  3110.               {
  3111.                number_variables = extract_prefix(itemno,itemargs);
  3112.                break;
  3113.               }
  3114.            }
  3115.          else
  3116.            {
  3117.             if (strcmp((DEFCHAR *)itemargs,"") != 0)
  3118.               {
  3119.                display_error(2,(CHARTYPE *)itemargs,FALSE);
  3120.                number_variables = EXTRACT_ARG_ERROR;
  3121.                break;
  3122.               }
  3123.            }
  3124.          if (CURRENT_VIEW->prefix == PREFIX_OFF)
  3125.            {
  3126.             item_values[1].value = (CHARTYPE *)"OFF";
  3127.             item_values[1].len = 3;
  3128.             item_values[2].value = (CHARTYPE *)"";  /* this set to empty deliberately */
  3129.             item_values[2].len = 0;
  3130.             number_variables = 1;
  3131.             break;
  3132.            }
  3133.          if ((CURRENT_VIEW->prefix&PREFIX_STATUS_MASK) == PREFIX_ON)
  3134.            {
  3135.             item_values[1].value = (CHARTYPE *)"ON";
  3136.             item_values[1].len = 2;
  3137.            }
  3138.          else
  3139.            {
  3140.             item_values[1].value = (CHARTYPE *)"NULLS";
  3141.             item_values[1].len = 5;
  3142.            }
  3143.          if ((CURRENT_VIEW->prefix&PREFIX_LOCATION_MASK) == PREFIX_LEFT)
  3144.            {
  3145.             item_values[2].value = (CHARTYPE *)"LEFT";
  3146.             item_values[2].len = 4;
  3147.            }
  3148.          else
  3149.            {
  3150.             item_values[2].value = (CHARTYPE *)"RIGHT";
  3151.             item_values[2].len = 5;
  3152.            }
  3153.          sprintf((DEFCHAR *)num1,"%d",CURRENT_VIEW->prefix_width);
  3154.          item_values[3].value = num1;
  3155.          item_values[3].len = strlen((DEFCHAR *)num1);
  3156.          sprintf((DEFCHAR *)num2,"%d",CURRENT_VIEW->prefix_gap);
  3157.          item_values[4].value = num2;
  3158.          item_values[4].len = strlen((DEFCHAR *)num2);
  3159.          number_variables = 4;
  3160.          break;
  3161.     case ITEM_PRINTER:
  3162. #if defined(UNIX) || defined(OS2) || defined(EMX)
  3163.          item_values[1].value = (CHARTYPE *)spooler_name;
  3164.          item_values[1].len = strlen((DEFCHAR *)spooler_name);
  3165. #else
  3166.          item_values[1].value = (CHARTYPE *)"LPT1";
  3167.          item_values[1].len = 4;
  3168. #endif
  3169.          break;
  3170.     case ITEM_REPROFILE:
  3171.          if (REPROFILEx)
  3172.            {
  3173.             item_values[1].value = (CHARTYPE *)"ON";
  3174.             item_values[1].len = 2;
  3175.            }
  3176.          else
  3177.            {
  3178.             item_values[1].value = (CHARTYPE *)"OFF";
  3179.             item_values[1].len = 3;
  3180.            }
  3181.          break;
  3182.     case ITEM_READV:
  3183.          while(1)
  3184.            {
  3185. #ifdef CAN_RESIZE
  3186.          if (is_termresized())
  3187.            {
  3188.             (void)THE_Resize(0,0);
  3189.             (void)THERefresh((CHARTYPE *)"");
  3190.            }
  3191. #endif
  3192.             key = my_getch(stdscr);
  3193. #ifdef CAN_RESIZE
  3194.             if (is_termresized())
  3195.                continue;
  3196. #endif     
  3197.             break;
  3198.            }
  3199.          keyname = get_key_name(key);
  3200.          if (keyname == NULL)
  3201.            {
  3202.             item_values[1].value = (CHARTYPE *)"";
  3203.             item_values[1].len = 0;
  3204.            }
  3205.          else
  3206.            {
  3207.             item_values[1].value = keyname;
  3208.             item_values[1].len = strlen((DEFCHAR *)keyname);
  3209.            }
  3210.          if (key < 256)
  3211.            {
  3212.             sprintf((DEFCHAR *)num1,"%d",key);
  3213.             item_values[2].value = num1;
  3214.             item_values[2].len = strlen((DEFCHAR *)num1);
  3215.            }
  3216.          else
  3217.            {
  3218.             item_values[2].value = (CHARTYPE *)"";
  3219.             item_values[2].len = 0;
  3220.            }
  3221.          sprintf((DEFCHAR *)num2,"%d",key);
  3222.          item_values[3].value = num2;
  3223.          item_values[3].len = strlen((DEFCHAR *)num2);
  3224.          break;
  3225.     case ITEM_RESERVED:
  3226.          number_variables = extract_reserved(itemno,itemargs,query_type);
  3227.          break;
  3228.     case ITEM_REXXOUTPUT:
  3229.          if (CAPREXXOUTx)
  3230.            {
  3231.             item_values[1].value = (CHARTYPE *)"FILE";
  3232.             item_values[1].len = 4;
  3233.            }
  3234.           else
  3235.            {
  3236.             item_values[1].value = (CHARTYPE *)"DISPLAY";
  3237.             item_values[1].len = 7;
  3238.            }
  3239.          sprintf((DEFCHAR *)num1,"%ld",CAPREXXMAXx);
  3240.          item_values[2].value = num1;
  3241.          item_values[2].len = strlen((DEFCHAR *)num1);
  3242.          break;
  3243.     case ITEM_RIGHTEDGE_FUNCTION:
  3244.          if (batch_only)
  3245.            {
  3246.             item_values[1].value = (CHARTYPE *)"0";
  3247.             item_values[1].len = 1;
  3248.             break;
  3249.            }
  3250.          getyx(CURRENT_WINDOW,y,x);
  3251.          if (CURRENT_VIEW->current_window == WINDOW_FILEAREA
  3252.          &&  x == getmaxx(CURRENT_WINDOW)-1)
  3253.            {
  3254.             item_values[1].value = (CHARTYPE *)"1";
  3255.             item_values[1].len = 1;
  3256.            }
  3257.           else
  3258.            {
  3259.             item_values[1].value = (CHARTYPE *)"0";
  3260.             item_values[1].len = 1;
  3261.            }
  3262.          break;
  3263.     case ITEM_RING:
  3264.          if (query_type == QUERY_FUNCTION)
  3265.             number_variables = number_of_files;
  3266.          else
  3267.             number_variables = extract_ring(itemno,rsrvd,query_type);
  3268.          break;
  3269.     case ITEM_SCALE:
  3270.          if (CURRENT_VIEW->scale_on)
  3271.            {
  3272.             item_values[1].value = (CHARTYPE *)"ON";
  3273.             item_values[1].len = 2;
  3274.            }
  3275.           else
  3276.            {
  3277.             item_values[1].value = (CHARTYPE *)"OFF";
  3278.             item_values[1].len = 3;
  3279.            }
  3280.          if (CURRENT_VIEW->scale_base == POSITION_MIDDLE)
  3281.             sprintf((DEFCHAR *)rsrvd,"M%+d",CURRENT_VIEW->scale_off);
  3282.          else
  3283.             sprintf((DEFCHAR *)rsrvd,"%d",CURRENT_VIEW->scale_off);
  3284.          item_values[2].value = rsrvd;
  3285.          item_values[2].len = strlen((DEFCHAR *)rsrvd);
  3286.          break;
  3287.     case ITEM_SCOPE:
  3288.          if (CURRENT_VIEW->scope_all)
  3289.            {
  3290.             item_values[1].value = (CHARTYPE *)"ALL";
  3291.             item_values[1].len = 3;
  3292.            }
  3293.           else
  3294.            {
  3295.             item_values[1].value = (CHARTYPE *)"DISPLAY";
  3296.             item_values[1].len = 7;
  3297.            }
  3298.          break;
  3299.     case ITEM_SCREEN:
  3300.          sprintf((DEFCHAR *)num1,"%d",display_screens);
  3301.          item_values[1].value = num1;
  3302.          item_values[1].len = strlen((DEFCHAR *)num1);
  3303.          if (horizontal)
  3304.            {
  3305.             item_values[2].value = (CHARTYPE *)"HORIZONTAL";
  3306.             item_values[2].len = 10;
  3307.            }
  3308.           else
  3309.            {
  3310.             item_values[2].value = (CHARTYPE *)"VERTICAL";
  3311.             item_values[2].len = 8;
  3312.            }
  3313.          break;
  3314.     case ITEM_SELECT:
  3315.          curr = lll_find(CURRENT_FILE->first_line,CURRENT_FILE->last_line,
  3316.                          (compatible_feel==COMPAT_XEDIT)?CURRENT_VIEW->current_line:get_true_line(TRUE),
  3317.                          CURRENT_FILE->number_lines);
  3318.          sprintf((DEFCHAR *)num1,"%d",curr->select);
  3319.          item_values[1].value = num1;
  3320.          item_values[1].len = strlen((DEFCHAR *)num1);
  3321.          x = 0;
  3322.          curr = lll_find(CURRENT_FILE->first_line,CURRENT_FILE->last_line,1L,CURRENT_FILE->number_lines);
  3323.          while(curr->next != NULL)
  3324.            {
  3325.             if (curr->select > x)
  3326.                x = curr->select;
  3327.             curr = curr->next;
  3328.            }
  3329.          sprintf((DEFCHAR *)num2,"%d",x);
  3330.          item_values[2].value = num2;
  3331.          item_values[2].len = strlen((DEFCHAR *)num2);
  3332.          break;
  3333.     case ITEM_SHADOW:
  3334.          if (CURRENT_VIEW->shadow)
  3335.            {
  3336.             item_values[1].value = (CHARTYPE *)"ON";
  3337.             item_values[1].len = 2;
  3338.            }
  3339.           else
  3340.            {
  3341.             item_values[1].value = (CHARTYPE *)"OFF";
  3342.             item_values[1].len = 3;
  3343.            }
  3344.          break;
  3345.     case ITEM_SHADOW_FUNCTION:
  3346.          switch(CURRENT_VIEW->current_window)
  3347.            {
  3348.             case WINDOW_FILEAREA:
  3349.                  if (batch_only)
  3350.                    {
  3351.                     bool_flag = FALSE;
  3352.                     break;
  3353.                    }
  3354.                  getyx(CURRENT_WINDOW,y,x);
  3355.                  if (CURRENT_SCREEN.sl[y].line_type == LINE_SHADOW)
  3356.                     bool_flag = TRUE;
  3357.                  else
  3358.                     bool_flag = FALSE;
  3359.                  break;
  3360.             default:
  3361.                  bool_flag = FALSE;
  3362.                  break;
  3363.            }
  3364.          if (bool_flag)
  3365.            {
  3366.             item_values[1].value = (CHARTYPE *)"1";
  3367.             item_values[1].len = 1;
  3368.            }
  3369.           else
  3370.            {
  3371.             item_values[1].value = (CHARTYPE *)"0";
  3372.             item_values[1].len = 1;
  3373.            }
  3374.          break;
  3375.     case ITEM_SHOWKEY:
  3376.          if (strcmp((DEFCHAR *)itemargs,"") == 0)
  3377.            {
  3378.             item_values[1].value = (CHARTYPE *)"INVALID KEY";
  3379.             item_values[1].len = strlen((DEFCHAR *)item_values[1].value);
  3380.             break;
  3381.            }
  3382.          key = atoi((DEFCHAR *)itemargs);
  3383.          function_key(key,OPTION_EXTRACT);
  3384.          number_variables = EXTRACT_VARIABLES_SET;
  3385.          break;
  3386.     case ITEM_SIZE:
  3387.          sprintf((DEFCHAR *)num1,"%ld",CURRENT_FILE->number_lines);
  3388.          item_values[1].value = num1;
  3389.          item_values[1].len = strlen((DEFCHAR *)num1);
  3390.          break;
  3391.     case ITEM_SPACECHAR_FUNCTION:
  3392.          cursor_char = (CHARTYPE)(winch(CURRENT_WINDOW) & A_CHARTEXT);
  3393.          if (cursor_char == ' ')
  3394.            {
  3395.             item_values[1].value = (CHARTYPE *)"1";
  3396.             item_values[1].len = 1;
  3397.            }
  3398.           else
  3399.            {
  3400.             item_values[1].value = (CHARTYPE *)"0";
  3401.             item_values[1].len = 1;
  3402.            }
  3403.          break;
  3404.     case ITEM_STATUSLINE:
  3405.          switch(STATUSLINEx)
  3406.            {
  3407.             case 'B':
  3408.                  item_values[1].value = (CHARTYPE *)"BOTTOM";
  3409.                  item_values[1].len = 6;
  3410.                  break;
  3411.             case 'T':
  3412.                  item_values[1].value = (CHARTYPE *)"TOP";
  3413.                  item_values[1].len = 3;
  3414.                  break;
  3415.             case 'O':
  3416.                  item_values[1].value = (CHARTYPE *)"OFF";
  3417.                  item_values[1].len = 3;
  3418.                  break;
  3419.             case 'G':
  3420.                  item_values[1].value = (CHARTYPE *)"GUI";
  3421.                  item_values[1].len = 3;
  3422.                  break;
  3423.            }
  3424.          break;
  3425.     case ITEM_STAY:
  3426.          if (CURRENT_VIEW->stay)
  3427.            {
  3428.             item_values[1].value = (CHARTYPE *)"ON";
  3429.             item_values[1].len = 2;
  3430.            }
  3431.           else
  3432.            {
  3433.             item_values[1].value = (CHARTYPE *)"OFF";
  3434.             item_values[1].len = 3;
  3435.            }
  3436.          break;
  3437.     case ITEM_TABKEY:
  3438.          if (tabkey_overwrite == 'T')
  3439.            {
  3440.             item_values[1].value = (CHARTYPE *)"TAB";
  3441.             item_values[1].len = 3;
  3442.            }
  3443.           else
  3444.            {
  3445.             item_values[1].value = (CHARTYPE *)"CHARACTER";
  3446.             item_values[1].len = 9;
  3447.            }
  3448.          if (tabkey_insert == 'T')
  3449.            {
  3450.             item_values[2].value = (CHARTYPE *)"TAB";
  3451.             item_values[2].len = 3;
  3452.            }
  3453.           else
  3454.            {
  3455.             item_values[2].value = (CHARTYPE *)"CHARACTER";
  3456.             item_values[2].len = 9;
  3457.            }
  3458.          break;
  3459.     case ITEM_TABLINE:
  3460.          if (CURRENT_VIEW->tab_on)
  3461.            {
  3462.             item_values[1].value = (CHARTYPE *)"ON";
  3463.             item_values[1].len = 2;
  3464.            }
  3465.           else
  3466.            {
  3467.             item_values[1].value = (CHARTYPE *)"OFF";
  3468.             item_values[1].len = 3;
  3469.            }
  3470.          if (CURRENT_VIEW->tab_base == POSITION_MIDDLE)
  3471.             sprintf((DEFCHAR *)rsrvd,"M%+d",CURRENT_VIEW->tab_off);
  3472.          else
  3473.             sprintf((DEFCHAR *)rsrvd,"%d",CURRENT_VIEW->tab_off);
  3474.          item_values[2].value = rsrvd;
  3475.          item_values[2].len = strlen((DEFCHAR *)rsrvd);
  3476.          break;
  3477.     case ITEM_TABS:
  3478.          strcpy((DEFCHAR *)rsrvd,"");
  3479.          if (CURRENT_VIEW->tabsinc)
  3480.            {
  3481.             sprintf((DEFCHAR *)rsrvd,"INCR %d",CURRENT_VIEW->tabsinc);
  3482.            }
  3483.          else
  3484.            {
  3485.             for (i=0;i<CURRENT_VIEW->numtabs;i++)
  3486.                {
  3487.                 sprintf((DEFCHAR *)num1,"%d ",CURRENT_VIEW->tabs[i]);
  3488.                 strcat((DEFCHAR *)rsrvd,(DEFCHAR *)num1);
  3489.                }
  3490.             if (query_type == QUERY_QUERY
  3491.             ||  query_type == QUERY_STATUS)
  3492.                rsrvd[COLS-7] = '\0';
  3493.            }
  3494.          item_values[1].value = rsrvd;
  3495.          item_values[1].len = strlen((DEFCHAR *)rsrvd);
  3496.          break;
  3497.     case ITEM_TABSIN:
  3498.          if (TABI_ONx)
  3499.            {
  3500.             item_values[1].value = (CHARTYPE *)"ON";
  3501.             item_values[1].len = 2;
  3502.            }
  3503.           else
  3504.            {
  3505.             item_values[1].value = (CHARTYPE *)"OFF";
  3506.             item_values[1].len = 3;
  3507.            }
  3508.          sprintf((DEFCHAR *)num1,"%d",TABI_Nx);
  3509.          item_values[2].value = num1;
  3510.          item_values[2].len = strlen((DEFCHAR *)num1);
  3511.          break;
  3512.     case ITEM_TABSOUT:
  3513.          if (CURRENT_FILE->tabsout_on)
  3514.            {
  3515.             item_values[1].value = (CHARTYPE *)"ON";
  3516.             item_values[1].len = 2;
  3517.            }
  3518.           else
  3519.            {
  3520.             item_values[1].value = (CHARTYPE *)"OFF";
  3521.             item_values[1].len = 3;
  3522.            }
  3523.          sprintf((DEFCHAR *)num1,"%d",CURRENT_FILE->tabsout_num);
  3524.          item_values[2].value = num1;
  3525.          item_values[2].len = strlen((DEFCHAR *)num1);
  3526.          break;
  3527.     case ITEM_TERMINAL:
  3528.          item_values[1].value = term_name;
  3529.          item_values[1].len = strlen((DEFCHAR *)term_name);
  3530.          break;
  3531.     case ITEM_TOF:
  3532.          if (CURRENT_TOF)
  3533.            {
  3534.             item_values[1].value = (CHARTYPE *)"ON";
  3535.             item_values[1].len = 2;
  3536.            }
  3537.           else
  3538.            {
  3539.             item_values[1].value = (CHARTYPE *)"OFF";
  3540.             item_values[1].len = 3;
  3541.            }
  3542.          break;
  3543.     case ITEM_TOF_FUNCTION:
  3544.          if (FOCUS_TOF && CURRENT_VIEW->current_window != WINDOW_COMMAND)
  3545.            {
  3546.             item_values[1].value = (CHARTYPE *)"1";
  3547.             item_values[1].len = 1;
  3548.            }
  3549.           else
  3550.            {
  3551.             item_values[1].value = (CHARTYPE *)"0";
  3552.             item_values[1].len = 1;
  3553.            }
  3554.          break;
  3555.     case ITEM_TOPEDGE_FUNCTION:
  3556.          if (batch_only)
  3557.            {
  3558.             item_values[1].value = (CHARTYPE *)"0";
  3559.             item_values[1].len = 1;
  3560.             break;
  3561.            }
  3562.          getyx(CURRENT_WINDOW,y,x);
  3563.          if (CURRENT_VIEW->current_window == WINDOW_FILEAREA
  3564.          &&  y == 0)
  3565.            {
  3566.             item_values[1].value = (CHARTYPE *)"1";
  3567.             item_values[1].len = 1;
  3568.            }
  3569.           else
  3570.            {
  3571.             item_values[1].value = (CHARTYPE *)"0";
  3572.             item_values[1].len = 1;
  3573.            }
  3574.          break;
  3575.     case ITEM_TYPEAHEAD:
  3576.          if (TYPEAHEADx)
  3577.            {
  3578.             item_values[1].value = (CHARTYPE *)"ON";
  3579.             item_values[1].len = 2;
  3580.            }
  3581.           else
  3582.            {
  3583.             item_values[1].value = (CHARTYPE *)"OFF";
  3584.             item_values[1].len = 3;
  3585.            }
  3586.          break;
  3587.     case ITEM_UNDOING:
  3588.          if (CURRENT_FILE->undoing)
  3589.            {
  3590.             item_values[1].value = (CHARTYPE *)"ON";
  3591.             item_values[1].len = 2;
  3592.            }
  3593.           else
  3594.            {
  3595.             item_values[1].value = (CHARTYPE *)"OFF";
  3596.             item_values[1].len = 3;
  3597.            }
  3598.          break;
  3599.     case ITEM_UNTAA:
  3600.          if (UNTAAx)
  3601.            {
  3602.             item_values[1].value = (CHARTYPE *)"ON";
  3603.             item_values[1].len = 2;
  3604.            }
  3605.           else
  3606.            {
  3607.             item_values[1].value = (CHARTYPE *)"OFF";
  3608.             item_values[1].len = 3;
  3609.            }
  3610.          break;
  3611.     case ITEM_VERIFY:
  3612.          sprintf((DEFCHAR *)num3,"%d %d",CURRENT_VIEW->verify_start,CURRENT_VIEW->verify_end);
  3613.          item_values[1].value = num3;
  3614.          item_values[1].len = strlen((DEFCHAR *)num3);
  3615.          break;
  3616.     case ITEM_VERSHIFT:
  3617.          sprintf((DEFCHAR *)rsrvd,"%ld",(LINETYPE)CURRENT_VIEW->verify_col - (LINETYPE)CURRENT_VIEW->verify_start);
  3618.          item_values[1].value = rsrvd;
  3619.          item_values[1].len = strlen((DEFCHAR *)rsrvd);
  3620.          break;
  3621.     case ITEM_VERONE_FUNCTION:
  3622.          if (CURRENT_VIEW->verify_col == 1)
  3623.            {
  3624.             item_values[1].value = (CHARTYPE *)"1";
  3625.             item_values[1].len = 1;
  3626.            }
  3627.           else
  3628.            {
  3629.             item_values[1].value = (CHARTYPE *)"0";
  3630.             item_values[1].len = 1;
  3631.            }
  3632.          break;
  3633.     case ITEM_VERSION:
  3634.          item_values[1].value = (CHARTYPE *)"THE";
  3635.          item_values[1].len = 3;
  3636.          item_values[2].value = (CHARTYPE *)the_version;
  3637.          item_values[2].len = strlen((DEFCHAR *)the_version);
  3638.          item_values[3].value = (CHARTYPE *)"???";
  3639. #if defined(DOS)
  3640. # if defined(EMX)
  3641.          if (_osmode == DOS_MODE)
  3642.             item_values[3].value = (CHARTYPE *)"DOS";
  3643.          else
  3644.             item_values[3].value = (CHARTYPE *)"OS2";
  3645. #else
  3646.          item_values[3].value = (CHARTYPE *)"DOS";
  3647. # endif
  3648. #endif
  3649. #if defined(OS2)
  3650. # if defined(EMX)
  3651.          if (_osmode == DOS_MODE)
  3652.             item_values[3].value = (CHARTYPE *)"DOS";
  3653.          else
  3654.             item_values[3].value = (CHARTYPE *)"OS2";
  3655. #else
  3656.          item_values[3].value = (CHARTYPE *)"OS2";
  3657. # endif
  3658. #endif
  3659. #if defined(UNIX)
  3660.          item_values[3].value = (CHARTYPE *)"UNIX";
  3661. #endif
  3662. #if defined(XCURSES)
  3663.          item_values[3].value = (CHARTYPE *)"X11";
  3664. #endif
  3665. #if defined(MSWIN)
  3666.          item_values[3].value = (CHARTYPE *)"MS-WINDOWS";
  3667. #endif
  3668. #if defined(WIN32)
  3669.          item_values[3].value = (CHARTYPE *)"WIN32";
  3670. #endif
  3671.          item_values[3].len = strlen((DEFCHAR *)item_values[3].value);
  3672.          item_values[4].value = (CHARTYPE *)the_release;
  3673.          item_values[4].len = strlen((DEFCHAR *)item_values[4].value);
  3674.          break;
  3675.     case ITEM_WIDTH:
  3676.          sprintf((DEFCHAR *)num1,"%d",max_line_length);
  3677.          item_values[1].value = num1;
  3678.          item_values[1].len = strlen((DEFCHAR *)num1);
  3679.          break;
  3680.     case ITEM_WORD:
  3681.          if (CURRENT_VIEW->word == 'A')
  3682.            {
  3683.             item_values[1].value = (CHARTYPE *)"ALPHANUM";
  3684.             item_values[1].len = 8;
  3685.            }
  3686.           else
  3687.            {
  3688.             item_values[1].value = (CHARTYPE *)"NONBLANK";
  3689.             item_values[1].len = 8;
  3690.            }
  3691.          break;
  3692.     case ITEM_WORDWRAP:
  3693.          if (CURRENT_VIEW->wordwrap)
  3694.            {
  3695.             item_values[1].value = (CHARTYPE *)"ON";
  3696.             item_values[1].len = 2;
  3697.            }
  3698.           else
  3699.            {
  3700.             item_values[1].value = (CHARTYPE *)"OFF";
  3701.             item_values[1].len = 3;
  3702.            }
  3703.          break;
  3704.     case ITEM_WRAP:
  3705.          if (CURRENT_VIEW->wrap)
  3706.            {
  3707.             item_values[1].value = (CHARTYPE *)"ON";
  3708.             item_values[1].len = 2;
  3709.            }
  3710.           else
  3711.            {
  3712.             item_values[1].value = (CHARTYPE *)"OFF";
  3713.             item_values[1].len = 3;
  3714.            }
  3715.          break;
  3716.     case ITEM_XTERMINAL:
  3717.          item_values[1].value = xterm_program;
  3718.          item_values[1].len = strlen((DEFCHAR *)xterm_program);
  3719.          break;
  3720.     case ITEM_ZONE:
  3721.          sprintf((DEFCHAR *)num1,"%d",CURRENT_VIEW->zone_start);
  3722.          item_values[1].value = num1;
  3723.          item_values[1].len = strlen((DEFCHAR *)num1);
  3724.          sprintf((DEFCHAR *)num2,"%d",CURRENT_VIEW->zone_end);
  3725.          item_values[2].value = num2;
  3726.          item_values[2].len = strlen((DEFCHAR *)num2);
  3727.          break;
  3728.     default:
  3729.          break;
  3730.    }
  3731. /*---------------------------------------------------------------------*/
  3732. /* If an "error" condition exists, do not set any values.              */
  3733. /*---------------------------------------------------------------------*/
  3734.  if (number_variables >= 0)
  3735.    {
  3736.     switch(query_type)
  3737.       {
  3738.        case QUERY_EXTRACT:
  3739.        case QUERY_FUNCTION:
  3740.        case QUERY_READV:
  3741.             sprintf((DEFCHAR *)num0,"%d",number_variables);
  3742.             item_values[0].value = num0;
  3743.             item_values[0].len = strlen((DEFCHAR *)num0);
  3744.             break;
  3745.        case QUERY_STATUS:
  3746.        case QUERY_QUERY:
  3747.        case QUERY_MODIFY:
  3748.             item_values[0].value = query_item[itemno].name;
  3749.             item_values[0].len = strlen((DEFCHAR *)query_item[itemno].name);
  3750.             break;
  3751.        default:
  3752.             break;
  3753.       }
  3754.    }
  3755. #ifdef TRACE
  3756.  trace_return();
  3757. #endif
  3758.  return(number_variables);
  3759. }
  3760. /***********************************************************************/
  3761. #ifdef HAVE_PROTO
  3762. static short extract_point(short itemno,CHARTYPE *params)
  3763. #else
  3764. static short extract_point(itemno,params)
  3765. short itemno;
  3766. CHARTYPE *params;
  3767. #endif
  3768. /***********************************************************************/
  3769. {
  3770. /*-------------------------- external data ----------------------------*/
  3771.  extern short compatible_feel;
  3772. /*--------------------------- local data ------------------------------*/
  3773.  register short i=0;
  3774.  short number_variables = query_item[itemno].number_values;
  3775.  static CHARTYPE num4[15];
  3776.  LINE *curr=NULL;
  3777.  LINETYPE true_line=0L;
  3778.  short rc=RC_OK;
  3779. /*--------------------------- processing ------------------------------*/
  3780. #ifdef TRACE
  3781.  trace_function("query.c:   extract_point");
  3782. #endif
  3783.  if (strcmp((DEFCHAR *)params,"") == 0) /* get name for focus line only */
  3784.    {
  3785.     true_line = (compatible_feel==COMPAT_XEDIT)?CURRENT_VIEW->current_line:get_true_line(TRUE);
  3786.     curr = lll_find(CURRENT_FILE->first_line,CURRENT_FILE->last_line,true_line,CURRENT_FILE->number_lines);
  3787.     if (curr->name == NULL)  /* line not named */
  3788.        number_variables = 0;
  3789.     else
  3790.       {
  3791.        sprintf((DEFCHAR *)num4,"%ld %s",true_line,curr->name);
  3792.        item_values[1].value = num4;
  3793.        item_values[1].len = strlen((DEFCHAR *)num4);
  3794.        number_variables = 1;
  3795.       }
  3796.    }
  3797.  else
  3798.    {
  3799.     if (strcmp((DEFCHAR *)params,"*") != 0)     /* argument must be "*" */
  3800.       {
  3801.        display_error(1,(CHARTYPE *)params,FALSE);
  3802.        number_variables = EXTRACT_ARG_ERROR;
  3803.       }
  3804.     else
  3805.       {
  3806.        curr = CURRENT_FILE->first_line;
  3807.        for(true_line=0,i=0;curr != NULL;true_line++)
  3808.          {
  3809.           if (curr->name != NULL)  /* line is named */
  3810.             {
  3811.              sprintf((DEFCHAR *)num4,"%ld %s",true_line,curr->name);
  3812.              rc = set_rexx_variable(query_item[itemno].name,num4,strlen((DEFCHAR *)num4),++i);
  3813.              if (rc == RC_SYSTEM_ERROR)
  3814.                {
  3815.                 display_error(54,(CHARTYPE *)"",FALSE);
  3816. #ifdef TRACE
  3817.                 trace_return();
  3818. #endif
  3819.                 return(EXTRACT_ARG_ERROR);
  3820.                }
  3821.             }
  3822.           curr = curr->next;
  3823.          }
  3824.        sprintf((DEFCHAR *)num4,"%d",i);
  3825.        rc = set_rexx_variable(query_item[itemno].name,num4,strlen((DEFCHAR *)num4),0);
  3826.        if (rc == RC_SYSTEM_ERROR)
  3827.          {
  3828.           display_error(54,(CHARTYPE *)"",FALSE);
  3829.           number_variables = EXTRACT_ARG_ERROR;
  3830.          }
  3831.        else
  3832.           number_variables = EXTRACT_VARIABLES_SET;
  3833.       }
  3834.    }
  3835. #ifdef TRACE
  3836.  trace_return();
  3837. #endif
  3838.  return(number_variables);
  3839. }
  3840. /***********************************************************************/
  3841. #ifdef HAVE_PROTO
  3842. static short extract_pending(short itemno,CHARTYPE *params)
  3843. #else
  3844. static short extract_pending(itemno,params)
  3845. short itemno;
  3846. CHARTYPE *params;
  3847. #endif
  3848. /***********************************************************************/
  3849. {
  3850. /*-------------------------- external data ----------------------------*/
  3851. /*--------------------------- local data ------------------------------*/
  3852. #define PEN_PARAMS  4
  3853.  CHARTYPE *word[PEN_PARAMS+1];
  3854.  CHARTYPE strip[PEN_PARAMS];
  3855.  unsigned short num_params=0;
  3856.  short number_variables = query_item[itemno].number_values;
  3857.  bool find_block=FALSE;
  3858.  bool find_oldname=FALSE;
  3859.  bool valid_args = FALSE;
  3860.  CHARTYPE *name=NULL;
  3861.  static CHARTYPE num1[7];
  3862.  PPC *curr_ppc=NULL;
  3863. /*--------------------------- processing ------------------------------*/
  3864. #ifdef TRACE
  3865.  trace_function("query.c:   extract_pending");
  3866. #endif
  3867.  strip[0]=STRIP_BOTH;
  3868.  strip[1]=STRIP_BOTH;
  3869.  strip[2]=STRIP_BOTH;
  3870.  strip[4]=STRIP_BOTH;
  3871.  num_params = param_split(params,word,PEN_PARAMS,WORD_DELIMS,TEMP_PARAM,strip,FALSE);
  3872.  switch(num_params)
  3873.    {
  3874. /*---------------------------------------------------------------------*/
  3875. /* No parameters, error.                                               */
  3876. /*---------------------------------------------------------------------*/
  3877.     case 0:
  3878.            display_error(3,(CHARTYPE *)"",FALSE);
  3879.            number_variables = EXTRACT_ARG_ERROR;
  3880.            break;
  3881. /*---------------------------------------------------------------------*/
  3882. /* 1  parameter, only name.                                            */
  3883. /*---------------------------------------------------------------------*/
  3884.     case 1:
  3885.            if (equal((CHARTYPE *)"block",word[0],5)
  3886.            ||  equal((CHARTYPE *)"oldname",word[0],7))
  3887.              {
  3888.               display_error(3,(CHARTYPE *)"",FALSE);
  3889.               number_variables = EXTRACT_ARG_ERROR;
  3890.               break;
  3891.              }
  3892.            name = word[0];
  3893.            break;
  3894. /*---------------------------------------------------------------------*/
  3895. /* 2  parameters, BLOCK and name or OLDNAME and name.                  */
  3896. /*---------------------------------------------------------------------*/
  3897.     case 2:
  3898.            if (equal((CHARTYPE *)"block",word[0],5)
  3899.            &&  equal((CHARTYPE *)"oldname",word[1],7))
  3900.              {
  3901.               display_error(3,(CHARTYPE *)"",FALSE);
  3902.               number_variables = EXTRACT_ARG_ERROR;
  3903.               break;
  3904.              }
  3905.            if (equal((CHARTYPE *)"block",word[1],5)
  3906.            &&  equal((CHARTYPE *)"oldname",word[0],7))
  3907.              {
  3908.               display_error(3,(CHARTYPE *)"",FALSE);
  3909.               number_variables = EXTRACT_ARG_ERROR;
  3910.               break;
  3911.              }
  3912.            if (equal((CHARTYPE *)"block",word[0],5))
  3913.              {
  3914.               name = word[1];
  3915.               find_block = TRUE;
  3916.               break;
  3917.              }
  3918.            if (equal((CHARTYPE *)"oldname",word[0],7))
  3919.              {
  3920.               name = word[1];
  3921.               find_oldname = TRUE;
  3922.               break;
  3923.              }
  3924.            display_error(1,word[0],FALSE);
  3925.            number_variables = EXTRACT_ARG_ERROR;
  3926.            break;
  3927. /*---------------------------------------------------------------------*/
  3928. /* 3  parameters, BLOCK and OLDNAME and name.                          */
  3929. /*---------------------------------------------------------------------*/
  3930.     case 3:
  3931.            if (equal((CHARTYPE *)"block",word[0],5)
  3932.            &&  equal((CHARTYPE *)"oldname",word[1],7))
  3933.               valid_args = TRUE;
  3934.            if (equal((CHARTYPE *)"block",word[1],5)
  3935.            &&  equal((CHARTYPE *)"oldname",word[0],7))
  3936.               valid_args = TRUE;
  3937.            if (!valid_args)
  3938.              {
  3939.               display_error(1,word[0],FALSE);
  3940.               number_variables = EXTRACT_ARG_ERROR;
  3941.               break;
  3942.              }
  3943.            find_block = find_oldname = TRUE;
  3944.            name = word[2];
  3945.            break;
  3946. /*---------------------------------------------------------------------*/
  3947. /* Too many parameters, error.                                         */
  3948. /*---------------------------------------------------------------------*/
  3949.     default:
  3950.            display_error(2,(CHARTYPE *)"",FALSE);
  3951.            number_variables = EXTRACT_ARG_ERROR;
  3952.            break;
  3953.    }
  3954. /*---------------------------------------------------------------------*/
  3955. /* If the validation of parameters is successful...                    */
  3956. /*---------------------------------------------------------------------*/
  3957.  if (number_variables >= 0)
  3958.    {
  3959. /*---------------------------------------------------------------------*/
  3960. /* No pending prefix commands, return 0.                               */
  3961. /*---------------------------------------------------------------------*/
  3962.     if (CURRENT_FILE->first_ppc == NULL)
  3963.        number_variables = 0;
  3964.     else
  3965. /*---------------------------------------------------------------------*/
  3966. /* Have to search each pending prefix command...                       */
  3967. /*---------------------------------------------------------------------*/
  3968.       {
  3969. /*---------------------------------------------------------------------*/
  3970. /* If we are to look for OLDNAME, find a synonym for it if one exists..*/
  3971. /*---------------------------------------------------------------------*/
  3972.        if (find_oldname)
  3973.           name = find_prefix_oldname(name);
  3974. /*---------------------------------------------------------------------*/
  3975. /* For each pending prefix command...                                  */
  3976. /*---------------------------------------------------------------------*/
  3977.        curr_ppc = CURRENT_FILE->first_ppc;
  3978.        while(1)
  3979.          {
  3980.           if (curr_ppc == NULL)
  3981.              break;
  3982. /*---------------------------------------------------------------------*/
  3983. /* If we want to match on any name...                                  */
  3984. /*---------------------------------------------------------------------*/
  3985.           if (strcmp((DEFCHAR *)name,"*") == 0)
  3986.             {
  3987. /*---------------------------------------------------------------------*/
  3988. /* Are we matching on any BLOCK command...                             */
  3989. /*---------------------------------------------------------------------*/
  3990.              if (find_block)
  3991.                {
  3992.                 if (curr_ppc->ppc_block_command)
  3993. /*---------------------------------------------------------------------*/
  3994. /* We have found the first BLOCK command with any name.                */
  3995. /*---------------------------------------------------------------------*/
  3996.                    break;
  3997.                 else
  3998.                   {
  3999. /*---------------------------------------------------------------------*/
  4000. /* Go back and look for another...                                     */
  4001. /*---------------------------------------------------------------------*/
  4002.                    curr_ppc = curr_ppc->next;
  4003.                    continue;
  4004.                   }
  4005.                }
  4006.              else
  4007. /*---------------------------------------------------------------------*/
  4008. /* We have found the first command with any name.                      */
  4009. /*---------------------------------------------------------------------*/
  4010.                 break;
  4011.             }
  4012. /*---------------------------------------------------------------------*/
  4013. /* We want to find a specific command...                               */
  4014. /*---------------------------------------------------------------------*/
  4015.           if (memcmpi(curr_ppc->ppc_command,name,strlen((DEFCHAR *)name)) == 0)
  4016.             {
  4017. /*---------------------------------------------------------------------*/
  4018. /* Are we looking for a specific BLOCK command...                      */
  4019. /*---------------------------------------------------------------------*/
  4020.              if (find_block)
  4021.                {
  4022.                 if (curr_ppc->ppc_block_command)
  4023. /*---------------------------------------------------------------------*/
  4024. /* We have found the first specific BLOCK command.                     */
  4025. /*---------------------------------------------------------------------*/
  4026.                    break;
  4027.                }
  4028.              else
  4029. /*---------------------------------------------------------------------*/
  4030. /* We have found the first specific command.                           */
  4031. /*---------------------------------------------------------------------*/
  4032.                 break;
  4033.             }
  4034.           curr_ppc = curr_ppc->next;
  4035.          }
  4036. /*---------------------------------------------------------------------*/
  4037. /* Did we find a matching pending prefix command ?                     */
  4038. /*---------------------------------------------------------------------*/
  4039.        if (curr_ppc == NULL)
  4040.           number_variables = 0;
  4041.        else
  4042.          {
  4043. /*---------------------------------------------------------------------*/
  4044. /* Yes we did. Set all of the REXX variables to the correct values...  */
  4045. /*---------------------------------------------------------------------*/
  4046.           sprintf((DEFCHAR *)num1,"%ld",curr_ppc->ppc_line_number);
  4047.           item_values[1].value = num1;
  4048.           item_values[1].len = strlen((DEFCHAR *)num1);
  4049.           item_values[2].value = curr_ppc->ppc_command;
  4050.           item_values[2].len = strlen((DEFCHAR *)item_values[2].value);
  4051.           item_values[3].value = find_prefix_synonym(curr_ppc->ppc_command);
  4052.           item_values[3].len = strlen((DEFCHAR *)item_values[2].value);
  4053.           if (curr_ppc->ppc_block_command)
  4054.              item_values[4].value = (CHARTYPE *)"BLOCK";
  4055.           else
  4056.              item_values[4].value = (CHARTYPE *)"";
  4057.           item_values[4].len = strlen((DEFCHAR *)item_values[4].value);
  4058.          }
  4059.       }
  4060.    }
  4061. #ifdef TRACE
  4062.  trace_return();
  4063. #endif
  4064.  return(number_variables);
  4065. }
  4066. /***********************************************************************/
  4067. #ifdef HAVE_PROTO
  4068. static short extract_prefix(short itemno,CHARTYPE *params)
  4069. #else
  4070. static short extract_prefix(itemno,params)
  4071. short itemno;
  4072. CHARTYPE *params;
  4073. #endif
  4074. /***********************************************************************/
  4075. {
  4076. /*-------------------------- external data ----------------------------*/
  4077.  extern LINE *first_prefix_synonym;
  4078. /*--------------------------- local data ------------------------------*/
  4079.  register short i=0;
  4080. #define PRE_PARAMS  3
  4081.  CHARTYPE *word[PRE_PARAMS+1];
  4082.  CHARTYPE strip[PRE_PARAMS];
  4083.  unsigned short num_params=0;
  4084.  short number_variables = query_item[itemno].number_values;
  4085.  static CHARTYPE num4[15];
  4086.  LINE *curr=NULL;
  4087.  short rc=RC_OK;
  4088.  CHARTYPE *tmpbuf=NULL;
  4089. /*--------------------------- processing ------------------------------*/
  4090. #ifdef TRACE
  4091.  trace_function("query.c:   extract_prefix");
  4092. #endif
  4093.  strip[0]=STRIP_BOTH;
  4094.  strip[1]=STRIP_BOTH;
  4095.  strip[2]=STRIP_BOTH;
  4096.  num_params = param_split(params,word,PRE_PARAMS,WORD_DELIMS,TEMP_PARAM,strip,FALSE);
  4097.  switch(num_params)
  4098.    {
  4099. /*---------------------------------------------------------------------*/
  4100. /* None or 1 parameters, error.                                        */
  4101. /*---------------------------------------------------------------------*/
  4102.     case 0:
  4103.     case 1:
  4104.            display_error(3,(CHARTYPE *)"",FALSE);
  4105.            number_variables = EXTRACT_ARG_ERROR;
  4106.            break;
  4107. /*---------------------------------------------------------------------*/
  4108. /* 2  parameters, Synonym and name.                                    */
  4109. /*---------------------------------------------------------------------*/
  4110.     case 2:
  4111.            if (!equal((CHARTYPE *)"synonym",word[0],1))
  4112.              {
  4113.               display_error(13,(CHARTYPE *)"",FALSE);
  4114.               number_variables = EXTRACT_ARG_ERROR;
  4115.               break;
  4116.              }
  4117.            break;
  4118. /*---------------------------------------------------------------------*/
  4119. /* Too many parameters, error.                                         */
  4120. /*---------------------------------------------------------------------*/
  4121.     default:
  4122.            display_error(2,(CHARTYPE *)"",FALSE);
  4123.            number_variables = EXTRACT_ARG_ERROR;
  4124.            break;
  4125.    }
  4126. /*---------------------------------------------------------------------*/
  4127. /* If the validation of parameters is successful...                    */
  4128. /*---------------------------------------------------------------------*/
  4129.  if (number_variables >= 0)
  4130.    {
  4131.     if (strcmp((DEFCHAR *)word[1],"*") == 0)
  4132. /*---------------------------------------------------------------------*/
  4133. /* Get oldname for all synonyms...                                     */
  4134. /*---------------------------------------------------------------------*/
  4135.       {
  4136.        curr = first_prefix_synonym;
  4137.        i = 0;
  4138.        while(curr != NULL)
  4139.          {
  4140.           tmpbuf = (CHARTYPE *)(*the_malloc)(sizeof(CHARTYPE)*(strlen((DEFCHAR *)curr->name)+strlen((DEFCHAR *)curr->line)+1));
  4141.           if (tmpbuf == (CHARTYPE *)NULL)
  4142.             {
  4143.              display_error(30,(CHARTYPE *)"",FALSE);
  4144. #ifdef TRACE
  4145.              trace_return();
  4146. #endif
  4147.              return(EXTRACT_ARG_ERROR);
  4148.             }
  4149.           strcpy((DEFCHAR *)tmpbuf,(DEFCHAR *)curr->name);
  4150.           strcat((DEFCHAR *)tmpbuf," ");
  4151.           strcat((DEFCHAR *)tmpbuf,(DEFCHAR *)curr->line);
  4152.           rc = set_rexx_variable(query_item[itemno].name,tmpbuf,strlen((DEFCHAR *)tmpbuf),++i);
  4153.           (*the_free)(tmpbuf);
  4154.           if (rc == RC_SYSTEM_ERROR)
  4155.             {
  4156.              display_error(54,(CHARTYPE *)"",FALSE);
  4157. #ifdef TRACE
  4158.              trace_return();
  4159. #endif
  4160.              return(EXTRACT_ARG_ERROR);
  4161.             }
  4162.           curr = curr->next;
  4163.          }
  4164.        sprintf((DEFCHAR *)num4,"%d",i);
  4165.        rc = set_rexx_variable(query_item[itemno].name,num4,strlen((DEFCHAR *)num4),0);
  4166.        if (rc == RC_SYSTEM_ERROR)
  4167.          {
  4168.           display_error(54,(CHARTYPE *)"",FALSE);
  4169.           number_variables = EXTRACT_ARG_ERROR;
  4170.          }
  4171.        else
  4172.           number_variables = EXTRACT_VARIABLES_SET;
  4173.       }
  4174.     else
  4175. /*---------------------------------------------------------------------*/
  4176. /* Get oldname for named synonym...                                    */
  4177. /*---------------------------------------------------------------------*/
  4178.       {
  4179.        item_values[1].value = find_prefix_synonym(word[1]);
  4180.        item_values[1].len = strlen((DEFCHAR *)item_values[1].value);
  4181.        number_variables = 1;
  4182.       }
  4183.  }
  4184. #ifdef TRACE
  4185.  trace_return();
  4186. #endif
  4187.  return(number_variables);
  4188. }
  4189. /***********************************************************************/
  4190. #ifdef HAVE_PROTO
  4191. static short extract_reserved(short itemno,CHARTYPE *params,CHARTYPE query_type)
  4192. #else
  4193. static short extract_reserved(itemno,params,query_type)
  4194. short itemno;
  4195. CHARTYPE *params;
  4196. CHARTYPE query_type;
  4197. #endif
  4198. /***********************************************************************/
  4199. {
  4200. /*-------------------------- external data ----------------------------*/
  4201. /*--------------------------- local data ------------------------------*/
  4202.  bool line_numbers_only=TRUE;
  4203.  static RESERVED *curr_rsrvd;
  4204.  CHARTYPE *tmpbuf=NULL,*attr_string=NULL;
  4205.  short number_variables=0;
  4206.  short rc=RC_OK;
  4207.  static CHARTYPE rsrvd[100];
  4208.  short y=0,x=0;
  4209. /*--------------------------- processing ------------------------------*/
  4210. #ifdef TRACE
  4211.  trace_function("query.c:   extract_reserved");
  4212. #endif
  4213.  if (query_type == QUERY_EXTRACT
  4214.  &&  strcmp((DEFCHAR *)params,"*") == 0)
  4215.     line_numbers_only = FALSE;
  4216.  
  4217.  curr_rsrvd = CURRENT_FILE->first_reserved;
  4218.  strcpy((DEFCHAR *)rsrvd,"");
  4219.  while(curr_rsrvd != NULL)
  4220.    {
  4221.     if (line_numbers_only)
  4222.       {
  4223.        y = strlen((DEFCHAR *)curr_rsrvd->spec) + 1;
  4224.        if ((x + y) > 80)
  4225.           break;
  4226.        strcat((DEFCHAR *)rsrvd,(DEFCHAR *)curr_rsrvd->spec);
  4227.        strcat((DEFCHAR *)rsrvd," ");
  4228.        x += y;
  4229.       }
  4230.     else
  4231.       {
  4232.        attr_string = get_colour_strings(curr_rsrvd->attr);
  4233.        if (attr_string == (CHARTYPE *)NULL)
  4234.          {
  4235. #ifdef TRACE
  4236.           trace_return();
  4237. #endif
  4238.           return(EXTRACT_ARG_ERROR);
  4239.          }
  4240.        tmpbuf = (CHARTYPE *)(*the_malloc)(sizeof(CHARTYPE)*(strlen((DEFCHAR *)attr_string)+strlen((DEFCHAR *)curr_rsrvd->line)+strlen((DEFCHAR *)curr_rsrvd->spec)+3));
  4241.        if (tmpbuf == (CHARTYPE *)NULL)
  4242.          {
  4243.           display_error(30,(CHARTYPE *)"",FALSE);
  4244. #ifdef TRACE
  4245.           trace_return();
  4246. #endif
  4247.           return(EXTRACT_ARG_ERROR);
  4248.          }
  4249.        strcpy((DEFCHAR *)tmpbuf,(DEFCHAR *)curr_rsrvd->spec);
  4250.        strcat((DEFCHAR *)tmpbuf," ");
  4251.        strcat((DEFCHAR *)tmpbuf,(DEFCHAR *)attr_string);
  4252.        (*the_free)(attr_string);
  4253.        strcat((DEFCHAR *)tmpbuf,(DEFCHAR *)curr_rsrvd->line);
  4254.        rc = set_rexx_variable(query_item[itemno].name,tmpbuf,strlen((DEFCHAR *)tmpbuf),++number_variables);
  4255.        (*the_free)(tmpbuf);
  4256.        if (rc == RC_SYSTEM_ERROR)
  4257.          {
  4258.           display_error(54,(CHARTYPE *)"",FALSE);
  4259. #ifdef TRACE
  4260.           trace_return();
  4261. #endif
  4262.           return(EXTRACT_ARG_ERROR);
  4263.          }
  4264.       }
  4265.     curr_rsrvd = curr_rsrvd->next;
  4266.    }
  4267.  if (line_numbers_only)
  4268.    {
  4269.     if (x == 0)
  4270.        number_variables = 0;
  4271.     else
  4272.       {
  4273.        number_variables = 1;
  4274.        item_values[1].value = rsrvd;
  4275.        item_values[1].len = strlen((DEFCHAR *)rsrvd);
  4276.       }
  4277.     rc = number_variables;
  4278.    }
  4279.  else
  4280.    {
  4281.     sprintf((DEFCHAR *)rsrvd,"%d",number_variables);
  4282.     rc = set_rexx_variable(query_item[itemno].name,rsrvd,strlen((DEFCHAR *)rsrvd),0);
  4283.     if (rc == RC_SYSTEM_ERROR)
  4284.       {
  4285.        display_error(54,(CHARTYPE *)"",FALSE);
  4286.        rc = EXTRACT_ARG_ERROR;
  4287.       }
  4288.     else
  4289.        rc = EXTRACT_VARIABLES_SET;
  4290.    }
  4291. #ifdef TRACE
  4292.  trace_return();
  4293. #endif
  4294.  return(rc);
  4295. }
  4296. /***********************************************************************/
  4297. #ifdef HAVE_PROTO
  4298. static short extract_ring(short itemno,CHARTYPE *buffer,CHARTYPE query_type)
  4299. #else
  4300. static short extract_ring(itemno,buffer,query_type)
  4301. short itemno;
  4302. CHARTYPE *buffer;
  4303. CHARTYPE query_type;
  4304. #endif
  4305. /***********************************************************************/
  4306. {
  4307. /*-------------------------- external data ----------------------------*/
  4308.  extern VIEW_DETAILS *vd_first;
  4309.  extern CHARTYPE display_screens;
  4310.  extern CHARTYPE number_of_files;
  4311.  extern short compatible_look;
  4312.  extern short compatible_feel;
  4313. /*--------------------------- local data ------------------------------*/
  4314.  short rc=RC_OK;
  4315.  VIEW_DETAILS *curr;
  4316.  FILE_DETAILS *first_view_file=NULL;
  4317.  bool process_view=FALSE;
  4318.  LINETYPE lineno=0L;
  4319.  LENGTHTYPE col=0;
  4320.  register int i=0,j=0;
  4321.  int offset = 0;
  4322.  short number_files=0;
  4323.  bool view_being_displayed=FALSE;
  4324.  CHARTYPE num1[5];
  4325. /*--------------------------- processing ------------------------------*/
  4326. #ifdef TRACE
  4327.  trace_function("query.c:   extract_ring");
  4328. #endif
  4329.  if (compatible_feel == COMPAT_XEDIT)
  4330.     offset = 1;
  4331.  curr = vd_current;
  4332.  for (j=0;j<number_of_files;)
  4333.    {
  4334.     process_view = TRUE;
  4335.     if (curr->file_for_view->file_views > 1)
  4336.       {
  4337.        if (first_view_file == curr->file_for_view)
  4338.           process_view = FALSE;
  4339.        else
  4340.           first_view_file = curr->file_for_view;
  4341.       }
  4342.     if (process_view)
  4343.       {
  4344.        j++;
  4345.        view_being_displayed=FALSE;
  4346.        for (i=0;i<display_screens;i++)
  4347.          {
  4348.           if (SCREEN_VIEW(i) == curr)
  4349.             {
  4350.              view_being_displayed = TRUE;
  4351.              get_current_position(i,&lineno,&col);
  4352.             }
  4353.          }
  4354.        if (!view_being_displayed)
  4355.          {
  4356.           lineno = (curr->current_window==WINDOW_COMMAND)?curr->current_line:curr->focus_line;
  4357.           col = curr->current_column;
  4358.          }
  4359.        if (compatible_look == COMPAT_XEDIT)
  4360.           sprintf((DEFCHAR *)buffer,"%s%s Size=%ld Line=%ld Col=%d Alt=%d,%d",
  4361.                   curr->file_for_view->fpath,
  4362.                   curr->file_for_view->fname,
  4363.                   curr->file_for_view->number_lines,
  4364.                   lineno,col,
  4365.                   curr->file_for_view->autosave_alt,
  4366.                   curr->file_for_view->save_alt);
  4367.        else
  4368.           sprintf((DEFCHAR *)buffer,"%s%s Line=%ld Col=%d Size=%ld Alt=%d,%d",
  4369.                   curr->file_for_view->fpath,
  4370.                   curr->file_for_view->fname,
  4371.                   lineno,col,
  4372.                   curr->file_for_view->number_lines,
  4373.                   curr->file_for_view->autosave_alt,
  4374.                   curr->file_for_view->save_alt);
  4375.        if (query_type == QUERY_QUERY)
  4376.          {
  4377.           display_error(0,buffer,TRUE);
  4378.          }
  4379.        else
  4380.          {
  4381.           rc = set_rexx_variable(query_item[itemno].name,buffer,strlen((DEFCHAR *)buffer),++number_files+offset);
  4382.           if (rc == RC_SYSTEM_ERROR)
  4383.             {
  4384.              display_error(54,(CHARTYPE *)"",FALSE);
  4385. #ifdef TRACE
  4386.              trace_return();
  4387. #endif
  4388.              return(EXTRACT_ARG_ERROR);
  4389.             }
  4390.          }
  4391.       }
  4392.     curr = curr->next;
  4393.     if (curr == NULL)
  4394.        curr = vd_first;
  4395.    }
  4396.  
  4397.  if (query_type != QUERY_QUERY)
  4398.    {
  4399.     sprintf((DEFCHAR *)num1,"%d",number_files);
  4400.     rc = set_rexx_variable(query_item[itemno].name,num1,strlen((DEFCHAR *)num1),offset);
  4401.     if (rc == RC_SYSTEM_ERROR)
  4402.       {
  4403.        display_error(54,(CHARTYPE *)"",FALSE);
  4404.        rc = EXTRACT_ARG_ERROR;
  4405.       }
  4406.     else
  4407.        rc = EXTRACT_VARIABLES_SET;
  4408.     if (offset == 1)
  4409.       {
  4410.        sprintf((DEFCHAR *)num1,"%d",number_files+offset);
  4411.        rc = set_rexx_variable(query_item[itemno].name,num1,strlen((DEFCHAR *)num1),0);
  4412.        if (rc == RC_SYSTEM_ERROR)
  4413.          {
  4414.           display_error(54,(CHARTYPE *)"",FALSE);
  4415.           rc = EXTRACT_ARG_ERROR;
  4416.          }
  4417.        else
  4418.           rc = EXTRACT_VARIABLES_SET;
  4419.       }
  4420.    }
  4421.  else
  4422.     rc = EXTRACT_VARIABLES_SET;
  4423. #ifdef TRACE
  4424.  trace_return();
  4425. #endif
  4426.  return(rc);
  4427. }
  4428. /***********************************************************************/
  4429. #ifdef HAVE_PROTO
  4430. static void get_etmode(CHARTYPE *onoff,CHARTYPE *list)
  4431. #else
  4432. static void get_etmode(onoff,list)
  4433. CHARTYPE *onoff,*list;
  4434. #endif
  4435. /***********************************************************************/
  4436. {
  4437. /*-------------------------- external data ----------------------------*/
  4438.  extern bool   etmode_flag[256];
  4439. /*--------------------------- local data ------------------------------*/
  4440.  bool on_flag=FALSE;
  4441.  bool off_flag=FALSE;
  4442.  bool last_state=FALSE;
  4443.  char tmp[15];
  4444.  register int i=0;
  4445. /*--------------------------- processing ------------------------------*/
  4446. #ifdef TRACE
  4447.  trace_function("query.c:   get_etmode");
  4448. #endif
  4449.  strcpy((DEFCHAR *)list,"");
  4450.  last_state = TRUE;
  4451.  for (i=0;i<256;i++)
  4452.    {
  4453.     if (etmode_flag[i] == TRUE)
  4454.        off_flag = TRUE;
  4455.     else
  4456.        on_flag = TRUE;
  4457.     if (last_state != etmode_flag[i])
  4458.       {
  4459.        if (last_state == FALSE)
  4460.          {
  4461.           sprintf(tmp,"%d",i-1);
  4462.           strcat((DEFCHAR *)list,tmp);
  4463.          }
  4464.        else
  4465.          {
  4466.           sprintf(tmp," %d-",i);
  4467.           strcat((DEFCHAR *)list,tmp);
  4468.          }
  4469.        last_state = etmode_flag[i];
  4470.       }
  4471.    }
  4472.  if (*(list+strlen((DEFCHAR *)list)-1) == '-')
  4473.    {
  4474.     sprintf(tmp,"%d",255);
  4475.     strcat((DEFCHAR *)list,tmp);
  4476.    }
  4477.  if (on_flag)
  4478.    {
  4479.     strcpy((DEFCHAR *)onoff,"ON");
  4480.     if (!off_flag)
  4481.        strcpy((DEFCHAR *)list,"");
  4482.    }
  4483.  else
  4484.    {
  4485.     strcpy((DEFCHAR *)onoff,"OFF");
  4486.     strcpy((DEFCHAR *)list,"");
  4487.    }
  4488. #ifdef TRACE
  4489.  trace_return();
  4490. #endif
  4491.  return;
  4492. }
  4493. /***********************************************************************/
  4494. #ifdef HAVE_PROTO
  4495. static short extract_colour(short itemno,CHARTYPE *buffer,CHARTYPE query_type,CHARTYPE *params,bool us)
  4496. #else
  4497. static short extract_colour(itemno,buffer,query_type,params,us)
  4498. short itemno;
  4499. CHARTYPE *buffer;
  4500. CHARTYPE query_type;
  4501. CHARTYPE *params;
  4502. bool us;
  4503. #endif
  4504. /***********************************************************************/
  4505. {
  4506. /*-------------------------- external data ----------------------------*/
  4507.  extern AREAS valid_areas[ATTR_MAX];
  4508.  extern CHARTYPE *trec;
  4509.  extern short terminal_lines;
  4510. /*--------------------------- local data ------------------------------*/
  4511.  short rc=RC_OK;
  4512.  register int i=0,j=0;
  4513.  int start=0,end=0,number_variables=0,off=0;
  4514.  bool found=FALSE;
  4515.  CHARTYPE *attr_string=NULL;
  4516.  CHARTYPE num1[15];
  4517.  CHARTYPE save_msgline_base = CURRENT_VIEW->msgline_base;
  4518.  short save_msgline_off = CURRENT_VIEW->msgline_off;
  4519.  ROWTYPE save_msgline_rows = CURRENT_VIEW->msgline_rows;
  4520.  bool save_msgmode_status = CURRENT_VIEW->msgmode_status;
  4521. /*--------------------------- processing ------------------------------*/
  4522. #ifdef TRACE
  4523.  trace_function("query.c:   extract_colour");
  4524. #endif
  4525.  
  4526.  if (blank_field(params)
  4527.  ||  strcmp((DEFCHAR*)params,"*") == 0)
  4528.    {
  4529.     start = 0;
  4530.     end = ATTR_MAX;
  4531.    }
  4532.  else
  4533.    {
  4534.     for (i=0;i<ATTR_MAX;i++)
  4535.       {
  4536.        if (equal(valid_areas[i].area,params,valid_areas[i].area_min_len))
  4537.          {
  4538.           found = TRUE;
  4539.           break;
  4540.          }
  4541.       }
  4542.     if (!found)
  4543.       {
  4544.        display_error(1,params,FALSE);
  4545. #ifdef TRACE
  4546.        trace_return();
  4547. #endif
  4548.        return(EXTRACT_ARG_ERROR);
  4549.       }
  4550.     start = i;
  4551.     end = i+1;
  4552.    }
  4553.  if (query_type == QUERY_QUERY)
  4554.    {
  4555.     CURRENT_VIEW->msgline_base   = POSITION_TOP;
  4556.     CURRENT_VIEW->msgline_off    = 1;
  4557.     CURRENT_VIEW->msgline_rows   = min(terminal_lines-1,end-start);
  4558.     CURRENT_VIEW->msgmode_status = TRUE;
  4559.    }
  4560.  
  4561.  for (i=start;i<end;i++)
  4562.    {
  4563.     attr_string = get_colour_strings(CURRENT_FILE->attr+i);
  4564.     if (attr_string == (CHARTYPE *)NULL)
  4565.       {
  4566. #ifdef TRACE
  4567.        trace_return();
  4568. #endif
  4569.        return(EXTRACT_ARG_ERROR);
  4570.       }
  4571.     if (us)
  4572.        sprintf((DEFCHAR *)buffer,"%s%s %s",
  4573.             (query_type == QUERY_QUERY) ? "color " : "",
  4574.             valid_areas[i].area,
  4575.             attr_string);
  4576.     else
  4577.        sprintf((DEFCHAR *)buffer,"%s%s %s",
  4578.             (query_type == QUERY_QUERY) ? "colour " : "",
  4579.             valid_areas[i].area,
  4580.             attr_string);
  4581.     (*the_free)(attr_string);
  4582.  
  4583.     if (query_type == QUERY_QUERY)
  4584.        display_error(0,buffer,TRUE);
  4585.     else
  4586.       {
  4587.        number_variables++;
  4588.        item_values[number_variables].len = strlen((DEFCHAR *)buffer);
  4589.        memcpy((DEFCHAR*)trec+off,(DEFCHAR*)buffer,(item_values[number_variables].len)+1);
  4590.        item_values[number_variables].value = trec+off;
  4591.        off += (item_values[number_variables].len)+1;
  4592.       }
  4593.    }
  4594.  if (query_type == QUERY_QUERY)
  4595.    {
  4596.     CURRENT_VIEW->msgline_base   = save_msgline_base;
  4597.     CURRENT_VIEW->msgline_off    = save_msgline_off;
  4598.     CURRENT_VIEW->msgline_rows   = save_msgline_rows;
  4599.     CURRENT_VIEW->msgmode_status = save_msgmode_status;
  4600.     rc = EXTRACT_VARIABLES_SET;
  4601.    }
  4602.  else
  4603.     rc = number_variables;
  4604. #ifdef TRACE
  4605.  trace_return();
  4606. #endif
  4607.  return(rc);
  4608. }
  4609.