home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / qtawkos2.zip / QTAWK.DOC < prev    next >
Text File  |  1995-01-08  |  656KB  |  16,157 lines

  1. I2
  2.  
  3.  
  4.  
  5.  
  6.  
  7.         
  8.         
  9.         
  10.         
  11.         
  12.         
  13.         
  14.         
  15.         
  16.         
  17.         
  18.         
  19.         
  20.         
  21.         
  22.         QTAwk
  23.         Utility Creation Tool
  24.         
  25.         
  26.         For: PC/MS-DOS & OS/2
  27.         Version 6.00 PC/MS_DOS 08-04-94
  28.         Version 1.00 OS/2 08-04-94
  29.         
  30.         
  31.         
  32.         
  33.         
  34.         
  35.         
  36.         
  37.         Sunday, January 08, 1995
  38.         
  39.         
  40.         
  41.         
  42.         
  43.         (c) Copyright 1988 - 1994 Pearl Boldt
  44.         
  45.         Darnestown, MD 20878
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.         QTAwk License
  62.             
  63.         Utility Creation Program
  64.         Version 6.00 PC/MS_DOS 08-04-94
  65.         Version 1.00 OS/2 08-04-94
  66.         (c) Copyright 1988 - 1994 Pearl  Boldt.   All  Rights  Reserved. 
  67.             
  68.         Pearl Boldt
  69.         Quik Trim
  70.         13012 Birdale Lane
  71.         Darnestown, MD 20878
  72.         
  73.             CompuServe ID: 72040.434
  74.         
  75.         
  76.         1.  Copyright:  The  QTAwk  program  and  all  other programs and
  77.             documentation distributed or shipped with  it  are  Copyright
  78.             1988  -  1994  Pearl  Boldt  and  are  protected by U.S.  and
  79.             International Copyright law.  In the rest of  this  document,
  80.             this   collection  of  programs  is  referred  to  simply  as
  81.             "QTAwk". 
  82.             
  83.         2.  Shareware copies of QTAwk are distributed  to  allow  you  to
  84.             try  the  program  before you pay for it.  They are Copyright
  85.             1988 - 1994, Pearl Boldt and  do  not  constitute  "free"  or
  86.             "public  domain"  software.   You may use QTAwk for personal,
  87.             noncommercial use.  You may give  the  shareware  version  of
  88.             QTAwk to others for noncommercial use IF:
  89.             
  90.             ■  As a minimum the following files are included:
  91.                 a)  qtawk.exe ==> QTAwk executable
  92.                     
  93.                 b)  qtawk.doc ==> QTAwk Documentation
  94.                     
  95.                 c)  diffdoc.fmt  ==>  differences  between  QTAwk and Awk
  96.                     
  97.                 d)  license.fmt ==> license  agreement  for  QTAwk  usage
  98.                     
  99.                 e)  order.frm  ==>  oder  form for registered versions of
  100.                     QTAwk
  101.                     
  102.                 f)  qtautl.zip   ==>   zipped   file   containing   QTAwk
  103.                     utilities
  104.                     
  105.                 g)  qtawk.his ==> version history for QTAwk
  106.                     
  107.                 h)  readme.doc ==> this file
  108.             ■  The Files Are Not Modified In Any Way. 
  109.  
  110.  
  111.         QTAwk                        - iii -                        QTAwk
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.         3.  Use  of  QTAwk:  QTAwk  is a powerful program.  While we have
  119.             attempted to build in reasonable safeguards, if  you  do  not
  120.             use  QTAwk  properly  you  may  destroy  files or cause other
  121.             damage to your computer software and data.  You  assume  full
  122.             responsibility  for the selection and use of QTAwk to achieve
  123.             your intended results. 
  124.             
  125.              The shareware version of QTAwk may be freely used and shared
  126.             with  others  for  personal,  noncommercial use.  There is no
  127.             REQUIRED registration fee for noncommercial/non-institutional
  128.             personal use. 
  129.             
  130.              However,  if  you find the QTAwk package of value, a gift of
  131.             $50.00 (US) or any  amount  would  be  greatly  appreciated. 
  132.             Please remember that improvements to the QTAwk package cannot
  133.             happen without your support.  You can help by  sharing  QTAwk
  134.             with others. 
  135.             
  136.              You  may,  of  course, register QTAwk by ordering a standard
  137.             site license.  Please see the ORDER.FRM  file  for  details. 
  138.             
  139.         4.  All  warranties  as  to  this  software,  whether  express or
  140.             implied, are disclaimed,  including  without  limitation  any
  141.             implied   warranties   of   merchantability,  fitness  for  a
  142.             particular  purpose,  functionality  or  data  integrity   or
  143.             protection are disclaimed. 
  144.         
  145.         Questions may be sent to:
  146.             
  147.         Pearl Boldt
  148.         Quik Trim
  149.         13012 Birdale Lane
  150.         Darnestown, MD 20878
  151.         
  152.             CompuServe ID: 72040.434
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.         QTAwk                        - iv -                         QTAwk
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.         QTAwk 6.00 PC/MS_DOS Order Form
  176.         QTAwk 1.00 OS/2 Order Form
  177.         Utility Creation Program
  178.         Version 6.00 PC/MS_DOS 08-04-94
  179.         Version 1.00 OS/2 08-04-94
  180.         (c)  Copyright  1988  -  1994 Pearl Boldt.  All Rights Reserved. 
  181.             
  182.         Return to:
  183.         Pearl Boldt
  184.         Quik Trim
  185.         13012 Birdale Lane
  186.         Darnestown, MD 20878
  187.             
  188.         Make all Checks Payable to: Pearl Boldt
  189.             
  190.         Name:
  191.         Company:
  192.         Address:
  193.             
  194.         Phone:
  195.             
  196.         Register QTAwk to: Company (___) or Individual (___)
  197.         Send information on: Site Licenses (___), Reseller Pricing  (___)
  198.             
  199.         I  have  read  and agree to abide by the QTAwk license agreement,
  200.             
  201.         Signature:
  202.             
  203.         Where did you hear about QTAwk?
  204.             
  205.         Disk Size: ___ 5.25" (1.2 Mbytes), ___ 3.5" (1.44 Mbytes)
  206.         
  207.         
  208.                                                Quantity    Price         
  209.                                                                          
  210.         Registered Version ($50.00 (US)/copy): ________  $ ________.____ 
  211.                                                                          
  212.         Subtotal                                         $ ________.____ 
  213.                                                                          
  214.         Shipping charges, per copy:                      $ ________.____ 
  215.         Total enclosed:                                  $ ________.____ 
  216.         
  217.         US standard        - included                                    
  218.         US 2-day           - $8.00 (US)                                  
  219.         Canada (air)       - $5.00 (US)                                  
  220.         All Others (air)   - $10.00 (US)                                 
  221.         
  222.  
  223.  
  224.  
  225.         QTAwk                         - v -                         QTAwk
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.               ===> Please read the following before ordering! <===       
  233.         
  234.          Order Information
  235.         
  236.          International Orders:
  237.         
  238.          Orders from outside the U.S.  must be paid by a check  or  money
  239.         order  in  U.S.   funds  and  drawn  on  a  U.S.   bank; or by an
  240.         international postal money order in U.S.  dollars.  Checks  which
  241.         are not in U.S.  funds and drawn on a U.S.  bank will be returned
  242.         due to extremely high charges imposed by U.S.  banks  to  collect
  243.         the  funds.   Purchase orders (minimum $200) can be accepted from
  244.         outside the U.S., but  you  must  contact  us  before  ordering. 
  245.         
  246.          Company Purchase Orders:
  247.         
  248.          Purchase  orders  for amounts of $100 and over are accepted from
  249.         established U.S.  companies; orders under $100 are  accepted  but
  250.         must  be prepaid.  Have your purchasing agent contact Pearl Boldt
  251.         for  terms.   Credit  references  will  be   required   for   new
  252.         customers. 
  253.         
  254.          Multi-System Licenses:
  255.         
  256.          Multi-system  licensing  arrangements are available for network,
  257.         site, and corporate use of QTAwk.  Check the line  on  the  order
  258.         form  or  contact  us for more information.  A sample schedule of
  259.         license fees is below; contact us for pricing on the exact number
  260.         of  systems  you  wish  to  license.   The  fee includes a master
  261.         diskette. 
  262.         
  263.         Systems  Price      Systems  Price       Systems  Price          
  264.         2         90.00     15       675.00      50       2,250.00       
  265.         3        135.00     20       900.00      60       2,700.00       
  266.         4        155.00     25     1,125.00      70       3,150.00       
  267.         5        180.00     30     1,350.00      80       3,600.00       
  268.         10       450.00     40     1,800.00      100      4,500.00       
  269.         
  270.         Return to:
  271.         Pearl Boldt
  272.         Quik Trim
  273.         13012 Birdale Lane
  274.         Darnestown, MD 20878
  275.             
  276.         Make all Checks Payable to: Pearl Boldt
  277.  
  278.  
  279.  
  280.  
  281.  
  282.         QTAwk                        - vi -                         QTAwk
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.          QTAwk Update History
  290.         
  291.          ==> QTAwk Version 6.00 for DOS and version 1.00 for OS/2,  dated
  292.         05/01/94.   This  version  contains several changes and additions
  293.         from the previous versions:
  294.         
  295.          1.  Arrays have been fully integrated into the match  operators,
  296.         '~~'  and  '!~',  both  their direct use and their implied use in
  297.         patterns and as arguments of the functions 'match', 'sub', 'gsub'
  298.         and  'split'.   The  use  of  an  array as the operand of a match
  299.         operator will match against all elements of the array as separate
  300.         regular  expressions.   This  is  similar to the use of the GROUP
  301.         keyword in patterns. 
  302.         
  303.          If a match is found, the new variable MATCH_INDEX is set to  the
  304.         string  value  of  the index in the array of the matching regular
  305.         expression.  If a  multidimensional  array  is  used,  the  array
  306.         indices  are  separated  by  the  value  of the built-in variable
  307.         SUBSEP (which has been re-introduced from  Awk  with  a  slightly
  308.         different use). 
  309.         
  310.          In addition, the use of arrays for the built-in variables RS and
  311.         FS enables the user to specify multiple regular  expressions  for
  312.         use  as  record  separators  and/or field separators.  The use of
  313.         arrays  for  RS  and/or  FS  does  not  affect   the   value   of
  314.         MATCH_INDEX. 
  315.         
  316.          Arrays   used  for  regular  expression  matching  retain  their
  317.         internal regular expression form until  the  whole  array  or  an
  318.         array  element is changed.  Thus arrays can be be used as dynamic
  319.         regular expressions for which the user controls when the internal
  320.         form is changed. 
  321.         
  322.          2.   New  algorithms  have  been  developed and used for regular
  323.         expression matching.  A total of four  different  algorithms  are
  324.         used  for  pattern  matching.   QTAwk  automatically  selects the
  325.         appropriate algorithm to optimize the  search  depending  on  the
  326.         regular  expression(s)  to  be  matched.   The  algorithm used is
  327.         selected based on the number of regular  expression(s)  to  match
  328.         and the complexity of the regular expression(s). 
  329.         
  330.          3.   The  new variable MATCH_INDEX is defined.  This variable is
  331.         set to the string value of the index of the matching element when
  332.         an array is used for matching. 
  333.         
  334.          4.  The variable SUBSEP from Awk is re-introduced with a default
  335.         value of a comma character, ','.  The value of SUBSEP is used  to
  336.         separate the index values in MATCH_INDEX when a
  337.  
  338.  
  339.         QTAwk                        - vii -                        QTAwk
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.          multidimensional array is used for matching. 
  347.         
  348.          5.  A new method of file processing has been introduced.  In the
  349.         current and previous versions, the following process  is  carried
  350.         out:
  351.         
  352.          a)  Determine  next  record according to RS or RECLEN, see below
  353.         for an explanation of RECLEN,  b)  Read  next  record,  c)  Parse
  354.         record  into fields according to FS or FIELDWIDTHS, see below for
  355.         an explanation of FIELDWIDTHS, d) Execute each pattern expression
  356.         1:  If  pattern  expression  is  TRUE,  execute associated action
  357.         
  358.          For QTAwk utilities in which  all  patterns  contain  a  regular
  359.         expression  match  or  for  those  files  for  which  actions are
  360.         executed only for those records matching a set  of  one  or  more
  361.         regular  expressions,  the  above  process for each record can be
  362.         time consuming.  It would be much faster to scan the  input  file
  363.         for matches to the desired regular expression(s) and then execute
  364.         each pattern expression once such a record has been found.   This
  365.         by-passes  the  time  consuming  process  of  reading  individual
  366.         records and parsing each into fields.  Only the  desired  records
  367.         need  to be read and parsed with the new method, thus saving much
  368.         time in the execution of the QTAwk utility. 
  369.         
  370.          QTAwk Version 6.00 for  PC/MS-DOS  and  Version  1.00  for  OS/2
  371.         implements the new search method.  Two new variables:
  372.         
  373.          a) FILE_SEARCH b) FILE_SEARCH_PAT
  374.         
  375.          have  been  introduced  for  this  purpose.  When FILE_SEARCH is
  376.         TRUE, the next record read will be the record matching a  regular
  377.         expression  from  FILE_SEARCH_PAT.   If FILE_SEARCH is FALSE, the
  378.         normal file input process described above is followed.   The  new
  379.         file  search  process may be turned on and off as necessary for a
  380.         single input file in this manner. 
  381.         
  382.          FILE_SEARCH_PAT is set by  the  user  utility  to  one  or  more
  383.         regular  expressions against which records from the current input
  384.         file are matched.  FILE_SEARCH_PAT may be set to a single regular
  385.         expression as a simple variable, e.g.,
  386.         
  387.          ■ FILE_SEARCH_PAT = /test string/;
  388.         
  389.         
  390.         
  391.         
  392.         
  393.         
  394.  
  395.  
  396.         QTAwk                       - viii -                        QTAwk
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.          or a singly dimensioned array, e.g.,
  404.         
  405.          ■  FILE_SEARCH_PAT[1]  = /test string 1/; ■ FILE_SEARCH_PAT[2] =
  406.         /test string 2/;  ■  FILE_SEARCH_PAT[3]  =  /test  string  3/;  ■
  407.         FILE_SEARCH_PAT[4] = /test string 4/;
  408.         
  409.          or a multidimensioned array, e.g.,
  410.         
  411.          ■    FILE_SEARCH_PAT[1][1]    =    /test    string    1,1/;    ■
  412.         FILE_SEARCH_PAT[1][2]     =     /test     string     1,2/;      ■
  413.         FILE_SEARCH_PAT[1][3]      =     /test     string     1,3/;     ■
  414.         FILE_SEARCH_PAT[2][1]     =     /test     string     2,1/;      ■
  415.         FILE_SEARCH_PAT[2][2]      =     /test     string     2,2/;     ■
  416.         FILE_SEARCH_PAT[2][3]     =     /test     string     2,3/;      ■
  417.         FILE_SEARCH_PAT[3][1]      =     /test     string     3,1/;     ■
  418.         FILE_SEARCH_PAT[3][2]     =     /test     string     3,2/;      ■
  419.         FILE_SEARCH_PAT[3][3] = /test string 3,3/;
  420.         
  421.          When  FILE_SEARCH is TRUE, the current input file is scanned for
  422.         a match to FILE_SEARCH_PAT.  When a record is  found  matching  a
  423.         regular expression in FILE_SEARCH_PAT, the record is read, parsed
  424.         into fields according to  FS  or  FIELDWIDTHS  and  each  pattern
  425.         expression  executed.   The  associated  actions for TRUE pattern
  426.         expressions are executed.  Note that the variables RS  or  RECLEN
  427.         still  determine  the  parsing  of  the input file into records. 
  428.         
  429.          Under some circumstances, the above process can return  in  '$0'
  430.         multiple  records  from the current input file.  In searching the
  431.         input file for a match to FILE_SEARCH_PAT, a match may span  more
  432.         than  one  record if the new variable, SPAN_RECORDS, is TRUE.  In
  433.         this case, '$0' is set to the full set of  records  spanning  the
  434.         match  to FILE_SEARCH_PAT.  If SPAN_RECORDS is FALSE, any matches
  435.         to FILE_SEARCH_PAT are not allowed to span input records and '$0'
  436.         will contain only a single record. 
  437.         
  438.          6.  The new variable FILE_SEARCH is defined as described above. 
  439.         
  440.          7.  The new variable FILE_SEARCH_PAT  is  defined  as  described
  441.         above. 
  442.         
  443.          8.   The  new  variable  SPAN_RECORDS  is  defined  as described
  444.         above. 
  445.         
  446.          9.  The action of QTAwk when NF  is  changed  now  reflects  the
  447.         intuitive  effect  of  changing  NF.  If the new value is greater
  448.         
  449.         
  450.         
  451.  
  452.  
  453.         QTAwk                        - ix -                         QTAwk
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.          than the current value, the current  input  line  is  lengthened
  461.         with  new  empty  fields  separated by the output field separator
  462.         string, OFS.  If the new value is less than  the  current  value,
  463.         the  current  input line is shortened by truncating at the end of
  464.         the field corresponding to the new NF value. 
  465.         
  466.          10.   Two  new  input  functions  have   been   introduced:   a)
  467.         srchrecord(sp)  or  srchrecord(sp,rs) or srchrecord(sp,rs,var) is
  468.         similar to the function 'getline'.  'srchrecord' will search  the
  469.         current  input  file  for the next record or records matching the
  470.         search pattern, 'sp'.  If the record separator  parameter,  'rs',
  471.         is  not  specified,  records are determined by the variable RS or
  472.         RECLEN.  If 'rs' is specified, record boundaries  are  determined
  473.         by  the  strings matching 'rs'.  'rs' may be a simple constant or
  474.         variable or an array.  The record or records matching the  search
  475.         pattern are returned in '$0' if 'var' is not specified.  If 'var'
  476.         is specified, the matching record  or  records  are  returned  in
  477.         'var'.  The built-in variables, FNR and NR are updated to reflect
  478.         the current position and record number  after  the  search.   The
  479.         built-in  variables,  NF and '$i', i ≤ 0 ≤ NF, are set when 'var'
  480.         is not specified. 
  481.         
  482.          b)     fsrchrecord(file)     or     fsrchrecord(file,sp)      or
  483.         fsrchrecord(file,sp,rs) or fsrchrecord(file,sp,rs,var) is similar
  484.         to the function 'fgetline'.  'fsrchrecord' will search  the  file
  485.         specified  for  the  next  record  or records matching the search
  486.         pattern, 'sp'.  If the record separator parameter, 'rs',  is  not
  487.         specified,  records are determined by the variable RS or RECLEN. 
  488.         If 'rs' is specified, record boundaries  are  determined  by  the
  489.         strings matching 'rs'.  'rs' may be a simple constant or variable
  490.         or an array.  The record or records matching the  search  pattern
  491.         are  returned  in  '$0'  if  'var' is not specified.  If 'var' is
  492.         specified, the matching record or records are returned in 'var'. 
  493.         The  built-in  variables,  NF  and '$i', i ≤ 0 ≤ NF, are set when
  494.         'var' is not specified. 
  495.         
  496.          Both functions have  identical  returns  to  the  'getline'  and
  497.         'fgetline'  functions,  i.e.,  a) the number of characters in the
  498.         record(s) matched plus the End-Of_Record length plus 1
  499.         
  500.         
  501.         
  502.         
  503.         
  504.          b)  zero,  0,  if  End-Of-File  was  reached  before  finding  a
  505.         match c) -1 on a file read error. 
  506.         
  507.         
  508.  
  509.  
  510.         QTAwk                         - x -                         QTAwk
  511.  
  512.  
  513.  
  514.  
  515.  
  516.  
  517.          getline()   getline(v)  fgetline(F)  fgetline(F,v)  srchrecord()
  518.         srchrecord(v) fsrchrecord(F) fsrchrecord(F,v)
  519.         
  520.          $0 updated not updated updated not updated $i, i>0  updated  not
  521.         updated  updated  not  updated NF updated not updated updated not
  522.         updated NR updated updated not updated not  updated  FNR  updated
  523.         updated not updated not updated
  524.         
  525.          Note:  the  function parameters sp and rs have not been shown in
  526.         'srchrecord' and 'fsrchrecord' to highlight the  similarity  with
  527.         the  functions  'getline'  and 'fgetline' and their effect on the
  528.         variables indicated. 
  529.         
  530.          11.  The new  function  'get_FNR'  has  been  introduced.   This
  531.         function   returns   the  current  record  number  for  the  file
  532.         specified.  The two forms are:
  533.         
  534.          a) get_FNR() This form returns the current record number of  the
  535.         current  input file.  The value returned is equal to the built-in
  536.         variable FNR.  b) get_FNR(filename) This form returns the current
  537.         record  number  of  the  input  file  specified.   If filename ==
  538.         FILENAME, this form is equivalent to  the  first  form.   If  the
  539.         filename  specified is not open or is not open for input, a value
  540.         of zero, 0, is returned. 
  541.         
  542.          This function has been added  because  of  the  input  functions
  543.         'fgetline'  and  'fsrchrecord'.   For the current input file, the
  544.         built-in variable FNR is always updated automatically to  contain
  545.         the record number of the last record input (the current record). 
  546.         However, when reading from a file other than  the  current  input
  547.         file,  previously  there  was  no  means of obtaining the current
  548.         record number of the  input  file.   With  'fgetline',  the  user
  549.         utility  could  maintain  an  independent count of records read. 
  550.         However, if the 'fsrchrecord' function is used, there is no other
  551.         means  of  obtaining  the record number of the last record read. 
  552.         
  553.          12.  The function 'resetre' has been  introduced.   In  previous
  554.         versions,  once  a  regular  expression  has  been used to search
  555.         
  556.         
  557.         
  558.         
  559.         
  560.          for a match, the internal form  of  the  regular  expression  is
  561.         set  and  could  not  be  changed.   If  the  regular  expression
  562.         contained embedded named expressions  and  the  value(s)  of  the
  563.         corresponding  variables changed, the new values of the variables
  564.         could not be incorporated  into  the  regular  expression.   This
  565.  
  566.  
  567.         QTAwk                        - xi -                         QTAwk
  568.  
  569.  
  570.  
  571.  
  572.  
  573.  
  574.         improved  the speed of scanning since the regular expressions did
  575.         not have to be converted to  internal  form  for  each  use.   To
  576.         obtain  the  variability  needed  for  changing  variable values,
  577.         strings were used for  matching.   For  match  expressions  which
  578.         change frequently, strings used for match operators are still the
  579.         better choice, since they are converted to internal form for each
  580.         use.   However,  for  those  occasions where the match expression
  581.         changes infrequently due to the change in value of embedded named
  582.         expressions,  the use of a string leads to impaired performance. 
  583.         This function has  been  introduced  for  just  such  use.   This
  584.         function releases the internal form of all regular expressions so
  585.         that the next time it is used as the search pattern for  a  match
  586.         operation,  the  internal  form is rebuilt using the then current
  587.         values of any variables used in named expressions. 
  588.         
  589.          Note that the use of arrays for match patterns falls between the
  590.         use of strings, for which the internal regular expression form is
  591.         rebuilt for each use,  and  regular  expressions  for  which  the
  592.         internal  form  is  built  for  the  first  use  and then remains
  593.         static.  When arrays are used for matching, the internal  regular
  594.         expression  form  is built when first used and retained until the
  595.         array is changed.  For arrays  the  internal  regular  expression
  596.         form is assigned when the array as a whole is assigned to another
  597.         variable.  Thus the  internal  regular  expression  form  can  be
  598.         retained and reused. 
  599.         
  600.          13.   The  new  variable  FILEATTR  is  defined.   This variable
  601.         contains the attributes of the current input file in  a  string. 
  602.         The  string  defines  the  attributes  in  the same manner as the
  603.         variable for the 'findfile' function defines the  attributes  for
  604.         the files found by that function. 
  605.         
  606.          14.   The  new  variable  FILEDATE  is  defined.   This variable
  607.         contains the date of the current  input  file  in  the  operating
  608.         system format.  The 'sdate/stime' functions may be used to format
  609.         the date. 
  610.         
  611.          15.  The  new  variable  FILEPATH  is  defined.   This  variable
  612.         contains  the drive and path of the current input file.  The path
  613.         string ends with the subdirectory separator character. 
  614.         
  615.         
  616.         
  617.         
  618.         
  619.         
  620.          16.  The  new  variable  FILESIZE  is  defined.   This  variable
  621.         contains the size in bytes of the current input file. 
  622.  
  623.  
  624.         QTAwk                        - xii -                        QTAwk
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.          17.   The  new  variable  FILETIME  is  defined.   This variable
  632.         contains the time of the current  input  file  in  the  operating
  633.         system format.  The 'sdate/stime' functions may be used to format
  634.         the time. 
  635.         
  636.          18.  The following built-in variables have been added:
  637.         
  638.          a) FILEDATE_CREATE - date of file creation as  returned  by  the
  639.         Operating  System.  b) FILETIME_CREATE - time of file creation as
  640.         returned by the Operating System.  c) FILEDATE_LACCESS - date  of
  641.         last  file  access  as  returned  by  the  Operating  System.  d)
  642.         FILETIME_LACCESS - time of last file access as  returned  by  the
  643.         Operating System. 
  644.         
  645.          The  same variables are available in the PC/MS-DOS version, butr
  646.         their values  are  set  equal  to  the  values  of  FILEDATE  and
  647.         FILETIME. 
  648.         
  649.          19.   The  functions  'sdate' and 'stime' have been changed from
  650.         previous versions.   The  fixed  formats  supported  by  previous
  651.         versions  have  been  replaced  by  the  use of a 'format string'
  652.         identical to that  supported  by  ANSI  C.   The  forms  are:  a)
  653.         sdate(frmt_strg) return string formatted according to 'frmt_strg'
  654.         using current system date and  time.   b)  sdate(frmt_strg,fdate)
  655.         return  string  formatted  according  to  'frmt_strg'  using date
  656.         specified in fdate and current system time.  fdate is a file date
  657.         in       the       operating       system       format.        c)
  658.         sdate(frmt_strg,year,month,day) return string formatted according
  659.         to  'frmt_strg' using date specified in 'year', 'month' and 'day'
  660.         and current  system  time.   d)  stime(frmt_strg)  return  string
  661.         formatted  according to 'frmt_strg' using current system date and
  662.         time.   e)   stime(frmt_strg,ftime)   return   string   formatted
  663.         according  to  'frmt_strg'  using  time  specified  in  ftime and
  664.         current system date.  ftime is  a  file  time  in  the  operating
  665.         system  format.   f)  stime(frmt_strg,hour,minute,second)  return
  666.         string formatted according to 'frmt_strg' using time specified in
  667.         'hour', 'minute' and 'second' and current system date. 
  668.         
  669.          The format string is similar to those used in the 'print'
  670.         
  671.         
  672.         
  673.         
  674.         
  675.          functions  except  that  the  following  substitutions are made:
  676.         
  677.          % Substitution Made %a --> Locale's Abbreviated Weekday Name  %A
  678.         -->  Locale's Weekday Name %b --> Locale's Abbreviated Month Name
  679.  
  680.  
  681.         QTAwk                       - xiii -                        QTAwk
  682.  
  683.  
  684.  
  685.  
  686.  
  687.  
  688.         %B --> Locale's Month Name %c --> Locale's Appropriate  Date  And
  689.         Time  Representation  %d --> Day Of The Month As A Decimal Number
  690.         (01-31) %H --> The Hour  (24-hour  Clock)  As  A  Decimal  Number
  691.         (00-23)  %I  -->  The  Hour  (12-hour  Clock) As A Decimal Number
  692.         (01-12) %j --> The Day Of The Year As A Decimal Number  (001-366)
  693.         %m --> The Month As A Decimal Number (01-12) %M --> The Minute As
  694.         A Decimal Number (00-59) %p --> The Locale's  Equivalent  Of  The
  695.         AM/PM  Designations  Associated  With  A 12-hour Clock %S --> The
  696.         Second As Decimal Number (00-61) %U --> The Week  Number  Of  The
  697.         Year  (the  First Sunday As The First Day Of Week 1) As A Decimal
  698.         Number (00-53) %w --> The Weekday  As  A  Decimal  Number  (0-6),
  699.         Where  Sunday  Is 0 %W --> The Week Number Of The Year (the First
  700.         Monday As The First Day Of Week 1) As A Decimal Number (00-53) %x
  701.         -->  The  Locale's  Appropriate  Date  Representation  %X --> The
  702.         Locale's Appropriate Time Representation %y --> The Year  Without
  703.         Century  As A Decimal Number (00-99) %Y --> The Year With Century
  704.         As A Decimal Number %Z --> The Time Zone Name Or Abbreviation, Or
  705.         By No Character If No Time Zone Is Determinable %% --> %
  706.         
  707.          20.   The  functions  'jdn' and 'cal' have been modified.  'jdn'
  708.         computes the Julian Day Number for  an  associated  date.   'cal'
  709.         computes  the date for a given Julian Day Number.  The Julian Day
  710.         Number is very useful in date computations.  The  forms  are:  a)
  711.         jdn()  Computes  the  Julian  Day  Number  for the current System
  712.         Date.  b) jdn(fdate) computes the Julian Day Number for the  file
  713.         date,    fdate,    in    the   operating   system   format.    c)
  714.         jdn(year,month,day) computes the Julian Day Number for  the  date
  715.         specified.    d)   cal(frmt_strg,jdn)   return  string  formatted
  716.         according to 'frmt_stgr'  using  date  specified  in  Julian  Day
  717.         Number,  jdn,  and  current  system  time.   The  format  string,
  718.         frmt_strg, is the  same  as  used  by  the  'sdate'  and  'stime'
  719.         functions above.  If
  720.         
  721.         
  722.         
  723.         
  724.         
  725.          the  jdn  passed  is  an  integer  as calculated and returned by
  726.         the 'jdn' function, then the current system time is used for  any
  727.         time  substitutions.   If  the  jdn  passed  is  a floating point
  728.         number, the fractional part is used to compute  the  time  used. 
  729.         
  730.          21.   The  new  command  line  option,  "-Ww filename", has been
  731.         introduced.  This option allows the user to  write  the  internal
  732.         form  of  a utility to the specified file.  The internal form may
  733.         then be specified with the "-f"  option.   Reading  the  internal
  734.         form  of  a  utility in this manner can greatly speed the initial
  735.         execution of the utility. 
  736.  
  737.  
  738.         QTAwk                        - xiv -                        QTAwk
  739.  
  740.  
  741.  
  742.  
  743.  
  744.  
  745.          22.  The command line switch '-Wd' has  been  introduced.   This
  746.         switch  causes QTAwk to delay parsing of the input until an input
  747.         field, "$i", or the "NF"  variable  is  accessed.   Without  this
  748.         switch,  QTAwk  parses  each  input  record  as  it is read.  For
  749.         utilities which do not access input fields for  every  record  or
  750.         very  few  records,  this  can speed up processing considerably. 
  751.         
  752.          23.  The following built-in variables have been added:
  753.         
  754.          a) MATCH_INDEX - see the description of the expanded  'sub'  and
  755.         'gsub' functions below. 
  756.         
  757.          b) CONVFMT - specifies the format used to convert floating point
  758.         values to a string value.  Previously the value of OFMT was  used
  759.         for  this purpose.  OFMT is now used only for formatting floating
  760.         point values for output. 
  761.         
  762.          c)  IGNORECASE  -  if  assigned  a  true  value,  QTAwk  ignores
  763.         alphabetic  case  in  all  match  operations  against strings and
  764.         regular expressions.  This is true  for  all  built-in  functions
  765.         using  regular  expressions and in searches for record terminator
  766.         and field terminator  strings  using  RS  and  FS  respectively. 
  767.         
  768.          d)  RT - Contains the full string value of the record terminator
  769.         of the current input record.  If the value of RS is not  changed,
  770.         this  always  contains a single new line character.  If the value
  771.         of RS is changed to an array or a regular  expression,  then  the
  772.         record  terminator  can change with each input record.  The value
  773.         of RT  gives  the  user  access  to  the  current  value  of  the
  774.         terminator. 
  775.         
  776.          e) RECLEN - used to specify the length of fixed length records. 
  777.         If RECLEN has an integral non-zero value, the
  778.         
  779.         
  780.         
  781.         
  782.         
  783.          value is used to read  the  next  record  and  RS  is  ignored. 
  784.         When  RECLEN is used to determine input records, RT is always set
  785.         to the null string. 
  786.         
  787.          f) FIELDWIDTHS - when assigned a string value  containing  space
  788.         separated integral numbers of the form:
  789.         
  790.          n1 n2 n3 ...  nn
  791.         
  792.          the  splitting  of  input records into fields is governed by the
  793.  
  794.  
  795.         QTAwk                        - xv -                         QTAwk
  796.  
  797.  
  798.  
  799.  
  800.  
  801.  
  802.         numbers  in  FIELDWIDTHS  rather  than  FS.    Each   number   in
  803.         FIELDWIDTHS  specifies  the  width  of  a field including columns
  804.         between fields.  If  you  want  to  ignore  the  columns  between
  805.         fields,  you  can  specify  the width as a separate field that is
  806.         subsequently ignored.  When the value FIELDWIDTHS does not  match
  807.         this form, field splitting is done using FS in the usual manner. 
  808.         
  809.          g) FIELDFILL - used to fill a field when the  replacement  value
  810.         is  less  than the field width.  This variable value is used only
  811.         when field splitting is based on FIELDWIDTHS rather than FS.  The
  812.         default value is a single blank character. 
  813.         
  814.          h)  DELAY_INPUT_PARSE  -  used  to  delay parsing of the current
  815.         input record until the value of NF or one of the field variables,
  816.         $i,  1  ≤ i ≤ NF, is needed.  The default value is false.  If the
  817.         value is  true,  then  the  input  record  is  not  parsed  until
  818.         necessary.   For utilities which do not reference NF or the field
  819.         variables, $i, or seldom reference them, delaying the parsing  of
  820.         the   input  record  can  speed  the  execution  of  the  utility
  821.         significantly. 
  822.         
  823.          24.  The command line option "-vvar = value" has been introduced
  824.         to  assign  "value" to the variable "var' before execution of the
  825.         utility starts.  This makes the assigned value of "var" available
  826.         in  any  BEGIN actions.  This option may be used multiple time on
  827.         the caommand line to assign multiple variables. 
  828.         
  829.          25.  The command line option "-Wd" has been introduced to  delay
  830.         input  parsing until needed.  See the description of the built-in
  831.         variable "DELAY_INPUT_PARSE" above. 
  832.         
  833.          26.  The command line option "-wfilename" has  been  changed  to
  834.         "-Wwfilename" to conform to the POSIX specifcation. 
  835.         
  836.          27.   The predefined pattern, GROUP, has been expanded to accept
  837.         
  838.         
  839.         
  840.         
  841.         
  842.          any  valid  QTAwk  expression.   The  expressions  in  a   GROUP
  843.         pattern  are  evaluated when the GROUP patterns are first matched
  844.         against an input line.   The  expression  is  evaluated  and  the
  845.         result  converted  to a regular expression.  If the result of the
  846.         expression is an array,  the  entire  array  is  matched  at  the
  847.         corresponding position in the GROUP pattern. 
  848.         
  849.          28.   The  'sub'  and  'gsub' functions have been expanded.  The
  850.  
  851.  
  852.         QTAwk                        - xvi -                        QTAwk
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.         second argument, the replacement string expression, is no  longer
  860.         evaluated  at  the  time  the  function  is  called, but when the
  861.         replacement string is used  for  replacement.   Since  the  first
  862.         argument,  the match pattern expression, may now be an array, the
  863.         value of the built-in variable, MATCH_INDEX, can be  affected  as
  864.         matches  are made.  By delaying the evaluation of the replacement
  865.         string expression until the replacement is made,  the  change  in
  866.         MATCH_INDEX  can  be  used to affect the value of the replacement
  867.         string  for  each  replacement.   QTAwk   guarantees   that   the
  868.         replacement  string  expression will be evaluated as replacements
  869.         are made in the text string from left  to  right.   For  constant
  870.         expressions  used  for the replacement string, this change has no
  871.         direct effect. 
  872.         
  873.          29.  The  Tagged  string  operator,  '$$',  has  been  fixed  to
  874.         properly yield the tagged strings. 
  875.         
  876.          30.   A  new  standard  file,  in addition to "stdaux", "stdin",
  877.         "stderr", "stdprn" and "stdout", has been introduced,  "keyboard"
  878.         for  unbuffered  input  directly from the keyboard.  The built-in
  879.         variable "ECHO_INPUT" also controls echoing of  input  characters
  880.         from this "file" to the standard output file.  The standard files
  881.         are defined in more detail in Section 11. 
  882.         
  883.          31.  The returns from the  "getline"  and  "fgetline"  functions
  884.         have  been altered slightly.  The values returned are the same as
  885.         the new functions "srchrecord" and "fsrchrecord": a)  the  number
  886.         of  characters  read  plus the length of the End-Of-Record string
  887.         plus 1, b) 0 if End-Of-File was encountered, or c) -1 if an error
  888.         occurred. 
  889.         
  890.          ==>  QTAwk  Version 5.11, dated 03/30/92.  This version contains
  891.         two additions from the previous versions:
  892.         
  893.          1.  The predefined variable FILE_SORT has been added to  control
  894.         the  sequence  of  files  returned  by  the  "findfile"  built-in
  895.         function. 
  896.         
  897.         
  898.         
  899.         
  900.         
  901.         
  902.          2.  The  predefined  variable  "Gregorian"  has  been  added  to
  903.         control   the  use  of  the  Gregorian  or  Julian  Calendars  in
  904.         converting to/from dates and Julian Day Numbers by  the  built-in
  905.         "cal", "jdn" and "sdate" functions. 
  906.         
  907.  
  908.  
  909.         QTAwk                       - xvii -                        QTAwk
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.          ==>  QTAwk  Version 5.10, dated 10/01/91.  This version contains
  917.         several changes and additions from the previous versions:
  918.         
  919.          1.  The command line variable setting mechanism:
  920.         
  921.          variable = value
  922.         
  923.          has been fixed. 
  924.         
  925.          2.  The function "jdn(fdate)" or "jdn(year,month,day)" has  been
  926.         added  to  compute  the  Julian  Day  Number (jdn) of a specified
  927.         date.   The  Julian  Day  Number  is   very   useful   for   date
  928.         computations. 
  929.         
  930.          3.   The  function  "cal(jdn,form)" has been added to complement
  931.         the 'jdn' function above.  The "cal" function  returns  the  date
  932.         corresponding to the specified jdn passed. 
  933.         
  934.          4.   The  function "findfile" has been added.  This function has
  935.         the following forms
  936.         
  937.          a)      findfile(var)      b)      findfile(var,pattern)      c)
  938.         findfile(var,pattern,attributes)
  939.         
  940.          where:
  941.         
  942.          a)  var  ==  the  variable in which to return the array of files
  943.         found which match the pattern specified
  944.         
  945.          b) pattern == a string  specifying  the  pattern  to  match  the
  946.         filenames.   Follows  the DOS wildcard convention.  If no pattern
  947.         is specified, "*.*" is used. 
  948.         
  949.          c)  attributes  ==  a  string  specifying   the   desired   file
  950.         attributes: Archive, Read-Only, Hidden, System, Sub-Directory, or
  951.         Volume ID. 
  952.         
  953.          This function returns the number of files found which match  the
  954.         pattern  specified.   The file names, sizes, last modify date and
  955.         times are returned via the variable specified.  The file date and
  956.         time  are  returned  in  "DOS  format"  which is good for sorting
  957.         purposes, but unreadable.  The "stime" and
  958.         
  959.         
  960.         
  961.         
  962.         
  963.          "sdate"  functions  have  been  expanded  to  include  the  file
  964.  
  965.  
  966.         QTAwk                       - xviii -                       QTAwk
  967.  
  968.  
  969.  
  970.  
  971.  
  972.  
  973.         time and date and format them as desired. 
  974.         
  975.          5.   The "sdate" function has been expanded to return the Julian
  976.         Day Number as a formatting option and can  format  any  specified
  977.         date  as  well  as  the  file  date  returned  by  the "findfile"
  978.         function. 
  979.         
  980.          6.  The "stime" function has been expanded to be able to  format
  981.         any  specified  time  as  well  as  the file time returned by the
  982.         "findfile" function. 
  983.         
  984.          7.  For format arguments  greater  than  the  number  of  format
  985.         options  the  'sdate'  and  'stime' functions no longer terminate
  986.         execution with an  error  message.   The  remainder  operator  is
  987.         silently used to obtain a correct formatting option. 
  988.         
  989.          ==>  QTAwk  Version 5.00, dated 02/01/91.  This version contains
  990.         several additions from the previous versions:
  991.         
  992.          1.  The character output  functions  'putc(c)'  and  fputc(c,F)'
  993.         have  been  added.  These functions are identical in operation to
  994.         the  C  functions  of  the  same  names.   With  the  'getc'  and
  995.         'fgetc(F)' functions of the previous versions, the user now has a
  996.         complete set of character I/O. 
  997.         
  998.          2.   The  built-in  variable  'ECHO_INPUT'  has   been   added. 
  999.         ECHO_INPUT  has  a default value of FALSE.  If TRUE, when reading
  1000.         from the standard input file, normally the console keyboard,  the
  1001.         input is echoed to the standard output file, normally the console
  1002.         display.  When the standard input  file  is  re-directed  from  a
  1003.         file,  it  is  convenient  to  set ECHO_INPUT to FALSE to prevent
  1004.         echoing each input character to the display. 
  1005.         
  1006.          3.  The variable "QTAwk_Path" has been added.  If an environment
  1007.         setting for "QTAWK" exists, QTAwk_Path is set to the value of the
  1008.         setting upon program initiation.  This string value is then  used
  1009.         in  searching  for  input  files.   The search sequence for files
  1010.         follows the the order:
  1011.         
  1012.          a) If a directory and/or path name  name  is  specified  with  a
  1013.         file, then that path only is searched. 
  1014.         
  1015.          b)  If  no directory or path name is specified, then the current
  1016.         directory is searched.  If the file is not found, then all  paths
  1017.         specified  in  QTAwk_Path  are searched for the file in the order
  1018.         specified.  Multiple paths may be
  1019.         
  1020.         
  1021.  
  1022.  
  1023.         QTAwk                        - xix -                        QTAwk
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.          specified, separated by a semi-colon.   This  follows  the  same
  1031.         convention   for   specifying   multiple   paths  in  the  system
  1032.         environment path setting "PATH". 
  1033.         
  1034.          The value of QTAwk_Path may be reset at any time by  the  user's
  1035.         utility  to  change the paths to be searched for desired files to
  1036.         be opened for reading. 
  1037.         
  1038.          4.  The built-in function 'append(filename)'  has  been  added. 
  1039.         Executing  this  function  before  any  output to "filename" will
  1040.         cause all output to be appended to the end of the file "filename"
  1041.         if  it  currently exists.  Closing the file, "filename", with the
  1042.         'close' function will cancel  the  effect  of  'append'  for  any
  1043.         subsequent output to that file. 
  1044.         
  1045.          5.   The  tagged  string  operator,  '$$',  has been expanded to
  1046.         accept numerical expressions in the forms: a) $$0 -->  refers  to
  1047.         the  entire  string matched by the last regular expression in the
  1048.         pattern.  b) $$0.0 --> refers to the entire string matched by the
  1049.         last  regular  expression.   c)  $$j  -->  refers  to  the string
  1050.         matching the regular expression contained in the parenthesis  set
  1051.         at  nesting  level 1 and count j in the last regular expression. 
  1052.         Valid values of j are in the range 1 ≤  j  ≤  31.   Identical  to
  1053.         $$1.j  of  the  next  form.   d)  $$i.j  --> refers to the string
  1054.         matching the regular expression contained in the parenthesis  set
  1055.         at  the  ith  nesting  level,  jth  count  in  the  last  regular
  1056.         expression.  Valid values of i and j are in the range 1 ≤ i ≤  7,
  1057.         1 ≤ j ≤ 31.  e) $$variable_name --> this form may expand into any
  1058.         one of the previous forms.  If the variable operated on  by  '$$'
  1059.         is  a  string  or  regular  expression,  it is first converted to
  1060.         numeric form. 
  1061.         
  1062.          Thus $$5.02, is  the  string  matching  the  regular  expression
  1063.         contained  within  the  parenthesis  at  the  fifth level and 2nd
  1064.         count. 
  1065.         
  1066.          ==> QTAwk Version 4.20, dated 10/11/90.  This  version  contains
  1067.         three additions from the previous versions:
  1068.         
  1069.          1.   The  behavior  of  the  RS  predefined  variable  has  been
  1070.         changed.  It is now similar to the behavior of the FS  variable. 
  1071.         If  RS  is  assigned  a  value,  which when converted to a string
  1072.         value, is a single  character  in  length,  then  that  character
  1073.         becomes the record separator.  If the string is
  1074.         
  1075.         
  1076.         
  1077.         
  1078.  
  1079.  
  1080.         QTAwk                        - xx -                         QTAwk
  1081.  
  1082.  
  1083.  
  1084.  
  1085.  
  1086.  
  1087.          longer  in  length  than  a single character, then it is treated
  1088.         as  a  regular  expression.   The  string  matching  the  regular
  1089.         expression  is  treated  as  a  record separator.  As for FS, the
  1090.         string value is converted to the internal regular expression form
  1091.         when the assignment is made. 
  1092.         
  1093.          2.  Two new functions have been added: getc() --> reads a single
  1094.         character from the current input file.  The character is returned
  1095.         by  the  function.  fgetc(file) --> reads a single character from
  1096.         the file 'file'.  The character is  returned  by  the  function. 
  1097.         
  1098.          These  functions  allow  the  user  to  naturally  obtain single
  1099.         characters from any file including the standard input file (which
  1100.         would be the keyboard if not redirected or piped). 
  1101.         
  1102.          3.   Error  messages  now  have  a  numerical value displayed in
  1103.         addition to the short error  message.   The  error  messages  are
  1104.         listed in numerical order in the QTAwk documentation with a short
  1105.         explanation of the error.  In some cases,  an  attempt  has  been
  1106.         made to provide guidance as to what may have caused the error and
  1107.         possible remedies.  Since the error  messages  are  generated  at
  1108.         fixed  points within QTAwk and may be caused by different reasons
  1109.         in different utilities during interpretation or during  execution
  1110.         on  data  files, it is not possible to list every possible reason
  1111.         for the display of the error messages.  The  line  number  within
  1112.         the QTAwk utility on which the error was discovered and the input
  1113.         data file record number are provided  in  the  error  message  to
  1114.         provide some help to the user in attempting to ascertain the real
  1115.         reason for the error. 
  1116.         
  1117.          ==> QTAwk Version 4.10.  This version contains one addition from
  1118.         the previous versions:
  1119.         
  1120.          1.  In previous versions, the GROUP pattern keyword could accept
  1121.         patterns consisting only of a regular expression  constant.   For
  1122.         version  4.10,  The  GROUP  pattern  keyword has been expanded to
  1123.         accept  regular  expression  constants,  string   constants   and
  1124.         variables.   The  variables  are  evaluated at the time the GROUP
  1125.         patterns are first utilized to scan an input record.   The  value
  1126.         is  converted  to  string  form  and  interpreted  as  a  regular
  1127.         expression. 
  1128.         
  1129.          GROUP /regular expression constant/ { actions  }  GROUP  "string
  1130.         constant" { actions } GROUP Variable_name { actions }
  1131.         
  1132.         
  1133.         
  1134.         
  1135.  
  1136.  
  1137.         QTAwk                        - xxi -                        QTAwk
  1138.  
  1139.  
  1140.  
  1141.  
  1142.  
  1143.  
  1144.          GROUP  patterns  are  still  converted  into  an  internal  form
  1145.         for regular expressions only once, when the pattern is first used
  1146.         to  scan an input line.  Any variables in a GROUP pattern will be
  1147.         evaluated, converted to string form  and  interpreted  a  regular
  1148.         expression. 
  1149.         
  1150.          ==>  QTAwk  Version  4.02.   This version contains two additions
  1151.         from the previous versions:
  1152.         
  1153.          1.  The  command  line  argument,  double  hyphen,  "--",  stops
  1154.         further  scanning  of  the  command line for options.  The double
  1155.         hyphen argument is not passed to the QTAwk utility  in  the  ARGV
  1156.         array  or  counted  in  the  ARGC  variable.   Since  QTAwk  only
  1157.         recognizes two command options, this  has  been  included  to  be
  1158.         compatible with the latest Unix(tm) conventions. 
  1159.         
  1160.          2.   The  built-in  array  ENVIRON  has  been added.  This array
  1161.         contains the environment strings passed  to  QTAwk.   Changing  a
  1162.         string  in ENVIRON will have no effect on the environment strings
  1163.         passed in the  QTAwk  "system"  built-in  function.   Environment
  1164.         strings  are  set  with the PC/MS-DOS "SET" command.  The strings
  1165.         are of the form:
  1166.         
  1167.          name = string
  1168.         
  1169.          where the blanks on either side of  the  equal  sign,  '=',  are
  1170.         optional  and  depend  on  the  particular form used in the "SET"
  1171.         command.  The QTAwk utility may scan the elements of ENVIRON  for
  1172.         a particular name or string as desired. 
  1173.         
  1174.         
  1175.         
  1176.         
  1177.         
  1178.         
  1179.         
  1180.         
  1181.         
  1182.         
  1183.         
  1184.         
  1185.         
  1186.         
  1187.         
  1188.         
  1189.         
  1190.         
  1191.         
  1192.  
  1193.  
  1194.         QTAwk                       - xxii -                        QTAwk
  1195.  
  1196.  
  1197.  
  1198.  
  1199.  
  1200.  
  1201.         1.0 Introduction
  1202.         
  1203.          QTAwk  is  called  a Utility Creation Tool and not a programming
  1204.         language because it is intended for the average computer user  as
  1205.         well as the more experienced user and programmer.  QTAwk has been
  1206.         designed to make it easy for the average  user  to  create  those
  1207.         small,  or  maybe  not  so  small, utilities needed to accomplish
  1208.         small, or not so small, everyday jobs.  The jobs  which  are  too
  1209.         small  to  justify  the  time  and  cost of using the traditional
  1210.         computer programming language and  maybe  hiring  a  professional
  1211.         programmer to accomplish. 
  1212.         
  1213.          If  you  are like many computer users, you would frequently like
  1214.         to make changes in various text files wherever  certain  patterns
  1215.         appear,  or  extract  data  from  parts  of  certain  lines while
  1216.         discarding the rest.  To write a program to do this in a language
  1217.         such  as  C  or Pascal is a time-consuming inconvenience that may
  1218.         take many lines of code.  The job  may  be  easier  with  QTAwk. 
  1219.         
  1220.          The  QTAwk  utility  interprets  a  special-purpose  programming
  1221.         language   that   makes   it   possible    to    handle    simple
  1222.         data-reformatting  jobs  easily  with  just a few lines of code. 
  1223.         
  1224.          This manual teaches you what QTAwk does  and  how  you  can  use
  1225.         QTAwk effectively.  Using `QTAwk' you can:
  1226.         
  1227.         manage small, personal databases
  1228.             
  1229.         generate reports
  1230.             
  1231.         validate data
  1232.             
  1233.         produce  indexes,  and  perform  other document preparation tasks
  1234.             
  1235.         even experiment with algorithms that  can  be  adapted  later  to
  1236.             other computer languages
  1237.         
  1238.          This  paper presents a description of the QTAwk utility creation
  1239.         tool and its use.  Most computer users have many small  tasks  to
  1240.         accomplish  that  are  usually left undone for lack of the proper
  1241.         tool.  Typically these tasks require finding one or more  records
  1242.         within  a  file and executing some action depending on the record
  1243.         located. 
  1244.         
  1245.          In order to accomplish these tasks the user needs a  tool  which
  1246.         will allow the following to be accomplished easily:
  1247.         
  1248.         1.  reading files record by record,
  1249.  
  1250.  
  1251.         QTAwk                       - xxiii -                       QTAwk
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.         2.  spliting,  or parsing, the records read into words or fields,
  1259.         3.  determining if a record, or records, satisfy a  predetermined
  1260.             match criteria, i.e.  finding the "proper" record(s),
  1261.         4.  when  the  proper records are found, executing some action or
  1262.             actions on the records or fields of the records. 
  1263.         
  1264.          QTAwk supplies the user with all of these features in an easy to
  1265.         use  manner.   Specifying the name of a file is all the user need
  1266.         do to open the file and read it record by record.  The  user  may
  1267.         easily  change  what  a "record" is or let it default to an ASCII
  1268.         text line as used by all text editors and which can be written by
  1269.         all  word processors or force QTAwk to view files as sequences of
  1270.         fixed length records.  QTAwk  will  automatically  split  (parse)
  1271.         records  into  fields.  Initially a field is a word or a sequence
  1272.         of nonblank characters.  The user may change the definition of  a
  1273.         field  easily  to  adapt to the needs of a particular situation. 
  1274.         The user may even force QTAwk to split input records  into  fixed
  1275.         length fields. 
  1276.         
  1277.          Arithmetic   expressions,   logical   expressions   or   regular
  1278.         expressions may be used to  define  the  criteria  for  selecting
  1279.         records  for action.  Regular expressions are a powerful means of
  1280.         describing the criteria for selecting, i.e, matching, the text of
  1281.         records.   Arithmetic expressions utilize the ordinary arithmetic
  1282.         operators  (addition,  subtraction,  multiplication,  etc.)   for
  1283.         describing   the  criteria  for  selecting  records  and  logical
  1284.         expressions utilize the logical operators (less than,  equal  to,
  1285.         greater than, etc.) for selecting records. 
  1286.         
  1287.          Of  all the operators available in QTAwk, the regular expression
  1288.         operators may be only ones most readers are not  familiar  with. 
  1289.         Regular  expressions  are  a powerful and useful tool for working
  1290.         with text.  Yet for all their power, they are surprisingly simple
  1291.         and  easy  to  use  when  learned.   Section  2  explains regular
  1292.         expressions fully, in a manner that will make them  usable  by  a
  1293.         person totally unfamiliar with them. 
  1294.         
  1295.          QTAwk  is patterned after The Awk Programming Language by Alfred
  1296.         V.  Aho, Brian W.  Kernighan and Peter J.  Weinberger.   The  Awk
  1297.         program implementing The Awk Programming Language is available on
  1298.         most Unix (tm) systems.  Aho, Kernighan and  Weinberger  invented
  1299.         the  automatic  input  loop  and the pattern-action pairs used in
  1300.         QTAwk and are to be heartily  congratulated  for  this.   Without
  1301.         Awk,  QTAwk  would not exist.  QTAwk is an extensive expansion of
  1302.         The Awk Programming  Language  in  many  important  aspects.   In
  1303.         addition,   some   of   the  admitted  shortcomings  of  The  Awk
  1304.         Programming Language have been corrected.  Appendix iii  contains
  1305.         a  detailed  listing  of  the differences between QTAwk and Awk. 
  1306.  
  1307.  
  1308.         QTAwk                       - xxiv -                        QTAwk
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.  
  1325.  
  1326.  
  1327.  
  1328.  
  1329.  
  1330.  
  1331.  
  1332.  
  1333.  
  1334.  
  1335.  
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341.  
  1342.  
  1343.  
  1344.  
  1345.  
  1346.  
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.  
  1353.  
  1354.  
  1355.  
  1356.  
  1357.  
  1358.  
  1359.  
  1360.  
  1361.  
  1362.  
  1363.  
  1364.  
  1365.  
  1366.         QTAwk                        - xxv -                        QTAwk
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.  
  1373.  
  1374.  
  1375.  
  1376.  
  1377.  
  1378.  
  1379.  
  1380.  
  1381.  
  1382.  
  1383.  
  1384.  
  1385.  
  1386.  
  1387.  
  1388.  
  1389.  
  1390.  
  1391.  
  1392.  
  1393.  
  1394.  
  1395.  
  1396.  
  1397.  
  1398.  
  1399.  
  1400.  
  1401.  
  1402.  
  1403.  
  1404.  
  1405.  
  1406.  
  1407.  
  1408.  
  1409.  
  1410.  
  1411.  
  1412.  
  1413.  
  1414.  
  1415.  
  1416.  
  1417.  
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423.  
  1424.         QTAwk                       - 1-26 -                        QTAwk
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.  
  1431.         Section 2.0                                       Getting Started
  1432.  
  1433.  
  1434.         2.0 Getting Started
  1435.         
  1436.          QTAwk is designed to be used to search data or text files  using
  1437.         short  user  created utilities.  The types of files that QTAwk is
  1438.         designed to work with are "text"  files,  commonly  called  ASCII
  1439.         files.   The  files  contain user readable text and numbers.  The
  1440.         text  is  contained  in  records  and  the   records   end   with
  1441.         carriage-return,   newline  character  pairs  or  single  newline
  1442.         characters.  Text files are written by application  programs  and
  1443.         word processors and text editors. 
  1444.         
  1445.          The data in the files is grouped by fields on a single record or
  1446.         by records separated by a blank  line  or  some  other  "special"
  1447.         character.   For  example,  the  following  records  list data on
  1448.         various states:
  1449.         
  1450.         US # 10461 # 4375 # MD # Annapolis ( Maryland )
  1451.         US # 40763 # 5630 # VA # Richmond ( Virginia )
  1452.         US # 2045 # 620 # DE # Dover ( Delaware )
  1453.         US # 24236 # 1995 # WV # Charleston ( West Virginia )
  1454.         US # 46047 # 12025 # PA # Harrisburg ( Pennsylvania )
  1455.         US # 7787 # 7555 # NJ # Trenton ( New Jersey )
  1456.         US # 52737 # 17895 # NY # Albany ( New York )
  1457.         US # 9614 # 535 # VT # Montpelier ( Vermont )
  1458.         US # 9278 # 975 # NH # Concord ( New Hampshire )
  1459.         US # 33265 # 1165 # ME # Augusta ( Maine )
  1460.         
  1461.          Each record consists of at least 12 words.  The 12 words of  the
  1462.         first record are:
  1463.         
  1464.         1.  US
  1465.         2.  #
  1466.         3.  10461
  1467.         4.  #
  1468.         5.  4375
  1469.         6.  #
  1470.         7.  MD
  1471.         8.  #
  1472.         9.  Annapolis
  1473.         10.  (
  1474.         11.  Maryland
  1475.         12.  )
  1476.         
  1477.          The first word lists the country, the third word lists the state
  1478.         area in square miles, the fifth word lists the  state  population
  1479.         in thousands.  the seventh word lists the state abbreviation, the
  1480.  
  1481.  
  1482.         QTAwk                        - 2-1 -                        QTAwk
  1483.  
  1484.  
  1485.  
  1486.  
  1487.  
  1488.  
  1489.         Section 2.0                                       Getting Started
  1490.  
  1491.  
  1492.         ninth word lists the state capital, and the eleventh  word  lists
  1493.         the  state  name.   The  second, fourth, sixth, eighth, tenth and
  1494.         last words are word separators.   The  word  separators  are  not
  1495.         necessary  for  QTAwk,  but  make  each line easier for people to
  1496.         read.  A copy of  this  entire  file,  states.dta,  is  given  in
  1497.         Appendix v. 
  1498.         
  1499.          This data can be manipulated in various ways.  A few of the ways
  1500.         in which this can be done are:
  1501.         
  1502.         1.  the manner of listing changed, or
  1503.         2.  only records meeting certain criteria listed:
  1504.             a)  those states with a minimum area,
  1505.             b)  those states with a minimum population,
  1506.             c)  population  greater  than  a  minimum  and  less  than  a
  1507.                 maximum,
  1508.             d)  area  less  than  a maximum and population greater than a
  1509.                 minimum,
  1510.             e)  population  density  (population  /  area)  less  than  a
  1511.                 maximum. 
  1512.         3.  the list could be sorted:
  1513.             a)  alphabetically by
  1514.                 1:  state capital,
  1515.                 2:  state name,
  1516.                 3:  state abbreviation. 
  1517.             b)  by area,
  1518.             c)  by population. 
  1519.         4.  some  data  could  be  deleted  from  the  list  such  as the
  1520.             capital. 
  1521.         
  1522.          There are many more ways to manipulate the data.  In order to do
  1523.         so  the  data in the list must first be read record by record and
  1524.         each record split into its constituent parts.  Once the parts for
  1525.         each  record  have  been  determined,  the  data  can  be  easily
  1526.         manipulated, changed, or rearranged. 
  1527.         
  1528.         2.1 Running QTAwk
  1529.         
  1530.          QTAwk is started from  the  command  prompt,  giving  the  QTAwk
  1531.         utility to run and the files to search.  The QTAwk utility may be
  1532.         written directly on the command line or contained in one or  more
  1533.         files  named  on the command line.  If given on the command line,
  1534.         it is usually enclosed in double quotes:
  1535.         
  1536.         QTAwk "$5 > 50000 {print;}" states.dta
  1537.         
  1538.  
  1539.  
  1540.         QTAwk                        - 2-2 -                        QTAwk
  1541.  
  1542.  
  1543.  
  1544.  
  1545.  
  1546.  
  1547.         Section 2.1                                       Getting Started
  1548.  
  1549.  
  1550.          This QTAwk utility will print the record  for  every  state  for
  1551.         which the area is greater than 50,000 square miles. 
  1552.         
  1553.          The  example  shows  the  form of QTAwk utilities, a sequence of
  1554.         patterns and actions in the form:
  1555.         
  1556.         pattern1 { action1 }
  1557.         pattern2 { action2 }
  1558.         pattern3 { action3 }
  1559.         .. 
  1560.         .. 
  1561.         .. 
  1562.         
  1563.          QTAwk opens the files named on the command line, reads a record,
  1564.         splits  (parses)  each record into the individual words or fields
  1565.         and compares the record with each pattern in the order  in  which
  1566.         they  have  been  written  in  the  QTAwk utility.  If the record
  1567.         matches a pattern, the corresponding action contained  in  braces
  1568.         is executed. 
  1569.         
  1570.          Patterns  may  be  arithmetic  expressions, logical expressions,
  1571.         regular  expressions  or  combinations  of  all  three  types  of
  1572.         expressions.    The   example  above  has  a  logical  expression
  1573.         pattern. 
  1574.         
  1575.          Programs indicate the end of text lines in ASCII  files  with  a
  1576.         Carriage  Return,  Newline  character  pair.   QTAwk  follows the
  1577.         practice of converting all such pairs to a  single  newline  when
  1578.         reading  the  file.   In  writing  files,  QTAwk  converts single
  1579.         Newline characters to a Carriage Return, Newline pair. 
  1580.         
  1581.          For the data in the "states.dta" data file, a user may  ask  for
  1582.         the  total  population of Canada.  The first field can be used to
  1583.         identify the  data  for  Canada  and  the  fifth  field  contains
  1584.         population  data.   The following utility will sum the population
  1585.         data for Canada:
  1586.         
  1587.         $1 == "Canada" { Total += $5 }
  1588.         END { print Total; }
  1589.         
  1590.          In this example, when the first field of a record  is  equal  to
  1591.         "Canada",  the  fifth  field  is  accumulated  into  the variable
  1592.         Total.  When all records have been processed, Total is  printed. 
  1593.         The  printing  of  Total is accomplished in the action associated
  1594.         with the pattern 'END'.   'END'  is  a  predefined  pattern,  the
  1595.         associated  action  is executed after closing the input file(s). 
  1596.  
  1597.  
  1598.         QTAwk                        - 2-3 -                        QTAwk
  1599.  
  1600.  
  1601.  
  1602.  
  1603.  
  1604.  
  1605.         Section 2.1                                       Getting Started
  1606.  
  1607.  
  1608.          Usually, data such as the state date is given in tabular  format
  1609.         with each item in a record in a columns.  The state data is shown
  1610.         in such a format in Appendix v.  A few lines are repeated  below:
  1611.         
  1612.         Country State                    State Capital        Area     Population
  1613.         US      Maryland                 MD    Annapolis      10461    4375      
  1614.         US      Virginia                 VA    Richmond       40763    5630      
  1615.         US      Delaware                 DE    Dover          2045     620       
  1616.         .
  1617.         .
  1618.         .
  1619.         Europe  West Germany                   Bonn           92100    14030     
  1620.         Europe  France                         Paris          211208   55020     
  1621.         Europe  United Kingdom                 London         94092    56040     
  1622.         Europe  Ireland                        Dublin         27136    3595      
  1623.         
  1624.          For  the  above  table,  field five, $5, contains the state area
  1625.         for states in the US.  But for European countries,  the  area  is
  1626.         contained  in  field four, $4, since the third field is missing. 
  1627.         
  1628.          When data in records is contained within fixed length fields  as
  1629.         in this table, it can be more convenient to split the record into
  1630.         fields based on the field widths  rather  than  characters  which
  1631.         terminate  or  separate  the fields.  This can be especially true
  1632.         when some fields are missing  in  some  of  the  records.   QTAwk
  1633.         allows  the  user  to  split  records  on  fixed  field widths by
  1634.         assigning a sequence of integer  field  widths  to  the  built-in
  1635.         variable,  FIELDWIDTHS.   For  the  table  above  this  could  be
  1636.         accomplished with:
  1637.         
  1638.          FIELDWIDTHS = "8 25 6 15 9 10";
  1639.         
  1640.          Thus, for the first record the fields are:
  1641.         
  1642.         $1 = "US      "
  1643.         $2 = "Maryland                 "
  1644.         $3 = "MD    "
  1645.         $4 = "Annapolis      "
  1646.         $5 = "10461    "
  1647.         $6 = "4375      "
  1648.         
  1649.          and for the last record the fields are:
  1650.         
  1651.         $1 = "Europe  "
  1652.         $2 = "Ireland                  "
  1653.         $3 = "      "
  1654.  
  1655.  
  1656.         QTAwk                        - 2-4 -                        QTAwk
  1657.  
  1658.  
  1659.  
  1660.  
  1661.  
  1662.  
  1663.         Section 2.1                                       Getting Started
  1664.  
  1665.  
  1666.         $4 = "Dublin         "
  1667.         $5 = "27136    "
  1668.         $6 = "3595      "
  1669.         
  1670.          Note that for fixed fields widths, the fields may contain blanks
  1671.         and  comparisons  must  be  against  the entire field.  Thus, the
  1672.         short utility to find the total population  for  Canada  must  be
  1673.         written as:
  1674.         
  1675.         $1 == "Canada  " { Total += $5 }
  1676.         END { print Total; }
  1677.         
  1678.          to find those records for Canada. 
  1679.         
  1680.          There  are  several things to note using FIELDWIDTHS for parsing
  1681.         input records:
  1682.         
  1683.         1.  If the input record is longer  than  the  sum  of  the  field
  1684.             widths  specified  in FIELDWIDTHS, QTAwk creates a last field
  1685.             containing the remainder of the input record.   For  example,
  1686.             if FIELDWIDTHS is specified as:
  1687.             
  1688.              FIELDWIDTHS = "2 4 4 5";
  1689.             
  1690.              4  fields with a total width of 15 characters.  For an input
  1691.             record of 25 characters,  QTAwk  creates  5  fields  with  $5
  1692.             containing the last 10 characters of the input record.  FS is
  1693.             NOT used to parse the remaining input record after  the  last
  1694.             field specified in FIELDWIDTHS. 
  1695.             
  1696.         2.  If  the input record is shorter in length than the sum of the
  1697.             field widths specified in FIELDWIDTHS, QTAwk only creates the
  1698.             number  of fields necessary to contain the input record.  The
  1699.             last field will contain only those  characters  necessary  to
  1700.             fill  out  the  input record.  For example, if FIELDWIDTHS is
  1701.             specified as above and the input record is only 10 characters
  1702.             long,  QTAwk  will create only 3 fields, NF will be set to 3,
  1703.             and $3 will be only 2 characters long. 
  1704.         
  1705.          Thus, for the tabular data, FIELDWIDTHS  could  be  defined  as:
  1706.         
  1707.          FIELDWIDTHS = "8 25 6 15 9";
  1708.         
  1709.          and  QTAwk  would automatically assign the population data to $6
  1710.         for each record. 
  1711.         
  1712.  
  1713.  
  1714.         QTAwk                        - 2-5 -                        QTAwk
  1715.  
  1716.  
  1717.  
  1718.  
  1719.  
  1720.  
  1721.         Section 2.1                                       Getting Started
  1722.  
  1723.  
  1724.          The remaining  Sections  explain  QTAwk  expressions,  patterns,
  1725.         action  statements  and  more.   All of these are combined into a
  1726.         QTAwk utility.  In using and creating QTAwk utilities,  the  user
  1727.         needs  to  remember  the  fundamental  QTAwk processing sequence:
  1728.         
  1729.         1.  QTAwk opens each input file and  reads  the  file  record  by
  1730.             record,
  1731.         2.  as each record is read, it is split into fields,
  1732.         3.  each pattern expression is executed, and
  1733.         4.  the associated action is executed for each pattern expression
  1734.             which evaluates to true. 
  1735.         
  1736.          Keeping this fundamental loop in mind will make using QTAwk very
  1737.         simple  indeed.   The  advanced  user  should read the section on
  1738.         Pattern/Actions, Section 8, for a method of speeding file  search
  1739.         using  the FILE_SEARCH and FILE_SEARCH_PAT predefined variables. 
  1740.         Also the FIELDWIDTHS built-in variable may be used to  alter  the
  1741.         manner  in  which  QTAwk splits each input record into fields and
  1742.         utilize fixed length fields within records.  The RECLEN  variable
  1743.         may  be used to alter the manner in which QTAwk reads records and
  1744.         utilize fixed length records. 
  1745.  
  1746.  
  1747.  
  1748.  
  1749.  
  1750.  
  1751.  
  1752.  
  1753.  
  1754.  
  1755.  
  1756.  
  1757.  
  1758.  
  1759.  
  1760.  
  1761.  
  1762.  
  1763.  
  1764.  
  1765.  
  1766.  
  1767.  
  1768.  
  1769.  
  1770.  
  1771.  
  1772.         QTAwk                        - 2-6 -                        QTAwk
  1773.  
  1774.  
  1775.  
  1776.  
  1777.  
  1778.  
  1779.         Section 3.0                                   Regular Expressions
  1780.  
  1781.  
  1782.         3.0 Regular Expressions
  1783.         
  1784.          Regular expressions are  a  means  of  describing  sequences  of
  1785.         "characters".   In  the  discussion of QTAwk, "character" will be
  1786.         taken to mean any character from the extended ASCII  sequence  of
  1787.         characters  from ASCII '1' to ASCII '255'.  Appendix i contains a
  1788.         listing of the ASCII  characters  with  both  their  decimal  and
  1789.         hexadecimal equivalent. 
  1790.         
  1791.          A  string  is  a finite sequence of characters.  The length of a
  1792.         string is the number of characters contained in  the  string.   A
  1793.         special  string is the empty string, also called the null string,
  1794.         which is of zero length, i.e., it  contains  no  characters.   We
  1795.         shall  use  the  symbol  ''  below to refer to the null string. 
  1796.         
  1797.          Another way to think of a string is as the  concatenation  of  a
  1798.         sequence  of characters.  Two strings may be concatenated to form
  1799.         another string.  Concatenating the two strings:
  1800.         
  1801.                                     "abcdef"                             
  1802.         
  1803.          and
  1804.         
  1805.                                    "ghijklmn"                            
  1806.         
  1807.          forms the third string:
  1808.         
  1809.                                 "abcdefghijklmn"                         
  1810.         
  1811.          In many instances, it is desirable to  describe  a  string  with
  1812.         several  alternatives for one or more of the characters.  Thus we
  1813.         may wish to find the strings:
  1814.         
  1815.                                       FRED                               
  1816.         
  1817.          or
  1818.         
  1819.                                        TED                               
  1820.         
  1821.          A convenient manner of describing both  strings  with  the  same
  1822.         regular expression is
  1823.         
  1824.                                    /(FR|T)ED/                            
  1825.         
  1826.          Strings  in  QTAwk are enclosed in double quotes, ", and regular
  1827.         expressions are enclosed in slashes, '/'. 
  1828.  
  1829.  
  1830.         QTAwk                        - 3-1 -                        QTAwk
  1831.  
  1832.  
  1833.  
  1834.  
  1835.  
  1836.  
  1837.         Section 3.1                                   Regular Expressions
  1838.  
  1839.  
  1840.         3.1 'OR' Operator
  1841.         
  1842.          The symbol '|' means "or" and so the  above  regular  expression
  1843.         would  be read as: The string "FR" or the string "T" concatenated
  1844.         with the string "ED".  The parenthesis are used to group  strings
  1845.         into  equivalent  positions in the resultant regular expression. 
  1846.         In this manner it is possible to build a regular  expression  for
  1847.         several alternative strings. 
  1848.         
  1849.          In  many  instances  it  is  also  desirable  to  build  regular
  1850.         expressions that contain many  alternatives  for  one  character,
  1851.         i.e.,  one  character  strings.  For example, we may want to find
  1852.         all instances of the words "doing" or "going".   We  could  build
  1853.         the regular expression:
  1854.         
  1855.                                    /(d|g)oing/                           
  1856.         
  1857.         3.2 Character Classes
  1858.         
  1859.          Although the last regular expression is a fairly simple example,
  1860.         it serves to introduce the notion of "character  class".   If  we
  1861.         define the notation:
  1862.         
  1863.                                   [dg] = (d|e)                           
  1864.         
  1865.          then we may write the regular expression as:
  1866.         
  1867.                                    /[dg]oing/                            
  1868.         
  1869.          The  character class notation saves us from having to explicitly
  1870.         write the "or" symbols in the regular expression.   The  "or"  is
  1871.         implied between each character of the class. 
  1872.         
  1873.          Now  suppose  that  we  wanted  to expand our search to all five
  1874.         letter words ending in "ing" and starting  with  any  lower  case
  1875.         letter and having any lower case letter as the second character. 
  1876.         We would write the regular expression:
  1877.         
  1878.                    /(a|b|c|d|...|x|y|z)(a|b|c|d|...|x|y|z)ing/           
  1879.         
  1880.          or
  1881.         
  1882.                           /[abcd...xyz][abcd...xyz]ing/                  
  1883.         
  1884.          Regular expressions in these cases can not only get  very  long,
  1885.         but can be very tedious to write and are very prone to error.  We
  1886.  
  1887.  
  1888.         QTAwk                        - 3-2 -                        QTAwk
  1889.  
  1890.  
  1891.  
  1892.  
  1893.  
  1894.  
  1895.         Section 3.2                                   Regular Expressions
  1896.  
  1897.  
  1898.         introduce the notion of a range of characters into the  character
  1899.         class and define:
  1900.         
  1901.                    [a-z] = [abcd...xyz] = (a|b|c|d|...|x|y|z)            
  1902.         
  1903.          The above regular expression can now be written:
  1904.         
  1905.                                  /[a-z][a-z]ing/                         
  1906.         
  1907.          A  considerable  savings and less error prone.  The hyphen, '-',
  1908.         is recognized as expressing a range of characters  only  when  it
  1909.         occurs  within  a character class.  Within character classes, the
  1910.         hyphen loses this significance  in  the  following  three  cases:
  1911.         
  1912.         1.  when  it is the first character of the character class, e.g.,
  1913.             
  1914.                                     [-b] = (-|b)                         
  1915.             
  1916.         2.  when it is the last character of the character  class,  e.g.,
  1917.             
  1918.                                     [b-] = (b|-)                         
  1919.             
  1920.         3.  when  the  first  character of the indicated range is greater
  1921.             in the ASCII collating sequence than the second character  of
  1922.             the indicated range, e.g.,
  1923.             
  1924.                                         [z-a]                            
  1925.             
  1926.              would be recognized as:
  1927.             
  1928.                                        (z|-|a)                           
  1929.         
  1930.          In  interpreting  the range notation in character classes, QTAwk
  1931.         uses the ASCII collating sequence. 
  1932.         
  1933.                                       [0-Z]                              
  1934.         
  1935.          is equivalent to:
  1936.         
  1937.                              [0123456789:;<=>?@A-Z]                      
  1938.         
  1939.          Continuing the last example, if we did not  want  to  limit  the
  1940.         first  character  to  lower  case, but also wanted to include the
  1941.         possibility of upper case letters, we  could  use  the  following
  1942.         regular expression:
  1943.         
  1944.  
  1945.  
  1946.         QTAwk                        - 3-3 -                        QTAwk
  1947.  
  1948.  
  1949.  
  1950.  
  1951.  
  1952.  
  1953.         Section 3.2                                   Regular Expressions
  1954.  
  1955.  
  1956.                              /([A-Z]|[a-z])[a-z]ing/                     
  1957.         
  1958.          This  regular  expression  allows  the  first  letter  to be any
  1959.         character in the range from A to Z or in the range from a to  z. 
  1960.         But  the  "or"  is  implied  in character classes, shortening the
  1961.         above regular expression to:
  1962.         
  1963.                                /[A-Za-z][a-z]ing/                        
  1964.         
  1965.          If we now wish to expand the above from all  five  letter  words
  1966.         ending in "ing" to all six letter words ending in "ing", we could
  1967.         write the regular expression as:
  1968.         
  1969.                              /[A-Za-z][a-z][a-z]ing/                     
  1970.         
  1971.          In general, if  we  did  not  want  to  specify  the  number  of
  1972.         characters  between  the  first  letter  and the "ing" ending, we
  1973.         could specify an regular expression as:
  1974.         
  1975.                    /[A-Za-z](|[a-z])(|[a-z])...(|[a-z])ing/           
  1976.         
  1977.          By specifying the null string in the  'or'  regular  expression,
  1978.         the  regular expression allows a character in the range a to z or
  1979.         no character to match.   The  shortest  string  matched  by  this
  1980.         regular  expression  would be a single upper or lower case letter
  1981.         followed by "ing".  The regular expression would also  match  any
  1982.         string  starting  with  an  upper  or  lower case letter with any
  1983.         number of lower case letters  following  and  ending  in  "ing". 
  1984.         
  1985.         3.3 Closure
  1986.         
  1987.          What  we  need to describe this regular expression is a notation
  1988.         for specifying "zero or more" copies of a character  or  string. 
  1989.         Such a notation exists and is written as:
  1990.         
  1991.                                /[A-Za-z][a-z]*ing/                       
  1992.         
  1993.          where the notation
  1994.         
  1995.                                      [a-z]*                              
  1996.         
  1997.          means  zero  or  more occurrences of the character class [a-z]. 
  1998.         This operation is called  closure  and  the  '*'  is  called  the
  1999.         closure  operator.   In general, the notation may be used for any
  2000.         regular expression within a regular  expression.   The  following
  2001.         are  valid  regular  expressions using the notion of zero or more
  2002.  
  2003.  
  2004.         QTAwk                        - 3-4 -                        QTAwk
  2005.  
  2006.  
  2007.  
  2008.  
  2009.  
  2010.  
  2011.         Section 3.3                                   Regular Expressions
  2012.  
  2013.  
  2014.         occurrences of  an  regular  expression  within  another  regular
  2015.         expression:
  2016.         
  2017.                                     /mis*ion/                            
  2018.         
  2019.          would    match   "miion",   "mision",   "mission",   "misssion",
  2020.         "missssion", etc. 
  2021.         
  2022.                                     /bot*om/                             
  2023.         
  2024.          would match "boom",  "botom",  "bottom",  "botttom",  "bottttom,
  2025.         etc. 
  2026.         
  2027.                                    /(Fr|T)*ed/                           
  2028.         
  2029.          would  match  "ed", "Fred", "Ted", "FrFred", "TTed", "FrFrFred",
  2030.         "TTTed", "FrTFred", "FrFrTed", "TFrFred", etc. 
  2031.         
  2032.          As an extension to the '*' operator, we frequently would want to
  2033.         search for "one or more" occurrences of a regular expression.  As
  2034.         above we would write this as:
  2035.         
  2036.                             /[A-Za-z][a-z][a-z]*ing/                     
  2037.         
  2038.          The [a-z][a-z]* construct would ensure that at least one  letter
  2039.         occurred  between  the initial letter and the string "ing".  This
  2040.         occurs often enough that the notation
  2041.         
  2042.                               [a-z]+ = [a-z][a-z]*                       
  2043.         
  2044.          has been adopted  to  handle  this  situation.   Thus,  use  the
  2045.         operator  '*' for "zero or more" occurrences and the operator '+'
  2046.         for "one or more" occurrences.  The '+' operator  is  called  the
  2047.         positive closure operator. 
  2048.         
  2049.          In  many  cases it is desirable to search for either zero or one
  2050.         regular expression.  For example, it would be desirable to search
  2051.         for  names  preceded  by either Mr or Mrs The regular expression:
  2052.         
  2053.                                      /Mrs*/                              
  2054.         
  2055.          would find: Mr and Mrs and Mrss and Mrsss, etc.   The  following
  2056.         regular  expression  will  accomplish what we really want in this
  2057.         case:
  2058.         
  2059.                                     /Mr(|s)/                            
  2060.  
  2061.  
  2062.         QTAwk                        - 3-5 -                        QTAwk
  2063.  
  2064.  
  2065.  
  2066.  
  2067.  
  2068.  
  2069.         Section 3.3                                   Regular Expressions
  2070.  
  2071.  
  2072.          This regular expression would find 'Mr' followed by zero or  one
  2073.         's'. 
  2074.         
  2075.          The  operator  '?'  has been selected to denote "zero or one" of
  2076.         the preceding regular expression.  Thus,
  2077.         
  2078.                                /Mrs?/ = /Mr(|s)/                        
  2079.         
  2080.         3.4 Repetition Operator
  2081.         
  2082.          In some cases we wish to specify a minimum  and  maximum  repeat
  2083.         count  for  a  regular  expression.   For example, suppose it was
  2084.         desirable for a regular expression to contain a minimum of 2  and
  2085.         a maximum of 4 copies of "abc".  We could specify this as:
  2086.         
  2087.                               /abcabc(abc)?(abc)?/                       
  2088.         
  2089.          The  notation  {2,4}  has been adopted for expressing this.  The
  2090.         general form of the repetition operator is {n1,n2}.   n1  and  n2
  2091.         are  integers,  with n1 greater than or equal to 1 and n2 greater
  2092.         than or equal to n1, 1 ≤ n1 ≤ n2.  A repetition  count  would  be
  2093.         specified as:
  2094.         
  2095.         /r{n1,n2}/ = /rrrrrrrrrrrrrrr?r?r?r?r?r?/
  2096.                       │<─── n1 ───>│          │
  2097.                       │<──────── n2 ─────────>│
  2098.         
  2099.          The above could be expressed as:
  2100.         
  2101.                      /(abc){2,4}/ = /(abc)(abc)(abc)?(abc)?/             
  2102.         
  2103.          Since  the repetition operator repeats the immediately preceding
  2104.         regular expression, the parenthesis around "abc" are necessary to
  2105.         repeat  the  whole  string.   Without the parenthesis the regular
  2106.         expression would expand as:
  2107.         
  2108.                              /abc{2,4}/ = /abccc?c?/                     
  2109.         
  2110.          The repetition operator can be  used  to  repeat  either  single
  2111.         characters,  groups  of  characters,  character classes or quoted
  2112.         strings.  The use of the operator is illustrated below  for  each
  2113.         case:
  2114.         
  2115.         1.  Single character:
  2116.             
  2117.                                /abc{2,4}/ = /abccc?c?/                   
  2118.  
  2119.  
  2120.         QTAwk                        - 3-6 -                        QTAwk
  2121.  
  2122.  
  2123.  
  2124.  
  2125.  
  2126.  
  2127.         Section 3.4                                   Regular Expressions
  2128.  
  2129.  
  2130.         2.  Grouped regular expression:
  2131.             
  2132.                        /(abc){2,4}/ = /(abc)(abc)(abc)?(abc)?/           
  2133.             
  2134.         3.  character class:
  2135.             
  2136.                        /[abc]{2,4}/ = /[abc][abc][abc]?[abc]?/           
  2137.             
  2138.         4.  quoted string:
  2139.             
  2140.                         /"abc"{2,4}/ = /"abcabc(abc)?(abc)?"/            
  2141.             
  2142.              For  quoted  strings,  the  whole  of  the  string contained
  2143.             within quotes is repeated, with  all  repetitions  maintained
  2144.             within the quotes. 
  2145.             
  2146.         5.  named expressions (described later):
  2147.             
  2148.                     /{abc}{2,4}/ = /{abc}{abc}({abc})?({abc})?"/         
  2149.         
  2150.          A  special  case exists for character classes in which the class
  2151.         of characters to exclude is greater than the class of  characters
  2152.         to  include.   For  example,  suppose that we wanted in a certain
  2153.         character  position  to  include  all  characters  that   weren't
  2154.         numerics.  We could build a character class of all characters and
  2155.         leave  the  numerics  out.   An  easier  method  is  to  use  the
  2156.         "complemented"  or "negated" character class.  A special operator
  2157.         has been introduced for this purpose.  The  logical  NOT  symbol,
  2158.         '!',  occurring  as  the  first  character  in a character class,
  2159.         negates the class, i.e.,  any  character  NOT  in  the  class  is
  2160.         recognized at the character position. 
  2161.         
  2162.          Thus,  to  define  the negated character class of all characters
  2163.         which are not numerics, we would specify:
  2164.         
  2165.                                      [!0-9]                              
  2166.         
  2167.          To  define  all  characters  except  the  semi-colon,  we  would
  2168.         specify:
  2169.         
  2170.                                       [!;]                               
  2171.         
  2172.          Note  that  the  symbol '!' has this special meaning only as the
  2173.         FIRST character in a character class.  The caret symbol, '^',  as
  2174.         the  FIRST  character  in  a  character class may also be used to
  2175.         negate a character class.  Traditionally, the caret been used for
  2176.  
  2177.  
  2178.         QTAwk                        - 3-7 -                        QTAwk
  2179.  
  2180.  
  2181.  
  2182.  
  2183.  
  2184.  
  2185.         Section 3.4                                   Regular Expressions
  2186.  
  2187.  
  2188.         this  purpose,  but  QTAwk  allows  the logical NOT operator, '!'
  2189.         also. 
  2190.         
  2191.          Utilizing the above concepts for building regular expressions by
  2192.         concatenating  characters,  concatenating  regular expressions to
  2193.         build more complicated regular expressions, using parenthesis  to
  2194.         nest  or  group  regular  expressions within regular expressions,
  2195.         using character classes to denote constructs with implied  "or"s,
  2196.         negated character classes to specify characters to exclude from a
  2197.         given position, using the closure operators, '*',  '+'  and  '?',
  2198.         and  the  repetition  operator,  {n1,n2}, for expressing multiple
  2199.         copies, very complicated regular expressions  may  be  built  for
  2200.         searching for strings in files. 
  2201.         
  2202.         3.5 Escape Sequences
  2203.         
  2204.          To  round  out  the ability for building regular expressions for
  2205.         searching, we need only a few more tools.  In some cases  we  may
  2206.         wish  for  the  regular  expression  to  contain  blanks  or  tab
  2207.         characters.  In addition, other non-printable characters  may  be
  2208.         included  in  regular  expressions.  These characters are defined
  2209.         with "escape  sequences".   Escape  sequences  are  two  or  more
  2210.         characters   used  to  denote  a  single  character.   The  first
  2211.         character is always the backslash, '\'.  The second character  is
  2212.         by convention a letter as follows:
  2213.         
  2214.         \a   == bell (alert)           ( \x07 )                          
  2215.         \b   == backspace              ( \x08 )                          
  2216.         \f   == formfeed               ( \x0c )                          
  2217.         \n   == newline                ( \x0a )                          
  2218.         \r   == carriage return        ( \x0d )                          
  2219.         \s   == space (blank)          ( \x20 )                          
  2220.         \t   == horizontal tab         ( \x09 )                          
  2221.         \v   == vertical tab           ( \x0b )                          
  2222.         \c   == c [ \\ == \ ]                                            
  2223.         \ooo == character represented by octal value ooo                 
  2224.                 1 to 3 octal digits acceptable                           
  2225.         \xhhh== character represented by hexadecimal value hhh           
  2226.                 1 to 3 hexadecimal digits acceptable                     
  2227.         
  2228.          Any  other  character  following  the backslash is translated to
  2229.         mean that character.  Thus '\c' would become a single  'c',  '\['
  2230.         would  become  '[',  etc.   The  latter  is necessary in order to
  2231.         include such characters as '[', ']', '-',  '!',  '(',  ')',  '*',
  2232.         '+',  '?'  in  regular expressions without invoking their special
  2233.         meanings as regular expression operators. 
  2234.  
  2235.  
  2236.         QTAwk                        - 3-8 -                        QTAwk
  2237.  
  2238.  
  2239.  
  2240.  
  2241.  
  2242.  
  2243.         Section 3.6                                   Regular Expressions
  2244.  
  2245.  
  2246.         3.6 Position Operators
  2247.         
  2248.          Three additional special characters have,  by  convention,  been
  2249.         defined for use in writing regular expressions, namely the period
  2250.         '.', the caret, '^' and the dollar sign,  '$'.   The  period  has
  2251.         been  assigned  to  mean "any character" in the set of characters
  2252.         except the newline character, '\n'.  For our use the period means
  2253.         any  character  from ASCII 1 to ASCII 9 inclusive and ASCII 11 to
  2254.         ASCII 255 inclusive and exclusive of the newline character, ASCII
  2255.         10. 
  2256.         
  2257.          The  caret  and  the dollar sign are position indicators and not
  2258.         character indicators.  The caret, '^', is used  to  indicate  the
  2259.         beginning  or  start  of  the search string.  Thus, any character
  2260.         following the caret in a regular expression  must  be  the  first
  2261.         character  of  the  string  to  be  searched  otherwise the match
  2262.         fails.  The dollar sign , '$', is used to indicate the end of the
  2263.         search  string.  Thus, any character preceding the dollar sign in
  2264.         a regular expression must be the last character of the string  to
  2265.         be searched or the match fails. 
  2266.         
  2267.          To  indicate "beginning of line", the caret must be in the first
  2268.         character  position  of  a  regular  expression.   Similarly,  to
  2269.         indicate  "end  of  line",  the  dollar  sign must be in the last
  2270.         character  position  of  a  regular  expression.   In  any  other
  2271.         position,  these  characters  lose  their  special significance. 
  2272.         Thus, the regular expression:
  2273.         
  2274.                                   /(^|[\s\t])A/                          
  2275.         
  2276.          or
  2277.         
  2278.                                   /([\s\t]|^)A/                          
  2279.         
  2280.          means that 'A' must be the first character  on  a  line,  or  be
  2281.         preceded by a space or tab character to match.  Similarly
  2282.         
  2283.                                   /A($|[\s\t])/                          
  2284.         
  2285.          or
  2286.         
  2287.                                   /A([\s\t]|$)/                          
  2288.         
  2289.          means  that  'A'  must  be  the  last  character on a line or be
  2290.         followed by a space or tab character. 
  2291.         
  2292.  
  2293.  
  2294.         QTAwk                        - 3-9 -                        QTAwk
  2295.  
  2296.  
  2297.  
  2298.  
  2299.  
  2300.  
  2301.         Section 3.7                                   Regular Expressions
  2302.  
  2303.  
  2304.         3.7 Examples
  2305.         
  2306.          The regular expression:
  2307.         
  2308.                               /[A-Za-z][a-z]\s+.*/                       
  2309.         
  2310.          will match an upper or lower case letter  followed  by  a  lower
  2311.         case  letter  followed  by  one  or  more  blanks followed by any
  2312.         character except a newline zero or more times. 
  2313.         
  2314.          The regular expression:
  2315.         
  2316.                                /\([A-Z]+\)[!\s]+/                        
  2317.         
  2318.          will match a left parenthesis followed  by  one  or  more  upper
  2319.         case  letters  followed by a right parenthesis followed by one or
  2320.         more characters which are not blanks. 
  2321.         
  2322.          The regular expression:
  2323.         
  2324.                            /[\s\t]+ARCHIVE([\s\t]+|$)/                   
  2325.         
  2326.          will match one or more blanks or tabs followed by the  word  (in
  2327.         upper  case)  "ARCHIVE"  followed either by one or more blanks or
  2328.         tabs or by the end of line.  Note this kind of construct is handy
  2329.         for  finding  words  as  independent  units and not buried within
  2330.         other words. 
  2331.         
  2332.          The regular expression:
  2333.         
  2334.                                   /([\s\t]+|$)/                          
  2335.         
  2336.          is necessary to find words with trailing blanks or that end  the
  2337.         search line.  If only [\s\t]+ had been used then words ending the
  2338.         search line would not be  found,  since  there  are  no  trailing
  2339.         blanks or tabs. 
  2340.         
  2341.          Note that for files with the newline character, '\n', at the end
  2342.         of all lines, commonly called ASCII text files, it is possible to
  2343.         search for regular expressions that may span more than one line. 
  2344.         For example, if we wanted to find  all  sequences  of  the  names
  2345.         
  2346.                            Ted, Alice, George and Mary                   
  2347.         
  2348.          that  were  separated  by  spaces,  tabs  or line boundaries, we
  2349.         would write the following regular expression:
  2350.  
  2351.  
  2352.         QTAwk                       - 3-10 -                        QTAwk
  2353.  
  2354.  
  2355.  
  2356.  
  2357.  
  2358.  
  2359.         Section 3.7                                   Regular Expressions
  2360.  
  2361.  
  2362.                 /[\s\t\n]+Ted[\s\t\n]+Alice[\s\t\n]+Mary[\s\t\n]/        
  2363.         
  2364.          The regular expression:
  2365.         
  2366.                 /^As\s+(Fred|Ted|Jed|Ned)\s+(began|ended)(\s+|$)/        
  2367.         
  2368.          will match the beginning of the search line  followed  by  "As",
  2369.         i.e.,  'A' as the first character of the search line, followed by
  2370.         's', followed by one or more blanks followed by "Fred"  or  "Ted"
  2371.         or  "Jed"  or  "Ned"  followed  by one or more blanks followed by
  2372.         "began" or "ended" followed by one or more blanks or the  end  of
  2373.         the search line.  This could be modified slightly to be:
  2374.         
  2375.                    /^As\s+(Fr|T|J|N)ed\s+(began|ended)(\s+|$)/           
  2376.         
  2377.          or
  2378.         
  2379.                    /^As\s+(Fr|[TJN])ed\s+(began|ended)(\s+|$)/           
  2380.         
  2381.          either form will result in exactly the same search. 
  2382.         
  2383.         3.8 Look Ahead Operator
  2384.         
  2385.          Sometimes it is necessary to find a regular expression, but only
  2386.         when it is followed by another regular expression.  Thus we  wish
  2387.         to  find  "Mr",  but  only  when  it is followed by "Smith".  The
  2388.         "look-ahead" operator, '@', is used to denote this situation.  In
  2389.         general,  if r is a regular expression we wish to match, but only
  2390.         when followed by the regular expression s, then we would  express
  2391.         this as:
  2392.         
  2393.                                       /r@s/                              
  2394.         
  2395.          Thus,  to find "Mr", but only when followed by "Smith", we have:
  2396.         
  2397.                                 /Mr@[\s\t]+Smith/                        
  2398.         
  2399.         3.9 Match Classes
  2400.         
  2401.          There are also circumstances in which we wish to find  pairs  of
  2402.         characters.  For example, we wish to find all clauses in a letter
  2403.         enclosed within parenthesis, "()",  braces,  "{}",  or  brackets,
  2404.         "[]".   We could write several separate regular expressions which
  2405.         are identical except that  one  would  use  parenthesis,  another
  2406.         braces,  etc.   A  simpler  method  has been introduced using the
  2407.         concept of matched character classes.  A matched character  class
  2408.  
  2409.  
  2410.         QTAwk                       - 3-11 -                        QTAwk
  2411.  
  2412.  
  2413.  
  2414.  
  2415.  
  2416.  
  2417.         Section 3.9                                   Regular Expressions
  2418.  
  2419.  
  2420.         is denoted as:
  2421.         
  2422.                              [#\(\{\[] and [#\)\}\]]                     
  2423.         
  2424.          The  first  instance of a "matched character class" in a regular
  2425.         expression will match any character in  the  class.   The  second
  2426.         instance  will  match  only  the character in the position of the
  2427.         class matched by the first instance.  For example, in  the  above
  2428.         two  classes,  if  the character that matched the first class was
  2429.         '[', then only a ']' would match the second class and not  a  ')'
  2430.         or  a  '}'.   Note  the  use  of the backslash above to avoid any
  2431.         confusion in interpreting the characters "()", "{}", and "[]"  as
  2432.         characters and regular expression operators.  Except for ']', the
  2433.         backslash is not needed  since  the  characters  do  not  act  as
  2434.         operators  within  a character class.  For the character ']', the
  2435.         backslash is  necessary  to  prevent  early  termination  of  the
  2436.         character class. 
  2437.         
  2438.          Note that matched character classes cannot be nested.  Thus, the
  2439.         span  of  characters  between  two  different  matched  character
  2440.         classes cannot overlap.  If we wanted to find regular expressions
  2441.         contained within "([" and ")]"  or  within  "{["  and  "}]",  the
  2442.         instances  of  each  in the regular expression could not overlap,
  2443.         i.e., we could NOT write a regular expression like:
  2444.         
  2445.         this /[#\(\[] exp [#\{\[] contains [#\)\]] two [#\}\]] matched/
  2446.               │<────────────────────────────────>│           │
  2447.               │           │<────────────────────────────────>│
  2448.         
  2449.          This regular expression would be interpreted as:
  2450.         
  2451.         /this [#\(\[] exp [#\{\[] contains [#\)\]] two [#\}\]] matched/
  2452.               │<───────────────>│          │<───────────────>│
  2453.         
  2454.         3.10 Named Expressions
  2455.         
  2456.          If the  strings  to  be  found  using  regular  expressions  are
  2457.         complicated,  the  associated regular expressions can become very
  2458.         difficult to understand.  This makes it very hard to determine if
  2459.         the  regular  expression  is  correct.   For example, the regular
  2460.         expression (as one line):
  2461.         
  2462.            /^[A-Za-z_][A-Za-z0-9_]*([\s\t]+\**[A-Za-z_][A-Za-z0-9_]*)*   
  2463.         \((([\s\t]*[\*&]*[A-Za-z_][A-Za-z0-9_]*[\s\t]*)(,([\s\t]*
  2464.         [\*&]*[A-Za-z_][A-Za-z0-9_]*[\s\t]*))*)*\)([\s\t]*
  2465.         (\/\*.*\*\/)[\s\t]*)*$/
  2466.  
  2467.  
  2468.         QTAwk                       - 3-12 -                        QTAwk
  2469.  
  2470.  
  2471.  
  2472.  
  2473.  
  2474.  
  2475.         Section 3.10                                  Regular Expressions
  2476.  
  2477.  
  2478.          will  find  function  definitions  in  C   language   programs. 
  2479.         Constructing  and  analyzing  this regular expression as a single
  2480.         entity, is difficult. 
  2481.         
  2482.          Breaking such regular expressions into smaller units, which  are
  2483.         shorter  and  simpler,  makes  the  task  much easier.  QTAwk has
  2484.         introduced the concept of "named expressions" for this  purpose. 
  2485.         Named  expressions  are  QTAwk variable names enclosed in braces,
  2486.         '{' '}'.  In translating the  regular  expression  into  internal
  2487.         form  QTAwk,  scans  the regular expression for named expressions
  2488.         and substitutes the current value of the variable  named.   If  a
  2489.         variable does not exist by the name specified, no substitution is
  2490.         made. 
  2491.         
  2492.          By defining a variable:
  2493.         
  2494.                               fst = "first words";                       
  2495.         
  2496.          Then the following regular expression:
  2497.         
  2498.                             /The {fst} of the child/                     
  2499.         
  2500.          would expand into:
  2501.         
  2502.                          /The first words of the child/                  
  2503.         
  2504.          Named expressions allow  for  building  up  regular  expressions
  2505.         from  smaller  more easily understood regular expressions and for
  2506.         re-using the smaller regular expressions.  The following  example
  2507.         QTAwk   utility   builds  the  previous  regular  expression  for
  2508.         recognizing C language function definitions  (all  on  one  line)
  2509.         from  many smaller regular expressions.  Each constituent regular
  2510.         expression is  built  to  recognize  a  particular  part  of  the
  2511.         function  definition.   When  combined  into  the  final  regular
  2512.         expression, the three parts  of  the  definition  can  be  easily
  2513.         understood.   The  final  regular  expression  is expanded in the
  2514.         final print statement.  It spans several 80 character  lines  and
  2515.         is  much  more  difficult  to  understand  due  to its length and
  2516.         complexity. 
  2517.         
  2518.         Example:
  2519.         BEGIN {
  2520.         # define variables for use in regular expressions:
  2521.         # Define C name expression
  2522.              c_n = /[A-Za-z_][A-Za-z0-9_]*/;
  2523.         # Define C comment expression
  2524.  
  2525.  
  2526.         QTAwk                       - 3-13 -                        QTAwk
  2527.  
  2528.  
  2529.  
  2530.  
  2531.  
  2532.  
  2533.         Section 3.10                                  Regular Expressions
  2534.  
  2535.  
  2536.         # Note: Does NOT allow comment to span lines
  2537.              c_c = /(\/\*.*\*\/)/;
  2538.         # Define single line comment
  2539.              c_slc = /([\s\t]*{c_c}[\s\t]*)*/;
  2540.         # Define C name with pointer
  2541.              c_np = /\**{c_n}/;
  2542.         # Define C name with pointer or address
  2543.              c_ni = /[\*&]*{c_n}/;
  2544.         # Define C function type and name declaration
  2545.              c_fname = /{c_n}([\s\t]+{c_np})*/;
  2546.         # Define expression for first argument in function list
  2547.              c_first_arg = /([\s\t]*{c_ni})/;
  2548.         # Define expression  for  remaining  argument  in  function  list
  2549.              c_rem_arg = /([\s\t]*,{c_first_arg})*/;
  2550.         # Define C function argument list
  2551.              c_arg_list = /\(({c_first_arg}{c_rem_arg})*\)/;
  2552.         #
  2553.         # Expression to find all C function definitions
  2554.              totl_name = /^{c_fname}{c_arg_list}{c_slc}$/;
  2555.         #
  2556.         # print total expression to illustrate expansion of named
  2557.         # expressions
  2558.         # Refer to the description of the 'replace' function
  2559.         #
  2560.              print replace(totl_name);
  2561.         }
  2562.         
  2563.          The string output by this utility is:
  2564.         
  2565.            ^[A-Za-z_][A-Za-z0-9_]*([\s\t]+\**[A-Za-z_][A-Za-z0-9_]*)*    
  2566.         \((([\s\t]*[\*&]*[A-Za-z_][A-Za-z0-9_]*[\s\t]*)(,([\s\t]*
  2567.         [\*&]*[A-Za-z_][A-Za-z0-9_]*[\s\t]*))*)*\)([\s\t]*
  2568.         (\/\*.*\*\/)[\s\t]*)*$
  2569.         
  2570.          Note  that  in  printing the regular expression, the leading and
  2571.         trailing slash, '/', were not printed. 
  2572.         3.11 Predefined Names
  2573.         
  2574.          In translating  regular  expressions,  names  starting  with  an
  2575.         underscore  and  followed  by a single upper or lower case letter
  2576.         are reserved as predefined.  The following predefined  names  are
  2577.         currently available for use in named expressions:
  2578.         
  2579.               Alphabetic                                                 
  2580.         {_a}  ==  [A-Za-z]                                               
  2581.               Brackets                                                   
  2582.  
  2583.  
  2584.         QTAwk                       - 3-14 -                        QTAwk
  2585.  
  2586.  
  2587.  
  2588.  
  2589.  
  2590.  
  2591.         Section 3.11                                  Regular Expressions
  2592.  
  2593.  
  2594.         {_b}  ==  [{}()[]<>]                                             
  2595.               Control Character                                          
  2596.         {_c}  ==  [\x001-\x01f\x07f]                                     
  2597.               Decimal Digit                                              
  2598.         {_d}  ==  [0-9]                                                  
  2599.               Exponent                                                   
  2600.         {_e}  ==  [DdEe][-+]?{_d}{1,3}                                   
  2601.               Floating point number                                      
  2602.         {_f}  ==  [-+]?({_d}+\.{_d}*|{_d}*\.{_d}+)                       
  2603.               Floating, optional exponent                                
  2604.         {_g}  ==  {_f}({_e})?                                            
  2605.               Hexadecimal digit                                          
  2606.         {_h}  ==  [0-9A-Fa-f]                                            
  2607.               decimal Integer                                            
  2608.         {_i}  ==  [-+]?{_d}+                                             
  2609.               alpha-Numeric                                              
  2610.         {_n}  ==  [A-Za-z0-9]                                            
  2611.               Octal digit                                                
  2612.         {_o}  ==  [0-7]                                                  
  2613.               Punctuation                                                
  2614.         {_p}  ==  [\!-/:-@[-                                             
  2615.               double or single Quote                                     
  2616.         {_q}  ==  {_s}["'                                                
  2617.               Real number                                                
  2618.         {_r}  ==  {_f}{_e}                                               
  2619.               zero or even number of Slashes                             
  2620.         {_s}  ==  (^|[!\\](\\\\)*)                                       
  2621.               printable character                                        
  2622.         {_t}  ==  [\s-~]                                                 
  2623.               graphical character                                        
  2624.         {_u}  ==  [\x01f-~]                                              
  2625.               White space                                                
  2626.         {_w}  ==  [\s\t]                                                 
  2627.               space, \t, \n, \v, \f, \r, \s                              
  2628.         {_z}  ==  [\t-\r\s]                                              
  2629.         
  2630.          The  above  predefined  names  will  take  precedence  over  any
  2631.         variables with identical names in replacing named expressions  in
  2632.         regular expressions and the 'replace' function. 
  2633.         
  2634.         3.12 Tagged Strings
  2635.         
  2636.          QTAwk recognizes and searches for regular expressions containing
  2637.         parenthesized regular expressions.  QTAwk makes  special  use  of
  2638.         the  strings  which  match  regular  expressions contained within
  2639.         parenthesis.  The strings  matching  regular  expressions  within
  2640.  
  2641.  
  2642.         QTAwk                       - 3-15 -                        QTAwk
  2643.  
  2644.  
  2645.  
  2646.  
  2647.  
  2648.  
  2649.         Section 3.12                                  Regular Expressions
  2650.  
  2651.  
  2652.         parenthesis are called Tagged Strings and the QTAwk Tag Operator,
  2653.         '$$', is used to refer to tagged strings.  The  use  of  the  tag
  2654.         operator  to refer to tagged strings is explained in Section 5 on
  2655.         QTAwk expressions.  The discussion here will explain  how  tagged
  2656.         strings  are  counted.   It  is important to understand how QTAwk
  2657.         counts tagged strings to use the tag operator. 
  2658.         
  2659.          A pair of numbers, ln.cn, are be  used  to  label  parenthesized
  2660.         regular  expressions  according to the nesting level, ln, and the
  2661.         count, cn, at a given level.  There is no  theoretical  limit  on
  2662.         the  number  of parenthesized regular expressions or the level to
  2663.         which the  parenthesized  regular  expressions  may  be  nested. 
  2664.         However,  while  matching  a regular expression, QTAwk only keeps
  2665.         track of tagged strings to a nesting level of 7, 1 ≤ ln ≤ 7,  and
  2666.         a  maximum  count  of 31, 1 ≤ cn ≤ 31, for each level.  QTAwk can
  2667.         utilize regular expressions with parenthesis nested deeper than 7
  2668.         and  a  count greater than 31 at each level, but for use with the
  2669.         tag operator, these limits apply. 
  2670.         
  2671.          The following examples illustrate the method for counting tagged
  2672.         strings.   Tagged strings are identified with a pair of integers:
  2673.         'i' for the nesting level and  'j'  for  the  count  at  a  given
  2674.         level.   Tagged  strings are counted according to the parenthesis
  2675.         set in the regular expression.  Thus,  the  examples  below  show
  2676.         parenthesis  nesting level and count using the regular expression
  2677.         and not the strings matching the regular expressions. 
  2678.         
  2679.          For the regular expression:
  2680.         
  2681.         /[Tt]he matching ((string|digit)s (can|will))/
  2682.         
  2683.         1.  ((string|digit)s (can|will))
  2684.             i.j == 1.01
  2685.             Nesting Level 1,  First  regular  expression  at  this  level
  2686.         2.  (string|digit)
  2687.             i.j == 2.01
  2688.             Nesting  Level  2,  First  regular  expression  at this level
  2689.         3.  (can|will)
  2690.             i.j == 2.02
  2691.             Nesting Level 2, Second  regular  expression  at  this  level
  2692.         
  2693.          Using  the  same  regular  expression,  but  omitting one set of
  2694.         parenthesis, we have:
  2695.         
  2696.         /[Tt]he matching (string|digit)s (can|will)/
  2697.         
  2698.  
  2699.  
  2700.         QTAwk                       - 3-16 -                        QTAwk
  2701.  
  2702.  
  2703.  
  2704.  
  2705.  
  2706.  
  2707.         Section 3.12                                  Regular Expressions
  2708.  
  2709.  
  2710.         1.  (string|digit)
  2711.             i.j == 1.01
  2712.             Nesting Level 1,  First  regular  expression  at  this  level
  2713.         2.  (string|digit)
  2714.             i.j == 1.02
  2715.             Nesting  Level  1,  Second  regular  expression at this level
  2716.         
  2717.          Care must be used in determining parenthesis  level  and  counts
  2718.         for  regular expressions containing variable names, predefined or
  2719.         user defined.  For example, the regular expression:
  2720.         
  2721.         /({_g}|{_i}) (--> ([rfi]))/
  2722.         
  2723.          matches  floating  point  numbers  with  optional  exponents  or
  2724.         integers followed by
  2725.         
  2726.         "--> r" or
  2727.         "--> f" or
  2728.         "--> i"
  2729.         
  2730.          When  the  predefined names are expanded, the regular expression
  2731.         is: (Note: The original regular expression has been split  across
  2732.         three  lines  since  it  is  too  long to print on a single line)
  2733.         
  2734.                                                                          
  2735.         |[-+]?[0-9]+)
  2736.         (--> ([rfi]))/
  2737.         
  2738.          The parenthesis set at level 1,  count  1  contains  the  string
  2739.         matching  the  floating point number or integer.  The parenthesis
  2740.         set at level 2, count 1 contains the string matching the mantissa
  2741.         of  the  floating  point number.  The parenthesis set at level 2,
  2742.         count 2 contains the string matching the optional exponent of the
  2743.         floating  point  number  (whether  the exponent is present in the
  2744.         matching string or not.  The parenthesis set "(-->  ([rfi]))"  is
  2745.         at  level  1,  count 2 and "([rfi])" is at level 2, count 3.  The
  2746.         various levels and counts are listed below:
  2747.         
  2748.         1.  ({_g}|{_i})
  2749.             i.j == 1.01, level 1, count 01
  2750.         2.  ({_d}+\.{_d}*|{_d}*\.{_d}+)
  2751.             i.j == 2.01, level 2, count 01 ---> mantissa portion of  {_g}
  2752.             expanded
  2753.         3.  ([DdEe][-+]?{_d}{1,3})
  2754.             i.j  == 2.02, level 2, count 02 ---> exponent portion of {_g}
  2755.             expanded
  2756.  
  2757.  
  2758.         QTAwk                       - 3-17 -                        QTAwk
  2759.  
  2760.  
  2761.  
  2762.  
  2763.  
  2764.  
  2765.         Section 3.12                                  Regular Expressions
  2766.  
  2767.  
  2768.         4.  {_d}{1,3} == [0-9]([0-9])?([0-9])?
  2769.             i.j == 3.01 && 3.02, level 3, count 01 and 02
  2770.         5.  (--> ([rfi]))
  2771.             i.j == 1.02, level 1, count 02
  2772.         6.  ([rfi])
  2773.             i.j == 2.03, level 2, count 03
  2774.         
  2775.          Thus, when named expressions, predefined or  user  defined,  are
  2776.         included  in  regular  expressions, care must be taken to account
  2777.         for any parenthesis set contained within the named variable  when
  2778.         determining  parenthesis set level and count for use with the tag
  2779.         operator. 
  2780.         
  2781.  
  2782.  
  2783.  
  2784.  
  2785.  
  2786.  
  2787.  
  2788.  
  2789.  
  2790.  
  2791.  
  2792.  
  2793.  
  2794.  
  2795.  
  2796.  
  2797.  
  2798.  
  2799.  
  2800.  
  2801.  
  2802.  
  2803.  
  2804.  
  2805.  
  2806.  
  2807.  
  2808.  
  2809.  
  2810.  
  2811.  
  2812.  
  2813.  
  2814.  
  2815.  
  2816.         QTAwk                       - 3-18 -                        QTAwk
  2817.  
  2818.  
  2819.  
  2820.  
  2821.  
  2822.  
  2823.         Section 3.13                                  Regular Expressions
  2824.  
  2825.  
  2826.         3.13 Regular Expression Operator Summary
  2827.         
  2828.          The QTAwk regular expression  operators  are  summarized  below:
  2829.         
  2830.         ^  matches  Beginning  of  Line  as  first  character  of regular
  2831.             expression
  2832.         $ matches End of Line as last  character  of  regular  expression
  2833.         \c  matches  following:  (hexadecimal value shown in parenthesis)
  2834.             
  2835.             \a   == bell (alert)           ( \x07 )                      
  2836.             \b   == backspace              ( \x08 )                      
  2837.             \f   == formfeed               ( \x0c )                      
  2838.             \n   == newline                ( \x0a )                      
  2839.             \r   == carriage return        ( \x0d )                      
  2840.             \s   == space (blank)          ( \x20 )                      
  2841.             \t   == horizontal tab         ( \x09 )                      
  2842.             \v   == vertical tab           ( \x0b )                      
  2843.             \c   == c [ \\ == \ ]                                        
  2844.             \ooo == character represented by octal value ooo             
  2845.                     1 to 3 octal digits acceptable                       
  2846.             \xhhh== character represented by hexadecimal value hhh       
  2847.                     1 to 3 hexadecimal digits acceptable                 
  2848.             
  2849.         .  matches any character except newline, '\n'
  2850.         [abc0-9] Character Class - match any character in class
  2851.         [^abc0-9] Negated Character Class - match any  character  not  in
  2852.             class
  2853.         [!abc0-9]  Negated  Character  Class - match any character not in
  2854.             class
  2855.         [#abc0-9] Matched Character  Class  -  for  second  match,  class
  2856.             character must match in corresponding position
  2857.         * - Closure, Zero or more matches
  2858.         + - Positive Closure, One or More matches
  2859.         ? - Zero or One matches
  2860.         r(s)t  embedded  regular  expression  s.   String matching s is a
  2861.             "Tagged String"
  2862.         r|s|t, '|' == logical 'or' operator.  Regular expression r  or  s
  2863.             or t
  2864.         @  -  Look-Ahead, r@t, matches regular expression 'r' only when r
  2865.             is followed by regular expression  't'.Regular  expression  t
  2866.             not  contained  in  final match string.  Symbol loses special
  2867.             meaning when contained within parenthesis, '()', or character
  2868.             class, '[]'. 
  2869.         r{n1,n2}  -  at least n1 and up to n2 repetitions of {re} r.  n1,
  2870.             n2 integers with 1 ≤ n1 ≤ n2
  2871.             c{2,6} ==> ccc?c?c?c?
  2872.  
  2873.  
  2874.         QTAwk                       - 3-19 -                        QTAwk
  2875.  
  2876.  
  2877.  
  2878.  
  2879.  
  2880.  
  2881.         Section 3.13                                  Regular Expressions
  2882.  
  2883.  
  2884.             c{3,3} ==> ccc
  2885.             {Re}s grouped by ", (), [], or names, "{name}"  are  repeated
  2886.                 as  a  group.  {Re}s grouped by " or names, "{name}", are
  2887.                 enclosed within  parenthesis  when  repeated:  (Note  the
  2888.                 treatment of quoted {ex}s)
  2889.             (r){2,6} ==> (r)(r)(r)?(r)?(r)?(r)?
  2890.             [r]{2,6} ==> [r][r][r]?[r]?[r]?[r]?
  2891.             {r}{2,6} ==> {r}{r}({r})?({r})?({r})?({r})?
  2892.             "r"{2,6} ==> "rr(r)?(r)?(r)?(r)?"
  2893.             
  2894.         {named_expr}   -   named   expression.   In  regular  expressions
  2895.             "{name}" is replaced by the string value of the corresponding
  2896.             variable.   Unrecognized  variable  names  are not replaced. 
  2897.  
  2898.  
  2899.  
  2900.  
  2901.  
  2902.  
  2903.  
  2904.  
  2905.  
  2906.  
  2907.  
  2908.  
  2909.  
  2910.  
  2911.  
  2912.  
  2913.  
  2914.  
  2915.  
  2916.  
  2917.  
  2918.  
  2919.  
  2920.  
  2921.  
  2922.  
  2923.  
  2924.  
  2925.  
  2926.  
  2927.  
  2928.  
  2929.  
  2930.  
  2931.  
  2932.         QTAwk                       - 3-20 -                        QTAwk
  2933.  
  2934.  
  2935.  
  2936.  
  2937.  
  2938.  
  2939.         Section 4.0                                             Variables
  2940.  
  2941.  
  2942.         4.0 Variables
  2943.         
  2944.          Variables in QTAwk are of four kinds:
  2945.         1.  user defined
  2946.         2.  built-in
  2947.         3.  field
  2948.         4.  tag
  2949.         
  2950.          The names of user defined variables start with an upper or lower
  2951.         case  character  or underscore optionally followed by one or more
  2952.         upper or lower case  characters,  digits  or  underscores.   Most
  2953.         QTAwk  built-in  variables  are named with upper case letters and
  2954.         underscores (only three are defined with lower case characters). 
  2955.         
  2956.          Variables  are  defined by using them in expressions.  Variables
  2957.         have numeric, character, string or regular expression  values  or
  2958.         all  four  depending  upon  the context in which they are used in
  2959.         expressions or function calls. 
  2960.         
  2961.          Except for variables defined with the 'local' keyword or used as
  2962.         function  parameters, all variables are global in scope.  That is
  2963.         they are accessible and can be changed anywhere  within  a  QTAwk
  2964.         utility.   Local variables will be discussed in Section 10, where
  2965.         the 'local' keyword is discussed.  Function parameters  for  user
  2966.         defined functions will be discussed in Section 12. 
  2967.         
  2968.          All  variables are initialized with a zero (0) numeric value and
  2969.         the null string value when created by reference.   The  value  of
  2970.         the  variable  is  changed  with  the assignment operator, '=' or
  2971.         'op='. 
  2972.         
  2973.         var1 = 45.87;
  2974.         
  2975.         var2 = "string value";
  2976.         
  2977.         var3 = /[\s\t]+[A-Za-z_][A-Za-z0-9_]+/;
  2978.         
  2979.          var1  has  a  numeric  value  of  45.87  from   the   assignment
  2980.         statement.   It  has  a  string value of "45.87" and a value as a
  2981.         regular  expression  of  /45\.87/.   The   string   and   regular
  2982.         expression values of var1 may be changed by changing the value of
  2983.         the built-in variable "CONVFMT".  The string value of CONVFMT  is
  2984.         used  to  convert  floating  point  numeric  values to string and
  2985.         regular expression values.  CONVFMT is initialized with  a  value
  2986.         of  "%.6g" and can be changed with an assignment statement.  Such
  2987.         changes would then  affect  the  string  and  regular  expression
  2988.  
  2989.  
  2990.         QTAwk                        - 4-1 -                        QTAwk
  2991.  
  2992.  
  2993.  
  2994.  
  2995.  
  2996.  
  2997.         Section 4.0                                             Variables
  2998.  
  2999.  
  3000.         values  of  floating  point  numeric quantities.  For example, if
  3001.         CONVFMT is assigned a value of "%u", then the string and  regular
  3002.         expression   values   of   var1   would   become  "45"  and  /45/
  3003.         respectively. 
  3004.         
  3005.          The numeric value of both var2 and var3 is zero (0). 
  3006.         
  3007.          The string value of  var3  is  "[\s\t]+[A-Za-z_][A-Za-z0-9_]+". 
  3008.         Note  that  the  tab  escape  sequence,  '\t', is not expanded in
  3009.         converting the regular expression to a string.   The  reverse  is
  3010.         not true.  One difference between strings and regular expressions
  3011.         is the time at which escape sequences such as '\t' are translated
  3012.         to ASCII hexadecimal characters.  For strings, the translation is
  3013.         done when the strings are read from the QTAwk utility file.   For
  3014.         regular  expressions the escape sequences are translated when the
  3015.         regular expression is  converted  to  internal  form.   For  this
  3016.         reason,  strings used in the place of regular expressions undergo
  3017.         a double translation, first when read from the QTAwk utility file
  3018.         and  second  when  converted into the internal regular expression
  3019.         form.   The  second  translation  of  strings  used  for  regular
  3020.         expressions  is  the  reason  backslash  characters, '\', must be
  3021.         doubled for strings used in this manner.  Refer to Section 7  for
  3022.         a  more  complete  discusion of strings and regular expressions. 
  3023.  
  3024.  
  3025.  
  3026.  
  3027.  
  3028.  
  3029.  
  3030.  
  3031.  
  3032.  
  3033.  
  3034.  
  3035.  
  3036.  
  3037.  
  3038.  
  3039.  
  3040.  
  3041.  
  3042.  
  3043.  
  3044.  
  3045.  
  3046.  
  3047.  
  3048.         QTAwk                        - 4-2 -                        QTAwk
  3049.  
  3050.  
  3051.  
  3052.  
  3053.  
  3054.  
  3055.         Section 5.0                                    Built-in Variables
  3056.  
  3057.  
  3058.         5.0 Built-in Variables
  3059.         
  3060.          QTAwk offers the following built-in  variables.   The  variables
  3061.         may  be set by the user.  Those marked with an asterisk, '*', are
  3062.         new to QTAwk.  Those marked with a plus sign, '+',  have  new  or
  3063.         expanded meaning in QTAwk. 
  3064.         
  3065.         1.  * _arg_chk  ==>  TRUE/FALSE.  Default value = 0.  If assigned
  3066.             a FALSE value, the number  of  arguments  passed  to  a  user
  3067.             defined function is checked only to ensure that the number is
  3068.             not more than defined.  Arguments defined, but not passed are
  3069.             initialized and passed for use as local variables as in Awk. 
  3070.             If assigned a true value, the number of arguments passed to a
  3071.             user  defined  function is checked against the number defined
  3072.             for the function, unless the  function  was  defined  with  a
  3073.             variable  number  of  arguments.  If the number passed is not
  3074.             exactly equal to the number  defined,  an  error  message  is
  3075.             issued  and  execution  halted.   For  this  case,  any local
  3076.             variables must be defined with the 'local' keyword. 
  3077.             
  3078.         2.  ARGC ==> set equal to  the  number  of  arguments  passed  to
  3079.             QTAwk as in Awk. 
  3080.             
  3081.         3.  * ARGI  ==>  equal  to  the  index  value in ARGV of the next
  3082.             command line argument to be processed.   This  value  may  be
  3083.             changed  and  will change the array element of ARGV processed
  3084.             next.  When the last element of ARGV  is  the  current  input
  3085.             file, ARGI is set to one of two integer values:
  3086.             
  3087.             a)  the  integer  value  of  the index of the last element of
  3088.                 ARGV plus one, or
  3089.             b)  if the last element of ARGV has a string index,  ARGI  is
  3090.                 set to zero. 
  3091.             
  3092.              Setting  ARGI to zero, ARGC or a value for which there is no
  3093.             element of ARGV with a corresponding index value, will  cause
  3094.             the  current  input file to be the last command line argument
  3095.             processed. 
  3096.             
  3097.         4.  ARGV ==> one-dimensional array with  elements  equal  to  the
  3098.             arguments  passed  to  QTAwk as in Awk.  The index values are
  3099.             integers ranging in value from  zero  to  ARGC.   ARGV[0]  ==
  3100.             filename  by  which  QTAwk  was  invoked, including full path
  3101.             information. 
  3102.             
  3103.         5.  * CLENGTH ==> length of string matched  in  'case'  statement
  3104.  
  3105.  
  3106.         QTAwk                        - 5-1 -                        QTAwk
  3107.  
  3108.  
  3109.  
  3110.  
  3111.  
  3112.  
  3113.         Section 5.0                                    Built-in Variables
  3114.  
  3115.  
  3116.         6.  * CSTART  ==>  start  of  string  matched in 'case' statement
  3117.             
  3118.         7.  CONVFMT ==>  STRING  conversion  format  for  floating  point
  3119.             numbers.  Default value of "%.6g". 
  3120.             
  3121.         8.  * CYCLE_COUNT  ==>  value  for  the current cycle through the
  3122.             outer pattern match  loop  for  the  current  record.   Value
  3123.             incremented by the 'cycle' statement. 
  3124.             
  3125.         9.  * DEGREES  ==> TRUE/FALSE.  Default value = 0.  If assigned a
  3126.             false value, trigonometric functions assume radian values are
  3127.             passed  and  return radian values.  If assigned a TRUE value,
  3128.             trigonometric functions assume degree values are  passed  and
  3129.             return degree values. 
  3130.             
  3131.         10.  * DELAY_INPUT_PARSE  ==>  TRUE/FALSE.   Default  value = 0. 
  3132.             Used to delay parsing of the current input record  until  the
  3133.             value of NF or one of the field variables, $i, 1 ≤ i ≤ NF, is
  3134.             needed.  The default value is false.  If the value  is  true,
  3135.             then  the  input  record  is not parsed until necessary.  For
  3136.             utilities which do not reference NF or the  field  variables,
  3137.             $i,  in  any patterns expressions (or seldom executed pattern
  3138.             expressions), delaying the parsing of the  input  record  can
  3139.             speed the execution of the utility significantly.  The normal
  3140.             sequence of execution is:
  3141.             a)  determine next record according to RS  and  read  record,
  3142.             b)  set FNR and NR,
  3143.             c)  parse  record  according to FS and set NF and $i, 1 ≤ i ≤
  3144.                 NF,
  3145.             d)  start executing pattern expressions
  3146.             
  3147.              The third step in the above sequence can be delayed until  a
  3148.             field  variable value or NF is needed by DELAY_INPUT_PARSE to
  3149.             a true value. 
  3150.             
  3151.         11.  * ECHO_INPUT  ==>  TRUE/FALSE.   Default  value  =  0.    If
  3152.             assigned  a  true value, when reading from the keyboard file,
  3153.             the input is echoed to the standard output file, normally the
  3154.             console display. 
  3155.             
  3156.              When the standard input file is the keyboard, any characters
  3157.             read are always echoed to the console display.  In  addition,
  3158.             if  ECHO_INPUT  is  true,  then  any characters read are also
  3159.             echoed to the standard output file. 
  3160.             
  3161.              When the standard input file is redirected from  a  file  or
  3162.  
  3163.  
  3164.         QTAwk                        - 5-2 -                        QTAwk
  3165.  
  3166.  
  3167.  
  3168.  
  3169.  
  3170.  
  3171.         Section 5.0                                    Built-in Variables
  3172.  
  3173.  
  3174.             piped  from  the output of another application program, it is
  3175.             convenient to set ECHO_INPUT to  a  false  value  to  prevent
  3176.             echoing  each  input  character to the standard output file. 
  3177.             
  3178.              For input read from  the  keyboard  file  with  the  "fgetc"
  3179.             function, ECHO_INPUT should be set to a true value to display
  3180.             key values as they are pressed. 
  3181.             
  3182.              The following table shows the effect of ECHO_INPUT on  input
  3183.             from the standard input file:
  3184.             
  3185.             ECHO_INPUT  stdin from  stdin from  redirected  redirected   
  3186.             value       keyboard    keyboard    stdin       stdin        
  3187.                         to display  to stdout   to display  to stdout    
  3188.             
  3189.             true        yes         yes         no          yes          
  3190.             
  3191.             false       yes         no          no          no           
  3192.             
  3193.              For   more  information  on  the  "keyboard"  and  "standard
  3194.             input" files, refer to Section 11. 
  3195.             
  3196.         12.  ENVIRON ==> one-dimensional array  with  elements  equal  to
  3197.             the  environment  strings  passed to QTAwk.  The index values
  3198.             are integers ranging in value from  zero  to  the  number  of
  3199.             environment strings defined less one. 
  3200.             
  3201.         13.  * FALSE  ==>  predefined  with  zero,  0,  constant  value. 
  3202.             
  3203.         14.  * FIELDFILL ==> used to fill a field  when  the  replacement
  3204.             value is less than the field width or if the field changed is
  3205.             greater than the number of fields in the original record.  If
  3206.             the  field  changed  is  greater  than  the  number of fields
  3207.             defined  in  FIELDWIDTHS,  the  extra  fields   created   are
  3208.             initialized  as  null strings separated by the strng value of
  3209.             OFS.  This variable value is used only when  field  splitting
  3210.             is based on FIELDWIDTHS rather than FS.  The default value is
  3211.             a single blank character. 
  3212.             
  3213.         15.  * FIELDWIDTHS ==> when assigned a  string  value  containing
  3214.             space separated integral numbers of the form:
  3215.             
  3216.              n1 n2 n3 ...  nn
  3217.             
  3218.              the  splitting  of  input records into fields is governed by
  3219.             the numbers in FIELDWIDTHS rather than FS.   Each  number  in
  3220.  
  3221.  
  3222.         QTAwk                        - 5-3 -                        QTAwk
  3223.  
  3224.  
  3225.  
  3226.  
  3227.  
  3228.  
  3229.         Section 5.0                                    Built-in Variables
  3230.  
  3231.  
  3232.             FIELDWIDTHS  specifies the width of a field including columns
  3233.             between fields.  If you want to ignore  the  columns  between
  3234.             fields, you can specify the width as a separate field that is
  3235.             subsequently ignored.  When the value  FIELDWIDTHS  does  not
  3236.             match  this  form,  field  splitting  is done using FS in the
  3237.             usual manner.  If the length of the input record  is  greater
  3238.             than  the  sum  of the field widths specified in FIELDWIDTHS,
  3239.             QTAwk creates an additional field and assigns  the  remainder
  3240.             of the input record to the field. 
  3241.             
  3242.         16.  * FILEATTR  ==> contains the attributes of the current input
  3243.             file in a string.  The string defines the attributes  in  the
  3244.             same  manner  as  the  variable  for  the 'findfile' function
  3245.             defines the attributes for the files found by that function. 
  3246.             Changing  the  value  of  this  variable has no effect on the
  3247.             attributes of the current input file. 
  3248.             
  3249.         17.  * FILEDATE ==> contains the date of the current  input  file
  3250.             in the operating system format.  The 'sdate' functions may be
  3251.             used to format the date.  Changing the value of this variable
  3252.             has no effect on the date of the current input file. 
  3253.             
  3254.         18.  * FILEDATE_CREATE  ==>  contains  the  creation  date of the
  3255.             current input file  in  the  operating  system  format.   The
  3256.             'sdate'  functions  may be used to format the date.  Changing
  3257.             the value of this variable has no effect on the creation date
  3258.             of  the current input file.  On PC/MS-DOS systems, this value
  3259.             of this variable equals the value of FILEDATE. 
  3260.             
  3261.         19.  * FILEDATE_LACCESS ==> contains the last  file  access  date
  3262.             of  the  current  input file in the operating system format. 
  3263.             The 'sdate' functions  may  be  used  to  format  the  date. 
  3264.             Changing the value of this variable has no effect on the last
  3265.             access date of the current input file.  On PC/MS-DOS systems,
  3266.             this  value  of  this variable equals the value of FILEDATE. 
  3267.             
  3268.         20.  + FILENAME ==> equal to the string value  of  current  input
  3269.             file,  NOT  including  any path specified.  If assigned a new
  3270.             value, the file with a name equal to the new string value  is
  3271.             opened  (or  an  error  message  displayed if the filename is
  3272.             illegal).  The new file becomes the current input file.   The
  3273.             former  input  file is not closed and input may continue from
  3274.             the current position by re-assigning  FILENAME,  putting  the
  3275.             name  in  ARGV  for  future  use  or read with the 'fgetline'
  3276.             function. 
  3277.             
  3278.  
  3279.  
  3280.         QTAwk                        - 5-4 -                        QTAwk
  3281.  
  3282.  
  3283.  
  3284.  
  3285.  
  3286.  
  3287.         Section 5.0                                    Built-in Variables
  3288.  
  3289.  
  3290.              If assigned a new string value by the  user's  utility,  the
  3291.             full  drive  and  path must be specified if necessary to find
  3292.             the file.  QTAwk will strip off the drive and path and assign
  3293.             the  filename  to  the  "FILENAME"  variable.   The following
  3294.             statements will  save  the  current  filepath  and  name  and
  3295.             re-assign latter:
  3296.             
  3297.             # Save Current File Name
  3298.             fpn_hold = FILEPATH ∩ FILENAME;
  3299.             . 
  3300.             . 
  3301.             . 
  3302.             # Revert To Processing Original Input File
  3303.             FILENAME = fpn_hold;
  3304.             
  3305.         21.  * FILEPATH  ==>  contains  the drive and path of the current
  3306.             input file.  The  path  string  ends  with  the  subdirectory
  3307.             separator character.  Changing the value of this variable has
  3308.             no effect on the path of the current input file. 
  3309.             
  3310.         22.  * FILE_SEARCH ==> true/false values.  Default  value  =  0. 
  3311.             Value  determines  whether  next  input  record read from the
  3312.             current input file is the next physical record  or  the  next
  3313.             record(s) matching a pattern in FILE_SEARCH_PAT.  If assigned
  3314.             a false value, then the next physical  record  is  read.   If
  3315.             assigned  a  true  value,  then the next record(s) matching a
  3316.             pattern in FILE_SEARCH_PAT is read.  Multiple records may  be
  3317.             read  if  SPAN_RECORDS  is true and the match spans more than
  3318.             one record.  See the end of Section 8  for  a  more  complete
  3319.             explanation of searching the input file for the next record. 
  3320.             
  3321.         23.  * FILE_SEARCH_PAT ==> assigned by the user to  the  patterns
  3322.             to  match in the current input file if FILE_SEARCH contains a
  3323.             true value.  If FILE_SEARCH_PAT is an array, then  all  array
  3324.             elements are scanned for matches and the MATCH_INDEX built-in
  3325.             variable set accordingly.  See the end of  Section  8  for  a
  3326.             more complete explanation of searching the input file for the
  3327.             next record. 
  3328.             
  3329.         24.  * FILESIZE ==> contains the size in  bytes  of  the  current
  3330.             input  file.   Changing  the  value  of  this variable has no
  3331.             effect on the size of the current input file. 
  3332.             
  3333.         25.  * FILE_SORT ==> String value of this  variable  defines  the
  3334.             sort   order   for  the  array  returned  by  the  'findfile'
  3335.             function.  The default value is the null  string,  i.e.,  the
  3336.  
  3337.  
  3338.         QTAwk                        - 5-5 -                        QTAwk
  3339.  
  3340.  
  3341.  
  3342.  
  3343.  
  3344.  
  3345.         Section 5.0                                    Built-in Variables
  3346.  
  3347.  
  3348.             array  contains  files in the order returned by the operating
  3349.             system. 
  3350.             
  3351.              Valid character values for sorting in the string are:
  3352.             
  3353.             'n' or 'N' -- sort by file name
  3354.             'e' or 'E' -- sort by file extension
  3355.             'd' or 'D' -- sort by file date
  3356.             't' or 'T' -- sort by file time
  3357.             's' or 'S' -- sort by file size
  3358.             
  3359.              Any other character will be ignored. 
  3360.             
  3361.              If multiple sort options are specified, the  files  returned
  3362.             are sorted in the order of preference given. 
  3363.             
  3364.              For example:
  3365.             
  3366.             #  Will  Sort  By  Date,  Time, File Extension, File Name And
  3367.             Last By Size
  3368.             FILE_SORT = "dtens";
  3369.             
  3370.         26.  * FILETIME ==> contains the time of the current  input  file
  3371.             in  the  DOS  format.   The  'stime' functions may be used to
  3372.             format the time.  Changing the value of this variable has  no
  3373.             effect on the time of the current input file. 
  3374.             
  3375.         27.  * FILETIME_CREATE  ==>  contains  the  creation  time of the
  3376.             current input file in the DOS format.  The 'stime'  functions
  3377.             may  be  used to format the time.  Changing the value of this
  3378.             variable has no effect on the creation time  of  the  current
  3379.             input  file.  On PC/MS-DOS systems the value of this variable
  3380.             equals the value of FILETIME. 
  3381.             
  3382.         28.  * FILETIME_LACCESS ==> contains the last  file  access  time
  3383.             of  the  current  input  file in the DOS format.  The 'stime'
  3384.             functions may be used to format the time.  Changing the value
  3385.             of  this  variable  has no effect on the lastr access time of
  3386.             the current input file.  On PC/MS-DOS systems  the  value  of
  3387.             this variable equals the value of FILETIME. 
  3388.             
  3389.         29.  FNR  ==>  equal  to  current  record number of current input
  3390.             file.  If the current value of  $0  contains  more  than  one
  3391.             input record, then FNR contains the number of the last record
  3392.             in  $0.   See  the  definition  of  the  built-in   variables
  3393.             FILE_SEARCH,  FILE_SEARCH_PAT and SPAN_RECORDS and the end of
  3394.  
  3395.  
  3396.         QTAwk                        - 5-6 -                        QTAwk
  3397.  
  3398.  
  3399.  
  3400.  
  3401.  
  3402.  
  3403.         Section 5.0                                    Built-in Variables
  3404.  
  3405.  
  3406.             Section 8 for a more complete explanation  of  searching  the
  3407.             input  file  for  the next record and how $0 may contain more
  3408.             than one input record.  See also NR. 
  3409.             
  3410.         30.  FS  ==>  value  of  current  input  field   separator.    If
  3411.             FIELDWIDTHS  is not assigned a value as specified above, then
  3412.             the value of FS is  used  for  splitting  the  current  input
  3413.             record  into  fields.   The  default value for FS is /{_z}+/,
  3414.             i.e., any consecutive white space characters.  If FS  is  set
  3415.             on the command line or in the user utility then the following
  3416.             rules apply (see also RS below):
  3417.             a)  setting to a single blank, ' ' or " ", will set FS to the
  3418.                 default value of /{_z}+/,
  3419.             b)  setting  to  a  value  other  than  a  regular expression
  3420.                 constant, the equivalent string form will be derived  and
  3421.                 the  string  considered a regular expression.  The string
  3422.                 or regular expression will be converted  to  the  regular
  3423.                 expression  internal  form  when the assignment is made. 
  3424.                 Input records are  scanned  for  a  string  matching  the
  3425.                 regular  expression  and  matching  strings  become field
  3426.                 separators.  The length of matching strings  is  governed
  3427.                 by the LONGEST_EXPR built-in variable. 
  3428.             
  3429.         31.  * Gregorian  ==>  TRUE/FALSE.   Default == 1.  If assigned a
  3430.             true value, QTAwk assumes Gregorian Calendar in computing the
  3431.             Julian  Day  Number  in  the  "jdn"  function.   Also affects
  3432.             calendar used in converting jdn to calendar date by the "cal"
  3433.             function.   If  assigned  a  false  value,  QTAwk assumes the
  3434.             Julian Calendar. 
  3435.             
  3436.         32.  * IGNORECASE ==> TRUE/FALSE.  Default == 0.  If  assigned  a
  3437.             true value, QTAwk ignores case in any operation comparing two
  3438.             strings and for single character comparisons.   The  affected
  3439.             comparisons include:
  3440.             
  3441.             a)  any   match   against   regular   expressions  using  the
  3442.                 operators, '~~' and '!~', either explicit or implied,  in
  3443.                 pattern expressions,
  3444.             b)  any   match   against   regular   expressions  using  the
  3445.                 operators, '~~' and '!~', either explicit or implied,  in
  3446.                 action expressions,
  3447.             c)  any   match   against   regular   expressions  using  the
  3448.                 functions:  gsub(),  index(),  match(),  split(),  sub(),
  3449.                 strim, srch_record and fsrch_record. 
  3450.             d)  any search using the FILE_SEARCH_PAT variable,
  3451.             e)  any  matches of one string against another using the '=='
  3452.  
  3453.  
  3454.         QTAwk                        - 5-7 -                        QTAwk
  3455.  
  3456.  
  3457.  
  3458.  
  3459.  
  3460.  
  3461.         Section 5.0                                    Built-in Variables
  3462.  
  3463.  
  3464.                 and '!=' operators,
  3465.             f)  any match of one character against another using the '=='
  3466.                 and '!=' operators,
  3467.             g)  any  match  of  one  string  against  another  string  in
  3468.                 'switch'/'case' statements,
  3469.             h)  any match of one character against another  character  in
  3470.                 'switch'/'case' statements,
  3471.             i)  any match against a regular expression in 'switch'/'case'
  3472.                 statements,
  3473.             j)  all  searches  for  record  terminator  character/strings
  3474.                 using RS,
  3475.             k)  all searches for field terminator character/strings using
  3476.                 FS. 
  3477.             
  3478.         33.  * LONGEST_EXP ==> TRUE/FALSE.  Default == 1.  If assigned  a
  3479.             true  value, the longest string matching a regular expression
  3480.             is found in:
  3481.             a)  patterns
  3482.             b)  match operators, '~~' and '!~'
  3483.             c)  'match' function
  3484.             d)  'gsub' function
  3485.             e)  'sub' function
  3486.             f)  'strim' function
  3487.             g)  input record separator  strings  matching  RS  pattern(s)
  3488.             h)  input   record   field   separator  strings  matching  FS
  3489.                 pattern(s)
  3490.             i)  field separator matching in 'split' function
  3491.             
  3492.              If assigned a false value, then the  first  string  matching
  3493.             the regular expression is found. 
  3494.             
  3495.         34.  * MATCH_INDEX  ==>  set  to the string value of the index of
  3496.             the matching element when an array is used for matching.  Use
  3497.             string    value   of   SUBSEP   to   separate   indices   for
  3498.             multidimensioned arrays. 
  3499.             
  3500.         35.  * MAX_CYCLE ==> Maximum value for  CYCLE_COUNT  for  cycling
  3501.             through  outer pattern match loop with current input record. 
  3502.             Default value == 100. 
  3503.             
  3504.         36.  * MLENGTH ==> length of string matched in  match  operators,
  3505.             '~~' and '!~'
  3506.             
  3507.         37.  * MSTART  ==>  start  of  string matched in match operators,
  3508.             '~~' and '!~'
  3509.             
  3510.  
  3511.  
  3512.         QTAwk                        - 5-8 -                        QTAwk
  3513.  
  3514.  
  3515.  
  3516.  
  3517.  
  3518.  
  3519.         Section 5.0                                    Built-in Variables
  3520.  
  3521.  
  3522.         38.  + NF ==> equal to the number of fields in the current  input
  3523.             record.   The action of QTAwk when NF is changed reflects the
  3524.             intuitive effect of changing NF.  If the new value is greater
  3525.             than  the current value, the current input line is lengthened
  3526.             with new empty fields separated by the output field separator
  3527.             strings,  OFS.   If  the  new  value is less than the current
  3528.             value, the current input line is shortened by  truncating  at
  3529.             the  end  of  the  field  corresponding to the new NF value. 
  3530.             
  3531.         39.  * NG ==> set to the number of the GROUP expression  matching
  3532.             the current input record for GROUP patterns. 
  3533.             
  3534.         40.  NR  ==> total number of records read so far across all input
  3535.             files.  See also FNR. 
  3536.             
  3537.         41.  OFMT  ==>  output  conversion  format  for  floating   point
  3538.             numbers.  Default value of "%.6g". 
  3539.             
  3540.         42.  OFS  ==>  output field separator.  Default value of a single
  3541.             blank, '\b'. 
  3542.             
  3543.         43.  ORS ==> output record separator.  Default value of a  single
  3544.             newline character, '\n'. 
  3545.             
  3546.         44.  * RECLEN  ==> If assigned a non-zero numeric value, then the
  3547.             current input file is assumed  to  consist  of  fixed  length
  3548.             records with the record length equal to the integral value of
  3549.             RECLEN.  When RECLEN determines input records, RT is assigned
  3550.             the  null  string  whenever a record is read from the current
  3551.             input file. 
  3552.             
  3553.         45.  RLENGTH ==> length of string  matched  in  'match'  function
  3554.             
  3555.         46.  RSTART  ==>  start  of  string  matched  in 'match' function
  3556.             
  3557.         47.  * RETAIN_FS ==> TRUE/FALSE.  Default value = 0.   The  value
  3558.             of  this  variable  is  used  only if input record fields are
  3559.             determined by FS and not by  the  FIELDWIDTHS  variable.   If
  3560.             assigned  a  false  value,  and FS is used for field parsing,
  3561.             then OFS is used between fields to reconstruct $0 whenever  a
  3562.             field  value is altered.  If assigned a true value, and FS is
  3563.             used  for  field  parsing,  the  original   field   separator
  3564.             characters are retained in reconstructing $0 whenever a field
  3565.             value is altered. 
  3566.             
  3567.         48.  RS ==> input record separator.  The default value for RS  is
  3568.  
  3569.  
  3570.         QTAwk                        - 5-9 -                        QTAwk
  3571.  
  3572.  
  3573.  
  3574.  
  3575.  
  3576.  
  3577.         Section 5.0                                    Built-in Variables
  3578.  
  3579.  
  3580.             a  single  newline  character,  '\n'.   If  RS  is set on the
  3581.             command line or in the user utility then the following  rules
  3582.             apply (see also FS above):
  3583.             a)  setting  to  the  null  string,  "",  will  set RS to the
  3584.                 regular expression /\n\n/.  Thus, blank lines, i.e.,  two
  3585.                 consecutive  newline  characters,  bound  input records. 
  3586.             b)  setting to  a  value  other  than  a  regular  expression
  3587.                 constant,  the equivalent string form will be derived and
  3588.                 the string considered a regular expression.   The  string
  3589.                 or  regular  expression  will be converted to the regular
  3590.                 expression internal form when the  assignment  is  made. 
  3591.                 The  input  file character stream is scanned for a string
  3592.                 matching the  regular  expression  and  matching  strings
  3593.                 become record separators.  The length of matching strings
  3594.                 is  governed  by  the  LONGEST_EXPR  built-in  variable. 
  3595.             
  3596.         49.  * RT  ==> set equal to the record terminator string whenever
  3597.             a new record is read from the current input file.   If  fixed
  3598.             langth  records  are  used  by  setting  RECLEN,  then  RT is
  3599.             assigned the null string. 
  3600.             
  3601.         50.  * SPAN_RECORDS ==> true/false value.  Default  value  =  0. 
  3602.             Value determines whether or not matches to FILE_SEARCH_PAT or
  3603.             the search  pattern  in  'srchrecord'  or  'fsrchrecord'  are
  3604.             allowed  to span records.  If assigned a false value, matches
  3605.             must be contained in a single record.  See the end of Section
  3606.             8 for a more complete explanation of searching the input file
  3607.             for the next record. 
  3608.             
  3609.         51.  + SUBSEP ==> a default value of  a  comma  character,  ','. 
  3610.             The  value  of SUBSEP is used to separate the index values in
  3611.             MATCH_INDEX  when  a  multidimensional  array  is  used   for
  3612.             matching. 
  3613.             
  3614.         52.  * TRACE  ==> control statement tracing.  Default value = 0. 
  3615.             Determines whether statements are traced  during  execution. 
  3616.             
  3617.         53.  * TRANS_FROM   ==>  string  used  by  'stran'  function  for
  3618.             translating       from.        Default        value        is
  3619.             "ABCDEFGHIJKLMNOPQRSTUVWXYZ". 
  3620.             
  3621.         54.  * TRANS_TO   ==>   string   used  by  'stran'  function  for
  3622.             translating        to.         Default        value        is
  3623.             "abcdefghijklmnopqrstuvwxyz". 
  3624.             
  3625.         55.  * TRUE ==> predefined with one, 1, constant value. 
  3626.  
  3627.  
  3628.         QTAwk                       - 5-10 -                        QTAwk
  3629.  
  3630.  
  3631.  
  3632.  
  3633.  
  3634.  
  3635.         Section 5.0                                    Built-in Variables
  3636.  
  3637.  
  3638.         56.  * QTAwk_Path  ==>  defined at program initiation to value of
  3639.             the environment variable  "QTAWK".   Specifies  paths  to  be
  3640.             searched  for  input files.  Multiple paths may be specified,
  3641.             separated by semi-colons.  The paths specified  are  searched
  3642.             for  input  files  in the order specified.  If a drive and/or
  3643.             path is specified with the filename, then that drive and path
  3644.             only  are searched for the desired file.  If no drive or path
  3645.             is specified with the filename, then the current directory is
  3646.             searched  and  then  the  paths specified in QTAwk_Path.  The
  3647.             search sequence for files follows the the order:
  3648.             
  3649.             a)  If a directory and/or path name name is specified with  a
  3650.                 file, then that path only is searched. 
  3651.                 
  3652.             b)  If  no  directory  or  path  name  is specified, then the
  3653.                 current directory is searched.  If the file is not found,
  3654.                 then  all  paths specified in QTAwk_Path are searched for
  3655.                 the file in the order specified.  Multiple paths  may  be
  3656.                 specified,  separated  by a semi-colon.  This follows the
  3657.                 same convention for  specifying  multiple  paths  in  the
  3658.                 system environment path setting "PATH". 
  3659.             
  3660.              The  value  of  QTAwk_Path  may  be reset at any time by the
  3661.             user's utility to change the paths to be searched for desired
  3662.             files  to  be  opened  for  reading.   Setting  the  value of
  3663.             QTAwk_Path to a false value, will null the directory  search,
  3664.             only the current directory will be searched. 
  3665.             
  3666.         57.  * vargc  ==>  count  of variable arguments passed to current
  3667.             invocation
  3668.             
  3669.         58.  * vargv ==> singly-dimensioned array of  variable  arguments
  3670.             passed  to  current  function  invocation.   Indexing numeric
  3671.             starting at one, 1. 
  3672.  
  3673.  
  3674.  
  3675.  
  3676.  
  3677.  
  3678.  
  3679.  
  3680.  
  3681.  
  3682.  
  3683.  
  3684.  
  3685.  
  3686.         QTAwk                       - 5-11 -                        QTAwk
  3687.  
  3688.  
  3689.  
  3690.  
  3691.  
  3692.  
  3693.         Section 5.0                                    Built-in Variables
  3694.  
  3695.  
  3696.         :h1 res=30.*00 id=Expression.Expressions
  3697.  
  3698.  
  3699.  
  3700.  
  3701.  
  3702.  
  3703.  
  3704.  
  3705.  
  3706.  
  3707.  
  3708.  
  3709.  
  3710.  
  3711.  
  3712.  
  3713.  
  3714.  
  3715.  
  3716.  
  3717.  
  3718.  
  3719.  
  3720.  
  3721.  
  3722.  
  3723.  
  3724.  
  3725.  
  3726.  
  3727.  
  3728.  
  3729.  
  3730.  
  3731.  
  3732.  
  3733.  
  3734.  
  3735.  
  3736.  
  3737.  
  3738.  
  3739.  
  3740.  
  3741.  
  3742.  
  3743.  
  3744.         QTAwk                       - 5-12 -                        QTAwk
  3745.  
  3746.  
  3747.  
  3748.  
  3749.  
  3750.  
  3751.         Section 6.0                                           Expressions
  3752.  
  3753.  
  3754.         6.0 Expressions
  3755.         
  3756.          Expressions specify values to QTAwk or specify the  computations
  3757.         that a utility performs when it executes.  An expression consists
  3758.         of  a  sequence  of  variable  name(s),   constant(s),   built-in
  3759.         functions,  user-defined  functions and operator(s).  The purpose
  3760.         of an expression is to yield a value  or  assign  a  value  to  a
  3761.         variable. 
  3762.         
  3763.         6.1 Operators
  3764.         
  3765.          QTAwk  provides  a  rich  set  of operators which may be used in
  3766.         expressions.  The QTAwk operators are listed below  from  highest
  3767.         to lowest precedence:
  3768.         
  3769.         Operation              Operator         Associativity            
  3770.         grouping               ()               left to right            
  3771.         subscripting           []               left to right            
  3772.         field                  $                left to right            
  3773.         tagged string          $$               left to right            
  3774.         logical negation (NOT) !                left to right            
  3775.         one's complement       ~                left to right            
  3776.         increment/decrement    ++ --            right to left            
  3777.         unary plus/minus       + -              left to right            
  3778.         exponentiation         ^                right to left            
  3779.         multiply, divide,                                                
  3780.          remainder             * / %            left to right            
  3781.         binary plus/minus      + -              left to right            
  3782.         concatenation                           left to right            
  3783.         concatenation          ∩ (ASCII 239)    left to right            
  3784.         shift left/right       << >>            left to right            
  3785.         relational             < <= > >=        left to right            
  3786.         equality               == !=            left to right            
  3787.         matching               ~~ !~            left to right            
  3788.         array membership       in               left to right            
  3789.         bitwise AND            &                left to right            
  3790.         bitwise XOR            @                left to right            
  3791.         bitwise OR             |                left to right            
  3792.         logical AND            &&               left to right            
  3793.         logical OR             ||               left to right            
  3794.         conditional            ? :              right to left            
  3795.         assignment             = ^= *= /= %=    right to left            
  3796.                                += -= &= @= |=                            
  3797.                                <<= >>= ∩=                                
  3798.         sequence               ,                left to right            
  3799.  
  3800.  
  3801.  
  3802.         QTAwk                        - 6-1 -                        QTAwk
  3803.  
  3804.  
  3805.  
  3806.  
  3807.  
  3808.  
  3809.         Section 6.1                                           Expressions
  3810.  
  3811.  
  3812.         Note  that  QTAwk  has  changed  some  operators from C and Awk. 
  3813.         QTAwk has retained the Awk exponentiation operator (the C bitwise
  3814.         XOR operator) and made '@' the QTAwk bitwise XOR operator.  QTAwk
  3815.         has changed the Awk match operators to '~~' and '!~' to make them
  3816.         consistent  with the equality operators, '==' and '!='.  This has
  3817.         freed up the single tilde to restore it to its C meaning of unary
  3818.         one's  complement.   QTAwk has also brought forward the remainder
  3819.         of the C operators: shift, '<<' and '>>', bitwise operators, '&',
  3820.         '@' and '|', and the sequence operator, ','. 
  3821.         
  3822.          The  shift operators, '<<' and '>>', are bit shift operators for
  3823.         numeric  operands  and  character  shift  operators  for   string
  3824.         operands. 
  3825.         
  3826.          Note  that all expression operators are left associative except:
  3827.         
  3828.         1.  increment/decrement, '++' and '--',
  3829.         2.  exponentiation, '^'
  3830.         3.  conditional, ' ? : '
  3831.         4.  assignment, '='
  3832.         5.  assignment, '^=' '*=' '/=' '%='  '+='  '-='  '&='  '@='  '|='
  3833.             '<<=' '>>=' '∩='
  3834.         
  3835.          Left  associativity  means that operators of the same precedence
  3836.         are evaluated left to right: 10 - 9 + 7 means  (10  -  9)  +  7. 
  3837.         
  3838.          Operators of higher precedence are evaluated before operators of
  3839.         lower precedence.  Thus, 10 + 5 * 9  means  10  +  (5  *  9)  and
  3840.         evaluates  to  55.   Since  the  multiply  operator  has a higher
  3841.         precedence than the addition operator, it  is  evaluated  first. 
  3842.         
  3843.         6.2 Numeric Forms and Arithmetic Operations
  3844.         
  3845.          QTAwk   maintains  two  separate  numeric  forms,  integral  and
  3846.         floating point.   The  main  difference  between  the  two  forms
  3847.         involves  the  type  of  arithmetic  performed for the binary and
  3848.         unary arithmetic operators.  The arithmetic operators are:
  3849.         
  3850.         Operation              Operator                                  
  3851.         one's complement       ~                                         
  3852.         increment/decrement    ++ --                                     
  3853.         unary plus/minus       + -                                       
  3854.         exponentiation         ^                                         
  3855.         multiply, divide,      * / %                                     
  3856.         remainder                                                        
  3857.         binary plus/minus      + -                                       
  3858.  
  3859.  
  3860.         QTAwk                        - 6-2 -                        QTAwk
  3861.  
  3862.  
  3863.  
  3864.  
  3865.  
  3866.  
  3867.         Section 6.2                                           Expressions
  3868.  
  3869.  
  3870.         bitwise AND            &                                         
  3871.         bitwise XOR            @                                         
  3872.         bitwise OR             |                                         
  3873.         assignment             ^= *= /= %=                               
  3874.                                += -= &= @= |=                            
  3875.         
  3876.          For  all  binary  arithmetic  operations  (except  the   bitwise
  3877.         operators), the following two simple rules are followed:
  3878.         
  3879.         1.  If  both  operand  values  are  integers,  then  an  integral
  3880.             operation is  performed  and  an  integral  result  yielded. 
  3881.             
  3882.         2.  If  either  or both operand values is floating point numeric,
  3883.             then a floating point operation is performed after  obtaining
  3884.             the  equivalent floating point value of any integer value and
  3885.             a floating point result yielded. 
  3886.         
  3887.          If either or both operand values are strings, the numeric  value
  3888.         for either or both string values are obtained before applying the
  3889.         above rules.  If a string has no numeric form,  then  an  integer
  3890.         zero value is used. 
  3891.         
  3892.          Single  character  operands  are  treated as integers, using the
  3893.         ASCII integer value of the single character. 
  3894.         
  3895.          The application of the above rules is most noticeable  when  one
  3896.         numeric is divided by a second:
  3897.         
  3898.         numeric_1 / numeric_2
  3899.         
  3900.          If  both  numeric_1 and numeric_2 are integers, integer division
  3901.         is performed and the result will be an integer.  Thus:
  3902.         
  3903.         (1 / 2) = 0
  3904.         
  3905.          If either numeric_1 or numeric_2 is a floating  point,  floating
  3906.         point  division  is performed and the result is a floating point:
  3907.         
  3908.         1.0 / 2 = 0.5
  3909.         
  3910.          and
  3911.         
  3912.         1 / 2.0 = 0.5
  3913.         
  3914.          and
  3915.         
  3916.  
  3917.  
  3918.         QTAwk                        - 6-3 -                        QTAwk
  3919.  
  3920.  
  3921.  
  3922.  
  3923.  
  3924.  
  3925.         Section 6.2                                           Expressions
  3926.  
  3927.  
  3928.         1.0 / 2.0 = 0.5
  3929.         
  3930.         6.3 Numerics and Strings
  3931.         
  3932.          QTAwk maintains the separate numeric forms in converting strings
  3933.         to  numerics.   "123"  will  be converted to integral form, while
  3934.         "123.0" will be converted to floating point form.  The difference
  3935.         in  the two forms may become significant in cases where variables
  3936.         are assigned numeric values derived from input string  fields  or
  3937.         other  strings.   If  numeric  operations  are performed and full
  3938.         floating point division is desired, 0.0  should  be  added  to  a
  3939.         numeric value to assure floating point form. 
  3940.         
  3941.          Thus,  QTAwk has three idioms for converting between strings and
  3942.         numeric forms:
  3943.         
  3944.         1.  Convert numeric value to string form:
  3945.             123 ∩ "" --> "123"
  3946.             
  3947.         2.  Convert integer string form to integer value:
  3948.             Decimal Integer String: "123" + 0 --> 123
  3949.             Octal Integer String: "0123" + 0 --> 83
  3950.             Hexadecimal Integer String: "0x012" + 0 --> 18
  3951.             
  3952.         3.  Convert integer or floating point  string  form  to  floating
  3953.             point value:
  3954.             "123" + 0.0 --> 123.0
  3955.             "123.0" + 0.0 --> 123.0
  3956.             "123.0" + 0 --> 123.0
  3957.         
  3958.          Note  that  if  the  string  has  a  floating point form, then a
  3959.         floating point numeric will always result. 
  3960.         
  3961.          Also, the conversion from numeric  value  to  string  form  will
  3962.         result  in a floating point value or integer value depending upon
  3963.         both the numeric value and the value of "OFMT".  In converting  a
  3964.         numeric  value  to string form, QTAwk first considers whether the
  3965.         numeric value is integer or floating point.  If an integer value,
  3966.         then  a straight integer to ASCII string conversion is performed,
  3967.         retaining the full accuracy of the numeric value.   If,  however,
  3968.         the  numeric  value  is a floating point value, then the value is
  3969.         formatted  using  the  output  numeric  format  in  the  built-in
  3970.         variable, 'OFMT'.  The default value of OFMT is "%.6g".  Changing
  3971.         the value of OFMT to "%6u" will result in integer results for all
  3972.         conversions  of a floating point numeric to a string.  A value of
  3973.         "%.2f" OFMT will always result in a floating  point  string  form
  3974.  
  3975.  
  3976.         QTAwk                        - 6-4 -                        QTAwk
  3977.  
  3978.  
  3979.  
  3980.  
  3981.  
  3982.  
  3983.         Section 6.3                                           Expressions
  3984.  
  3985.  
  3986.         with two decimal places. 
  3987.         
  3988.          The  above  conversions  from numeric value to string value also
  3989.         apply to the  default  conversions  made  in  outputting  numeric
  3990.         values  with  the  'print'  and  'fprint'  functions described in
  3991.         Section 11. 
  3992.         
  3993.         6.3.1 Assignment Operators
  3994.         
  3995.          The  assignment  operators  are  used  to   assign   values   to
  3996.         variables.  Thus:
  3997.         
  3998.          total = 0
  3999.         
  4000.          initializes,  assigns,  the  value  zero,  0,  to  the  variable
  4001.         'total'.  Multiple assignments may be accomplished  in  a  single
  4002.         expression:
  4003.         
  4004.          total_a = total_b = total_c = total_d = 0
  4005.         
  4006.          initializes  the four variables 'total_a', 'total_b', 'total_c',
  4007.         'total_d' to 0. 
  4008.         
  4009.          The left operand  of  the  assignment  operator,  '=',  must  be
  4010.         variable. 
  4011.         
  4012.          Another  form  of  the  assignment operator is available, 'op=',
  4013.         where 'op' is one of the operators, '^', '*', '/', '%', '+', '-',
  4014.         '&',  '@',  '|', '∩', '<<', '>>'.  The left operand of 'op=' must
  4015.         be a variable.  The expression "var op= exp" has the same  effect
  4016.         as  "var  =  var  op  exp",  except  that  the  variable 'var' is
  4017.         evaluated only once.  Thus,
  4018.         
  4019.          total = total + 45;
  4020.         
  4021.          could be written as:
  4022.         
  4023.          total += 45;
  4024.         
  4025.          The effect is to increase the value of 'total' by 45. 
  4026.         
  4027.         6.4 Grouping Operators: ()
  4028.         
  4029.          Parenthesis are used for grouping parts of expressions to ensure
  4030.         a particular evaluation.  For example, the expression "4 + 5 * 9"
  4031.         is evaluated as:
  4032.  
  4033.  
  4034.         QTAwk                        - 6-5 -                        QTAwk
  4035.  
  4036.  
  4037.  
  4038.  
  4039.  
  4040.  
  4041.         Section 6.4                                           Expressions
  4042.  
  4043.  
  4044.         "5 * 9" is evaluated first since '*' has the  highest  precedence
  4045.             in the expression, then
  4046.         "4  +  45"  is  evaluated  to yield the expression result of 44. 
  4047.         
  4048.          If, instead, the desired order of evaluation was:
  4049.         
  4050.         evaluate "4 + 5" first, then
  4051.         evaluate "9 * 9" to yield result of 81
  4052.         
  4053.          Parenthesis are necessary to ensure  the  alternative  order  of
  4054.         evaluation:  "(4  +  5)  *  9".  The parenthesis group "4 + 5" to
  4055.         ensure that the lower precedence additive operator  is  evaluated
  4056.         before the multiplicative operator. 
  4057.         
  4058.         6.5 Arithmetic Operators
  4059.         
  4060.         6.5.1 Unary Ones Complement: ~
  4061.         
  4062.          The  unary  ones  complement  operator works on both numeric and
  4063.         string values. 
  4064.         
  4065.          For numeric values, i.e., character, integer and floating  point
  4066.         values, the result of this operation is the bitwise complement of
  4067.         the operand value.  Each 1 bit in the operand results in a 0  bit
  4068.         in the result and each 0 bit in the operand results in a 1 bit in
  4069.         the result.  For floating point operands, the equivalent  integer
  4070.         value is used for the operand. 
  4071.         
  4072.          For  string  values  (regular expressions are considered strings
  4073.         for this purpose), the ones complement operation is performed  on
  4074.         each character of the string. 
  4075.         
  4076.         6.5.2 Unary Increment/Decrement: ++ --
  4077.         
  4078.          The  operand  of either the increment or decrement operator must
  4079.         be a variable, either global or local.  The unary  increment  and
  4080.         decrement  operators  may  be  used as either prefix operators or
  4081.         postfix operators. 
  4082.         
  4083.          The result of the postfix  ++  operator  is  the  value  of  the
  4084.         operand.   After  the  result  is  obtained, the operand value is
  4085.         incremented.  That is, the operand has the value 1 added to  it. 
  4086.         If  the  operand  is a string, it is converted to a numeric value
  4087.         and the value incremented. 
  4088.         
  4089.          The result of the  postfix  --  operator  is  analogous  to  the
  4090.  
  4091.  
  4092.         QTAwk                        - 6-6 -                        QTAwk
  4093.  
  4094.  
  4095.  
  4096.  
  4097.  
  4098.  
  4099.         Section 6.5.2                                         Expressions
  4100.  
  4101.  
  4102.         postfix ++ operator except that the operand value is decremented,
  4103.         i.e., the value 1 is subtracted from it. 
  4104.         
  4105.          The result of the prefix ++ operator is the incremented value of
  4106.         the  operand.   The  operand has the value 1 added to it, the new
  4107.         value of the operand is the result of the prefix ++ operator.  If
  4108.         the  operand  is a string, it is converted to a numeric value and
  4109.         the value incremented. 
  4110.         
  4111.          The result of the prefix -- operator is analogous to the  prefix
  4112.         ++  operator  except that the operand value is decremented, i.e.,
  4113.         the value 1 is subtracted from it. 
  4114.         
  4115.          These rules can be easily seen in the expressions:
  4116.         
  4117.         a = b = c++ = 1;
  4118.         print a,b,c;
  4119.         output --> 1 1 2
  4120.         a++ = ++b + c++;
  4121.         print a,b,c;
  4122.         output --> 5 2 3
  4123.         
  4124.          The first statement sets a, b and  c  each  to  1.   c  is  then
  4125.         incremented to 2 by the postfix increment operator. 
  4126.         
  4127.          In   the   second   statement,  the  prefix  increment  operator
  4128.         increments b to 2 and the new value is used for  the  binary  '+'
  4129.         operator.   The current value of c, 2, is used for the binary '+'
  4130.         operator and the value of c is incremented to 3  by  the  postfix
  4131.         increment  operator  after the addition operation is complete.  a
  4132.         is set to 2 +  2  =  4.   The  postfix  increment  operator  then
  4133.         increments a to 5. 
  4134.         
  4135.         6.5.3 Unary Plus/Minus: + -
  4136.         
  4137.          The value of the unary plus operator is the numeric value of its
  4138.         operand.  The value of the unary minus operator is  the  negative
  4139.         of the numeric value of its operand. 
  4140.         
  4141.         6.5.4 Exponentiation: ^
  4142.         
  4143.          The  result  of  the  binary  exponentiation operator, ^, is the
  4144.         value of the left operand  raised  to  the  power  of  the  right
  4145.         operand.   Both operands are converted to floating point numerics
  4146.         in performing  the  operation.   If  both  operands  are  integer
  4147.         values,  the  result  is  an  integer  value.   If either or both
  4148.  
  4149.  
  4150.         QTAwk                        - 6-7 -                        QTAwk
  4151.  
  4152.  
  4153.  
  4154.  
  4155.  
  4156.  
  4157.         Section 6.5.4                                         Expressions
  4158.  
  4159.  
  4160.         operands are floating point values,  the  result  is  a  floating
  4161.         point value. 
  4162.         
  4163.          If  either  operand  has  a  string  value, the numeric value is
  4164.         obtained before applying the above rule. 
  4165.         
  4166.         6.5.5 Multiplicative and Additive Operators: *  /  %  and  +  -
  4167.         
  4168.          The  multiplicative  operators,  multiply,  *,  divide,  /,  and
  4169.         remainder, %, and the additive operators, add, +,  and  subtract,
  4170.         -,  follow  the  standard arithmetic rules for their result.  The
  4171.         remainder operator, x % y, yields the remainder of x/y, which  is
  4172.         x - i*y for some integer i, such that i*y < x < (i+1)*y. 
  4173.         
  4174.         6.6 Bitwise And, Or and Xor: & | @
  4175.         
  4176.          For  these operators only integer values are used.  If the value
  4177.         of either operand is a string  or  floating  point  numeric,  the
  4178.         corresponding   integer   value   is  obtained  for  use  in  the
  4179.         operation. 
  4180.         
  4181.          The result of the binary '&' operator is the bitwise AND of  the
  4182.         operand  values,  i.e., a bit in the result is a 1 if and only if
  4183.         each of the corresponding bits in the  operand  values  are  1s. 
  4184.         
  4185.          The  result  of the binary '@' operator is the bitwise exclusive
  4186.         OR, XOR, of the operand values, i.e., a bit in the result is a  1
  4187.         if  and  only if either the corresponding bit of the left operand
  4188.         is 1 or the corresponding bit of the right operand is 1, but  not
  4189.         both. 
  4190.         
  4191.          The  result  of the binary '|' operator is the bitwise OR of the
  4192.         operand values, i.e., a bit in the result is a 1 if and  only  if
  4193.         at  least  one of the corresponding bits in either operand values
  4194.         is 1. 
  4195.         
  4196.         6.7 Subscripting: []
  4197.         
  4198.          Array elements are accessed using  the  subscripting  operators,
  4199.         '[]'.   If  the  variable  AA  is a singly dimensioned array, the
  4200.         elements  would  be  accessed  as  AA[expression].    The   index
  4201.         expression    can   be   any   valid   QTAwk   expression.    For
  4202.         multidimensional  arrays,  multiple  subscripting  operators  are
  4203.         used.   If  BB  is  a  two-dimensional  array,  then the rows are
  4204.         subscripted as BB[row_number_exp] and the individual  columns  in
  4205.         each  row  as  BB[row_number_exp][column_number_exp].   Refer  to
  4206.  
  4207.  
  4208.         QTAwk                        - 6-8 -                        QTAwk
  4209.  
  4210.  
  4211.  
  4212.  
  4213.  
  4214.  
  4215.         Section 6.7                                           Expressions
  4216.  
  4217.  
  4218.         Section 6 for a discussion of arrays. 
  4219.         
  4220.         6.8 Shift Operators: << >>
  4221.         
  4222.          The shift operators perform either a bitwise or character  shift
  4223.         of  the  left  operand.   If  the  left  operand  is  a string, a
  4224.         character shift is performed.  If the left operand is a  numeric,
  4225.         the  equivalent  integer value is obtained and used for a bitwise
  4226.         shift.  For either shift, the right operand specifies the  amount
  4227.         of  the shift.  The equivalent integer value of the right operand
  4228.         is used. 
  4229.         
  4230.          The shift operators operate on string left operands in QTAwk  by
  4231.         shifting   the   string   characters.   For  string  shifts,  the
  4232.         characters shifted off one end of the string, wrap to  the  other
  4233.         end. 
  4234.         
  4235.          For  numeric  operands  and  the  right  shift operator, >>, the
  4236.         integer value of the left operand is treated as  unsigned,  i.e.,
  4237.         the  sign bit is not extended in the shift, zero bits are shifted
  4238.         in.  If either operand is a floating point value, the result is a
  4239.         floating point value. 
  4240.         
  4241.          Thus,  these  operators  yield  the  results  indicated  in  the
  4242.         following situations:
  4243.         
  4244.         "Test String" << 2 --> "st StringTe"
  4245.             
  4246.         "Test String" >> 3 --> "ingTest Str"
  4247.             
  4248.         55 << 1 --> 110
  4249.             
  4250.         55 << 2 --> 220
  4251.             
  4252.         55.0 << 1 --> 110.0
  4253.             
  4254.         55.0 << 2 --> 220.0
  4255.         
  4256.         6.9 String Concatenation Operator: ∩
  4257.         
  4258.          QTAwk has retained the practice of forcing string  concatenation
  4259.         by  placing two constants, variables or function calls adjacent. 
  4260.         QTAwk has  introduced  the  string  concatenation  operator,  '∩'
  4261.         (character  239, 0x0ef of the extended ASCII character set).  The
  4262.         string  concatenation  operator  has  the  advantage  of   making
  4263.         concatenation  explicit  and  allowing  the  string concatenation
  4264.  
  4265.  
  4266.         QTAwk                        - 6-9 -                        QTAwk
  4267.  
  4268.  
  4269.  
  4270.  
  4271.  
  4272.  
  4273.         Section 6.9                                           Expressions
  4274.  
  4275.  
  4276.         assignment operator, '∩='.  Thus, string concatenation operations
  4277.         which previously had to be written as:
  4278.         
  4279.                        new_string = new_string old_string;               
  4280.         
  4281.          may now be written:
  4282.         
  4283.                             new_string ∩= old_string;                    
  4284.         
  4285.          Thus  a  loop to build a string of numerics which previously was
  4286.         written as:
  4287.         
  4288.                      for( i = 8 , j = 9 ; i ; i-- ) j = j i;             
  4289.         
  4290.          can be written as:
  4291.         
  4292.                      for( i = 8 , j = 9 ; i ; i-- ) j ∩= i;              
  4293.         
  4294.          and will produce a value for j of:
  4295.         
  4296.                                    "987654321"                           
  4297.         
  4298.          The string concatenation  operator  will  make  some  constructs
  4299.         work as expected.  For example, the statements:
  4300.         
  4301.         ostr = "prefix";
  4302.         suff = "suffix";
  4303.         k = 1;
  4304.         j = ostr ++k suff;
  4305.         print "j = ",j;
  4306.         print "ostr = ",ostr;
  4307.         
  4308.          will produce the seemly odd output:
  4309.         
  4310.         j = prefix1suffix
  4311.         ostr = 1
  4312.         
  4313.          This results from two factors:
  4314.         
  4315.         1.  In  tokenizing  the  statements, white space is used to break
  4316.             keyword,  variable,   function   names   and   multicharacter
  4317.             operators.  Otherwise it is ignored. 
  4318.             
  4319.         2.  The  increment  operator,  '++',  has  higher precedence than
  4320.             string concatenation. 
  4321.         
  4322.  
  4323.  
  4324.         QTAwk                       - 6-10 -                        QTAwk
  4325.  
  4326.  
  4327.  
  4328.  
  4329.  
  4330.  
  4331.         Section 6.9                                           Expressions
  4332.  
  4333.  
  4334.          Thus, QTAwk processes the following stream of tokens:
  4335.         
  4336.         1.  j
  4337.         2.  =
  4338.         3.  ostr
  4339.         4.  ++
  4340.         5.  k
  4341.         6.  suff
  4342.         7.  ;
  4343.         
  4344.          In interpreting the  stream,  '++'  is  encountered  immediately
  4345.         after  'ostr'  and is interpreted as a postfix operator operating
  4346.         on 'ostr' instead of a prefix operator operating on  'k'.   Thus,
  4347.         the stream appears to QTAwk as:
  4348.         
  4349.         j = ostr ++ k suff;
  4350.         
  4351.          After  concatenating the current string value of ostr, "prefix",
  4352.         with the string value of k, "1", ostr is converted to a  numeric,
  4353.         yielding  a  value  of  zero, 0, which is incremented to one, 1. 
  4354.         
  4355.          This seemingly anomalous situation can be remedied in two  ways:
  4356.         
  4357.         1.  Surround  ++k  with parenthesis, thus explicitly binding '++'
  4358.             to 'k':
  4359.             
  4360.              j = ostr (++k) suff;
  4361.             
  4362.         2.  Use the string concatenation operator, '∩', to make  explicit
  4363.             the string concatenation:
  4364.             
  4365.              j = ostr ∩ ++k suff;
  4366.             
  4367.              or
  4368.             
  4369.              j = ostr ∩ ++k ∩ suff;
  4370.         
  4371.          The output produced by this, is what was really desired:
  4372.         
  4373.         j = prefix2suffix
  4374.         ostr = prefix
  4375.         
  4376.         6.10 Field operator: $
  4377.         
  4378.          The  field  operator  is a unary operator used for accessing the
  4379.         fields of the  current  input  record.   "$expression"  evaluates
  4380.  
  4381.  
  4382.         QTAwk                       - 6-11 -                        QTAwk
  4383.  
  4384.  
  4385.  
  4386.  
  4387.  
  4388.  
  4389.         Section 6.10                                          Expressions
  4390.  
  4391.  
  4392.         expression  and  converts  the  value  to  an  integer  value  if
  4393.         necessary.  The operator yields the field of  the  current  input
  4394.         record  corresponding  to  integer  specified.   Field  numbering
  4395.         starts at 1 with the first field and  increases  to  the  maximum
  4396.         number  of fields found for the current input record.  The number
  4397.         of fields in the current input record is stored by QTAwk  in  the
  4398.         built-in  variable,  NF, as each record is read.  If the value of
  4399.         the operand expression is zero, the operator yields entire  input
  4400.         record.   If  the value of the operand expression is greater than
  4401.         the  number  of  fields  in  the  current  input  record,   i.e.,
  4402.         expression > NF, the operator yields a null string. 
  4403.         
  4404.         6.11 Tagged String Operator: $$
  4405.         
  4406.          QTAwk  has  introduced the tag operator, '$$'.  The tag operator
  4407.         works in conjunction with tagged strings as explained in  Section
  4408.         2.   The tag operator is analogous to the field operator, but the
  4409.         operand of this operator is numeric and takes five forms:
  4410.         
  4411.         1.  $$0 --> refers to the  entire  string  matched  by  the  last
  4412.             regular expression. 
  4413.             
  4414.         2.  $$0.0  -->  refers  to  the entire string matched by the last
  4415.             regular expression. 
  4416.             
  4417.         3.  $$j (j an integer value) --> refers to  the  string  matching
  4418.             the  regular  expression  contained in the parenthesis set at
  4419.             nesting level 1 and count j in the  last  regular  expression
  4420.             matched in the current action pattern.  Valid values of j are
  4421.             in the range 1 ≤ j ≤ 31.  Identical  to  $$1.j  of  the  next
  4422.             form. 
  4423.             
  4424.         4.  $$i.j  (i  and  j  integer  values)  --> refers to the string
  4425.             matching the regular expression contained in the  parenthesis
  4426.             set  at  the ith nesting level, jth count in the last regular
  4427.             expression.  Valid values of i and j are in the range:
  4428.             
  4429.             1 ≤ i ≤ 7
  4430.             1 ≤ j ≤ 31
  4431.             
  4432.              Note that the values of j less than  10  must  be  specified
  4433.             with  a  leading  zero  digit.   Thus, a value of 1.1 will be
  4434.             interpreted as 1.10, yielding values for i and j of:
  4435.             
  4436.             i == 1
  4437.             j == 10
  4438.  
  4439.  
  4440.         QTAwk                       - 6-12 -                        QTAwk
  4441.  
  4442.  
  4443.  
  4444.  
  4445.  
  4446.  
  4447.         Section 6.11                                          Expressions
  4448.  
  4449.  
  4450.              A value for i.j specified as 1.01 yields values for i and  j
  4451.             of:
  4452.             
  4453.             i == 1
  4454.             j == 1
  4455.             
  4456.              If  i  is  greater  than  7,  a value of 7 is used.  If j is
  4457.             greater than 31, a value of 31  is  used.   These  rules  are
  4458.             consistent  with  the  rules for field selection with the '$'
  4459.             operator.  For, '$i' if the value of i is  greater  than  NF,
  4460.             the value of NF is used. 
  4461.             
  4462.         5.  $$variable_name  --> this form may expand into any one of the
  4463.             previous forms.  If the variable operated on  by  '$$'  is  a
  4464.             string  or  regular  expression,  it  is  first  converted to
  4465.             numeric form.  If the numeric value of  variable_name  is  an
  4466.             integer,  the first or third forms above are appropriate.  If
  4467.             the numeric value is a floating point, the second and  fourth
  4468.             forms  are  appropriate.   For floating point forms, only the
  4469.             first two  digits  of  the  fractional  part  are  used,  the
  4470.             remaining  digits  are  discarded.   The  restrictions listed
  4471.             above on the integer and fractional portions are maintained. 
  4472.         
  4473.          When used in an action, the last regular expression match in the
  4474.         corresponding pattern will set the values of the  tagged  strings
  4475.         for  the  tag operator.  If there was no regular expression match
  4476.         in the pattern, then the value of the tag operator  is  the  null
  4477.         string. 
  4478.         
  4479.          The  operator may also be used in the 'sub' and 'gsub' functions
  4480.         in the same manner  that  '&'  is  used.   Tagged  strings  found
  4481.         matching  the  regular  expression  of  the  scan  string will be
  4482.         substituted for the tag  operator  in  the  replacement  string. 
  4483.         
  4484.          The  use  of  tagged  strings in the 'sub' and 'gsub' functions,
  4485.         described in  Section  11,  differs  slightly  in  their  use  of
  4486.         variables to specify the tagged string desired.  In actions, '$$'
  4487.         is a unary operator just as '$' is.  As such they operate on  the
  4488.         token  immediately  to  their  right.  In the replacement strings
  4489.         used in 'sub' and 'gsub', '$$' (and '&') act  less  as  operators
  4490.         than  as  tokens  specifying replacement values.  As such, in the
  4491.         replacement string, a means is needed of separating the  variable
  4492.         specifying the tagged string level and count from the surrounding
  4493.         text.  As for named expressions in regular expressions, the curly
  4494.         braces,  '{}',  are  used  to  accomplish  this.   Thus,  in  the
  4495.         replacement string for the 'sub' and 'gsub' functions,  a  tagged
  4496.  
  4497.  
  4498.         QTAwk                       - 6-13 -                        QTAwk
  4499.  
  4500.  
  4501.  
  4502.  
  4503.  
  4504.  
  4505.         Section 6.11                                          Expressions
  4506.  
  4507.  
  4508.         string is specified with a variable as:
  4509.         
  4510.         "replacement string -->$${var_name}<--";
  4511.         
  4512.          Regular  expressions  used  in actions with the match operators,
  4513.         '~~' and '!~', and with functions taking regular  expressions  as
  4514.         arguments,  will not disturb the value of the tag operator set by
  4515.         the pattern.  The pattern/action pair:
  4516.         
  4517.          /{_i}/ {
  4518.             print $$0;
  4519.             if ( $0 ~~ /[789]/ ) print $$0;
  4520.         }
  4521.         
  4522.          With the input line:
  4523.         
  4524.                        this line contains an integer 12745               
  4525.         
  4526.          both 'print' statements will output "12745"
  4527.         
  4528.          Using the tag operator, a simple QTAwk utility could be  written
  4529.         to  read  a file containing a list of floating point numbers, one
  4530.         per line, and change the exponents of the numbers.   For  example
  4531.         to add 5 to the exponents:
  4532.         
  4533.         /{_d}+\.{_d}+([eEdD][-+]?({_d}{_d}?{_d}?))?/ {
  4534.             if ( $$2.01 ) $$2.01 += 5;
  4535.         }
  4536.         
  4537.         { print; }
  4538.         
  4539.          The following lines in a file:
  4540.         
  4541.         1.23
  4542.         1.23e+45
  4543.         1.23E+45
  4544.         342187.3465
  4545.         342187.3465e-55
  4546.         342187.3465E-55
  4547.         
  4548.          will be output by the utility as:
  4549.         
  4550.         1.23
  4551.         1.23e+50
  4552.         1.23E+50
  4553.         342187.3465
  4554.  
  4555.  
  4556.         QTAwk                       - 6-14 -                        QTAwk
  4557.  
  4558.  
  4559.  
  4560.  
  4561.  
  4562.  
  4563.         Section 6.11                                          Expressions
  4564.  
  4565.  
  4566.         342187.3465e-60
  4567.         342187.3465E-60
  4568.         
  4569.          If   the  exponent  sign  were  included  in  the  second  level
  4570.         parenthesis set, as in the following utility:
  4571.         
  4572.         /{_d}+\.{_d}+([eEdD]([-+]?{_d}{_d}?{_d}?))?/ {
  4573.             if ( $$2.01 ) $$2.01 += 5;
  4574.         }
  4575.         
  4576.         { print; }
  4577.         
  4578.          the output would be:
  4579.         
  4580.         1.23
  4581.         1.23e+50
  4582.         1.23E+50
  4583.         342187.3465
  4584.         342187.3465e-50
  4585.         342187.3465E-50
  4586.         
  4587.          Unlike the fields  of  the  input  line,  which  are  re-derived
  4588.         whenever  the input line is changed, the strings matching the tag
  4589.         operator are not re-derived and  thus  are  no  longer  available
  4590.         whenever the input line is changed.  Once the input line has been
  4591.         changed in any manner, the tag operator  will  yields  only  null
  4592.         strings.   Thus after, the assignment "$$2.01 += 5;" in the above
  4593.         utility, any further uses of the tag  operator  will  yield  only
  4594.         null strings and any statements with the tag operator on the left
  4595.         side of the assignment operator will not change the input  line. 
  4596.         
  4597.         6.12 Logical Operators: && ||
  4598.         
  4599.          The logical operators are the logical AND, '&&', and logical OR,
  4600.         '||'.  A logical expression evaluates to  1  if  true  and  0  if
  4601.         false.   The operands of '&&' and '||' are evaluated from left to
  4602.         right with '&&' having a higher precedence than '||'.  Evaluation
  4603.         of  the  binary  '&&' and '||' ceases as soon as the value of the
  4604.         operator can be determined. 
  4605.         
  4606.          Thus, for
  4607.         
  4608.          exp1 && exp2
  4609.         
  4610.          if 'exp1' evaluates to false,  i.e.,  a  zero  numeric  or  null
  4611.         string,  then  'exp2'  is  not  evaluated  and  the  value of the
  4612.  
  4613.  
  4614.         QTAwk                       - 6-15 -                        QTAwk
  4615.  
  4616.  
  4617.  
  4618.  
  4619.  
  4620.  
  4621.         Section 6.12                                          Expressions
  4622.  
  4623.  
  4624.         expression is 0, or false.  Otherwise, 'exp2'  is  evaluated  and
  4625.         the  value  of  the  expression  is  1 if 'exp2' is true and 0 if
  4626.         'exp2' is false. 
  4627.         
  4628.          For
  4629.         
  4630.          exp1 || exp2
  4631.         
  4632.          if 'exp1' evaluates to true, i.e., a nonzero numeric or non-null
  4633.         string,  then  'exp2'  is  not  evaluated  and  the  value of the
  4634.         expression is 1.  Otherwise, 'exp2' is evaluated and the value of
  4635.         the  expression is 1 if 'exp2' is true and 0 if 'exp2' is false. 
  4636.         
  4637.          For expressions involving multiple '&&' and '||' operators,  the
  4638.         precedence  of  the operators must be remembered.  It is probably
  4639.         best to use parenthesis to group expressions to avoid confusion. 
  4640.         
  4641.          For  example,  predict the output for the following expressions:
  4642.         
  4643.         a = b = 1;
  4644.         c = 0;
  4645.         d = a++ || b++ && c++;
  4646.         print a,b,c,d; #1
  4647.         a = b = 1;
  4648.         c = 0;
  4649.         d = a++ || (b++ && c++);
  4650.         print a,b,c,d; #2
  4651.         a = b = 1;
  4652.         c = 0;
  4653.         d = (a++ || b++) && c++;
  4654.         print a,b,c,d; #3
  4655.         a = b = 0;
  4656.         c = 1;
  4657.         d = a++ || b++ && c++;
  4658.         print a,b,c,d; #4
  4659.         a = b = 0;
  4660.         c = 1;
  4661.         d = a++ || (b++ && c++);
  4662.         print a,b,c,d; #5
  4663.         a = b = 0;
  4664.         c = 1;
  4665.         d = (a++ || b++) && c++;
  4666.         print a,b,c,d; #6
  4667.         
  4668.          The outputs are:
  4669.         
  4670.  
  4671.  
  4672.         QTAwk                       - 6-16 -                        QTAwk
  4673.  
  4674.  
  4675.  
  4676.  
  4677.  
  4678.  
  4679.         Section 6.12                                          Expressions
  4680.  
  4681.  
  4682.                    a b c d                                               
  4683.         output #1: 2 1 0 1                                               
  4684.         output #2: 2 1 0 1                                               
  4685.         output #3: 2 1 1 0                                               
  4686.         output #4: 1 1 1 0                                               
  4687.         output #5: 1 1 1 0                                               
  4688.         output #6: 1 1 1 0                                               
  4689.         
  4690.         
  4691.          Since '&&' has higher precedence  than  '||',  the  expressions:
  4692.         
  4693.          a++ || b++ && c++
  4694.         
  4695.          and
  4696.         
  4697.          a++ || (b++ && c++)
  4698.         
  4699.          are equivalent. 
  4700.         
  4701.         6.13 Comparison Operators: < <= > >= == ~= ~~ !~
  4702.         
  4703.          The  binary  comparison  operators compare the value of the left
  4704.         operand expression to the value of right operand expression.  The
  4705.         comparison operators are the relational operators: less than '<',
  4706.         less than or equal to, '<=', greater than, '>', greater  than  or
  4707.         equal  to,  '>=',  equal  to,  '==',  not  equal to, '!=, and the
  4708.         regular expression matching operators: is matched  by,  '~~',  is
  4709.         not  matched by, '!~'.  The comparison operators yield a value of
  4710.         1 or 0. 
  4711.         
  4712.          In comparison expressions with the relational operators, if both
  4713.         operands are numeric, then the comparison is numeric.  Otherwise,
  4714.         any  numeric  operand  is  coerced  to  a  string  and  a  string
  4715.         comparison made. 
  4716.         
  4717.          For  input  record  fields, where the field can be both a string
  4718.         and a numeric, e.g., $i = "123.5", it is considered  a  numeric. 
  4719.         Any comparison made with an input record field, the type of test,
  4720.         numeric or string will depend on  the  other  operand.   If  both
  4721.         operands  are  input record fields, then if both can be numerics,
  4722.         they are treated as such for the comparison  and  the  comparison
  4723.         will be numeric. 
  4724.         
  4725.          For  numeric  comparisons,  if both operands are integer values,
  4726.         then the comparison made  will  be  an  integer  comparison.   If
  4727.         either operand is a floating point, then the comparison made will
  4728.  
  4729.  
  4730.         QTAwk                       - 6-17 -                        QTAwk
  4731.  
  4732.  
  4733.  
  4734.  
  4735.  
  4736.  
  4737.         Section 6.13                                          Expressions
  4738.  
  4739.  
  4740.         be a floating point  comparison  using  the  equivalent  floating
  4741.         point value for any inetger value. 
  4742.         
  4743.          For  string  comparisons,  the  ASCII collating sequence will be
  4744.         used.  If two  strings  are  identical  except  for  length,  the
  4745.         shorter  string  will  be  considered  to  less  than  the longer
  4746.         string. 
  4747.         
  4748.          For the match operators, '~~' and '!~',  the  right  operand  is
  4749.         converted to its string value if it is not already a string.  The
  4750.         internal regular expression form of the left operand is  obtained
  4751.         and  used  to  search  the  left  operand  for a match.  Refer to
  4752.         Section 2 for a full description of regular expressions and their
  4753.         use in matching strings. 
  4754.         
  4755.         6.13.1 Match Operator Variables
  4756.         
  4757.          QTAwk has defined two new built-in variables associated with the
  4758.         match operators, MLENGTH and MSTART.  Whenever the match operator
  4759.         is  executed  MLENGTH  is set equal to the length of the matching
  4760.         string or zero if no match is found.  MSTART is set equal to  the
  4761.         position  of the start of the matching string or zero if no match
  4762.         is found.  These built-in variables are completely  analogous  to
  4763.         the  built-in  variables  RLENGTH  and  RSTART  for  the built-in
  4764.         'match' function. 
  4765.         
  4766.         6.14 Conditional Operator: ? :
  4767.         
  4768.          The conditional operator, '? :' is a ternary operator, it  takes
  4769.         three operands:
  4770.         
  4771.          expc ? expt : expf
  4772.         
  4773.          Depending on the value of the conditional expression 'expc' only
  4774.         one of the expressions 'expt',  the  true  value  expression,  or
  4775.         'expf',  the false value expression, is evaluated, but not both. 
  4776.         the conditional expression, 'expc', is evaluated first.   If  the
  4777.         value  obtained  from  'expc' is true, i.e., a nonzero numeric or
  4778.         non-null string, then the true expression, 'expt',  is  evaluated
  4779.         and  the  value  obtained  is  the value of the operator.  If the
  4780.         conditional expression yields  a  false  value,  then  the  false
  4781.         expression, 'expf' is evaluated and the value is the value of the
  4782.         operator.  This operator is typically used in  places  where  an:
  4783.         
  4784.          "if ( condition ) statement else statement"
  4785.         
  4786.  
  4787.  
  4788.         QTAwk                       - 6-18 -                        QTAwk
  4789.  
  4790.  
  4791.  
  4792.  
  4793.  
  4794.  
  4795.         Section 6.14                                          Expressions
  4796.  
  4797.  
  4798.          would  used  to set a value, but where it is inconvenient to use
  4799.         the "if else" control flow statement and  where  the  expressions
  4800.         'expt'  and  'expf'  are  simple  expressions  and  not  compound
  4801.         statements. 
  4802.         
  4803.          A simple example often cited is 'print' for  output.   Depending
  4804.         upon the value of a flag variable, one of two different variables
  4805.         are to output:
  4806.         
  4807.          print flag_var ? output_var1 : output_var2;
  4808.         
  4809.         6.15 Logical Negation: !
  4810.         
  4811.          The logical negation operator yields the negative logical  value
  4812.         of the operand:
  4813.         
  4814.          !expression
  4815.         
  4816.          The operand expression is evaluated and if a true value, nonzero
  4817.         numeric or non-nul string is obtained, then a value of false,  0,
  4818.         is  the  value  of  the operator.  If false value is yield by the
  4819.         operand expression, then a value of true, 1, is the value of  the
  4820.         operator. 
  4821.         
  4822.         6.16 Array Membership: in
  4823.         
  4824.          This  operator  tests  if  the  value  of the left operand is an
  4825.         index, at the next level  of  indexing,  of  the  right  operand:
  4826.         
  4827.          expi in expa
  4828.         
  4829.          If  the  value  obtained  in  evaluating  the left operand index
  4830.         expression, 'expi', is  an  index  of  the  array  obtained  from
  4831.         evaluating  the  right  array  operand expression, 'expa', then a
  4832.         true value, 1, is the value of the operator,  otherwise  a  false
  4833.         value, 0, is the value.  If the value yielded by 'expa' is not an
  4834.         array, 0 is the value of the operator. 
  4835.         
  4836.          The next level of indexing is always tested.   Thus,  "i  in  A"
  4837.         tests  if  the current value of the variable 'i' is a valid index
  4838.         of the array variable 'A'.  "i in A[j]" tests if the value of 'i'
  4839.         is a valid column index in the jth row of the array 'A'. 
  4840.         
  4841.         6.17 Sequence Operator: ,
  4842.         
  4843.          QTAwk  uses  the C sequence operator, the comma, ','.  Using the
  4844.  
  4845.  
  4846.         QTAwk                       - 6-19 -                        QTAwk
  4847.  
  4848.  
  4849.  
  4850.  
  4851.  
  4852.  
  4853.         Section 6.17                                          Expressions
  4854.  
  4855.  
  4856.         sequence operator, expressions may be combined into an expr_list:
  4857.         
  4858.                 expression_1 , expression_2 , expression_3 , ...         
  4859.         
  4860.          As  in  C,  a  list  of  expressions  separated  by the sequence
  4861.         operator is valid anywhere an expression is valid.  Such lists of
  4862.         expressions  separated  by the sequence operator will be referred
  4863.         to as an expression list or expr_list.   Each  expression  in  an
  4864.         expr_list is evaluated in turn.  The final value of the expr_list
  4865.         is the value of the last expression.  The  sequence  operator  is
  4866.         very  useful  in the loop control statements discussed in Section
  4867.         10. 
  4868.         
  4869.         6.18 White Space
  4870.         
  4871.          In tokenizing a utility, white space is used to break  keywords,
  4872.         variable   and  function  names  and  multicharacter  operators. 
  4873.         Otherwise it is ignored.  White space is any of  the  characters:
  4874.         
  4875.          \t, \n, \v, \f, \r, \s == [\t\n\v\f\r\s] == {_z}
  4876.         
  4877.          Thus  none of the characters of the multicharacter operators can
  4878.         be  separated  by  one  of  the  white  space  characters.    The
  4879.         multicharacter operators are:
  4880.         
  4881.         Operation              Operator                                  
  4882.         tag                    $$                                        
  4883.         increment/decrement    ++ --                                     
  4884.         shift left/right       << >>                                     
  4885.         relational             < <= > >=                                 
  4886.         equality               == !=                                     
  4887.         matching               ~~ !~                                     
  4888.         array membership       in                                        
  4889.         logical AND            &&                                        
  4890.         logical OR             ||                                        
  4891.         assignment             ^= *= /= %=                               
  4892.                                += -= &= @= |=                            
  4893.                                <<= >>= ∩=                                
  4894.         
  4895.          By  observing  this  simple  rule  for multicharacter operators,
  4896.         expressions  such  as  the  following  will  yield  the  expected
  4897.         results:
  4898.         
  4899.              a = b = c = d++ = 1
  4900.              a++ = b++ + ++c;
  4901.              print a,b,c,d;
  4902.  
  4903.  
  4904.         QTAwk                       - 6-20 -                        QTAwk
  4905.  
  4906.  
  4907.  
  4908.  
  4909.  
  4910.  
  4911.         Section 6.18                                          Expressions
  4912.  
  4913.  
  4914.              output ==> 4 2 2 2
  4915.         
  4916.         6.19 Constants
  4917.         
  4918.          Expressions  in  QTAwk  can  contain several types of constants:
  4919.         
  4920.         1.  numeric constants
  4921.             a)  decimal numeric constants
  4922.             b)  octal numeric constants
  4923.             c)  hexadecimal numeric constants
  4924.             d)  floating point numeric constants
  4925.         2.  character constants
  4926.         3.  string constants
  4927.         4.  regular expression constants
  4928.         
  4929.          Numeric constants have  several  forms:  integer  constants  and
  4930.         floating  point  constants.   Integers  follow  the C practice of
  4931.         allowing decimal, octal and hexadecimal base constants. 
  4932.         
  4933.         6.19.1 Numeric Constants
  4934.         
  4935.          Decimal constants match the form:
  4936.         
  4937.         /{_i}/ --> [-+]?[0-9]+
  4938.         
  4939.          Octal constants match the form:
  4940.         
  4941.         /0{_o}+/ --> 0[0-7]+
  4942.         
  4943.          Hexadecimal constants match the form:
  4944.         
  4945.         /0[xX]{_h}+/ --> 0[xX][0-9A-Fa-f]+
  4946.         
  4947.          The results of  all  three  of  the  following  expressions  are
  4948.         equivalent.   All  set  the  variable,  int_cons,  to the integer
  4949.         value, 11567. 
  4950.         
  4951.              int_cons = 11567;
  4952.         
  4953.              int_cons = 026457;
  4954.         
  4955.              int_cons = 0x2d2f;
  4956.         
  4957.          Note that octal and  hexadecimal  integers  are  recognized  not
  4958.         only  in  QTAwk expressions in utilitys, but also in input record
  4959.         fields and other strings. 
  4960.  
  4961.  
  4962.         QTAwk                       - 6-21 -                        QTAwk
  4963.  
  4964.  
  4965.  
  4966.  
  4967.  
  4968.  
  4969.         Section 6.19.1                                        Expressions
  4970.  
  4971.  
  4972.          Floating point numeric constants match the form:
  4973.         
  4974.         
  4975.         {_f}
  4976.         
  4977.          or
  4978.         
  4979.                                                                          
  4980.         
  4981.         6.19.2 Character Constants
  4982.         
  4983.          Character constants are single  characters  enclosed  in  single
  4984.         quotes,  ',  The  same  escape  sequences  allowed in strings and
  4985.         regular expressions are  allowed  in  character  constants.   All
  4986.         three  of  the  following  expressions  will  set  the  variable,
  4987.         chr_cons, to 'A':
  4988.         
  4989.                                  chr_cons = 'A';                         
  4990.         
  4991.                                chr_cons = '\x041';                       
  4992.         
  4993.                                 chr_cons = '\101'                        
  4994.         
  4995.          QTAwk will maintain variables  set  to  character  constants  as
  4996.         single characters, but they may be used in arithmetic expressions
  4997.         as any other number.  When used in arithmetic expressions,  QTAwk
  4998.         will  automatically  convert  them to their ASCII numeric value. 
  4999.         Thus:
  5000.         
  5001.         chr_cons = 'a';
  5002.         int_cons = chr_cons / 2;
  5003.         print chr_cons,int_cons;
  5004.         output: a 48
  5005.         
  5006.          Printing int_cons yields 48, the integer ASCII value of 'a',  ==
  5007.         97,  divided  by  2.   Note  that QTAwk maintains 'chr_cons' as a
  5008.         character on output and prints the character value  and  not  the
  5009.         integer value, 97. 
  5010.         
  5011.          The  'substr' function will return a character constant when the
  5012.         requested substring is only a single character wide. 
  5013.         
  5014.         6.19.3 String Constants
  5015.         
  5016.          String constants are  character  sequences  enclosed  in  double
  5017.         quotes,   ".   The  same  escape  sequences  allowed  in  regular
  5018.  
  5019.  
  5020.         QTAwk                       - 6-22 -                        QTAwk
  5021.  
  5022.  
  5023.  
  5024.  
  5025.  
  5026.  
  5027.         Section 6.19.3                                        Expressions
  5028.  
  5029.  
  5030.         expressions are allowed in string constants. 
  5031.         
  5032.         6.19.4 Regular Expression Constants
  5033.         
  5034.          Regular Expression constants are character sequences enclosed in
  5035.         slashes,  '/',  Regular Expression are discussed fully in Section
  5036.         2. 
  5037.  
  5038.  
  5039.  
  5040.  
  5041.  
  5042.  
  5043.  
  5044.  
  5045.  
  5046.  
  5047.  
  5048.  
  5049.  
  5050.  
  5051.  
  5052.  
  5053.  
  5054.  
  5055.  
  5056.  
  5057.  
  5058.  
  5059.  
  5060.  
  5061.  
  5062.  
  5063.  
  5064.  
  5065.  
  5066.  
  5067.  
  5068.  
  5069.  
  5070.  
  5071.  
  5072.  
  5073.  
  5074.  
  5075.  
  5076.  
  5077.  
  5078.         QTAwk                       - 6-23 -                        QTAwk
  5079.  
  5080.  
  5081.  
  5082.  
  5083.  
  5084.  
  5085.  
  5086.  
  5087.  
  5088.  
  5089.  
  5090.  
  5091.  
  5092.  
  5093.  
  5094.  
  5095.  
  5096.  
  5097.  
  5098.  
  5099.  
  5100.  
  5101.  
  5102.  
  5103.  
  5104.  
  5105.  
  5106.  
  5107.  
  5108.  
  5109.  
  5110.  
  5111.  
  5112.  
  5113.  
  5114.  
  5115.  
  5116.  
  5117.  
  5118.  
  5119.  
  5120.  
  5121.  
  5122.  
  5123.  
  5124.  
  5125.  
  5126.  
  5127.  
  5128.  
  5129.  
  5130.  
  5131.  
  5132.  
  5133.  
  5134.  
  5135.  
  5136.         QTAwk                       - 6-24 -                        QTAwk
  5137.  
  5138.  
  5139.  
  5140.  
  5141.  
  5142.  
  5143.         Section 7.0                                                Arrays
  5144.  
  5145.  
  5146.         7.0 Arrays
  5147.         
  5148.          Arrays in QTAwk are a blending of Awk and C.  The use of the Awk
  5149.         associative  arrays  is  continued  and expanded to allow integer
  5150.         indices.  The use  of  the  comma  to  delineate  multiple  array
  5151.         indices  is discontinued.  The comma is now the sequence operator
  5152.         and will be so treated in array  index  expressions.   Thus,  the
  5153.         reference
  5154.         
  5155.         A[i,j]
  5156.         
  5157.          will now reference the element of 'A' subscripted by the current
  5158.         value of the variable j.   As  a  consequence  of  this  the  Awk
  5159.         built-in  variable  SUBSEP has been assigned a new meaning, refer
  5160.         to Section 4 and to  the  discussion  on  arrays  later  in  this
  5161.         section. 
  5162.         
  5163.         7.1 Multidimensional Arrays
  5164.         
  5165.          QTAwk  allows  multidimensional  arrays  referenced  in the same
  5166.         manner as C.  Thus:
  5167.         
  5168.         A[i][j]
  5169.         
  5170.          references the jth column of the ith row of the  two-dimensional
  5171.         array A. 
  5172.         
  5173.         7.2 Integer and String Indices
  5174.         
  5175.          Array subscripts may be strings.  Thus:
  5176.         
  5177.         A[i]["state"]
  5178.         
  5179.          would  reference  the  "state" element of the ith row of the two
  5180.         dimensional array, A.  QTAwk allows array indices  to  be  either
  5181.         integers or strings.  Single character indices, e.g., A['a'], are
  5182.         treated as integer indices with an index value equivalent to  the
  5183.         integer  ASCII value of the single character.  Integer and string
  5184.         indices may be used in  the  same  array.   Integer  indices  are
  5185.         stored  before  string indices.  Integer indices follow the usual
  5186.         numeric ordering and string indices follow  the  ASCII  collating
  5187.         sequence.   The ordering will be apparent in use of the 'in' form
  5188.         of the 'for' statement:
  5189.         
  5190.         for ( k in A ) statement
  5191.         
  5192.  
  5193.  
  5194.         QTAwk                        - 7-1 -                        QTAwk
  5195.  
  5196.  
  5197.  
  5198.  
  5199.  
  5200.  
  5201.         Section 7.2                                                Arrays
  5202.  
  5203.  
  5204.          k is stepped through  the  indices  of  the  singly  dimensioned
  5205.         array,  A,  in  the  order  stored.   Thus if A has the following
  5206.         indices: 1, 3, 5, 7, 8, 9, 10, 12, 14, "county", "state", "zip". 
  5207.         Then  k would be stepped through the indices in that order.  Note
  5208.         that allowing both  string  and  integer  indices  overcomes  the
  5209.         disconcerting  order  of  the  "stringized  numerical" indices of
  5210.         Awk.  Specifically, index 10 does not  precede  2  as  "10"  does
  5211.         precede  "2"  in  Awk.   QTAwk  still  allows  the use of numeric
  5212.         strings such as "10", "2", etc., but in  most  cases  where  such
  5213.         strings  would  be  used,  the  user should be aware that integer
  5214.         indices are now available and will prevent  the  counterintuitive
  5215.         ordering of Awk. 
  5216.         
  5217.          Character  constants,  or  variables assigned character constant
  5218.         values, may also be used for array indices.  When used  as  array
  5219.         indices, character constants are converted to their integer ASCII
  5220.         value and that value used as the index value.  Thus:
  5221.         
  5222.         A['a']
  5223.         
  5224.          and
  5225.         
  5226.         A[97]
  5227.         
  5228.          would access the same array element of A. 
  5229.         
  5230.          Note that only indexed elements of an array actually  referenced
  5231.         exist.   Thus, for the array A above, the elements for indices 2,
  5232.         4, 6 and 13 do not exist since they have  not  been  referenced. 
  5233.         This  follows  the  general  philosophy  that a variable does not
  5234.         exist until it has been referenced. 
  5235.         
  5236.         7.3 QTAwk Arrays in Arithmetic Expressions
  5237.         
  5238.          When Arrays are used in arithmetic  expressions  in  QTAwk,  the
  5239.         entire  array  is  operated  on or assigned.  For example, if the
  5240.         variable 'B' is a 3x3 array with the following values:
  5241.         
  5242.         B[1][1] = 11, B[1][2] = 12, B[1][3] = 13
  5243.         B[2][1] = 21, B[2][2] = 22, B[2][3] = 23
  5244.         B[3][1] = 31, B[3][2] = 32, B[3][3] = 33
  5245.         
  5246.          Assigning B to the variable 'A':
  5247.         
  5248.         A = B
  5249.         
  5250.  
  5251.  
  5252.         QTAwk                        - 7-2 -                        QTAwk
  5253.  
  5254.  
  5255.  
  5256.  
  5257.  
  5258.  
  5259.         Section 7.3                                                Arrays
  5260.  
  5261.  
  5262.          will duplicate the entire array into A. 
  5263.         
  5264.         A[1][1] = 11, A[1][2] = 12, A[1][3] = 13
  5265.         A[2][1] = 21, A[2][2] = 22, A[2][3] = 23
  5266.         A[3][1] = 31, A[3][2] = 32, A[3][3] = 33
  5267.         
  5268.          If A and B are array variables and C  is  a  scalar  (non-array)
  5269.         variable,  then the following expression forms for the assignment
  5270.         operators, 'op=', are legal:
  5271.         
  5272.         1.  A = B
  5273.             assign one array to a second.  The original elements of array
  5274.             A  are  deleted and the the elements of B duplicated into A. 
  5275.             
  5276.         2.  C = B
  5277.             assigning an array to a variable currently a  scalar.   Again
  5278.             the  elements  of  B  are duplicated into elements of C which
  5279.             becomes an array. 
  5280.             
  5281.         3.  A = C
  5282.             assigning a scalar to a variable  which  is  an  array.   The
  5283.             elements  of the array are discarded and the variable becomes
  5284.             a scalar. 
  5285.             
  5286.         4.  A = B[i]...[j]
  5287.             assigning an array element to a variable which  is  currently
  5288.             an  array.   Since  the element of an array is a scalar, this
  5289.             case is essentially the  same  as  the  immediately  previous
  5290.             case, and A becomes a scalar. 
  5291.             
  5292.         5.  A[i]...[j] = B[k]...[l]
  5293.             since  array  elements  are scalars, this is the usual scalar
  5294.             assignment case. 
  5295.             
  5296.         6.  A op= C
  5297.             the 'op=' operator is applied to every element of A.  Thus, A
  5298.             += 2, would add '2' to every element of A. 
  5299.             
  5300.         7.  A op= B
  5301.             the 'op=' operator is applied to every element of A for which
  5302.             an element exists in B with identical indices.   No  elements
  5303.             are  created  in  A  to  match  elements  of  B  with indices
  5304.             different from any element  of  A.   Thus,  the  sequence  of
  5305.             statements:
  5306.             
  5307.             A = B;
  5308.  
  5309.  
  5310.         QTAwk                        - 7-3 -                        QTAwk
  5311.  
  5312.  
  5313.  
  5314.  
  5315.  
  5316.  
  5317.         Section 7.3                                                Arrays
  5318.  
  5319.  
  5320.             A += B;
  5321.             
  5322.              would  leave  every element of A with twice the value of the
  5323.             corresponding element of B. 
  5324.         
  5325.          There  are  two  cases  of  using  arrays  with  the  assignment
  5326.         operators  that  are  not legal and for which QTAwk will issue an
  5327.         error message at runtime. 
  5328.         
  5329.         1.  A[i]...[j] = B
  5330.         2.  A[i]...[j] op= B
  5331.         3.  C op= B
  5332.         
  5333.          These are all variations on the same expression.  In  the  first
  5334.         case, the expression is attempting to assign an array to an array
  5335.         element.  Since an array element cannot be further expanded  into
  5336.         an array, the assignment is not allowed.  In the second and third
  5337.         cases, the expressions are attempting to operate on a scalar with
  5338.         an  array  and  assign  the  result to the scalar.  Both of these
  5339.         expressions fail for the same reason: an array cannot operate  on
  5340.         a  scalar.   It  is  possible  for  a  single value, a scalar, to
  5341.         operate on every element of an array,  but  the  reverse,  having
  5342.         each   element  of  the  array  operate  on  the  scalar  is  not
  5343.         permitted. 
  5344.         
  5345.          The reasoning prohibiting the second and third  cases  above  is
  5346.         extended to all binary expressions involving arrays in QTAwk.  In
  5347.         general, arrays are allowed in expressions with binary arithmetic
  5348.         operators:
  5349.         
  5350.         ~ ^ * / % + - << >> & @ |
  5351.         
  5352.          as well as string concatenation:
  5353.         
  5354.         A B (equivalent to A ∩ B)
  5355.         
  5356.          In  such expressions, arrays are allowed in the following forms:
  5357.         
  5358.         1.  A op B
  5359.         2.  A op C
  5360.         
  5361.          But not as
  5362.         
  5363.         C op A
  5364.         
  5365.          It could be argued that expressions such as,
  5366.  
  5367.  
  5368.         QTAwk                        - 7-4 -                        QTAwk
  5369.  
  5370.  
  5371.  
  5372.  
  5373.  
  5374.  
  5375.         Section 7.3                                                Arrays
  5376.  
  5377.  
  5378.         2 + A
  5379.         
  5380.          should be allowed since '+' is commutative  and  the  expression
  5381.         could be written equivalently as,
  5382.         
  5383.         A + 2
  5384.         
  5385.          This  is  true  for  addition,  but  not  for  all of the binary
  5386.         arithmetic operators.  For example, the division operator is  not
  5387.         commutative. 
  5388.         
  5389.         2 / A
  5390.         
  5391.          could not be written equivalently as:
  5392.         
  5393.         A / 2
  5394.         
  5395.          For  this  reason, QTAwk does not allow any array expressions of
  5396.         the form:
  5397.         
  5398.         scalar op array
  5399.         
  5400.          The unary arithmetic operators may also be used  to  operate  on
  5401.         entire arrays:
  5402.         
  5403.         ++A (prefix increment operator)
  5404.             
  5405.         --A (prefix decrement operator)
  5406.             
  5407.         A++ (post-fix increment operator)
  5408.             
  5409.         A-- (post-fix decrement operator)
  5410.             
  5411.         -A (Unary minus operator)
  5412.             
  5413.         +A (Unary plus operator)
  5414.             
  5415.         ~A (Unary one's complement operator)
  5416.         
  5417.          An expression such as:
  5418.         
  5419.         A + B
  5420.         
  5421.          will  result in an array with element indices identical to those
  5422.         of A, and with values which are the sum of the elements of A  and
  5423.         B, which have identical indices.  If A has an element for which B
  5424.  
  5425.  
  5426.         QTAwk                        - 7-5 -                        QTAwk
  5427.  
  5428.  
  5429.  
  5430.  
  5431.  
  5432.  
  5433.         Section 7.3                                                Arrays
  5434.  
  5435.  
  5436.         does not have a  corresponding  element,  the  resultant  element
  5437.         value  is equal to the A element value.  Elements of B which have
  5438.         no  corresponding  element  in  A  are  not  represented  in  the
  5439.         resultant array. 
  5440.         
  5441.          An  array with elements of double the value of the elements of B
  5442.         can created as:
  5443.         
  5444.         A = B;
  5445.         D = A + B;
  5446.         
  5447.          or as
  5448.         
  5449.         D = B + B;
  5450.         
  5451.          or as
  5452.         
  5453.         D = B * 2;
  5454.         
  5455.          any of the above sequence of statements will result in an array,
  5456.         D, with elements with indices identical to B, and with double the
  5457.         element values.  The array A could be made an array with elements
  5458.         twice the element values of B with the statement:
  5459.         
  5460.         A = B;
  5461.         A *= 2;
  5462.         
  5463.          Arrays  may be used in expressions with arithmetic operators and
  5464.         the whole array will be utilized in the  expression.   This  does
  5465.         not extend to all of the logical operators:
  5466.         
  5467.         ! < <= >= > == != && ||
  5468.         
  5469.          Using  an array with a logical operator listed above will result
  5470.         in the first  element  in  the  array  only  being  used  in  the
  5471.         expression. 
  5472.         
  5473.         7.4 Arrays as Regular Expressions
  5474.         
  5475.          Arrays  can  be  used  with the match operators, ~~ and !~, both
  5476.         their explicit use in  expressions  and  their  implicit  use  in
  5477.         patterns  and the built-in functions, 'match', 'sub' and 'gsub'. 
  5478.         The use of arrays as regular expressions is similar to the use of
  5479.         the  predefined  pattern,  GROUP.   Each  element of the array is
  5480.         treated as a separate regular expression and the matching process
  5481.         matches  against  all elements of the array.  If a match is found
  5482.  
  5483.  
  5484.         QTAwk                        - 7-6 -                        QTAwk
  5485.  
  5486.  
  5487.  
  5488.  
  5489.  
  5490.  
  5491.         Section 7.4                                                Arrays
  5492.  
  5493.  
  5494.         with one of the elements of the  array,  the  built-in  variable,
  5495.         MATCH_INDEX,  is  set  to  the  string value of the array element
  5496.         index.   If  the  array  is  multidimensional,  the  indices  are
  5497.         separated  by the string value of the built-in variable, SUBSEP. 
  5498.         The default value of SUBSEP is a single comma, ','. 
  5499.         
  5500.          When an  array  is  used  for  searching  for  multiple  regular
  5501.         expressions,  the  internal  form  of  the  combined  patterns is
  5502.         generated.  The internal form is not  discarded  once  the  match
  5503.         operation  has  been  completed.   The internal form is discarded
  5504.         whenever any element of  the  array  is  changed,  the  array  is
  5505.         discarded via the 'deletea' statement or the variable is assigned
  5506.         a new value. 
  5507.         
  5508.          The array can be assigned to another  variable,  after  a  match
  5509.         operation  and  the  internal  form  is  also assigned to the new
  5510.         variable.  This could preserve  the  internal  form  if  the  old
  5511.         variable is assigned a new value. 
  5512.         
  5513.          The  use  of  arrays  for  searching  for matches to one or more
  5514.         regular expressions, can be utilized to produce  dynamic  regular
  5515.         expressions which can change in time as when strings are used for
  5516.         regular expressions, but which retain the speed of static regular
  5517.         expressions and their static internal form.  For example, setting
  5518.         a single array element as:
  5519.         
  5520.         tp[1] = /Test: {var1}/;
  5521.         
  5522.          and matching against the array:
  5523.         
  5524.         if ( match_var ~~ tp ) expressions
  5525.         
  5526.          As long as the element  of  tp  is  not  changed,  the  internal
  5527.         regular expression form is used for matching.  Since the internal
  5528.         form is not re-derived for each match, the matching processes  is
  5529.         speeded up.  If the value of 'var1' changes or a new test pattern
  5530.         is desired, then tp[1] can be re-assigned:
  5531.         
  5532.         tp[1] = /Test: {var1}/;
  5533.         
  5534.          The assignment discards the internal regular expression form for
  5535.         the  tp  array  which  will  be  re-derived  on  the  next  match
  5536.         operation. 
  5537.         
  5538.          Arrays can be used in this manner not only in the action portion
  5539.         of pattern-action pairs, but also in the pattern portion.  Thus a
  5540.  
  5541.  
  5542.         QTAwk                        - 7-7 -                        QTAwk
  5543.  
  5544.  
  5545.  
  5546.  
  5547.  
  5548.  
  5549.         Section 7.4                                                Arrays
  5550.  
  5551.  
  5552.         pattern such as:
  5553.         
  5554.         tp {
  5555.         . 
  5556.         . 
  5557.         . 
  5558.         }
  5559.         
  5560.          can be used.  The first match against tp will set  the  internal
  5561.         regular  expression  form  for the array.  The internal form will
  5562.         not change until an element of tp is changed, then  the  internal
  5563.         form  will  be  re-derived  on the next match against the array. 
  5564.         
  5565.          Note that both individual elements of an array and the array  as
  5566.         a  whole can be used for matching.  Thus, matching against tp[1]:
  5567.         
  5568.         if ( mvar ~~ tp[1] ) expressions
  5569.         
  5570.          will match against the regular expression:
  5571.         
  5572.         /Test: {var1}/;
  5573.         
  5574.          The first such match will set the internal form of  the  regular
  5575.         expression  using the value of the variable 'var1' at that time. 
  5576.         This internal form does not change.  Re-assigning tp[1]:
  5577.         
  5578.         tp[1] = /Test: {var1}/;
  5579.         
  5580.          does not alter the regular expression internal form even  though
  5581.         the  internal  regular  expression form for the array tp has been
  5582.         discarded by the assignment.  Matching against  tp  as  an  array
  5583.         will  use  the  any  new  value for 'var1' at the time of the new
  5584.         match operation. 
  5585.         
  5586.          Arrays can be used in GROUP  patterns.   Any  match  against  an
  5587.         element of the array will activate the action associated with the
  5588.         array position in the GROUP and set the built-in variable, NG, to
  5589.         the  integer  value  for the position of the array in the GROUP. 
  5590.         Using arrays in GROUP  patterns  does  not  set  the  MATCH_INDEX
  5591.         variable.   Also  the  internal  regular  expression form for the
  5592.         GROUP patterns is not re-derived when the array changes. 
  5593.         
  5594.          The use of arrays as the  matching  regular  expression  in  the
  5595.         'gsub'  function is explained in Section 11.  The use of an array
  5596.         as the matching regular expression  in  the  'gsub'  function  as
  5597.         opposed  to  a  loop  for  multiple  regular  expressions is also
  5598.  
  5599.  
  5600.         QTAwk                        - 7-8 -                        QTAwk
  5601.  
  5602.  
  5603.  
  5604.  
  5605.  
  5606.  
  5607.         Section 7.4                                                Arrays
  5608.  
  5609.  
  5610.         described. 
  5611.  
  5612.  
  5613.  
  5614.  
  5615.  
  5616.  
  5617.  
  5618.  
  5619.  
  5620.  
  5621.  
  5622.  
  5623.  
  5624.  
  5625.  
  5626.  
  5627.  
  5628.  
  5629.  
  5630.  
  5631.  
  5632.  
  5633.  
  5634.  
  5635.  
  5636.  
  5637.  
  5638.  
  5639.  
  5640.  
  5641.  
  5642.  
  5643.  
  5644.  
  5645.  
  5646.  
  5647.  
  5648.  
  5649.  
  5650.  
  5651.  
  5652.  
  5653.  
  5654.  
  5655.  
  5656.  
  5657.  
  5658.         QTAwk                        - 7-9 -                        QTAwk
  5659.  
  5660.  
  5661.  
  5662.  
  5663.  
  5664.  
  5665.  
  5666.  
  5667.  
  5668.  
  5669.  
  5670.  
  5671.  
  5672.  
  5673.  
  5674.  
  5675.  
  5676.  
  5677.  
  5678.  
  5679.  
  5680.  
  5681.  
  5682.  
  5683.  
  5684.  
  5685.  
  5686.  
  5687.  
  5688.  
  5689.  
  5690.  
  5691.  
  5692.  
  5693.  
  5694.  
  5695.  
  5696.  
  5697.  
  5698.  
  5699.  
  5700.  
  5701.  
  5702.  
  5703.  
  5704.  
  5705.  
  5706.  
  5707.  
  5708.  
  5709.  
  5710.  
  5711.  
  5712.  
  5713.  
  5714.  
  5715.  
  5716.         QTAwk                       - 7-10 -                        QTAwk
  5717.  
  5718.  
  5719.  
  5720.  
  5721.  
  5722.  
  5723.         Section 8.0               Strings, Regular Expressions and Arrays
  5724.  
  5725.  
  5726.         8.0 Strings, Regular Expressions and Arrays
  5727.         
  5728.          Strings and regular expressions in QTAwk are very  similar,  yet
  5729.         very different.  Regular expressions can be used wherever strings
  5730.         are used and strings may be used in most cases  where  a  regular
  5731.         expression may be used. 
  5732.         
  5733.         8.1 Regular Expression and String Translation
  5734.         
  5735.          Regular  expressions and strings used as regular expressions are
  5736.         turned into an internal form for scanning the target string for a
  5737.         match.   For  regular expressions this process of conversion into
  5738.         the internal form is done once, when the  regular  expression  is
  5739.         first  used.   For  strings  the  process  is done every time the
  5740.         string is used as a regular expression. 
  5741.         
  5742.          The process of conversion into the internal  form  can  be  time
  5743.         consuming  if  done repeatedly.  The judicious use of strings and
  5744.         regular expressions can give  both  flexibility  and  speed.   By
  5745.         using  regular  expressions  in those places where the content of
  5746.         the regular expression will not change after the first  use,  the
  5747.         speed  of  a single conversion can be attained.  By using strings
  5748.         in those places where a regular expression is called  for,  e.g.,
  5749.         the  first  argument  of  the  'gsub' function and the right hand
  5750.         expression  for  the  match   operators,   the   flexibility   of
  5751.         dynamically  changing expressions can be gained at the expense of
  5752.         speed. 
  5753.         
  5754.          QTAwk has a form  of  regular  expression  between  the  use  of
  5755.         regular   expression   constants   and  string  constants,  array
  5756.         variables.  When an array variable  is  used  for  matching,  the
  5757.         internal   regular  expression  form  for  the  entire  array  is
  5758.         derived.  The derived internal form is kept  after  the  matching
  5759.         operation and is discarded only when the array is changed.  Thus,
  5760.         arrays are like regular expression constants in that the internal
  5761.         form  is  kept  between matching operations, but also like string
  5762.         constants in that the internal can be  changed  when  necessary. 
  5763.         
  5764.         8.2 Regular Expressions in Patterns
  5765.         
  5766.          There  are, however, some places where strings cannot be used as
  5767.         regular expressions.  The most notable of  these  is  stand-alone
  5768.         regular expressions in patterns.  Stand-alone regular expressions
  5769.         in patterns are a shorthand for:
  5770.         
  5771.         $0 ~~ /re/
  5772.  
  5773.  
  5774.         QTAwk                        - 8-1 -                        QTAwk
  5775.  
  5776.  
  5777.  
  5778.  
  5779.  
  5780.  
  5781.         Section 8.2               Strings, Regular Expressions and Arrays
  5782.  
  5783.  
  5784.          Thus, complex expressions may be built from stand-alone  regular
  5785.         expressions in patterns.  For example, the pattern:
  5786.         
  5787.         /re1/ && /re2/
  5788.         
  5789.          will match only those records for which both regular expressions
  5790.         re1 and re2 match.  Using the logical, relational,  equality  and
  5791.         bit-wise  operators,  two  or  more  regular  expressions  may be
  5792.         combined in patterns  to  test  records  against  more  than  one
  5793.         regular expression.  The following pattern:
  5794.         
  5795.         /re1/ != /re2/
  5796.         
  5797.          will  select  only  those  records matching re1 and NOT matching
  5798.         re2.  But records matching re2 and not matching re1 will also  be
  5799.         selected. 
  5800.         
  5801.         !/re1/
  5802.         
  5803.          will  select those records not matching the regular expression. 
  5804.         To use regular expressions in this manner the  following  logical
  5805.         truth table may be used for selecting desired records which match
  5806.         or do not match desired regular expressions:
  5807.         
  5808.         r1    T   T   F   F                                              
  5809.         r2    T   F   T   F                                              
  5810.         
  5811.         ==    T   F   F   T                                              
  5812.         !=    F   T   T   F                                              
  5813.         <=    T   F   T   T                                              
  5814.         <     F   F   T   F                                              
  5815.         >     F   T   F   F                                              
  5816.         >=    T   T   F   T                                              
  5817.         &     T   F   F   F                                              
  5818.         |     T   T   T   F                                              
  5819.         @     F   T   T   F                                              
  5820.         &&    T   F   F   F                                              
  5821.         ||    T   T   T   F                                              
  5822.         
  5823.          Thus, if you wanted to select only those  records  that  matched
  5824.         both  regular  expressions  and reject those records that did not
  5825.         match both, the following patterns are the only ones  to  do  so:
  5826.         
  5827.         /re1/ & /re2/
  5828.         
  5829.          or
  5830.  
  5831.  
  5832.         QTAwk                        - 8-2 -                        QTAwk
  5833.  
  5834.  
  5835.  
  5836.  
  5837.  
  5838.  
  5839.         Section 8.2               Strings, Regular Expressions and Arrays
  5840.  
  5841.  
  5842.         /re1/ && /re2/
  5843.         
  5844.          To  select  those records matching only re1 and not re2 or both,
  5845.         the following patterns could be used:
  5846.         
  5847.         /re1/ > /re2/
  5848.         
  5849.          or
  5850.         
  5851.         /re1/ && !/re2/
  5852.         
  5853.          Note that strings could  be  used  for  regular  expressions  in
  5854.         patterns  instead  of  stand-alone regular expressions.  However,
  5855.         the economy of expression of the stand-alone regular  expressions
  5856.         would   be  lost.   For  example,  for  the  stand-alone  regular
  5857.         expression pattern:
  5858.         
  5859.         /re1/ && !/re2/
  5860.         
  5861.          The following string expression could be used:
  5862.         
  5863.         ($0 ~~ "re1") && ($0 !~ "re2")
  5864.         
  5865.          or
  5866.         
  5867.         ($0 ~~ "re1") && !($0 ~~ "re2")
  5868.         
  5869.          If re1 or re2 contained named expressions, then  the  values  of
  5870.         the  variables  contained  in  re1  or  re2  could  be changed to
  5871.         dynamically alter the lines matched.  The  matching  process  for
  5872.         the  above  string  expressions would be much slower than for the
  5873.         correspond expressions  with  stand-alone  regular  expressions. 
  5874.         
  5875.          Array  variables  could  also be used for those situations where
  5876.         re1 and/or re2 contained named expressions which change  and  for
  5877.         which  the  change  must  be  reflected in the matching process. 
  5878.         Also, arrays allow the user better control over when the internal
  5879.         regular expression form is derived.  Setting:
  5880.         
  5881.          are1[1] = re1;
  5882.         
  5883.          and
  5884.         
  5885.          are2[1] = re2;
  5886.         
  5887.          The use of are1 and are2 as matching patterns:
  5888.  
  5889.  
  5890.         QTAwk                        - 8-3 -                        QTAwk
  5891.  
  5892.  
  5893.  
  5894.  
  5895.  
  5896.  
  5897.         Section 8.2               Strings, Regular Expressions and Arrays
  5898.  
  5899.  
  5900.          are1 && are2
  5901.         
  5902.          would be identical to
  5903.         
  5904.          re1 && re2
  5905.         
  5906.          as  a  pattern expression.  The advantage of using the arrays is
  5907.         when any named expression in re1 and/or r2  change  value.   Then
  5908.         simply re-assigning the arrays as:
  5909.         
  5910.          are1[1] = re1;
  5911.         
  5912.          and
  5913.         
  5914.          are2[1] = re2;
  5915.         
  5916.          would  discard  the  internal  regular  expression form for both
  5917.         arrays which would then be re-derived when the  pattern  is  next
  5918.         matched  against  an  input record.  The use of arrays as pattern
  5919.         matching  regular  expressions  yields  truely  dynamic   regular
  5920.         expressions  with the user utility having total control over when
  5921.         the internal form is discarded and re-derived. 
  5922.         
  5923.          Regular expressions and strings  may  also  be  used  in  'case'
  5924.         statements   as   described  later.   However,  strings  are  not
  5925.         equivalent to  regular  expressions  in  the  'case'  statement. 
  5926.  
  5927.  
  5928.  
  5929.  
  5930.  
  5931.  
  5932.  
  5933.  
  5934.  
  5935.  
  5936.  
  5937.  
  5938.  
  5939.  
  5940.  
  5941.  
  5942.  
  5943.  
  5944.  
  5945.  
  5946.  
  5947.  
  5948.         QTAwk                        - 8-4 -                        QTAwk
  5949.  
  5950.  
  5951.  
  5952.  
  5953.  
  5954.  
  5955.         Section 9.0                                       Pattern-Actions
  5956.  
  5957.  
  5958.         9.0 Pattern-Actions
  5959.         
  5960.          The fundamental QTAwk processing sequence is:
  5961.         
  5962.         1.  QTAwk  opens  each  input  file  and reads the file record by
  5963.             record, a record is determined by the value of  the  built-in
  5964.             variable RS. 
  5965.         2.  When  each record is read, it is split into fields determined
  5966.             by the value of the built-in variable FS. 
  5967.         3.  Each pattern expression is executed. 
  5968.         4.  The associated action is executed for each pattern expression
  5969.             which evaluates to true. 
  5970.         
  5971.          The above basic processing loop may be altered for special cases
  5972.         as explained at the end of this section. 
  5973.         
  5974.          QTAwk recognizes utilities in the following format:
  5975.         
  5976.         pattern { action }
  5977.         
  5978.          The opening brace, '{', of the action must be on the  same  line
  5979.         as the pattern.  Patterns control the execution of actions.  When
  5980.         a  pattern  matches  a  record,  i.e.,  the  pattern   expression
  5981.         evaluates  to  a  true value, the associated action is executed. 
  5982.         Patterns  consist  of  valid   QTAwk   expressions   or   regular
  5983.         expressions.  The sequence operator acquires a special meaning in
  5984.         pattern  expressions  and  loses  its  meaning  as   a   sequence
  5985.         operator. 
  5986.         
  5987.          QTAwk   follows   the   C  practice  in  logical  operations  of
  5988.         considering a nonzero numeric value as true and  a  zero  numeric
  5989.         value  as  false.  This has been expanded in QTAwk for strings by
  5990.         considering the null string as false and any non-null  string  as
  5991.         true.   When  a  logical  operation  is  performed, the operation
  5992.         returns an integer value of one (1) for a true condition  and  an
  5993.         integer value of zero (0) for a false condition. 
  5994.         
  5995.         9.1 QTAwk Patterns
  5996.         
  5997.          QTAwk  recognizes  the  following  type of pattern/action pairs:
  5998.         
  5999.         1.  { action }
  6000.             the pattern is assumed TRUE for every record and  the  action
  6001.             is executed for all records. 
  6002.             
  6003.         2.  expression
  6004.  
  6005.  
  6006.         QTAwk                        - 9-1 -                        QTAwk
  6007.  
  6008.  
  6009.  
  6010.  
  6011.  
  6012.  
  6013.         Section 9.1                                       Pattern-Actions
  6014.  
  6015.  
  6016.             the  default action {print;} is executed for every record for
  6017.             which expression evaluates to TRUE. 
  6018.             
  6019.         3.  expression { action }
  6020.             the action is executed for each record for  which  expression
  6021.             evaluates to TRUE. 
  6022.             
  6023.         4.  /regular expression/ { action }
  6024.             the  actions  are  executed  for  each  record  for which the
  6025.             regular expression matches  a  string  in  the  record  (TRUE
  6026.             condition).    The   regular   expression  may  be  specified
  6027.             explicitly as shown or specified by a variable with a regular
  6028.             expression value.  For example, setting the variable, var_re,
  6029.             as:
  6030.             
  6031.             var_re = /Replacement String/;
  6032.             
  6033.              and specifying the pattern as:
  6034.             
  6035.             var_re { action }
  6036.             
  6037.              would be identical to:
  6038.             
  6039.             /Replacement String/ { action }
  6040.             
  6041.              The use of a variable has the advantage  of  being  able  to
  6042.             change  to  the value of the variable.  Changing the variable
  6043.             to another regular expression gives  the  QTAwk  utility  the
  6044.             capability  of  dynamically  changing  patterns  recognized. 
  6045.             
  6046.         5.  compound pattern { action }
  6047.             the pattern combines regular expressions  with  logical  NOT,
  6048.             '!',  logical AND, '&&', logical OR, '||', bit-wise AND, '&',
  6049.             bit-wise  OR,  '|',  bit-wise  XOR,   '@',   the   relational
  6050.             operators, '<=', '<', '>', '>=', the equality operators, '=='
  6051.             and '!=', and the matching operators,  '~~'  and  '!~'.   The
  6052.             action  is  executed  for  each record for which the compound
  6053.             pattern is TRUE. 
  6054.             
  6055.         6.  expression1 , expression2 { action }
  6056.             range pattern.  The action is executed for the  first  record
  6057.             for   which  expression1  is  TRUE  and  every  record  until
  6058.             expression2 evaluates TRUE.  The range  is  inclusive.   This
  6059.             illustrates  the  special meaning of the sequence operator in
  6060.             patterns. 
  6061.             
  6062.  
  6063.  
  6064.         QTAwk                        - 9-2 -                        QTAwk
  6065.  
  6066.  
  6067.  
  6068.  
  6069.  
  6070.  
  6071.         Section 9.1                                       Pattern-Actions
  6072.  
  6073.  
  6074.         7.  predefined pattern { action }
  6075.             the predefined patterns are described next
  6076.         
  6077.         9.2 QTAwk Predefined Patterns
  6078.         
  6079.          QTAwk provides five predefined patterns, all  of  which  (except
  6080.         for  the  'GROUP'  pattern) require actions.  The five predefined
  6081.         patterns are:
  6082.         
  6083.         1.  BEGIN { action }
  6084.             the action(s) associated with the BEGIN pattern are  executed
  6085.             once  prior  to  opening  the first input file.  There may be
  6086.             multiple BEGIN {  action  }  combinations.   Each  action  is
  6087.             executed in the order in which it is specified. 
  6088.             
  6089.         2.  INITIAL { action }
  6090.             or
  6091.             INITIALIZE { action }
  6092.             the   action(s)  associated  with  the  INITIAL  (INITIALIZE)
  6093.             pattern are executed after each  input  file  is  opened  and
  6094.             before  the  first  record  is  read.   There may be multiple
  6095.             INITIAL { action } combinations.  Each action is executed  in
  6096.             the order in which it is specified. 
  6097.             
  6098.         3.  GROUP expression { action }
  6099.             
  6100.             GROUP expression1 { action }
  6101.             GROUP expression2 { action }
  6102.             GROUP expression3 { action }
  6103.                 
  6104.             or
  6105.                 
  6106.             GROUP expression1
  6107.             GROUP expression2 { action }
  6108.             GROUP expression3
  6109.             GROUP expression4 { action }
  6110.                 
  6111.             or
  6112.                 
  6113.             GROUP {exp}1
  6114.             GROUP {exp}2 { action }
  6115.             GROUP {exp}3
  6116.             GROUP {exp}4
  6117.             
  6118.              the  pattern associated with the 'GROUP' pattern keyword may
  6119.             be any valid QTAwk expression.  All expressions  in  a  GROUP
  6120.  
  6121.  
  6122.         QTAwk                        - 9-3 -                        QTAwk
  6123.  
  6124.  
  6125.  
  6126.  
  6127.  
  6128.  
  6129.         Section 9.2                                       Pattern-Actions
  6130.  
  6131.  
  6132.             are  evaluated  when  the  GROUP  is first matched against an
  6133.             input record.  The result of the evaluation is converted to a
  6134.             regular expression for matching.  If the result of evaluating
  6135.             a GROUP expression is an array, the entire array is used  for
  6136.             matching  at  the  current  position  in the GROUP, i.e., all
  6137.             elements of the array are converted  to  regular  expressions
  6138.             and each is matched against the current input record. 
  6139.             
  6140.              All  consecutive  GROUP/action  pairs  are  grouped  and the
  6141.             search for the regular expressions optimized over the group. 
  6142.             Each  expression  of  the  GROUP  may  have a separate action
  6143.             associated with it.  In this case the appropriate  action  is
  6144.             executed  if  the  expression is matched on the current input
  6145.             record.  If the action for a expression is  not  given,  then
  6146.             the  next  action explicitly given is executed.  If no action
  6147.             is given for the last expression of a GROUP, then the default
  6148.             action
  6149.             
  6150.             { print ; }
  6151.             
  6152.              is assigned to it.  When one of the expressions of the GROUP
  6153.             is matched, the built-in variable, NG, is set  equal  to  the
  6154.             number  of  the expression.  The numbering of the expressions
  6155.             in the GROUP starts with one, 1. 
  6156.             
  6157.              There may be more than one GROUP  of  expression  patterns. 
  6158.             Any  pattern not preceded with the 'GROUP' keyword will cause
  6159.             a GROUP to be terminated.   The  occurrence  of  the  'GROUP'
  6160.             keyword again will start a new GROUP and the numbering of the
  6161.             new group starts at one, 1. 
  6162.             
  6163.              GROUP patterns are discussed in more detail later. 
  6164.             
  6165.         4.  NOMATCH { action }
  6166.             the  action(s)  associated  with  the  NOMATCH  pattern   are
  6167.             executed for each record for which no pattern is TRUE.  There
  6168.             may be multiple NOMATCH { action } combinations.  Each action
  6169.             is executed in the order in which it is specified. 
  6170.             
  6171.         5.  FINAL { action }
  6172.             or
  6173.             FINALIZE { action }
  6174.             the  actions associated with the FINAL (FINALIZE) pattern are
  6175.             executed after the last record of each input  file  has  been
  6176.             read  and  before  the file is closed.  There may be multiple
  6177.             FINAL { action } combinations.  Each action  is  executed  in
  6178.  
  6179.  
  6180.         QTAwk                        - 9-4 -                        QTAwk
  6181.  
  6182.  
  6183.  
  6184.  
  6185.  
  6186.  
  6187.         Section 9.2                                       Pattern-Actions
  6188.  
  6189.  
  6190.             the order in which it is specified. 
  6191.             
  6192.         6.  END ( action )
  6193.             the  action(s)  associated  with the END pattern are executed
  6194.             once after the last input file has been closed.  There may be
  6195.             multiple  END  {  action  }  combinations.   Each  action  is
  6196.             executed in the order in which it is specified. 
  6197.         
  6198.          Note that there may be multiple predefined pattern-action  pairs
  6199.         defined  in  an  QTAwk  utility.   Each action is executed at the
  6200.         appropriate time in the order defined. 
  6201.         
  6202.          For some QTAwk utilities, the basic processing loop as  outlined
  6203.         at  the  beginning of this chapter may be slower than necessary. 
  6204.         If  all  actions  of  a  utility  are  associated  with   regular
  6205.         expressions  or  if a certain record matching one or more regular
  6206.         expressions must be found before any actions are  executed,  then
  6207.         the process of reading all records and parsing into fields before
  6208.         executing pattern expressions can  be  slow.   For  this  purpose
  6209.         QTAwk has two special built-in variables:
  6210.         
  6211.         1.  FILE_SEARCH, and
  6212.         2.  FILE_SEARCH_PAT
  6213.         
  6214.          When  FILE_SEARCH  is  TRUE,  the  next  record read will be the
  6215.         record matching a regular expression  from  FILE_SEARCH_PAT.   If
  6216.         FILE_SEARCH is FALSE, the normal file input process is followed. 
  6217.         The file search process may be turned on and off as necessary for
  6218.         a single input file in this manner. 
  6219.         
  6220.          FILE_SEARCH_PAT  is  set  by  the  user  utility  to one or more
  6221.         regular expressions against which records from the current  input
  6222.         file are matched.  FILE_SEARCH_PAT may be set to a single regular
  6223.         expression as a simple variable, e.g.,
  6224.         
  6225.         ■  FILE_SEARCH_PAT = /test string/;
  6226.         
  6227.          or a singly dimensioned array, e.g.,
  6228.         
  6229.         ■  FILE_SEARCH_PAT[1] = /test string 1/;
  6230.         ■  FILE_SEARCH_PAT[2] = /test string 2/;
  6231.         ■  FILE_SEARCH_PAT[3] = /test string 3/;
  6232.         ■  FILE_SEARCH_PAT[4] = /test string 4/;
  6233.         
  6234.          or a multidimensioned array, e.g.,
  6235.         
  6236.  
  6237.  
  6238.         QTAwk                        - 9-5 -                        QTAwk
  6239.  
  6240.  
  6241.  
  6242.  
  6243.  
  6244.  
  6245.         Section 9.2                                       Pattern-Actions
  6246.  
  6247.  
  6248.         ■  FILE_SEARCH_PAT[1][1] = /test string 1,1/;
  6249.         ■  FILE_SEARCH_PAT[1][2] = /test string 1,2/;
  6250.         ■  FILE_SEARCH_PAT[1][3] = /test string 1,3/;
  6251.         ■  FILE_SEARCH_PAT[2][1] = /test string 2,1/;
  6252.         ■  FILE_SEARCH_PAT[2][2] = /test string 2,2/;
  6253.         ■  FILE_SEARCH_PAT[2][3] = /test string 2,3/;
  6254.         ■  FILE_SEARCH_PAT[3][1] = /test string 3,1/;
  6255.         ■  FILE_SEARCH_PAT[3][2] = /test string 3,2/;
  6256.         ■  FILE_SEARCH_PAT[3][3] = /test string 3,3/;
  6257.         
  6258.          When FILE_SEARCH is TRUE, the current input file is scanned  for
  6259.         a  match  to  FILE_SEARCH_PAT.  When a record is found matching a
  6260.         regular expression in FILE_SEARCH_PAT, the record is read, parsed
  6261.         into   fields   according  to  FS  and  each  pattern  expression
  6262.         executed.  The associated actions for  TRUE  pattern  expressions
  6263.         are  executed.   Note  that  the variable RS still determines the
  6264.         parsing of the input file into records. 
  6265.         
  6266.          Under some circumstances, the above process can return  in  '$0'
  6267.         multiple  records  from the current input file.  In searching the
  6268.         input file for a match with FILE_SEARCH_PAT,  a  match  may  span
  6269.         more than one record if the new variable, SPAN_RECORDS, is TRUE. 
  6270.         In this case, '$0' is set to the full set of records spanning the
  6271.         match  to  FILE_SEARCH_PAT and FNR is set to the record number of
  6272.         the last record in $0. 
  6273.         
  6274.          If SPAN_RECORDS is FALSE, any matches to FILE_SEARCH_PAT are not
  6275.         allowed to span input records and '$0' will contain only a single
  6276.         record. 
  6277.         
  6278.          The following simple QTAwk utility will mimic the QTGrep program
  6279.         in  searching  for  multiple  regular expression and keywords and
  6280.         print them.  Using the ability, via FILE_SEARCH, to process  only
  6281.         those  lines which match a desired pattern, speeds the processing
  6282.         of the file considerably. 
  6283.         
  6284.  
  6285.  
  6286.  
  6287.  
  6288.  
  6289.  
  6290.  
  6291.  
  6292.  
  6293.  
  6294.  
  6295.  
  6296.         QTAwk                        - 9-6 -                        QTAwk
  6297.  
  6298.  
  6299.  
  6300.  
  6301.  
  6302.  
  6303.         Section 9.2                                       Pattern-Actions
  6304.  
  6305.  
  6306.         # QTAwk Utility To Mimic QTGrep Program -- Only
  6307.         # Slower
  6308.         #
  6309.         # Scan Specified Files For Matches To Multiple
  6310.         # Regular Expressions And Keywords And Print
  6311.         # Matching Lines With Line Number And Number Of
  6312.         # Match
  6313.         #
  6314.         # Have Explicitly Written Regular Expressions To
  6315.         # Match In 'BEGIN' Action And Must Change 'BEGIN'
  6316.         # Action For Differing Searches. 
  6317.         #
  6318.         # Use FILE_SEARCH And FILE_SEARCH_PAT Built-In
  6319.         # Variables To Speed Search - Process ONLY Those
  6320.         # Lines Which Match An Element In The
  6321.         # FILE_SEARCH_PAT Array. 
  6322.         #
  6323.         # Set SPAN_RECORDS To:
  6324.         # TRUE - Allow Matches To Span Multiple Records
  6325.         # FALSE - Confine Matches To A Single Record
  6326.         # Have Set Span_records To TRUE In This Version. 
  6327.         #
  6328.         BEGIN {
  6329.         #### Patterns To Find Listed Below:
  6330.         #
  6331.         # Set First Patterns To Find
  6332.         # FILE_SEARCH_PAT[1] = /Test Pattern 1/;
  6333.         # FILE_SEARCH_PAT[2] = /Test Pattern 2/;
  6334.         # FILE_SEARCH_PAT[3] = /Test Pattern 3/;
  6335.         # FILE_SEARCH_PAT[4] = /Test Pattern 4/;
  6336.         #### Patterns To Find Listed Above:
  6337.         # Allow Matches To Span One Or More Input Records
  6338.         SPAN_RECORDS = TRUE;
  6339.         # Indicate Whether Searching For Multiple Patterns
  6340.         multiple_search = FALSE;
  6341.         # Turn On File Search Mode For Faster Processing
  6342.         FILE_SEARCH = TRUE;
  6343.         }
  6344.         INITIAL {
  6345.         fprintf("stderr","%s\n",FILENAME);
  6346.         match_cnt = 0;
  6347.         record_cnt = 0;
  6348.         }
  6349.         {
  6350.         match_cnt++;
  6351.         record_cnt++;
  6352.  
  6353.  
  6354.         QTAwk                        - 9-7 -                        QTAwk
  6355.  
  6356.  
  6357.  
  6358.  
  6359.  
  6360.  
  6361.         Section 9.2                                       Pattern-Actions
  6362.  
  6363.  
  6364.         # set number of expression matched - match index, mi
  6365.         if ( multiple_search ) mi = MATCH_INDEX + 0; else mi = 1;
  6366.         # Check If Matches Span Multiple Records
  6367.         # If So - Then Split Records Out Of Input Record, $0, And
  6368.         # Compute Record Count Of First Record
  6369.         # Print Multiple Records With  Leading  Zeros  On  Record  Number
  6370.         # And Expression Count To Flag That Multiple Record Match
  6371.         if ( SPAN_RECORDS && match($0,/\n/) ) {
  6372.         cnt = split($0,lines,/\n/);
  6373.         fnr = FNR - cnt + 1;
  6374.         record_cnt += cnt - 1;
  6375.         for ( i in lines )
  6376.         printf("%06uE: %06uR: %s\n",mi,fnr++,lines[i]);
  6377.         } else printf("%6uE: %6uR: %s\n", mi,FNR ,$0);
  6378.         }
  6379.         # Output Totals For Individual File
  6380.         FINAL {
  6381.         # Update Totals Across Files
  6382.         tmatch_cnt += match_cnt;
  6383.         trecord_cnt += record_cnt;
  6384.         printf("%s%s\n",FILEPATH,FILENAME);
  6385.         printf(" Matches: %6u\n",match_cnt);
  6386.         printf("Records Matched: %6u\n",record_cnt);
  6387.         printf("Records Scanned: %6u\n\n",FNR);
  6388.         }
  6389.         # Output Totals For All Files
  6390.         END {
  6391.         printf("Total Matches: %6u\n",tmatch_cnt);
  6392.         printf("Total Records Matched: %6u\n",trecord_cnt);
  6393.         printf("Total Records Scanned: %6u\n",NR);
  6394.         }
  6395.         
  6396.          Another  handy  use  of FILE_SEARCH is to use FILE_SEARCH_PAT to
  6397.         search for the first line in a range of records to be processed. 
  6398.         When   the  first  record  is  found  using  the  file  searching
  6399.         capabilities of QTAwk, FILE_SEARCH is set to false and the  range
  6400.         of  records  is processed normally.  After the last record in the
  6401.         range has been processed, FILE_SEARCH is set to true to  continue
  6402.         the file search for the next cluster. 
  6403.         
  6404.          Such a utility may resemble:
  6405.         
  6406.         #   QTAwk  Utility  To  Rapidly  Find  And  Process  Clusters  Of
  6407.         Records. 
  6408.         # Record Cluster Start Found By Matching FILE_SEARCH_PAT
  6409.         BEGIN {
  6410.  
  6411.  
  6412.         QTAwk                        - 9-8 -                        QTAwk
  6413.  
  6414.  
  6415.  
  6416.  
  6417.  
  6418.  
  6419.         Section 9.2                                       Pattern-Actions
  6420.  
  6421.  
  6422.         FILE_SEARCH = TRUE;
  6423.         FILE_SEARCH_PAT[1] = /search pattern 1/;
  6424.         FILE_SEARCH_PAT[2] = /search pattern 2/;
  6425.         FILE_SEARCH_PAT[3] = /search pattern 3/;
  6426.         FILE_SEARCH_PAT[4] = /search pattern 4/;
  6427.         FILE_SEARCH_PAT[5] = /search pattern 5/;
  6428.         }
  6429.         # Have Found First Record Matching A Pattern In
  6430.         # FILE_SEARCH_PAT.  Turn File Search Mode Off
  6431.         # And Process Range Of Records Normally
  6432.         FILE_SEARCH {
  6433.         FILE_SEARCH = FALSE;
  6434.         .  # actions to be taken on record matching
  6435.         .  # FILE_SEARCH_PAT
  6436.         . 
  6437.         . 
  6438.         . 
  6439.         . 
  6440.         . 
  6441.         # Delete Next Statement If  Record  Matching  FILE_SEARCH_PAT  Is
  6442.         # To Be Matched Against Patterns
  6443.         next;
  6444.         }
  6445.         # Pattern/Actions For Records To Be Processed Normally
  6446.         pattern1 {
  6447.         # actions
  6448.         }
  6449.         pattern2 {
  6450.         # actions
  6451.         }
  6452.         . 
  6453.         . 
  6454.         . 
  6455.         # Pattern/Action For Last Record In Range
  6456.         # Reset FILE_SEARCH To True To Resume
  6457.         # File Search Mode.  May Also Set FILE_SEARCH_PAT
  6458.         # To Alter Matching Conditions For Next Record Cluster
  6459.         pattern_l {
  6460.         FILE_SEARCH = TRUE;
  6461.         . 
  6462.         . 
  6463.         . 
  6464.         }
  6465.         
  6466.          Note  if  FILE_SEARCH_PAT  is  not  set, then it has the default
  6467.         value of the null string.  A match against the null  string  will
  6468.  
  6469.  
  6470.         QTAwk                        - 9-9 -                        QTAwk
  6471.  
  6472.  
  6473.  
  6474.  
  6475.  
  6476.  
  6477.         Section 9.2                                       Pattern-Actions
  6478.  
  6479.  
  6480.         match  null,  or  zero length, records (QTAwk silently replaces a
  6481.         null  string  regular  expression  pattern   with   the   regular
  6482.         expression  /^$/.   Thus, the following very simple QTAwk utility
  6483.         will find all  null  records  in  a  given  file  and  print  the
  6484.         corresponding record numbers. 
  6485.         
  6486.          BEGIN { FILE_SEARCH = TRUE; }
  6487.         
  6488.          { print FNR; }
  6489.  
  6490.  
  6491.  
  6492.  
  6493.  
  6494.  
  6495.  
  6496.  
  6497.  
  6498.  
  6499.  
  6500.  
  6501.  
  6502.  
  6503.  
  6504.  
  6505.  
  6506.  
  6507.  
  6508.  
  6509.  
  6510.  
  6511.  
  6512.  
  6513.  
  6514.  
  6515.  
  6516.  
  6517.  
  6518.  
  6519.  
  6520.  
  6521.  
  6522.  
  6523.  
  6524.  
  6525.  
  6526.  
  6527.  
  6528.         QTAwk                       - 9-10 -                        QTAwk
  6529.  
  6530.  
  6531.  
  6532.  
  6533.  
  6534.  
  6535.         Section 10.0                                       Group Patterns
  6536.  
  6537.  
  6538.         10.0 Group Patterns
  6539.         
  6540.          GROUP patterns follow the syntax:
  6541.         
  6542.         GROUP exp1 { optional action }
  6543.         GROUP /re2/ { optional action }
  6544.         GROUP var3 { optional action }
  6545.         GROUP "st4" { optional action }
  6546.         
  6547.          Actions  are  optional  with  any  particular  expression in the
  6548.         group.  If no action is given, the next action specified  in  the
  6549.         group  is  executed.   If  no  action  is  specified for the last
  6550.         expression in a group, the default action, "{print;}" is assigned
  6551.         to it. 
  6552.         
  6553.          Any  utility  may have more than one GROUP of patterns.  A group
  6554.         is terminated by  any  pattern  not  starting  with  the  'GROUP'
  6555.         keyword. 
  6556.         
  6557.         10.1 GROUP Pattern Advantage
  6558.         
  6559.          GROUP patterns have two distinct advantages in QTAwk:
  6560.         
  6561.         1.  the  regular  expressions  corresponding  to  the expressions
  6562.             contained in the GROUP are optimized to decrease search time,
  6563.             and
  6564.             
  6565.         2.  input  records  are searched once for all regular expressions
  6566.             in a GROUP.  If the regular  expressions  were  organized  as
  6567.             individual   pattern/actions,   each   record   is   searched
  6568.             separately for each regular expression. 
  6569.         
  6570.          For utilities containing many regular  expression  patterns  for
  6571.         which  to search, a program organized into one or more GROUPs can
  6572.         be many  times  faster  than  a  utility  organized  as  ordinary
  6573.         pattern/action pairs.  For example, the QTAwk utility in Appendix
  6574.         iv searches a C source file listing for ANSI C  Standard  defined
  6575.         names.   The utility organizes the search into a single GROUP and
  6576.         will search a source file approximately 6 times faster  than  the
  6577.         same  utility  organized as separate pattern/action pairs without
  6578.         the use of a GROUP. 
  6579.         
  6580.         10.2 GROUP Pattern Disadvantage
  6581.         
  6582.          GROUP  patterns  have  one  disadvantage  compared  to  ordinary
  6583.         pattern/action  pairs.   QTAwk  will find only one of the regular
  6584.  
  6585.  
  6586.         QTAwk                       - 10-1 -                        QTAwk
  6587.  
  6588.  
  6589.  
  6590.  
  6591.  
  6592.  
  6593.         Section 10.2                                       Group Patterns
  6594.  
  6595.  
  6596.         expressions in a GROUP.  A set of GROUP patterns:
  6597.         
  6598.         GROUP expression1 { action1; }
  6599.         GROUP expression2 { action2; }
  6600.         GROUP expression3 { action3; }
  6601.         
  6602.          is similar in execution to:
  6603.         
  6604.         $0 ~~ expression1 { action1; next; }
  6605.         $0 ~~ expression2 { action2; next; }
  6606.         $0 ~~ expression3 { action3; next; }
  6607.         
  6608.          If more than one regular expression in  a  group  will  match  a
  6609.         given  string  in the input record, the regular expression listed
  6610.         first in the GROUP will be matched  and  the  appropriate  action
  6611.         executed.   If all regular expression patterns in a GROUP must be
  6612.         found in input records, then separate pattern-action  pairs  must
  6613.         be used. 
  6614.         
  6615.         10.3 GROUP Pattern Regular Expressions
  6616.         
  6617.          The regular expressions associated with the GROUP pattern can be
  6618.         any valid QTAwk expression.   All  expressions  in  a  GROUP  are
  6619.         evaluated when the GROUP is first matched against an input record
  6620.         and converted to regular expressions. 
  6621.         
  6622.          GROUP patterns are converted into an internal form  for  regular
  6623.         expressions  only once, when the pattern is first used to scan an
  6624.         input line.  Any variables  which  are  the  result  of  a  GROUP
  6625.         expression  will  be  evaluated,  converted  to  string  form and
  6626.         interpreted  as  a  regular  expression.   Similarly,  any  named
  6627.         expressions  in a regular expression constant, string constant or
  6628.         regular expression value of a variable will be replaced once,  at
  6629.         the time of conversion. 
  6630.         
  6631.          If  one  of  the  expressions in a GROUP match the current input
  6632.         record, the value of the built-in  variable  NG  is  set  to  the
  6633.         sequence   value  of  the  matching  expression  in  the  GROUP. 
  6634.         Numbering of the expressions in the GROUP starts with 1. 
  6635.         
  6636.          If any expression in a GROUP which evaluates to  an  array,  the
  6637.         entire  array  is  utilized  for matching at that position of the
  6638.         GROUP, i.e., if any element of  the  array  matches  the  current
  6639.         input  record,  the value of NG is assigned the sequence value of
  6640.         the array in the GROUP. 
  6641.  
  6642.  
  6643.  
  6644.         QTAwk                       - 10-2 -                        QTAwk
  6645.  
  6646.  
  6647.  
  6648.  
  6649.  
  6650.  
  6651.         Section 11.0                                           Statements
  6652.  
  6653.  
  6654.         11.0 Statements
  6655.         
  6656.          Statements specify the flow of control through a utility when it
  6657.         executes.   A  statement  that contains expressions also computes
  6658.         values and/or alters the values  stored  in  variables  when  the
  6659.         statement executes. 
  6660.         
  6661.          QTAwk  has  departed from Awk by using the C convention of using
  6662.         the semi-colon, ';', as a  statement  terminator.   QTAwk  treats
  6663.         newline  characters  as  white space, nothing more.  Comments are
  6664.         introduced by the symbol, '#', and continue to the  next  newline
  6665.         character.   Thus the Awk practice of letting new-lines terminate
  6666.         some statements can  no  longer  be  used.   The  Awk  rules  for
  6667.         terminating   statements  with  the  newline  except  under  some
  6668.         conditions  can  now  be  forgotten.   In  QTAwk,  terminate  all
  6669.         statements with a semi-colon, ';'. 
  6670.         
  6671.         11.1 QTAwk Keywords
  6672.         
  6673.          The QTAwk keywords are:
  6674.         
  6675.         1.  break
  6676.         2.  case
  6677.         3.  continue
  6678.         4.  cycle
  6679.         5.  default
  6680.         6.  delete
  6681.         7.  deletea
  6682.         8.  do
  6683.         9.  else
  6684.         10.  endfile
  6685.         11.  exit
  6686.         12.  for
  6687.         13.  if
  6688.         14.  in
  6689.         15.  local
  6690.         16.  next
  6691.         17.  return
  6692.         18.  switch
  6693.         19.  while
  6694.         
  6695.          The  keywords  'cycle', 'deletea', 'local' and 'endfile' are new
  6696.         to QTAwk.  The keywords 'switch', 'case' and 'default' have  been
  6697.         appropriated from C with expanded functionality over C. 
  6698.         
  6699.         11.2 Statements
  6700.  
  6701.  
  6702.         QTAwk                       - 11-1 -                        QTAwk
  6703.  
  6704.  
  6705.  
  6706.  
  6707.  
  6708.  
  6709.         Section 11.2                                           Statements
  6710.  
  6711.  
  6712.          A statement can be one of the following:
  6713.         
  6714.         break;
  6715.         case expr_list: statement
  6716.         continue;
  6717.         cycle;
  6718.         default: statement
  6719.         delete variable[expr_list];
  6720.         deletea variable;
  6721.         do statement while ( expr_list );
  6722.         endfile;
  6723.         exit;
  6724.         exit expression;
  6725.         for ( expr_list ; expr_list ; expr_list ) statement
  6726.         for ( variable1 in variable2 ) statement
  6727.         if ( expr_list ) statement
  6728.         if ( expr_list ) statement else statement
  6729.         local variable;
  6730.         local variable1 , variable2 , ...;
  6731.         local variable1 = value;
  6732.         local variable1 = value , variable2 = value , ...;
  6733.         next;
  6734.         return;
  6735.         return expr_list;
  6736.         switch ( expr_list ) statement
  6737.         while ( expr_list ) statement
  6738.         ;
  6739.         expression;
  6740.         expression , expression , expression , ...;
  6741.         { statement statement statement ...  }
  6742.         
  6743.          QTAwk  provides  braces for grouping statements to form compound
  6744.         statements.  Various keywords are available for  controlling  the
  6745.         logical   flow  of  statement  execution  and  for  looping  over
  6746.         statements multiple times. 
  6747.         
  6748.         11.3 'cycle' and 'next'
  6749.         
  6750.          The 'cycle' and 'next' statements allow the user to control  the
  6751.         execution  of  the  QTAwk outer loop which reads records from the
  6752.         current input file and compares them against the patterns.   Both
  6753.         statements, restart the pattern matching. 
  6754.         
  6755.          The  'next'  statement  causes  the next input record to be read
  6756.         before restarting the outer pattern matching loop with the  first
  6757.         pattern-action pair. 
  6758.  
  6759.  
  6760.         QTAwk                       - 11-2 -                        QTAwk
  6761.  
  6762.  
  6763.  
  6764.  
  6765.  
  6766.  
  6767.         Section 11.3                                           Statements
  6768.  
  6769.  
  6770.          The  'cycle'  statement  may use the current input record or the
  6771.         next input record  for  restarting  the  outer  pattern  matching
  6772.         loop.   As each input record is read from the current input file,
  6773.         the built-in variable CYCLE_COUNT is set  to  one.   The  'cycle'
  6774.         statement  increments the numeric value of CYCLE_COUNT by one and
  6775.         compares the new value to  the  numeric  value  of  the  built-in
  6776.         variable MAX_CYCLE.  One of two actions is taken depending on the
  6777.         result of this comparison:
  6778.         
  6779.         1.  If CYCLE_COUNT is  greater  than  MAX_CYCLE,  then  the  next
  6780.             input  record is read, setting NR, FNR, $0, NF and the record
  6781.             fields $1, $2, ...  $NF, before restarting the outer  pattern
  6782.             matching loop.  This is identical to the action of the 'next'
  6783.             keyword. 
  6784.             
  6785.         2.  If CYCLE_COUNT is  less  than  or  equal  to  MAX_CYCLE,  the
  6786.             current  values  of NR, FNR, $0, NF and the record fields are
  6787.             utilized when restarting the outer  pattern  matching  loop. 
  6788.         
  6789.          The  default  value  of  MAX_CYCLE is 100.  Both CYCLE_COUNT and
  6790.         MAX_CYCLE are built-in variables and may be  set  by  the  user's
  6791.         utility.   Setting  MAX_CYCLE  is useful to control the number of
  6792.         iterations possible on a record.  Setting MAX_CYCLE  to  1  would
  6793.         make the 'cycle' and 'next' keywords identical. 
  6794.         
  6795.          If  the  value of CYCLE_COUNT is set by the user's utility, care
  6796.         should be  taken  to  prevent  the  possibility  of  the  utility
  6797.         entering a loop from which it cannot exit. 
  6798.         
  6799.          The  'cycle' statement is useful when it is necessary to process
  6800.         the current input record through the  outer  pattern  match  loop
  6801.         more  than  once.   The following utility is a trivial example of
  6802.         one such use.  This utility  will  print  each  record  with  the
  6803.         record  number multiple times.  The number of times is determined
  6804.         by the value assigned MAX_CYCLE in the 'BEGIN' action. 
  6805.         
  6806.         BEGIN {
  6807.             MAX_CYCLE = 10;
  6808.         }
  6809.         
  6810.             {
  6811.             print FNR,$0;
  6812.             cycle;
  6813.         }
  6814.         
  6815.          The "next"  record  read  for  both  the  'next;'  and  'cycle;'
  6816.  
  6817.  
  6818.         QTAwk                       - 11-3 -                        QTAwk
  6819.  
  6820.  
  6821.  
  6822.  
  6823.  
  6824.  
  6825.         Section 11.3                                           Statements
  6826.  
  6827.  
  6828.         statements   depends  on  the  value  of  the  built-in  variable
  6829.         "FILE_SEARCH".  If FILE_SEARCH is false, then the  next  physical
  6830.         record  is  read.  If FILE_SEARCH is true, the next record is the
  6831.         record(s)   containing   a   string   matching   a   pattern   in
  6832.         FILE_SEARCH_PAT. 
  6833.         
  6834.         11.4 'delete' and 'deletea'
  6835.         
  6836.          The  'delete'  and 'deletea' statements allow the user to delete
  6837.         individual elements of an array or an entire array respectively. 
  6838.         The form of the 'delete' and 'deletea' statements are:
  6839.         
  6840.         delete A[expr_list];
  6841.         
  6842.          and
  6843.         
  6844.         deletea A;
  6845.         
  6846.          The  first form will delete the element of array A referenced by
  6847.         the subscript determined by 'expr_list'.  The  second  form  will
  6848.         delete  the  entire  array.   Note  that  for  singly dimensioned
  6849.         arrays, the 'deletea' statement is equivalent to  the  statement:
  6850.         
  6851.         for ( j in A ) delete A[j];
  6852.         
  6853.          The  use of the 'deletea' statement is encouraged for simplicity
  6854.         and speed of execution.  The 'delete' statement may be  used  for
  6855.         arrays  of  any  dimension.   However,  for arrays with dimension
  6856.         greater than 2, the elements of the array are  not  deleted,  but
  6857.         simply  initialized  to  zero and the null string.  This behavior
  6858.         has to do with the structure of  arrays  and  the  'holes'  which
  6859.         could  be  left  by  deleting  elements.   For singly dimensioned
  6860.         arrays, there is no problem, since there can be no 'hole' left by
  6861.         deleting an element.  For example consider the singly dimensioned
  6862.         array:
  6863.         
  6864.         A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
  6865.         
  6866.          If the array element A[5] is deleted
  6867.         
  6868.         A[1] A[2] A[3] A[4] ____ A[6] A[7] A[8] A[9]
  6869.         
  6870.          Then the remaining elements 'shift' to fill the 'hole'. 
  6871.         
  6872.         A[1] A[2] A[3] A[4] A[6] A[7] A[8] A[9]
  6873.         
  6874.  
  6875.  
  6876.         QTAwk                       - 11-4 -                        QTAwk
  6877.  
  6878.  
  6879.  
  6880.  
  6881.  
  6882.  
  6883.         Section 11.4                                           Statements
  6884.  
  6885.  
  6886.          For two-dimensional arrays a complication arises  in  trying  to
  6887.         fill the 'hole' left by deleting an array element. 
  6888.         
  6889.         A[1][1] A[1][2] A[1][3] A[1][4] A[1][5] A[1][6]
  6890.         A[2][1] A[2][2] A[2][3] A[2][4] A[2][5] A[2][6]
  6891.         A[3][1] A[3][2] A[3][3] A[3][4] A[3][5] A[3][6]
  6892.         A[4][1] A[4][2] A[4][3] A[4][4] A[4][5] A[4][6]
  6893.         A[5][1] A[5][2] A[5][3] A[5][4] A[5][5] A[5][6]
  6894.         A[6][1] A[6][2] A[6][3] A[6][4] A[6][6] A[6][6]
  6895.         
  6896.          If element A[4][4] is deleted, then we have the 'hole':
  6897.         
  6898.         A[1][1] A[1][2] A[1][3] A[1][4] A[1][5] A[1][6]
  6899.         A[2][1] A[2][2] A[2][3] A[2][4] A[2][5] A[2][6]
  6900.         A[3][1] A[3][2] A[3][3] A[3][4] A[3][5] A[3][6]
  6901.         A[4][1] A[4][2] A[4][3] _______ A[4][5] A[4][6]
  6902.         A[5][1] A[5][2] A[5][3] A[5][4] A[5][5] A[5][6]
  6903.         A[6][1] A[6][2] A[6][3] A[6][4] A[6][6] A[6][6]
  6904.         
  6905.          In  trying  to fill the 'hole', we have a choice of shifting the
  6906.         elements below the deleted element up to fill the 'hole',  column
  6907.         priority,  or  shifting  the elements to the right of the deleted
  6908.         element to fill the 'hole', row priority.  In QTAwk, row priority
  6909.         is used in filling the 'hole':
  6910.         
  6911.         A[1][1] A[1][2] A[1][3] A[1][4] A[1][5] A[1][6]
  6912.         A[2][1] A[2][2] A[2][3] A[2][4] A[2][5] A[2][6]
  6913.         A[3][1] A[3][2] A[3][3] A[3][4] A[3][5] A[3][6]
  6914.         A[4][1] A[4][2] A[4][3] A[4][5] A[4][6]
  6915.         A[5][1] A[5][2] A[5][3] A[5][4] A[5][5] A[5][6]
  6916.         A[6][1] A[6][2] A[6][3] A[6][4] A[6][6] A[6][6]
  6917.         
  6918.          For  arrays  of  higher  dimensions  the  situation is even more
  6919.         complicated.  Not only do elements  have  to  be  "shifted",  but
  6920.         elements  in  the  array will have to be discarded to do so.  For
  6921.         example, if A is a 3x3x3 array and element A[2][2][2] is deleted,
  6922.         then  element A[2][2][3], if it existed, would also be deleted by
  6923.         shifting other elements to fill the 'hole'.  QTAwk will  in  this
  6924.         case  initialize  the  element  A[2][2][2]  to  zero and the null
  6925.         string rather than delete the element and lose  other  elements. 
  6926.         Thus,  the 'delete' statement only truly deletes elements for one
  6927.         and two dimensional arrays. 
  6928.         
  6929.          The  'deletea'  statement,  however,  works  on  arrays  of  any
  6930.         dimension.   For  multidimensional arrays, the 'deletea' would be
  6931.         equivalent to nested  'for'  statements.   For  example,  if  the
  6932.  
  6933.  
  6934.         QTAwk                       - 11-5 -                        QTAwk
  6935.  
  6936.  
  6937.  
  6938.  
  6939.  
  6940.  
  6941.         Section 11.4                                           Statements
  6942.  
  6943.  
  6944.         'delete'  statement truly deleted elements of a three dimensional
  6945.         array,  then  the  'deletea'  statement  could  be  imagined   as
  6946.         equivalent to:
  6947.         
  6948.         for ( i in A )
  6949.           for ( j in A[i] )
  6950.             for ( k in A[i][j] ) delete A[i][j][k]
  6951.         
  6952.         11.5 'if'/'else'
  6953.         
  6954.          The  'if'  and  'else'  keywords  provide  for  executing one of
  6955.         possibly two statements conditioned upon the TRUE or FALSE  value
  6956.         of  an  expr_list.   The  form  of  the 'if'/'else' statement is:
  6957.         
  6958.         if ( expr_list ) statement1
  6959.         
  6960.          or
  6961.         
  6962.         if ( expr_list ) statement1 else statement2
  6963.         
  6964.          If  expr_list  when  evaluated,  produces  a  TRUE  value   then
  6965.         statement1 is executed.  If the expr_list produces a FALSE value,
  6966.         then for the second form, statement2 is executed. 
  6967.         
  6968.         11.6 'switch', 'case', 'default'
  6969.         
  6970.          QTAwk  includes  an  expanded  form  of  the  C  'switch'/'case'
  6971.         statements.   In C, the 'switch'/'case' statements must be of the
  6972.         form:
  6973.         
  6974.         switch ( expr_list ) {
  6975.              case constant1: statement
  6976.              case constant2: statement
  6977.              case constant3: statement
  6978.              case constant4: statement
  6979.              default: statement
  6980.         }
  6981.         
  6982.          The expr_list of the 'switch'  statement  must  evaluate  to  an
  6983.         integral  value  and  'constant1',  'constant2', 'constant3', and
  6984.         'constant4', must be compile-time integral constant  values.   In
  6985.         QTAwk,   the   'case'  statement  may  contain  any  valid  QTAwk
  6986.         expression or expr_list:
  6987.         
  6988.         switch ( expr_list ) {
  6989.              case expr_list1: statement
  6990.  
  6991.  
  6992.         QTAwk                       - 11-6 -                        QTAwk
  6993.  
  6994.  
  6995.  
  6996.  
  6997.  
  6998.  
  6999.         Section 11.6                                           Statements
  7000.  
  7001.  
  7002.              case expr_list2: statement
  7003.              case expr_list3: statement
  7004.              case expr_list4: statement
  7005.              default: statement
  7006.         }
  7007.         
  7008.          The expr_lists of the case statements are evaluated in  turn  at
  7009.         execution time.  The resultant value is checked against the value
  7010.         of the expr_list of the 'switch' statement  using  the  following
  7011.         logic. 
  7012.         
  7013.         if ( cexpr is a regular expression ) sexpr ~~ cexpr;
  7014.           else sexpr == cexpr;
  7015.         
  7016.          where  cexpr is the value of the case expr_list and sexpr is the
  7017.         value of the 'switch' statement expr_list.  Thus if  cexpr  is  a
  7018.         regular  expression, a match operation is performed.  If cexpr is
  7019.         a string, a string  comparison  is  performed.   If  cexpr  is  a
  7020.         numeric,  a numerical comparison is performed.  It is possible to
  7021.         have case statements with differing types of expr_list values  in
  7022.         the  same  'switch' statement and the proper comparison is made. 
  7023.         
  7024.          In addition a given case expr_list  can  evaluate  to  different
  7025.         types at different times. 
  7026.         
  7027.          Once  a  true  value is returned by a case statement comparison,
  7028.         the execution falls through from 'case' to 'case' with no further
  7029.         comparisons made.  The fall through of execution is broken by the
  7030.         use of the 'break' statement as in C. 
  7031.         
  7032.          Note that the expr_list of a 'case' statement  is  evaluated  at
  7033.         execution  time  and it is possible for some 'case' expr_lists to
  7034.         never be evaluated.  Thus, side effects from  the  evaluation  of
  7035.         'case'   expr_lists   should   not   be  relied  upon.   This  is
  7036.         particularly true where execution falls through from  one  'case'
  7037.         statement to the next. 
  7038.         
  7039.          If  the  expr_list  of a 'case' statement evaluates to a regular
  7040.         expression, then two built-in variables are set  when  the  match
  7041.         operation  is  performed:  CLENGTH and CSTART.  CLENGTH is set to
  7042.         the length of the matching string found (or zero) and  CSTART  is
  7043.         set  to  the  starting  position of the matching string found (or
  7044.         zero).  CLENGTH and CSTART are completely  analogous  to  RLENGTH
  7045.         and  RSTART  set  for the 'match' function and MLENGTH and MSTART
  7046.         for the match operators, '~~' and '!~'. 
  7047.         
  7048.  
  7049.  
  7050.         QTAwk                       - 11-7 -                        QTAwk
  7051.  
  7052.  
  7053.  
  7054.  
  7055.  
  7056.  
  7057.         Section 11.6                                           Statements
  7058.  
  7059.  
  7060.          The  'default'  keyword  is  provided  in  analogy  to  C.   The
  7061.         statements  following the 'default' statement are executed if the
  7062.         'switch' expr_list matches no 'case'  expr_list.   The  'default'
  7063.         statement  may be combined with other 'case' statements.  It need
  7064.         not be the last statement as shown. 
  7065.         
  7066.         11.7 Loops
  7067.         
  7068.          QTAwk has four forms of loop control statements:
  7069.         
  7070.         1.  for (  expr_list1  ;  expr_list2  ;  expr_list3  )  statement
  7071.         2.  for ( var in array ) statement
  7072.         3.  while ( expr_list ) statement
  7073.         4.  do statement while ( expr_list );
  7074.         
  7075.         11.7.1 'while'
  7076.         
  7077.          The 'while' statement has the form:
  7078.         
  7079.         
  7080.          while ( expr_list ) statement
  7081.         
  7082.          the  expr_list  is  evaluated and if TRUE 'stmt' is executed and
  7083.         expr_list is re-evaluated.  This cycle continues until  expr_list
  7084.         evaluates  to  FALSE,  at which point the cycle is terminated and
  7085.         execution resumes with the utility after 'stmt'. 
  7086.         
  7087.         11.7.2 'for'
  7088.         
  7089.          The 'for' statement has two forms:
  7090.         
  7091.         1.  for (  expr_list1  ;  expr_list2  ;  expr_list3  )  statement
  7092.         2.  for ( var in array ) statement
  7093.         
  7094.          In  the  first  form  the  following  sequence of operations are
  7095.         performed:
  7096.         1.  The expressions in expr_list1 are evaluated,
  7097.         2.  The expressions in expr_list2 are evaluated,
  7098.         3.  The action taken is  dependent  upon  whether  the  resultant
  7099.             value of expr_list2 is true or false:
  7100.             a)  TRUE
  7101.                 1:  Execute   'statement',   which   may  be  a  compound
  7102.                     statement. 
  7103.                 2:  Execute the expressions in expr_list3. 
  7104.                 3:  Control returns to item 2.  above. 
  7105.             b)  FALSE - terminate loop
  7106.  
  7107.  
  7108.         QTAwk                       - 11-8 -                        QTAwk
  7109.  
  7110.  
  7111.  
  7112.  
  7113.  
  7114.  
  7115.         Section 11.7.2                                         Statements
  7116.  
  7117.  
  7118.          The second form may also be used  for  multidimensional  arrays:
  7119.         
  7120.         for  (  var  in  array[s_expr_list]...[s_expr_list]  )  statement
  7121.         
  7122.          For each subscript in the next higher index level in  the  array
  7123.         reference,  var  is  set  to  the  index value and 'statement' is
  7124.         executed.  'statement'  may  be  a  compound  statement.   For  a
  7125.         multidimensional  array,  the  second  form  may  be used to loop
  7126.         sequentially through the indices of the next higher index level. 
  7127.         Thus for a two dimensional array:
  7128.         
  7129.         for ( i in A )
  7130.             for ( j in A[i] )
  7131.         
  7132.          will loop through the indices in the array in row order. 
  7133.         
  7134.         11.7.3 'do'/'while'
  7135.         
  7136.          The form of the 'do'/'while' statement is:
  7137.         
  7138.          do statement while ( expr_list );
  7139.         
  7140.          'statement'   is  executed,  expr_list  evaluated  and  if  TRUE
  7141.         'statement' is executed again else the loop is terminated.   Note
  7142.         that 'statement' is executed at least once. 
  7143.         
  7144.         11.8 'local'
  7145.         
  7146.          The  'local'  keyword  is  used  to  define  variables  within a
  7147.         compound statement that are local to the compound  statement  and
  7148.         that  disappear  when  the  compound  statement  is  exited.  The
  7149.         'local' keyword may be used within any compound statement, but is
  7150.         especially  useful in user-defined functions as described later. 
  7151.         Variables defined with the 'local' keyword  may  be  assigned  an
  7152.         initial  value  in  the  statement  and multiple variables may be
  7153.         defined with a single statement.  If a variable is  not  assigned
  7154.         an  initial  value, it is initialized to zero and the null string
  7155.         just as global variables are initialized. 
  7156.         
  7157.          Thus:
  7158.         
  7159.          local i, j = 12, k = substr(str,5);
  7160.         
  7161.          will define three variables  local  to  the  enclosing  compound
  7162.         statement:
  7163.         1.  i initialized to zero/null string,
  7164.  
  7165.  
  7166.         QTAwk                       - 11-9 -                        QTAwk
  7167.  
  7168.  
  7169.  
  7170.  
  7171.  
  7172.  
  7173.         Section 11.8                                           Statements
  7174.  
  7175.  
  7176.         2.  j initialized to 12, and
  7177.         3.  k initialized to a sub-string of the variable 'str'
  7178.         
  7179.          Local variables initialized explicitly in 'local' statements may
  7180.         be initialized to constants,  the  values  of  global  variables,
  7181.         values   returned  by  built-in  functions,  values  returned  by
  7182.         user-defined functions or previously defined local variables.  If
  7183.         the  value is set to that of a previously defined local variable,
  7184.         the variable may not be defined in the same  'local'  statement. 
  7185.         Thus:
  7186.         
  7187.         local k = 5;
  7188.         local j = k;
  7189.         
  7190.          is correct, but
  7191.         
  7192.         local k = 5, j = k;
  7193.         
  7194.          is  not.   In the latter case QTAwk will quietly assume that the
  7195.         k, to which j is assigned, is a global variable. 
  7196.         
  7197.         11.9 'endfile'
  7198.         
  7199.          The 'endfile' keyword causes the utility to behave as if the end
  7200.         of  the current input file has been reached.  Any 'FINAL' actions
  7201.         are executed, if any input files remain to be processed from  the
  7202.         command  line,  the next is opened for processing.  If no further
  7203.         input files  remain  to  be  processed,  any  'END'  actions  are
  7204.         executed. 
  7205.         
  7206.         11.10 'break'
  7207.         
  7208.          This  keyword  will  terminate  the  execution  of the enclosing
  7209.         'while', 'for', 'do'/'while' loop or break execution in  cascaded
  7210.         'case' statements. 
  7211.         
  7212.         11.11 'continue'
  7213.         
  7214.          This keyword will cause execution to jump to just after the last
  7215.         statement in the loop body and execute the next iteration of  the
  7216.         enclosing   loop.    The  loop  may  be  any  'for',  'while'  or
  7217.         'do'/'while' loop. 
  7218.         
  7219.         11.12 'exit opt_expr_list'
  7220.         
  7221.          This statement causes the utility to behave as if the end of the
  7222.  
  7223.  
  7224.         QTAwk                       - 11-10 -                       QTAwk
  7225.  
  7226.  
  7227.  
  7228.  
  7229.  
  7230.  
  7231.         Section 11.12                                          Statements
  7232.  
  7233.  
  7234.         current  input  file  had  been reached.  Any further input files
  7235.         specified are ignored.  If there are any FINAL  or  END  actions,
  7236.         they are executed. 
  7237.         
  7238.          If  encountered in a FINAL action, the action is terminated, any
  7239.         further  input  files  are  ignored  and  any  END  actions   are
  7240.         executed. 
  7241.         
  7242.          If  encountered in an END action, the execution of the action is
  7243.         terminated and utility execution is terminated. 
  7244.         
  7245.          The optional expr_list is  evaluated  and  the  resultant  value
  7246.         returned to DOS upon termination by QTAwk as the exit status.  If
  7247.         no expr_list is present,  or  no  'exit'  statement  encountered,
  7248.         QTAwk returns a value of zero for the exit status. 
  7249.         
  7250.         11.13 'return opt_expr_list'
  7251.         
  7252.          This  statement  will  cause  execution  to  return  from a user
  7253.         defined function.  If the optional expr_list is  present,  it  is
  7254.         evaluated  and  the  resultant  value  returned as the functional
  7255.         value. 
  7256.  
  7257.  
  7258.  
  7259.  
  7260.  
  7261.  
  7262.  
  7263.  
  7264.  
  7265.  
  7266.  
  7267.  
  7268.  
  7269.  
  7270.  
  7271.  
  7272.  
  7273.  
  7274.  
  7275.  
  7276.  
  7277.  
  7278.  
  7279.  
  7280.  
  7281.  
  7282.         QTAwk                       - 11-11 -                       QTAwk
  7283.  
  7284.  
  7285.  
  7286.  
  7287.  
  7288.  
  7289.  
  7290.  
  7291.  
  7292.  
  7293.  
  7294.  
  7295.  
  7296.  
  7297.  
  7298.  
  7299.  
  7300.  
  7301.  
  7302.  
  7303.  
  7304.  
  7305.  
  7306.  
  7307.  
  7308.  
  7309.  
  7310.  
  7311.  
  7312.  
  7313.  
  7314.  
  7315.  
  7316.  
  7317.  
  7318.  
  7319.  
  7320.  
  7321.  
  7322.  
  7323.  
  7324.  
  7325.  
  7326.  
  7327.  
  7328.  
  7329.  
  7330.  
  7331.  
  7332.  
  7333.  
  7334.  
  7335.  
  7336.  
  7337.  
  7338.  
  7339.  
  7340.         QTAwk                       - 11-12 -                       QTAwk
  7341.  
  7342.  
  7343.  
  7344.  
  7345.  
  7346.  
  7347.         Section 12.0                                   Built-in Functions
  7348.  
  7349.  
  7350.         12.0 Built-in Functions
  7351.         
  7352.          QTAwk offers a rich set of  built-in  arithmetic,  string,  I/O,
  7353.         array  and  system  functions.   The  array of built-in functions
  7354.         available has been extended over that available  with  Awk.   The
  7355.         I/O functions have been changed to match the functional syntax of
  7356.         all other built-in and user defined functions. 
  7357.         
  7358.         12.1 Arithmetic Functions
  7359.         
  7360.          QTAwk offers the following built-in arithmetic functions.  Those
  7361.         marked with an asterisk, '*', are new to QTAwk:
  7362.         
  7363.         1.  acos(x)  ==>  return  arc-cosine  of x.  The return value has
  7364.             degree units if the built-in variable DEGREES is true, radian
  7365.             units  otherwise.   Refer  to the DEGREES built-in variable. 
  7366.             
  7367.         2.  asin(x) ==> return arc-sine  of  x.   The  return  value  has
  7368.             degree units if the built-in variable DEGREES is true, radian
  7369.             units otherwise.  Refer to the  DEGREES  built-in  variable. 
  7370.             
  7371.         3.  atan2(y,x)  ==>  return  arc-tangent  of  y/x,  -π to π.  The
  7372.             return value  has  degree  units  if  the  built-in  variable
  7373.             DEGREES  is  true,  radian  units  otherwise.   Refer  to the
  7374.             DEGREES built-in variable. 
  7375.             
  7376.         4.  cos(x) ==> return cosine of  x.   Assumes  x  in  degrees  if
  7377.             built-in  variable  DEGREES  is  true, otherwise assumes x in
  7378.             radians.  Refer to the DEGREES built-in variable. 
  7379.             
  7380.         5.  * cosh(x) ==> return hyperbolic cosine of x. 
  7381.             
  7382.         6.  exp(x) ==> return e^x. 
  7383.             
  7384.         7.  * fract(x) ==> return fractional portion of x. 
  7385.             
  7386.         8.  int(x) ==> return integer portion of x. 
  7387.             
  7388.         9.  * jdn or jdn() ==>  return  the  Julian  Day  Number  of  the
  7389.             current  system  date.   The  Julian  Day Number (jdn) is the
  7390.             number of whole  days  that  have  elapsed  since  a  certain
  7391.             reference  time  in  the  past.   The  jdn  is widely used in
  7392.             astronomy  and  elsewhere  in  calculations   involving   the
  7393.             counting of days and the computation of the day of the week. 
  7394.             The reference time from which all jdn's are measured has been
  7395.             chosen  by  astronomers  to  be January 1, 4713 B.C.  (Julian
  7396.  
  7397.  
  7398.         QTAwk                       - 12-1 -                        QTAwk
  7399.  
  7400.  
  7401.  
  7402.  
  7403.  
  7404.  
  7405.         Section 12.1                                   Built-in Functions
  7406.  
  7407.  
  7408.             Calendar) at noon.  As an example of a jdn in  modern  times,
  7409.             from  noon  October  1,  1991  to  noon  October  2,  1991 is
  7410.             2,448,544. 
  7411.             
  7412.              The use of the Gregorian or Julian Calendar by QTAwk in  the
  7413.             computation of the jdn is controlled by the built-in variable
  7414.             "Gregorian".  If Gregorian = TRUE, QTAwk uses  the  Gregorian
  7415.             Calendar,  otherwise  QTAwk  uses  the  Julian Calendar.  The
  7416.             Julian Day Number computed by QTAwk is, by default, based  on
  7417.             the   Gregorian  Calendar  adopted  in  the  British  Empire,
  7418.             including the American Colonies, on September 2, 1752.  Dates
  7419.             before  that day are based on the Julian Calendar in the US. 
  7420.             
  7421.              The "cal" function described later is  the  reverse  of  the
  7422.             "jdn" function, turning a specified jdn into a formatted date
  7423.             string. 
  7424.             
  7425.              As mentioned, the jdn of a given date is handy in performing
  7426.             date  computations.   For  example,  given  two  dates, their
  7427.             respective jdn's may be found  with  this  function  and  the
  7428.             number  of  days  between  the  two  dates computed simply by
  7429.             subtracting one jdn from the other.  A day a specified number
  7430.             of  days  in  the  future (past) is easily computed by adding
  7431.             (subtracting) the desired number of days to the jdn and using
  7432.             the  "cal" function to obtain the new date.  Also, the day of
  7433.             the week of a given date may be computed  quite  simply  with
  7434.             the formula:
  7435.             
  7436.                                  dow = (jdn + 1) % 7                     
  7437.             
  7438.              where  dow  is  the  "day  of  week".  The value computed is
  7439.             between 0 and 6 inclusive with:
  7440.             0 ==> Sunday
  7441.             1 ==> Monday
  7442.             2 ==> Tuesday
  7443.             3 ==> Wednesday
  7444.             4 ==> Thursday
  7445.             5 ==> Friday
  7446.             6 ==> Saturday
  7447.             
  7448.         10.  * jdn(year,month,day) ==> return the Julian  Day  Number  of
  7449.             the date specified. 
  7450.             
  7451.         11.  * jdn(fdate)  ==>  return  the Julian Day Number of the date
  7452.             specified.  The date is specified in the "PC/MS-DOS file date
  7453.             format" as obtained with the "findfile" function. 
  7454.  
  7455.  
  7456.         QTAwk                       - 12-2 -                        QTAwk
  7457.  
  7458.  
  7459.  
  7460.  
  7461.  
  7462.  
  7463.         Section 12.1                                   Built-in Functions
  7464.  
  7465.  
  7466.         12.  log(x) ==> return natural (base e) logarithm of x. 
  7467.             
  7468.         13.  * log10(x) ==> return base 10 logarithm of x. 
  7469.             
  7470.         14.  * pi or pi() ==> return pi. 
  7471.             
  7472.         15.  rand() ==> return random number r, 0 <= r < 1. 
  7473.             
  7474.         16.  sin(x)  ==>  return  sine  of  x.   Assumes  x in degrees if
  7475.             built-in variable DEGREES is true,  otherwise  assumes  x  in
  7476.             radians.  Refer to the DEGREES built-in variable. 
  7477.             
  7478.         17.  * sinh(x) ==> return hyperbolic sine of x. 
  7479.             
  7480.         18.  sqrt(x) ==> return square root of x. 
  7481.             
  7482.         19.  srand(x) ==> set x as new seed for rand(). 
  7483.             
  7484.         20.  srand()  ==>  use  current  system  time  as  new  seed  for
  7485.             rand(). 
  7486.         
  7487.         12.2 String Functions
  7488.         
  7489.          QTAwk offers the following built-in string handling  functions. 
  7490.         Those marked with an asterisk, '*', are new to QTAwk. 
  7491.         
  7492.          Some  string  function  require  or  return  a string position. 
  7493.         String positions start with the first character as  position  1. 
  7494.         
  7495.         1.  * cal(fmt_str,jdn)  ==>  return  date/time  corresponding  to
  7496.             Julian Day Number (jdn) specified, formatted according to the
  7497.             string value of fmt_str.  The format options are identical to
  7498.             those for the "sdate/stime" functions described later.   This
  7499.             function  is  the  reverse  of  the  "jdn" function described
  7500.             previously. 
  7501.             
  7502.              If  the  jdn  specified  is  an  integer  value,  any   time
  7503.             substitutions  made  in  the  format  string  use the current
  7504.             system time.  If  the  jdn  specified  is  a  floating  point
  7505.             numeric  with  a nonzero fractional part, the fractional part
  7506.             is used to compute a time of day.  For  example,  a  floating
  7507.             point jdn value of:
  7508.             
  7509.             spec_day = 2449251.399803241;
  7510.             
  7511.              the statement:
  7512.  
  7513.  
  7514.         QTAwk                       - 12-3 -                        QTAwk
  7515.  
  7516.  
  7517.  
  7518.  
  7519.  
  7520.  
  7521.         Section 12.2                                   Built-in Functions
  7522.  
  7523.  
  7524.             print cal("%m/%d/%Y -- %H:%M:%S",spec_day);
  7525.             
  7526.              produces the output:
  7527.             
  7528.             09/20/1993 -- 09:35:43
  7529.             
  7530.              The integer portion, 2449251, produces the date, 09/20/1993,
  7531.             and the fractional portion, 0.399803241, produces  the  time,
  7532.             09:35:43. 
  7533.             
  7534.              Given  a  time  of  day  in  hours (on a 24 hour/day basis),
  7535.             minutes and seconds, to compute the fractional portion  of  a
  7536.             jdn, the following formula may be used:
  7537.             
  7538.             fract_jdn     =    (hours/24.0)    +    (minutes/1440.0)    +
  7539.             (seconds/86400.0);
  7540.             
  7541.         2.  * center(s,w)  ==>  return  string  s  centered  in  w  blank
  7542.             characters. 
  7543.             
  7544.         3.  * center(s,w,c)  ==>  return  string  s  centered  in  w  'c'
  7545.             characters. 
  7546.             
  7547.         4.  * copies(s,n) ==> return n copies of string s. 
  7548.             
  7549.         5.  * deletec(s,p,n)  ==>  return  string  s  with  n  characters
  7550.             deleted starting at position p. 
  7551.             
  7552.         6.  gsub(re,rs)  ==>  substitute  for  strings matched by regular
  7553.             expression,  re,   globally   in   $0,   return   number   of
  7554.             substitutions made.  The evaluation of the replacement string
  7555.             expression, rs, is the same as below. 
  7556.             
  7557.         7.  gsub(re,rs,t) ==> substitute for strings matched  by  regular
  7558.             expression,  re,  globally  in  string  t,  return  number of
  7559.             substitutions made.  The substitution strings are  determined
  7560.             by the replacement string, rs, the string value of the second
  7561.             argument.  The replacement  string  expression,  rs,  is  not
  7562.             evaluated  at  the  time the function is called, but when the
  7563.             replacement string is used for replacement. 
  7564.             
  7565.              Since the first argument, re, may be an array, the value  of
  7566.             the  built-in  variable,  MATCH_INDEX,  can  be  effected  as
  7567.             matches  are  made.   By  delaying  the  evaluation  of   the
  7568.             replacement  string expression until the replacement is made,
  7569.             the change in MATCH_INDEX can be used to effect the value  of
  7570.  
  7571.  
  7572.         QTAwk                       - 12-4 -                        QTAwk
  7573.  
  7574.  
  7575.  
  7576.  
  7577.  
  7578.  
  7579.         Section 12.2                                   Built-in Functions
  7580.  
  7581.  
  7582.             the replacement string for each replacement. 
  7583.             
  7584.              Replacing  a  list  of  strings  in  another string could be
  7585.             accomplished by two methods.  In both methods the strings  to
  7586.             replace,  the  pattern  strings,  are contained in the singly
  7587.             dimensioned array 'str_pat' and the replacement  strings  are
  7588.             contained  in  the  singly  dimensioned array 'str_rep'.  The
  7589.             first method uses a loop to replace each string in  str_pat. 
  7590.             
  7591.              for  (  i in str_pat ) gsub(str_pat[i],str_rep[i]),rep_var);
  7592.             
  7593.              The second method uses the array capabilities  of  QTAwk  to
  7594.             automatically  scan  for  all  pattern strings in 'str_pat'. 
  7595.             
  7596.              gsub(str_pat,str_rep[MATCH_INDEX + 0],rep_var);
  7597.             
  7598.              As each pattern string is found, MATCH_INDEX is set  to  the
  7599.             string  value  of  the  corresponding  index  of  the pattern
  7600.             string.   The   replacement   string   expression   is   then
  7601.             evaluated.   Adding  0 to MATCH_INDEX is necessary to convert
  7602.             its string value to a numeric for indexing into  the  str_rep
  7603.             array. 
  7604.             
  7605.              An  example  of  such use is found in the "more.exp" utility
  7606.             included  with  QTAwk.   When  the  ANSI  display  option  is
  7607.             activated, strings may be highlighted on output.  Finding and
  7608.             highlighting the desired strings  is  accomplished  with  the
  7609.             single statement:
  7610.             
  7611.             #  Put  In  High  Light  ANSI Sequences For High Lighted Text
  7612.             if ( highlight )
  7613.                  gsub(High_pat,High_Text[MATCH_INDEX + 0] ∩ "$$0" ∩ Normal,dl);
  7614.             
  7615.              where 'highlight' is a variable with a TRUE/FALSE value used
  7616.             to  flag  if  strings  are to be highlighted.  'High_pat' and
  7617.             'High_Text' are arrays with the string patterns to  highlight
  7618.             and  the  ANSI character sequences necessary for changing the
  7619.             display colors.  '$$0' is the tag  string  replacement  token
  7620.             containing   the  string  matching  the  desired  pattern  in
  7621.             'High_pat'.  Note that '$$0'  must  be  contained  in  double
  7622.             quotations  to  ensure that the substitution made for the tag
  7623.             string  token  is  accomplished  by  the  'gsub'   function. 
  7624.             Otherwise  the basic processing loop of QTAwk would evaluated
  7625.             '$$' as the tag string operator, operating on the  token  '0'
  7626.             when  the  replacement  string  expression is evaluated which
  7627.             would yield the matching string from the  associated  pattern
  7628.  
  7629.  
  7630.         QTAwk                       - 12-5 -                        QTAwk
  7631.  
  7632.  
  7633.  
  7634.  
  7635.  
  7636.  
  7637.         Section 12.2                                   Built-in Functions
  7638.  
  7639.  
  7640.             (or  the null string if there was no matching string from the
  7641.             pattern).  'Normal'  contains  the  ANSI  character  sequence
  7642.             necessary  to  return  the  display  to  the  normal  display
  7643.             colors.  'dl' is the variable containing the  display  line. 
  7644.             
  7645.              The replacement string expression:
  7646.             
  7647.              High_Text[MATCH_INDEX + 0] ∩ "$$0" ∩ Normal
  7648.             
  7649.              is  evaluated  each time 'gsub' finds a string match in 'dl'
  7650.             for  one  of  the  patterns  in  'High_pat'.   The  value  of
  7651.             MATCH_INDEX  reflects  the index of the element in 'High_pat'
  7652.             matched (0 is added to  convert  MATCH_INDEX  from  a  string
  7653.             value to an integer value for indexing 'High_Text'). 
  7654.             
  7655.              QTAwk guarantees that the replacement string expression will
  7656.             be evaluated as replacements are made in the text string from
  7657.             left  to  right.   For  constant  expressions  used  for  the
  7658.             replacement  string,  evaluating   the   replacement   string
  7659.             expression   when   the   function  is  called  or  when  the
  7660.             replacement is made are equivalent. 
  7661.             
  7662.              Without the use of arrays  as  search  patterns,  the  above
  7663.             could only be accomplished as a much slower loop:
  7664.             
  7665.              for ( i in High_pat )
  7666.             gsub(High_pat[i],High_Text[i] ∩ "$$0" ∩ Normal,dl);
  7667.             
  7668.         8.  index(s1,s2)  ==> return position of string s2 in string s1. 
  7669.             Return zero, 0, if string s1 does not contain string s2 as  a
  7670.             substring. 
  7671.             
  7672.         9.  * insert(s1,s2,p)  ==>  return  string  formed  by  inserting
  7673.             string s2 into string s1 starting at position p. 
  7674.             
  7675.         10.  * justify(a,n,w) ==> return string w characters long  formed
  7676.             by justifying n elements of array a padded with blanks.  If n
  7677.             elements of array a with at least one blank between  elements
  7678.             would  exceed  width  w,  then  the  number of array elements
  7679.             justified is reduced to fit in the length w. 
  7680.             
  7681.         11.  * justify(a,n,w,c)  ==>  return  string  w  characters  long
  7682.             formed  by  justifying  n  elements  of  array  a padded with
  7683.             character 'c'.  If n elements of array a with  at  least  one
  7684.             'c' character between elements would exceed width w, then the
  7685.             number of array elements justified is reduced to fit  in  the
  7686.  
  7687.  
  7688.         QTAwk                       - 12-6 -                        QTAwk
  7689.  
  7690.  
  7691.  
  7692.  
  7693.  
  7694.  
  7695.         Section 12.2                                   Built-in Functions
  7696.  
  7697.  
  7698.             length w. 
  7699.             
  7700.         12.  length ==> return number of characters in $0. 
  7701.             
  7702.         13.  length() ==> return number of characters in $0. 
  7703.             
  7704.         14.  length(s)  ==>  return  number  of  characters in string s. 
  7705.             
  7706.         15.  match(s,r) ==> return  true,  1,  if  string  s  contains  a
  7707.             substring   matched  by  regular  expression  r.   If  string
  7708.             contains no match  to  regular  expression  r,  then  returns
  7709.             false,  0.   Set  RLENGTH  to length of substring matched (or
  7710.             zero) and RSTART to start position of substring  matched  (or
  7711.             zero). 
  7712.             
  7713.         16.  * overlay(s1,s2,p)  ==>  return  string formed by overlaying
  7714.             string s2 on string s1 starting at position  p.   May  extend
  7715.             length  of  s1.   If p > length(s1), s1 padded with blanks to
  7716.             appropriate length. 
  7717.             
  7718.         17.  * remove(s,c) ==> return string formed by removing  all  'c'
  7719.             characters from string s. 
  7720.             
  7721.         18.  * replace(s)  ==>  return  string  formed  by  replacing all
  7722.             repeated expressions, {n1,n2}, and named expressions, {name},
  7723.             in  string  s.   Same operation performed for strings used as
  7724.             regular expressions and  in  converting  regular  expressions
  7725.             into internal form. 
  7726.             
  7727.         19.  * sdate(fmt_str)  ==>  return  current  system date and time
  7728.             formatted according to string value of fmt_str.   The  format
  7729.             string  is  similar  to  those  used  in the 'print' function
  7730.             except that the following substitutions are made:
  7731.             %a --> Locale's Abbreviated Weekday Name
  7732.             %A --> Locale's Weekday Name
  7733.             %b --> Locale's Abbreviated Month Name
  7734.             %B --> Locale's Month Name
  7735.             %c --> Locale's  Appropriate  Date  And  Time  Representation
  7736.             %d --> Day Of The Month As A Decimal Number (01-31)
  7737.             %H  -->  The Hour (24-hour Clock) As A Decimal Number (00-23)
  7738.             %I --> The Hour (12-hour Clock) As A Decimal  Number  (01-12)
  7739.             %j  -->  The  Day  Of  The Year As A Decimal Number (001-366)
  7740.             %m --> The Month As A Decimal Number (01-12)
  7741.             %M --> The Minute As A Decimal Number (00-59)
  7742.             %p --> The Locale's  Equivalent  Of  The  AM/PM  Designations
  7743.                 Associated With A 12-hour Clock
  7744.  
  7745.  
  7746.         QTAwk                       - 12-7 -                        QTAwk
  7747.  
  7748.  
  7749.  
  7750.  
  7751.  
  7752.  
  7753.         Section 12.2                                   Built-in Functions
  7754.  
  7755.  
  7756.             %S --> The Second As Decimal Number (00-61)
  7757.             %U  -->  The Week Number Of The Year (the First Sunday As The
  7758.                 First Day Of Week 1) As A Decimal Number (00-53)
  7759.             %w --> The Weekday As A Decimal Number (0-6), Where Sunday Is
  7760.                 0
  7761.             %W  -->  The Week Number Of The Year (the First Monday As The
  7762.                 First Day Of Week 1) As A Decimal Number (00-53)
  7763.             %x --> The Locale's Appropriate Date Representation
  7764.             %X --> The Locale's Appropriate Time Representation
  7765.             %y --> The Year Without Century As A Decimal  Number  (00-99)
  7766.             %Y --> The Year With Century As A Decimal Number
  7767.             %Z --> The Time Zone Name Or Abbreviation, Or By No Character
  7768.                 If No Time Zone Is Indeterminable
  7769.             %% --> %
  7770.             
  7771.              Some common format strings would be:
  7772.             %m/%d/%y       -  mm/dd/yy                                   
  7773.             %m/%d/%Y       -  mm/dd/yyyy                                 
  7774.             %d/%m/%y       -  dd/mm/yy                                   
  7775.             %d/%m/%Y       -  dd/mm/yyyy                                 
  7776.             %b %d, %Y      -  abbrev. month dd, yyyy                     
  7777.             %B %d, %Y      -  month dd, yyyy                             
  7778.             %a %m/%d/%Y    -  abbrev weekday mm/dd/yyyy                  
  7779.             %A %m/%d/%Y    -  weekday mm/dd/yyyy                         
  7780.             %a, %b %d, %Y  -  abbrev. weekday, abbrev. month dd, yyyy    
  7781.             %A, %B %d, %Y  -  weekday, month dd, yyyy                    
  7782.             %b             -  return ASCII string for abbrev. month name 
  7783.             %B             -  return ASCII string for month name         
  7784.             %a             -  return ASCII string for abbrev. day name   
  7785.             %A             -  return ASCII string for day name           
  7786.             %y%m%d         -  return date in yymmdd form for sorting     
  7787.             %j             -  return number of days this year            
  7788.             %H:%M:%S       -  hh:mm:ss 0 <= hh <= 24                     
  7789.             %H:%M          -  hh:mm 0 <= hh <= 24                        
  7790.             %I:%M:%S %p    -  hh:mm:ss AM/PM                             
  7791.             %I:%M %p       -  hh:mm AM/PM                                
  7792.             
  7793.         20.  * sdate(fmt_str,fdate) ==> return date  formatted  according
  7794.             to  string  value  of  fmt_str.   This function is similar to
  7795.             "sdate(fmt_str)" except that the file date (fdate) instead of
  7796.             the  current system date is formatted.  The file date, fdate,
  7797.             is usually obtained by the "findfile" function.  If the value
  7798.             of   fdate  passed  is  zero,  the  current  system  date  is
  7799.             utilized.  The current system time is utilized for  any  time
  7800.             substitutions. 
  7801.             
  7802.  
  7803.  
  7804.         QTAwk                       - 12-8 -                        QTAwk
  7805.  
  7806.  
  7807.  
  7808.  
  7809.  
  7810.  
  7811.         Section 12.2                                   Built-in Functions
  7812.  
  7813.  
  7814.         21.  * sdate(fmt_str,year,month,day)  ==>  return  date formatted
  7815.             according to string  value  of  fmt_str.   This  function  is
  7816.             similar  to  "sdate(fmt_str)"  except  that the specific date
  7817.             passed (year, month, day) is formatted.  The  current  system
  7818.             time is utilized for any time substitutions. 
  7819.             
  7820.         22.  split(s,a)  ==>  split  string  s  into  array  a  on  field
  7821.             separator FS.  Return  number  of  fields.   The  same  rules
  7822.             applied to FS for splitting the current input record apply to
  7823.             the use of fs in splitting s into a. 
  7824.             
  7825.         23.  split(s,a,fs) ==> split string  s  into  array  a  on  field
  7826.             separator  fs.   Return  number  of  fields.   The same rules
  7827.             applied to FS for splitting the current input record apply to
  7828.             the use of fs in splitting s into a. 
  7829.             
  7830.         24.  * srange(c1,c2)  ==>  return string formed from character by
  7831.             concatenating characters from c1 to c2 inclusive.  If c2 < c1
  7832.             null string returned.  Thus,
  7833.             
  7834.             srange('a','k') == "abcdefghijk". 
  7835.             
  7836.         25.  * srev(s)  ==>  return string formed by reversing string s. 
  7837.             
  7838.             srev(srange('a','k')) == "kjihgfedcba". 
  7839.             
  7840.         26.  * stime(fmt_str) ==> return current  system  time  and  date
  7841.             formatted according to the string value of fmt_str. 
  7842.             %a --> Locale's Abbreviated Weekday Name
  7843.             %A --> Locale's Weekday Name
  7844.             %b --> Locale's Abbreviated Month Name
  7845.             %B --> Locale's Month Name
  7846.             %c  -->  Locale's  Appropriate  Date  And Time Representation
  7847.             %d --> Day Of The Month As A Decimal Number (01-31)
  7848.             %H --> The Hour (24-hour Clock) As A Decimal  Number  (00-23)
  7849.             %I  -->  The Hour (12-hour Clock) As A Decimal Number (01-12)
  7850.             %j --> The Day Of The Year  As  A  Decimal  Number  (001-366)
  7851.             %m --> The Month As A Decimal Number (01-12)
  7852.             %M --> The Minute As A Decimal Number (00-59)
  7853.             %p  -->  The  Locale's  Equivalent  Of The AM/PM Designations
  7854.                 Associated With A 12-hour Clock
  7855.             %S --> The Second As Decimal Number (00-61)
  7856.             %U --> The Week Number Of The Year (the First Sunday  As  The
  7857.                 First Day Of Week 1) As A Decimal Number (00-53)
  7858.             %w --> The Weekday As A Decimal Number (0-6), Where Sunday Is
  7859.                 0
  7860.  
  7861.  
  7862.         QTAwk                       - 12-9 -                        QTAwk
  7863.  
  7864.  
  7865.  
  7866.  
  7867.  
  7868.  
  7869.         Section 12.2                                   Built-in Functions
  7870.  
  7871.  
  7872.             %W --> The Week Number Of The Year (the First Monday  As  The
  7873.                 First Day Of Week 1) As A Decimal Number (00-53)
  7874.             %x --> The Locale's Appropriate Date Representation
  7875.             %X --> The Locale's Appropriate Time Representation
  7876.             %y  -->  The Year Without Century As A Decimal Number (00-99)
  7877.             %Y --> The Year With Century As A Decimal Number
  7878.             %Z --> The Time Zone Name Or Abbreviation, Or By No Character
  7879.                 If No Time Zone Is Determinable
  7880.             %% --> %
  7881.             
  7882.              Refer  to  the  'sdate' function for some examples of common
  7883.             formatting strings. 
  7884.             
  7885.         27.  * stime(fmt_str,ftime) ==> return time  formatted  according
  7886.             to  the string value of fmt_str.  This function is similar to
  7887.             "stime(fmt_str)" except that the file time (ftime) instead of
  7888.             the  current system time is formatted.  The file time, ftime,
  7889.             is usually obtained by the "findfile" function.  The  current
  7890.             system date is utilized for any date substitutions. 
  7891.             
  7892.         28.  * stime(fmt_str,hour,minute,second)    ==>    return    date
  7893.             formatted according to the string  value  of  fmt_str.   This
  7894.             function  is  similar  to  "stime(fmt_str)"  except  that the
  7895.             specific time passed (hour, minute,  second)  is  formatted. 
  7896.             The   current   system   date   is   utilized  for  any  date
  7897.             substitutions. 
  7898.             
  7899.         29.  * stran(s)  ==>  return   string   formed   by   translating
  7900.             characters in string s matching characters in string value of
  7901.             built-in variable, TRANS_FROM, to corresponding character  in
  7902.             string   value   of   built-in  variable,  TRANS_TO.   if  no
  7903.             corresponding  character  in  TRANS_TO,  then  replace   with
  7904.             blank.  TRANS_FROM and TRANS_TO initially set to:
  7905.             
  7906.             TRANS_FROM = srange('A','Z');
  7907.             
  7908.             TRANS_TO = srange('a','z');
  7909.             
  7910.         30.  * stran(s,st)   ==>  return  string  formed  by  translating
  7911.             characters in string s matching characters in string value of
  7912.             built-in  variable, TRANS_FROM, to corresponding character in
  7913.             st.  if no corresponding character in st  then  replace  with
  7914.             blank. 
  7915.             
  7916.         31.  * stran(s,st,sf)  ==>  return  string  formed by translating
  7917.             characters  in  string  s  matching  characters  in   sf   to
  7918.  
  7919.  
  7920.         QTAwk                       - 12-10 -                       QTAwk
  7921.  
  7922.  
  7923.  
  7924.  
  7925.  
  7926.  
  7927.         Section 12.2                                   Built-in Functions
  7928.  
  7929.  
  7930.             corresponding character in st.  if no corresponding character
  7931.             in st then replace with blank. 
  7932.             
  7933.         32.  * strim(s) ==> return string formed by trimming leading  and
  7934.             tailing  white  space  from  string  s.   Leading white space
  7935.             matches the regular expression /^{_w}+/.  Tailing white space
  7936.             matches the regular expression /{_w}+$/. 
  7937.             
  7938.         33.  * strim(s,le)  ==>  return  string formed by trimming string
  7939.             matching le and tailing white space from string s.  Differing
  7940.             actions are taken depending the type of le:
  7941.             
  7942.             ────────────┬──────────────────────────────────────────────────
  7943.             le type     │  action
  7944.             ────────────┼──────────────────────────────────────────────────
  7945.             regular     │
  7946.             expression  │  delete first string matching regular expression
  7947.                     │
  7948.             string        │  convert to regular expression and delete
  7949.                     │  first matching string
  7950.                     │
  7951.             single        │
  7952.             character   │ delete all leading characters equal to 'le'
  7953.                     │
  7954.             nonzero     │
  7955.             numeric     │ delete leading white space matching /^{_w}+/
  7956.                     │
  7957.             zero        │
  7958.             numeric     │ ignore
  7959.             ────────────┴──────────────────────────────────────────────────
  7960.             
  7961.              strim(s,TRUE) is equivalent to the form strim(s)
  7962.             
  7963.              The  following  all delete the leading dashes from the given
  7964.             string:
  7965.             
  7966.             strim("------ remove leading -------",/^-+/);
  7967.             strim("------ remove leading -------",/-+/);
  7968.             strim("------ remove leading -------",'-');
  7969.                 
  7970.             ==> "remove leading -------"
  7971.             
  7972.         34.  * strim(s,le,te)  ==>  return  string  formed  by   trimming
  7973.             string  matching  le and string matching te from s.  'le' and
  7974.             'te'  may  be  a  regular  expression,  a  string,  a  single
  7975.             character   or   a  numeric.   Differing  actions  are  taken
  7976.  
  7977.  
  7978.         QTAwk                       - 12-11 -                       QTAwk
  7979.  
  7980.  
  7981.  
  7982.  
  7983.  
  7984.  
  7985.         Section 12.2                                   Built-in Functions
  7986.  
  7987.  
  7988.             depending the type of le and te:
  7989.             
  7990.             ────────────┬──────────────────────────────────────────────────
  7991.             le/te type  │  action
  7992.             ────────────┼──────────────────────────────────────────────────
  7993.             regular     │
  7994.             expression  │  delete first string matching regular expression
  7995.                     │
  7996.             string        │  convert to regular expression and delete
  7997.                     │  first matching string
  7998.                     │
  7999.             single        │
  8000.             character   │ delete all leading/tailing characters equal
  8001.                     │ to 'le'/'te' respectively
  8002.                     │
  8003.             nonzero     │
  8004.             numeric     │ delete leading/tailing white space matching
  8005.                     │ /^{_w}+/ or /{_w}+$/ respectively
  8006.                     │
  8007.             zero        │
  8008.             numeric     │ ignore
  8009.             ────────────┴──────────────────────────────────────────────────
  8010.             
  8011.              strim(s,TRUE,TRUE)  is  equivalent  to  the  form   strim(s)
  8012.             
  8013.             strim("======remove   leading   and  tailing-------",'=','-')
  8014.             or
  8015.             strim("======remove  leading  and  tailing-------",/^=+/,'-')
  8016.             or
  8017.             strim("======remove  leading  and  tailing-------",'+',/-+$/)
  8018.             or
  8019.             strim("======remove leading and  tailing-------",/^=+/,/-+$/)
  8020.                 
  8021.             ==> "remove leading and tailing"
  8022.             
  8023.              strim("======remove leading-------",'=',FALSE)
  8024.             ==> "remove leading-------"
  8025.             
  8026.              strim("======remove tailing-------",FALSE,'-')
  8027.             ==> "======remove tailing"
  8028.             
  8029.         35.  * strlwr(s)  ==>  return string s translated to lower-case. 
  8030.             
  8031.         36.  * strupr(s) ==> return string s translated  to  upper-case. 
  8032.             
  8033.         37.  sub(re,rs)  ==>  substitute  for  leftmost string matched by
  8034.  
  8035.  
  8036.         QTAwk                       - 12-12 -                       QTAwk
  8037.  
  8038.  
  8039.  
  8040.  
  8041.  
  8042.  
  8043.         Section 12.2                                   Built-in Functions
  8044.  
  8045.  
  8046.             regular expression, re, in $0, return number of substitutions
  8047.             made (0/1).  Refer to description of built-in function 'gsub'
  8048.             for  when  the  replacement   string   expression,   rs,   is
  8049.             accomplished. 
  8050.             
  8051.         38.  sub(re,rs,t)  ==>  substitute for leftmost string matched by
  8052.             regular expression, r, in t, return number  of  substitutions
  8053.             made (0/1).  Refer to description of built-in function 'gsub'
  8054.             for  when  the  replacement   string   expression,   rs,   is
  8055.             accomplished. 
  8056.             
  8057.         39.  substr(s,p)  ==>  return string formed from suffix of string
  8058.             s starting at position p. 
  8059.             
  8060.         40.  substr(s,p,n) ==> return string formed from n characters  of
  8061.             string  s  starting  at  position  p.  If n == 1, a character
  8062.             constant is returned. 
  8063.  
  8064.  
  8065.  
  8066.  
  8067.  
  8068.  
  8069.  
  8070.  
  8071.  
  8072.  
  8073.  
  8074.  
  8075.  
  8076.  
  8077.  
  8078.  
  8079.  
  8080.  
  8081.  
  8082.  
  8083.  
  8084.  
  8085.  
  8086.  
  8087.  
  8088.  
  8089.  
  8090.  
  8091.  
  8092.  
  8093.  
  8094.         QTAwk                       - 12-13 -                       QTAwk
  8095.  
  8096.  
  8097.  
  8098.  
  8099.  
  8100.  
  8101.         Section 12.3                                   Built-in Functions
  8102.  
  8103.  
  8104.         12.3 File Functions
  8105.         
  8106.          QTAwk offers  the  following  built-in  file  functions.   Those
  8107.         marked with an asterisk, '*', differ from those in Awk. 
  8108.         
  8109.          For  input  files,  if a drive and/or path is specified with the
  8110.         filename, then only that drive and  path  are  searched  for  the
  8111.         desired file.  If no drive or path is specified, then the current
  8112.         directory is searched, if the file is not found, then  the  paths
  8113.         (optionally with a drive specifier) specified by the string value
  8114.         of the built-in variable QTAwk_Path are searched for  the  file. 
  8115.         Multiple  paths may be specified in QTAwk_Path by separating them
  8116.         with semi-colons. 
  8117.         
  8118.          The file functions are:
  8119.         
  8120.          Input:
  8121.         getline;
  8122.         getline();
  8123.         getline(v);
  8124.         getline v;
  8125.         fgetline(F)
  8126.         fgetline(F,v)
  8127.         getc()
  8128.         fgetc(F)
  8129.         srchrecord(sp)
  8130.         srchrecord(sp,rs)
  8131.         srchrecord(sp,rs,var)
  8132.         fsrchrecord(fn,sp)
  8133.         fsrchrecord(fn,sp,rs)
  8134.         fsrchrecord(fn,sp,rs,var)
  8135.         
  8136.          Output:
  8137.         print;
  8138.         print expr_list;
  8139.         print(expr_list);
  8140.         fprint F;
  8141.         fprint(F);
  8142.         fprint F,expr_list;
  8143.         fprint(F,expr_list);
  8144.         printf(fmt);
  8145.         printf(fmt,expr_list);
  8146.         fprintf(F,fmt);
  8147.         fprintf(F,fmt,expr_list);
  8148.         putc(c);
  8149.         fputc(c,F);
  8150.  
  8151.  
  8152.         QTAwk                       - 12-14 -                       QTAwk
  8153.  
  8154.  
  8155.  
  8156.  
  8157.  
  8158.  
  8159.         Section 12.3                                   Built-in Functions
  8160.  
  8161.  
  8162.          Miscellaneous:
  8163.         1.  append(F);
  8164.         2.  close(F);
  8165.         3.  get_FNR();
  8166.         4.  get_FNR(F);
  8167.         12.3.1 Input Functions
  8168.         
  8169.         1.  * getline();
  8170.             or
  8171.             * getline; ==> reads next record from current input file into
  8172.             $0.   Sets  fields,  NF,  NR  and  FNR.   The  effect  of the
  8173.             'getline' function is summarized in the table  following  the
  8174.             description of the 'fsrchrecord' function. 
  8175.             
  8176.              Returns:
  8177.             a)  the  number  of  characters  read  plus the length of the
  8178.                 End-Of-Record plus 1,
  8179.             b)  0 if End-Of-File was encountered, or
  8180.             c)  -1 if an error occurred. 
  8181.             
  8182.              The built-in variables FILE_SEARCH and FILE_SEARCH_PAT  have
  8183.             no  effect  on the next record input with this function.  The
  8184.             next physical record in the file is read irregardless of  the
  8185.             value of FILE_SEARCH. 
  8186.             
  8187.         2.  * getline(v);
  8188.             or
  8189.             * getline  v;  ==>  reads next record from current input file
  8190.             into variable v.   Sets  NR  and  FNR.   The  effect  of  the
  8191.             'getline'  function is summariazed in the table following the
  8192.             description of the 'fsrchrecord' function. 
  8193.             
  8194.              Returns:
  8195.             a)  the number of characters read  plus  the  length  of  the
  8196.                 End-Of-Record plus 1,
  8197.             b)  0 if end-of-file was encountered or
  8198.             c)  -1 if an error occurred. 
  8199.             
  8200.              The  built-in variables FILE_SEARCH and FILE_SEARCH_PAT have
  8201.             no effect on the next record input with this  function.   The
  8202.             next  physical record in the file is read irregardless of the
  8203.             value of FILE_SEARCH. 
  8204.             
  8205.         3.  * fgetline(F) ==> reads next record from  file  F  into  $0. 
  8206.             Sets fields and NF.  The effect of the 'fgetline' function is
  8207.             summarized in the table  following  the  description  of  the
  8208.  
  8209.  
  8210.         QTAwk                       - 12-15 -                       QTAwk
  8211.  
  8212.  
  8213.  
  8214.  
  8215.  
  8216.  
  8217.         Section 12.3.1                                 Built-in Functions
  8218.  
  8219.  
  8220.             'fsrchrecord' function. 
  8221.             
  8222.              Returns:
  8223.             a)  the  number  of  characters  read  plus the length of the
  8224.                 End-Of-Record plus 1,
  8225.             b)  0 if end-of-file was encountered or
  8226.             c)  -1 if an error occurred. 
  8227.             
  8228.              The built-in variables FILE_SEARCH and FILE_SEARCH_PAT  have
  8229.             no  effect  on the next record input with this function.  The
  8230.             next physical record in the file is read irregardless of  the
  8231.             value of FILE_SEARCH. 
  8232.             
  8233.         4.  * fgetline(F,v)  ==>  reads  next  record  from  file  F into
  8234.             variable  v.   The  effect  of  the  'fgetline'  function  is
  8235.             summarized  in  the  table  following  the description of the
  8236.             'fsrchrecord' function. 
  8237.             
  8238.              Returns
  8239.             a)  the number of characters read  plus  the  length  of  the
  8240.                 End-Of-Record plus 1,
  8241.             b)  0 if end-of-file was encountered or
  8242.             c)  -1 if an error occurred. 
  8243.             
  8244.              The  built-in variables FILE_SEARCH and FILE_SEARCH_PAT have
  8245.             no effect on the next record input with this  function.   The
  8246.             next  physical record in the file is read irregardless of the
  8247.             value of FILE_SEARCH. 
  8248.             
  8249.         5.  * srchrecord(sp) or
  8250.             * srchrecord(sp,rs) or
  8251.             * srchrecord(sp,rs,var) searches the current input  file  for
  8252.             the  next  record  or  records  matching  the search pattern,
  8253.             'sp'.  If  the  record  separator  parameter,  'rs',  is  not
  8254.             specified,  records  are  determined  by the variable RS.  If
  8255.             'rs' is specified, record boundaries are  determined  by  the
  8256.             strings  matching  'rs'.   'rs'  may  be a simple constant or
  8257.             variable or an array.   As  for  the  built-in  variable  RS,
  8258.             specifying  rs  as the null string, "", will set a blank line
  8259.             as the record separator.  If rs is  specified  as  the  null,
  8260.             QTAwk  will  silently use the regular expression /\n\n/.  The
  8261.             record or records matching the search pattern are returned in
  8262.             '$0'  if  'var' is not specified.  If 'var' is specified, the
  8263.             matching record  or  records  are  returned  in  'var'.   The
  8264.             built-in  variables,  FNR  and  NR are updated to reflect the
  8265.             current position and record number  after  the  search.   The
  8266.  
  8267.  
  8268.         QTAwk                       - 12-16 -                       QTAwk
  8269.  
  8270.  
  8271.  
  8272.  
  8273.  
  8274.  
  8275.         Section 12.3.1                                 Built-in Functions
  8276.  
  8277.  
  8278.             built-in  variables,  NF  and  '$i', i ≤ 0 ≤ NF, are set when
  8279.             'var' is not  specified.   The  effect  of  the  'srchrecord'
  8280.             function is summarized in the table following the description
  8281.             of the 'fsrchrecord' function. 
  8282.             
  8283.              Returns
  8284.             a)  the number of characters read  plus  the  length  of  the
  8285.                 End-Of-Record plus 1,
  8286.             b)  0 if end-of-file was encountered or
  8287.             c)  -1 if an error occurred. 
  8288.             
  8289.         6.  * fsrchrecord(fn,sp) or
  8290.             * fsrchrecord(fn,sp,rs) or
  8291.             * fsrchrecord(fn,sp,rs,var)  searches  the  file specified in
  8292.             'fn' for the next  record  or  records  matching  the  search
  8293.             pattern,  'sp'.   If the record separator parameter, 'rs', is
  8294.             not specified, records are determined by the variable RS.  If
  8295.             'rs'  is  specified,  record boundaries are determined by the
  8296.             strings matching 'rs'.  'rs' may  be  a  simple  constant  or
  8297.             variable  or  an  array.   As  for  the built-in variable RS,
  8298.             specifying rs as the null string, "", will set a  blank  line
  8299.             as  the  record  separator.   If rs is specified as the null,
  8300.             QTAwk will silently use the regular expression  /\n\n/.   The
  8301.             record or records matching the search pattern are returned in
  8302.             '$0' if 'var' is not specified.  If 'var' is  specified,  the
  8303.             matching  record  or  records  are  returned  in  'var'.  The
  8304.             built-in variables, NF and '$i', i ≤ 0 ≤  NF,  are  set  when
  8305.             'var' is not specified.  Returns
  8306.             a)  the  number  of  characters  read  plus the length of the
  8307.                 End-Of-Record plus 1,
  8308.             b)  0 if end-of-file was encountered or
  8309.             c)  -1 if an error occurred. 
  8310.             
  8311.              The following table details the  effect  of  the  'getline',
  8312.             'fgetline',  'srchrecord'  and 'fsrchrecord' functions on $0,
  8313.             the field variables, $i, and the built-in variables,  NF,  NR
  8314.             and FNR. 
  8315.             
  8316.             
  8317.                       getline()     getline(v)     fgetline(F)     fgetline(F,v)
  8318.                       srchrecord()  srchrecord(v)  fsrchrecord(F)  fsrchrecord(F,v)
  8319.                                                                          
  8320.             $0        updated       not updated        updated     not updated
  8321.             $i, i>0   updated       not updated        updated     not updated
  8322.             NF        updated       not updated        updated     not updated
  8323.             NR        updated           updated    not updated     not updated
  8324.  
  8325.  
  8326.         QTAwk                       - 12-17 -                       QTAwk
  8327.  
  8328.  
  8329.  
  8330.  
  8331.  
  8332.  
  8333.         Section 12.3.1                                 Built-in Functions
  8334.  
  8335.  
  8336.             FNR       updated           updated    not updated     not updated
  8337.             
  8338.              Note:  the  function  parameters  sp  and  rs  have not been
  8339.             shown in 'srchrecord'  and  'fsrchrecord'  to  highlight  the
  8340.             similarity  with  the  functions 'getline' and 'fgetline' and
  8341.             their effect on the variables indicated. 
  8342.             
  8343.              Note: FNR and NR are updated to  their  proper  and  correct
  8344.             values  whenever  the  basic  QTAwk processing loop reads the
  8345.             next input record from the current input  file  or  when  the
  8346.             'getline' or 'srchrecord' functions are executed. 
  8347.             
  8348.              If the record number of the record read by the 'fgetline' or
  8349.             'fsrchrecord' functions is desired,  the  'get_FNR'  function
  8350.             must be used. 
  8351.             
  8352.         7.  * getc();  ==>  reads  next character from current input file
  8353.             and returns the character read, 0 if  End-Of-File  or  -1  on
  8354.             file read error. 
  8355.             
  8356.              The ECHO_INPUT built-in variable controls echo of characters
  8357.             read from the standard input file or  keyboard  file  to  the
  8358.             standard output file. 
  8359.             
  8360.         8.  * fgetc(F);  ==> reads next character from file F and returns
  8361.             the character read, 0 if End-Of-File or -1 if  a  file  error
  8362.             occurs. 
  8363.             
  8364.              If  reading from the standard file, "keyboard", there are no
  8365.             End-Of-File or error  returns.   The  "fgetc"  function  will
  8366.             return  0  when  a  function key, cursor key or other key not
  8367.             corresponding to an ASCII character is pressed  when  reading
  8368.             from  the  keyboard file.  A second call must be made to read
  8369.             the  keyboard  scan  code  to  recognize  the  key  pressed. 
  8370.             Keyboard scan codes are listed in Appendix ii. 
  8371.             
  8372.              The ECHO_INPUT built-in variable controls echo of characters
  8373.             read from the standard input file or  keyboard  file  to  the
  8374.             standard output file. 
  8375.         12.3.2 Output Functions
  8376.         
  8377.         1.  * fprint(F);
  8378.             or
  8379.             * fprint  F;  ==>  prints  $0  to  file 'F' followed by ORS. 
  8380.             Returns the number of characters printed. 
  8381.             
  8382.  
  8383.  
  8384.         QTAwk                       - 12-18 -                       QTAwk
  8385.  
  8386.  
  8387.  
  8388.  
  8389.  
  8390.  
  8391.         Section 12.3.2                                 Built-in Functions
  8392.  
  8393.  
  8394.         2.  * fprint(F,...);
  8395.             or
  8396.             * fprint F,...; ==>  prints  expressions  in  the  expr_list,
  8397.             '...',  to  the  file  'F',  each separated by OFS.  The last
  8398.             expression  is  followed  by  ORS.   Returns  the  number  of
  8399.             characters printed. 
  8400.             
  8401.         3.  fprintf(F,fmt,...)  ==>  print  expr_list,  ...,  to file 'F'
  8402.             according to format 'fmt'.  Returns the number of  characters
  8403.             printed. 
  8404.             
  8405.         4.  print();
  8406.             or
  8407.             print;  ==>  prints  $0  to  standard output file followed by
  8408.             ORS.  Returns the number of characters printed. 
  8409.             
  8410.         5.  print(...);
  8411.             or
  8412.             print ...; ==> prints expressions in the expr_list,  ...,  to
  8413.             the  standard  output  file, each separated by OFS.  The last
  8414.             expression  is  followed  by  ORS.   Returns  the  number  of
  8415.             characters printed. 
  8416.             
  8417.         6.  printf(fmt,...)  ==> print expr_list, ..., to standard output
  8418.             file  according  to  format,  fmt.   Returns  the  number  of
  8419.             characters printed. 
  8420.             
  8421.         7.  * putc(c)  ==>  writes  the  character  'c'  to  the standard
  8422.             output file and returns the character c if no error  occurred
  8423.             on the write.  Returns -1 if an error occurred. 
  8424.             
  8425.         8.  * fputc(c,F)  ==>  writes the character 'c' to the file F and
  8426.             returns the character c if no error occurred on  the  write. 
  8427.             Returns -1 if an error occurred. 
  8428.             
  8429.         9.  sprintf(fmt,...)  ==>  return  string  formed  by  formatting
  8430.             expr_list, ...  , according to format, fmt. 
  8431.         
  8432.         12.3.3 Miscellaneous File Functions
  8433.         
  8434.         1.  * append(F) ==> this function causes  all  subsequent  output
  8435.             to file 'F' to be written, "printed", at the end of the file,
  8436.             i.e., appended to the end.  If any output is printed  to  the
  8437.             file  before  executing  this function, if the file currently
  8438.             exists, it is opened and truncated to zero  length  prior  to
  8439.             printing  the  first  character.  Closing the file, "F", with
  8440.  
  8441.  
  8442.         QTAwk                       - 12-19 -                       QTAwk
  8443.  
  8444.  
  8445.  
  8446.  
  8447.  
  8448.  
  8449.         Section 12.3.3                                 Built-in Functions
  8450.  
  8451.  
  8452.             the 'close' function will cancel the effect of  'append'  for
  8453.             any subsequent output to that file. 
  8454.             
  8455.         2.  close(F)  ==>  close  file  F.   If the same file is open for
  8456.             both reading and writing, the 'close' function will close the
  8457.             file  opened  for writing first.  The same file may be opened
  8458.             for both reading and writing  with  the  'append'  function. 
  8459.             Specifying the current scan file for the 'append' function is
  8460.             possible and will direct any output to the end  of  the  file
  8461.             without altering the current read position. 
  8462.             
  8463.         3.  * get_FNR()
  8464.             or
  8465.             * get_FNR(F)  ==>  this  function  returns the current record
  8466.             number of the input file specified.  The first form returns a
  8467.             value  equal  to  the built-in variable FNR and is equivalent
  8468.             to:
  8469.             
  8470.              get_FNR(FILENAME)
  8471.             
  8472.              If the filename specified is not open or  is  not  open  for
  8473.             input, a value of zero, 0, is returned. 
  8474.             
  8475.              This  function has been added because of the input functions
  8476.             'fgetline' and 'fsrchrecord'.  For the  current  input  file,
  8477.             the  built-in variable FNR is always updated automatically to
  8478.             contain the record number  of  the  last  record  input  (the
  8479.             current  record).   However,  when  reading from a file other
  8480.             than the current input file,  there  is  no  other  means  of
  8481.             obtaining  the  current  record  number  of  the  file.  With
  8482.             'fgetline', the user utility could  maintain  an  independent
  8483.             count   of  records  read.   However,  if  the  'fsrchrecord'
  8484.             function is used, it is  not  possible  for  the  utility  to
  8485.             maintain  such  a  count  since  not all records are actually
  8486.             'read'.  Many may be skipped  when  searching  for  a  string
  8487.             matching the search pattern. 
  8488.         
  8489.          The  use  of  the re-direction and pipeline operators, '<', '>',
  8490.         '>>' and '|', have been discontinued as error prone.  The use  of
  8491.         the syntax:
  8492.         
  8493.         { print $1, $2 > $3 }
  8494.         
  8495.          has been replaced by the 'fprint' function:
  8496.         
  8497.         { fprint($3,$1,$2); }
  8498.  
  8499.  
  8500.         QTAwk                       - 12-20 -                       QTAwk
  8501.  
  8502.  
  8503.  
  8504.  
  8505.  
  8506.  
  8507.         Section 12.3.3                                 Built-in Functions
  8508.  
  8509.  
  8510.          or
  8511.         
  8512.         { fprint $3,$1,$2; }
  8513.         12.3.4 Standard Files
  8514.         
  8515.          QTAwk  has  six standard files: keyboard, stdaux, stderr, stdin,
  8516.         stdout, stdprn.  These files are always open  and  available  for
  8517.         input or output. 
  8518.         
  8519.         1.  keyboard -- Keyboard
  8520.             this  file  is  designed to read input from the keyboard.  If
  8521.             the keyboard has been  redirected  to  a  disk  file  by  the
  8522.             PC/MS-DOS   redirection   or   piping   facility,   then  the
  8523.             End-Of-File will not  be  recognized.   Any  utility  reading
  8524.             redirected  input  from  this file must supply a means within
  8525.             the utility for termination.  This can  be  done  on  special
  8526.             input and use of the "exit" or "endfile" statement. 
  8527.             
  8528.              The  "fgetc"  function  will  return  0 when a function key,
  8529.             cursor key  or  other  key  not  corresponding  to  an  ASCII
  8530.             character  is pressed when reading from the keyboard file.  A
  8531.             second call must be made to read the keyboard  scan  code  to
  8532.             recognize the key pressed.  Keyboard scan codes are listed in
  8533.             Appendix ii. 
  8534.             
  8535.              The ECHO_INPUT built-in variable controls echo of characters
  8536.             read  from the keyboard file to the standard output file.  If
  8537.             characters read are not  to  be  displayed,  then  ECHO_INPUT
  8538.             should  be  set  to  a  false  value.   The  default value of
  8539.             ECHO_INPUT is 0. 
  8540.             
  8541.         2.  stdaux -- Standard Auxiliary File
  8542.             the first  communications  port  if  available  for  output. 
  8543.             
  8544.         3.  stderr -- Standard Error File
  8545.             the console display. 
  8546.             
  8547.         4.  stdin -- Standard Input File
  8548.             normally  the  console  keyboard,  but may be redirected to a
  8549.             disk file or piped from the  output  of  another  application
  8550.             program. 
  8551.             
  8552.              This  file  is  the  utility input file if no input file has
  8553.             been specified on the command line or an input  file  of  "-"
  8554.             has been specified. 
  8555.             
  8556.  
  8557.  
  8558.         QTAwk                       - 12-21 -                       QTAwk
  8559.  
  8560.  
  8561.  
  8562.  
  8563.  
  8564.  
  8565.         Section 12.3.4                                 Built-in Functions
  8566.  
  8567.  
  8568.              If  not  redirected  or  piped,  input will be read from the
  8569.             keyboard.  This  file  is  buffered  and  the  input  is  not
  8570.             available  to the QTAwk utility until the carriage return, or
  8571.             enter, key is pressed.  If single key characters  are  needed
  8572.             by  the  utility as the keys are pressed, then the "keyboard"
  8573.             file should  be  used  for  input  using  the  "fgetc"  input
  8574.             function.    Also,   cursor  keys,  function  keys  or  other
  8575.             "special" character keys cannot be input from this file.  The
  8576.             "keyboard"  file  and  the  "fgetc" function must be used for
  8577.             such input. 
  8578.             
  8579.              The ECHO_INPUT built-in variable controls echo of characters
  8580.             read  from the redirected or piped standard input file to the
  8581.             standard output file.  If the standard  input  file  has  not
  8582.             been  redirected  or piped, then input read from the standard
  8583.             input file will always be displayed irregardless of the value
  8584.             of  ECHO_INPUT.   If  characters  read from the redirected or
  8585.             piped standard input file  are  not  to  be  displayed,  then
  8586.             ECHO_INPUT should be set to a false value.  The default value
  8587.             of ECHO_INPUT is 0.  Normally, the default value is  desired,
  8588.             otherwise  redirected  or  piped  input  will  be sent to the
  8589.             standard output file as it is read. 
  8590.             
  8591.              The following table shows the effect of ECHO_INPUT on  input
  8592.             from the standard input file:
  8593.             
  8594.                                                 redirected  redirected   
  8595.             ECHO_INPUT  stdin       stdin       stdin       stdin        
  8596.             value       to display  to stdout   to display  to stdout    
  8597.             
  8598.             true        yes         yes         no          yes          
  8599.             
  8600.             false       yes         no          no          no           
  8601.             
  8602.         5.  stdout -- Standard Output File
  8603.             normally  the console screen, but may be redirected to a disk
  8604.             file or piped to the input of another  application  program. 
  8605.             Note  that  the  "print",  "printf"  and "putc" functions all
  8606.             output only to this file. 
  8607.             
  8608.         6.  stdprn -- Standard Printer File
  8609.             the printer attached to  the  parallel,  or  printer,  port. 
  8610.  
  8611.  
  8612.  
  8613.  
  8614.  
  8615.  
  8616.         QTAwk                       - 12-22 -                       QTAwk
  8617.  
  8618.  
  8619.  
  8620.  
  8621.  
  8622.  
  8623.         Section 12.4                                   Built-in Functions
  8624.  
  8625.  
  8626.         12.4 Miscellaneous Functions
  8627.         
  8628.         12.4.1 Expression Type
  8629.         
  8630.          *e_type(expr)   ==>   returns  the  type  of  'expr'.   Function
  8631.         evaluates the expression 'expr' and returns the type of the final
  8632.         result.  The return is an integer defining the type:
  8633.         
  8634.         Return      Type                                                 
  8635.         0           Uninitialized (returned when 'expr' is a variable which
  8636.                                     has not had a value assigned to it. Also
  8637.                                     if the variable not been assigned    
  8638.                                     since acted on by "deletea" statement)
  8639.         1           Regular Expression Value                             
  8640.         2           String Value                                         
  8641.         3           Single Character Value                               
  8642.         4           Integral Value                                       
  8643.         5           Floating Point Value                                 
  8644.         
  8645.         local lvar;
  8646.         e_type(lvar)          ==> 0                                      
  8647.         e_type(/string test/) ==> 1                                      
  8648.         e_type("string test") ==> 2                                      
  8649.         e_type('a')           ==> 3                                      
  8650.         e_type(45)            ==> 4                                      
  8651.         e_type(45.6)          ==> 5                                      
  8652.         e_type(45.6 ∩ "")     ==> 2                                      
  8653.         e_type("45.6" + 0.0)  ==> 5                                      
  8654.         e_type("45.6" + 0)    ==> 5                                      
  8655.         e_type("45" + 0)      ==> 4                                      
  8656.         e_type("45" + 0.0)    ==> 5                                      
  8657.         
  8658.         
  8659.         
  8660.         12.4.2 Execute String
  8661.         
  8662.          QTAwk  offers  two  forms of a function to execute QTAwk dynamic
  8663.         expressions or statements.  The first form will  execute  strings
  8664.         as  QTAwk  expressions  or  statements.   The second will execute
  8665.         array elements as QTAwk expressions or elements. 
  8666.         
  8667.          *execute(s[,se[,rf]]) ==> execute string s as an QTAwk statement
  8668.         or  expression.   If  se == TRUE, then string s is executed as an
  8669.         expression and the resultant value is returned by  the  'execute'
  8670.         function.   If  se  ==  FALSE,  then  string  s  is executed as a
  8671.         statement and the constant value of one, 1, is returned.  The  se
  8672.  
  8673.  
  8674.         QTAwk                       - 12-23 -                       QTAwk
  8675.  
  8676.  
  8677.  
  8678.  
  8679.  
  8680.  
  8681.         Section 12.4.2                                 Built-in Functions
  8682.  
  8683.  
  8684.         parameter  is  optional  and  defaults to FALSE.  Any built-in or
  8685.         user-defined function may be executed in the  'execute'  function
  8686.         except  the  'execute'  function  itself.   New  variables may be
  8687.         defined as well as new constant strings and regular expressions. 
  8688.         
  8689.          The  optional  rf parameter is the error recovery flag.  If rf =
  8690.         FALSE (the default value), an error  encountered  in  parsing  or
  8691.         executing  the string s will cause QTAwk to issue the appropriate
  8692.         error message and halt  execution.   If  rf  ==  TRUE,  an  error
  8693.         encountered in parsing or executing the string s will cause QTAwk
  8694.         to issue the appropriate error message,  discontinue  parsing  or
  8695.         execution  of the string and continue executing the current QTAwk
  8696.         utility.  Attempting  to  execute  the  'execute'  function  from
  8697.         within  the  'execute'  function is a fatal error and will always
  8698.         cause QTAwk to halt execution. 
  8699.         
  8700.          The following string can be executed as either an expression  or
  8701.         statement:
  8702.         
  8703.                            nvar = "power2 = 2 ^ 31;";                    
  8704.         
  8705.          If executed as an expression:
  8706.         
  8707.         print execute(nvar,1);
  8708.         
  8709.          the output will be: 2147483648
  8710.         
  8711.          If executed as a statement:
  8712.         
  8713.         print execute(nvar,0);
  8714.         
  8715.         or
  8716.         
  8717.         print execute(nvar);
  8718.         
  8719.          the output will be: 1
  8720.         
  8721.          Multiple  statements/expressions may be executed with a compound
  8722.         statement of the form:
  8723.         
  8724.          pvar = "{ pow8 = 2 ^ 8; pow16 = 2 ^ 16; pow31  =  2  ^  31;  }";
  8725.         
  8726.          Then
  8727.         
  8728.         execute(pvar,0);
  8729.         
  8730.  
  8731.  
  8732.         QTAwk                       - 12-24 -                       QTAwk
  8733.  
  8734.  
  8735.  
  8736.  
  8737.  
  8738.  
  8739.         Section 12.4.2                                 Built-in Functions
  8740.  
  8741.  
  8742.         or
  8743.         
  8744.         execute(pvar);
  8745.         
  8746.          will set the three variables:
  8747.         
  8748.         1.  pow8
  8749.         2.  pow16
  8750.         3.  pow31
  8751.         
  8752.          even  if  the  variables  were  not  previously defined.  If the
  8753.         variables were not previously defined, they  will  added  to  the
  8754.         list of the utility global variables. 
  8755.         
  8756.          Note that attempting to execute pvar as an expression:
  8757.         
  8758.         execute(pvar,1);
  8759.         
  8760.          will  result  in the error message "Undefined Symbol", since the
  8761.         braces  '{}'  are  only  recognized  in  statements.   All  three
  8762.         expressions  may be executed, as an expression, by the use of the
  8763.         sequence operator in the following manner:
  8764.         
  8765.          pvar = "pow8 = 2 ^ 8 , pow16 = 2 ^ 16 , pow31 = 2 ^ 31;";
  8766.         
  8767.          *execute(a[,se[,rf]]) ==> execute the elements of array a as  an
  8768.         QTAwk statement or expression.  The se and rf parameters have the
  8769.         same function and default values  as  above.   For  example,  the
  8770.         compound statement contained in pvar above may be split among the
  8771.         elements of an array:
  8772.         
  8773.         avar[1] = "{";
  8774.         avar[2] = "pow8 = 2 ^ 8;";
  8775.         avar[3] = "pow16 = 2 ^ 16;";
  8776.         avar[4] = "pow31 = 2 ^ 31;";
  8777.         avar[5] = "}";
  8778.         
  8779.          and executed as:
  8780.         
  8781.         execute(avar);
  8782.         
  8783.         or
  8784.         
  8785.         execute(avar,0);
  8786.         
  8787.         
  8788.  
  8789.  
  8790.         QTAwk                       - 12-25 -                       QTAwk
  8791.  
  8792.  
  8793.  
  8794.  
  8795.  
  8796.  
  8797.         Section 12.4.2                                 Built-in Functions
  8798.  
  8799.  
  8800.         
  8801.         12.4.3 Array Function
  8802.         
  8803.          QTAwk offers the following built-in array function. 
  8804.         
  8805.          rotate(a) - the values of the array are rotated. 
  8806.         The value of the first element goes  to  the  last  element,  the
  8807.         second  to the first, third to the second, etc.  If the array has
  8808.         the following elements:
  8809.         
  8810.         1.  a[1] = 1
  8811.         2.  a[2] = 2
  8812.         3.  a[3] = 3
  8813.         4.  a[4] = 4
  8814.         
  8815.          then rotate(a) will have the result:
  8816.         
  8817.         1.  a[1] = 2
  8818.         2.  a[2] = 3
  8819.         3.  a[3] = 4
  8820.         4.  a[4] = 1
  8821.         
  8822.          It is not necessary  to  specify  one-dimensional  arrays.   If:
  8823.         
  8824.         1.  a[1][1] = 1
  8825.         2.  a[1][2] = 2
  8826.         3.  a[1][3] = 3
  8827.         4.  a[1][4] = 4
  8828.         
  8829.          Then rotate(a[1]) will produce the result:
  8830.         
  8831.         1.  a[1][1] = 2
  8832.         2.  a[1][2] = 3
  8833.         3.  a[1][3] = 4
  8834.         4.  a[1][4] = 1
  8835.         
  8836.         
  8837.         
  8838.         12.4.4 System Control Function
  8839.         
  8840.          system(e)  ==>  executes  the  system  command  specified by the
  8841.         string value of the expression e. 
  8842.         
  8843.         
  8844.         
  8845.         12.4.5 Variable Access
  8846.  
  8847.  
  8848.         QTAwk                       - 12-26 -                       QTAwk
  8849.  
  8850.  
  8851.  
  8852.  
  8853.  
  8854.  
  8855.         Section 12.4.5                                 Built-in Functions
  8856.  
  8857.  
  8858.          There  are  two  built-in  functions  available  for  access  to
  8859.         variables.   The  first,  "pd_sym", accesses predefined variables
  8860.         and the second, ud_sym, accesses  user-defined  variables.   Each
  8861.         has two forms:
  8862.         
  8863.         pd_sym(name_str)
  8864.         ud_sym(name_str)
  8865.         
  8866.          or
  8867.         
  8868.         pd_sym(name_num,name_str)
  8869.         ud_sym(name_num,name_str)
  8870.         
  8871.         1.  To  access predefined variables, the function "pd_sym" may be
  8872.             used.   This  function  has  been  supplied  to   provide   a
  8873.             predefined  variable  access function similar to the function
  8874.             "ud_sym" for accessing user-defined variables.  The forms and
  8875.             returns are similar. 
  8876.             
  8877.         2.  To  access user-defined variables where the variable name may
  8878.             not be known in  advance,  the  function  "ud_sym"  has  been
  8879.             supplied.  The first form:
  8880.             
  8881.             ud_sym(name_expr)
  8882.             
  8883.              is useful in situations where the variable name is not known
  8884.             until the statement is  to  be  executed.   In  these  cases,
  8885.             name_expr  may  be  any  expression or variable with a string
  8886.             value equal to the name of the  unknown  variable.   In  this
  8887.             form,  the  string  value  of name_expr is used to access the
  8888.             variable.  'ud_sym' returns the variable in question, if  one
  8889.             exists,  whose  name  is  equal  to the string value passed. 
  8890.             
  8891.              The functional return value may be used  in  any  expression
  8892.             just  as  the variable itself would.  This includes operating
  8893.             on the return value with the array  index  operators,  "[]". 
  8894.             
  8895.              Note:  This form may be used to access both local and global
  8896.             variables.  If both a local and  global  variable  have  been
  8897.             defined  with  the  desired  name  and  the local variable is
  8898.             within scope, then the local variable is returned. 
  8899.             
  8900.              The second form:
  8901.             
  8902.             ud_sym(name_expr,name_str)
  8903.             
  8904.  
  8905.  
  8906.         QTAwk                       - 12-27 -                       QTAwk
  8907.  
  8908.  
  8909.  
  8910.  
  8911.  
  8912.  
  8913.         Section 12.4.5                                 Built-in Functions
  8914.  
  8915.  
  8916.              is useful in those situations where it may be impractical to
  8917.             use  string values to access the variables, e.g., in a "for",
  8918.             "while" or "do" loop, but a numeric  value  can  be  used  to
  8919.             access the variables. 
  8920.             
  8921.              The  user variables are accessed in the order defined in the
  8922.             user utility starting with one, 1.  If the integer  value  of
  8923.             name_expr  exceeds the number of user-defined variables, then
  8924.             a constant is returned.   The  second  parameter  must  be  a
  8925.             variable.   Upon  return,  this  variable  will have a string
  8926.             value equal to the name of the variable  found  or  the  null
  8927.             string  if  name_expr  exceeds  the  number  of  user-defined
  8928.             variables.  The return value of this variable may  be  tested
  8929.             to assure that a variable was found. 
  8930.             
  8931.              The  functional  return  value may be used in any expression
  8932.             just as the variable itself would.  This  includes  operating
  8933.             on  the  return  value with the array index operators, "[]". 
  8934.             
  8935.              Appendix vi lists the pre-defined variables with the integer
  8936.             value  used  in  the  first argument to access the variable. 
  8937.             
  8938.              Note: This form may  be  used  to  access  global  variables
  8939.             ONLY.   Local  variables cannot be accessed with this form of
  8940.             the function. 
  8941.         
  8942.          The  following  short  function  will  return  the   number   of
  8943.         user-defined global variables:
  8944.         
  8945.         # function to return the current number of
  8946.         # GLOBAL variables defined in utility
  8947.         function var_number(display) {
  8948.             local cnt, j, jj;
  8949.         
  8950.             for ( cnt = 1, j = ud_sym(cnt,jj) ; jj ; j = ud_sym(cnt,jj) ) {
  8951.                 if ( display ) print cnt ∩ " : " ∩ jj ∩ " ==>" ∩ j ∩ "<==";
  8952.                 cnt++;
  8953.                 }
  8954.             return cnt - 1;
  8955.         }
  8956.         
  8957.          The  following  function  may  be  called  with  the name of the
  8958.         variable desired.  The value of the variable will  be  returned. 
  8959.         Note  that  the  appropriate  variables  have been defined in the
  8960.         "BEGIN" action. 
  8961.         
  8962.  
  8963.  
  8964.         QTAwk                       - 12-28 -                       QTAwk
  8965.  
  8966.  
  8967.  
  8968.  
  8969.  
  8970.  
  8971.         Section 12.4.5                                 Built-in Functions
  8972.  
  8973.  
  8974.         BEGIN {
  8975.         #define the conversion variables
  8976.             _kilometers_to_statute_miles_ = 1.609344; # mile / kilometers (exact)
  8977.             _statute_miles_to_kilometers_ = 1/1.609344; # kilometers / mile (exact)
  8978.             _km_to_sm_ = 1.609344; # mile / kilometers (exact)
  8979.             _sm_to_km_ = 1/1.609344; # kilometers / mile (exact)
  8980.             _inches_to_centimeters_ = 2.54;
  8981.             _centimeters_to_inches_ = 1/2.54;
  8982.             _in_to_cm_ = 2.54;
  8983.             _cm_to_in_ = 1/2.54;
  8984.             _radians_to_degrees_ = 180/pi;
  8985.             _degrees_to_radians_ = pi/180;
  8986.             _rad_to_deg_ = 180/pi;
  8987.             _deg_to_rad_ = pi/180;
  8988.         }
  8989.         # function to return the appropriate conversion
  8990.         function conversion_factor(to_n,from_n) {
  8991.             local c_name = '_' ∩ to_n ∩ "_to_" ∩ from_n ∩ '_';
  8992.             return ud_sym(c_name);
  8993.         }
  8994.         
  8995.          The following function will list all pre-defined variables  with
  8996.         their current value and the integer used to access them:
  8997.         BEGIN {
  8998.             for ( i = 1 , jj = pd_sym(i,j) ; j ; jj = pd_sym(++i,j) ) {
  8999.                 gsub(/\n/,"\\n",jj);
  9000.                 gsub(/\s/,"\\s",jj);
  9001.                 gsub(/\t/,"\\t",jj);
  9002.                 print i,j,jj;
  9003.             }
  9004.         }
  9005.         
  9006.         
  9007.         
  9008.         12.4.6 File Search Function
  9009.         
  9010.          QTAwk  offers three forms of the "findfile" function.  All three
  9011.         forms    search    for     files     matching     a     specified
  9012.         "drive:\path\filename.ext"  pattern.   Since  PC/MS-DOS functions
  9013.         calls are utilized for  the  search  operations,  only  PC/MS-DOS
  9014.         style wild cards are allowed in the "filename.ext" portion of the
  9015.         pattern.  The three forms of the file search function are:
  9016.         
  9017.         1.  findfile(variable)
  9018.         2.  findfile(variable,pattern)
  9019.         3.  findfile(variable,pattern,attributes)
  9020.  
  9021.  
  9022.         QTAwk                       - 12-29 -                       QTAwk
  9023.  
  9024.  
  9025.  
  9026.  
  9027.  
  9028.  
  9029.         Section 12.4.6                                 Built-in Functions
  9030.  
  9031.  
  9032.          All three forms of the function return the number of files found
  9033.         which match the pattern specified with the specified attributes. 
  9034.         The first argument specifies the variable in which the  array  of
  9035.         files  found  is  returned.   The  second  argument specifies the
  9036.         "drive:\path\filename.ext" pattern to match against and the third
  9037.         argument specifies the file attributes which the files found must
  9038.         match.  If the file pattern is not passed or passed as  the  null
  9039.         string,  then the pattern "*.*" matching all files in the current
  9040.         directory is utilized. 
  9041.         
  9042.          If the last argument, the file attributes, is passed,  then  the
  9043.         string  form  is  used as specifying the attributes desired.  The
  9044.         attributes are specified as a string with  the  following  values
  9045.         recognized:
  9046.         
  9047.         'a'  or  'A'  -->  file  archive bit set indicating that file has
  9048.             been written  to  since  the  file  was  last  archived  (bit
  9049.             cleared). 
  9050.             
  9051.         'd'  or  'D' --> sub-directory, only sub-directories matching the
  9052.             pattern will be returned. 
  9053.             
  9054.         'h' or 'H' --> file hidden bit is set  indicating  that  file  is
  9055.             hidden,   i.e.,   not   ordinarily   displayed  by  directory
  9056.             searches. 
  9057.             
  9058.         'r' or 'R' --> file read-only bit is set, i.e., file may  not  be
  9059.             written to. 
  9060.             
  9061.         's'  or  'S' --> file system bit is set indicating that file is a
  9062.             "system  file".   Again  these  files  are   not   ordinarily
  9063.             displayed by directory searches. 
  9064.             
  9065.         'v'  or  'V'  -->  Volume  ID  bit.   Returns volume IDs matching
  9066.             pattern.  This is only found in the root directory. 
  9067.             
  9068.         'z' or 'Z' --> all file attributes cleared. 
  9069.         
  9070.          If the file attributes are not specified, then all  files  which
  9071.         match  the  pattern specified with all attributes cleared and all
  9072.         files  with  the  archive  and/or  read-only  bits  set  will  be
  9073.         returned. 
  9074.         
  9075.          The variable passed in the first argument will be used to return
  9076.         the array of files found.  The zeroth, 0, element  of  the  array
  9077.         will  contain  the  path  specified  in the pattern passed or the
  9078.  
  9079.  
  9080.         QTAwk                       - 12-30 -                       QTAwk
  9081.  
  9082.  
  9083.  
  9084.  
  9085.  
  9086.  
  9087.         Section 12.4.6                                 Built-in Functions
  9088.  
  9089.  
  9090.         current working directory if no path is specified.  Starting with
  9091.         element one, 1, the filename.ext, file size, file time, file date
  9092.         and file  attributes  will  be  returned.   Thus,  if  the  first
  9093.         argument  passes the variable "files", this variable will contain
  9094.         elements with the following information (with 1  ≤  n  ≤  N,  the
  9095.         number of files found):
  9096.         
  9097.         files[0] --> path specified or current working directory
  9098.             
  9099.         files[n]["name"] --> name of n'th file found
  9100.             
  9101.         files[n]["size"] --> size of n'th file found
  9102.             
  9103.         files[n]["date"]  -->  date  of n'th file found in PC/MS-DOS file
  9104.             date format
  9105.             
  9106.         files[n]["time"] --> time of n'th file found  in  PC/MS-DOS  file
  9107.             time format
  9108.             
  9109.         files[n]["attr"]  -->  string with attributes of n'th file found,
  9110.             null string if all attributes cleared. 
  9111.         
  9112.          Normally, the list of files  returned  in  the  file  array  are
  9113.         unsorted,  i.e.,  in  the order found by PC/MS-DOS.  If the files
  9114.         returned in the file array have to be ordered by  filename,  file
  9115.         extension,  file date, file time or file size, then the FILE_SORT
  9116.         built-in variable must  be  used  to  specified  the  sort  order
  9117.         desired. 
  9118.         
  9119.          For  PC/MS-DOS,  the  PC/MS-DOS file format time and date can be
  9120.         converted to month, day, year and hour, minute second  using  the
  9121.         following simple computations:
  9122.         
  9123.          :lo. 
  9124.         fdate = files[n]["date"];
  9125.         day = fdate & 0x01f;
  9126.         month = (fdate >> 5) & 0x00f;
  9127.         year = (fdate >> 9) + 1980;
  9128.         
  9129.         ftime = files[n]["time"];
  9130.         second = (ftime & 0x01f) * 2;
  9131.         minute = (ftime >> 5) & 0x03f;
  9132.         hour = (ftime >> 11);
  9133.         
  9134.          Alternatively, the 'sdate' and 'stime' built-in functions may be
  9135.         used to format the file  date  and/or  time.   For  example,  the
  9136.  
  9137.  
  9138.         QTAwk                       - 12-31 -                       QTAwk
  9139.  
  9140.  
  9141.  
  9142.  
  9143.  
  9144.  
  9145.         Section 12.4.6                                 Built-in Functions
  9146.  
  9147.  
  9148.         following  loop  will  re-set the appropriate array elements with
  9149.         the formatted file date and time:
  9150.         
  9151.         date_fmt_str  =  "%m/%d/%Y";  #  format  date  as  month/day/year
  9152.         time_fmt_str  =  "%H:%M:%S";  # format time as hour:minute:second
  9153.         for ( elem in file ) {
  9154.             if ( elem == 0 ) continue; # skip path element
  9155.             file[elem]["date"] = sdate(date_fmt_str,file[elem]["date"]);
  9156.             file[elem]["time"] = sdate(time_fmt_str,file[elem]["time"]);
  9157.         }
  9158.         
  9159.         
  9160.         
  9161.         
  9162.         12.4.7 Re-Set Regular Expressions
  9163.         
  9164.          Once a regular expression has been used in  QTAwk  the  internal
  9165.         form  is  set  and  cannot  normally be changed.  If the value of
  9166.         named   expressions   used   in   regular   expressions   changes
  9167.         infrequently,  the  use  of strings for search patterns is slow. 
  9168.         Also the value of regular expressions used in  GROUP  expressions
  9169.         cannot  normally  be changed.  For this reason QTAwk has included
  9170.         the built-in function:
  9171.         
  9172.          resetre()
  9173.         
  9174.          This  function  resets  ALL  regular  expressions  except  array
  9175.         regular   expressions,  including  all  GROUP  expressions.   The
  9176.         internal forms for regular expressions are deleted.  On the  next
  9177.         use  of  a  regular expression for matching, the internal form is
  9178.         rederived with the current values of any named expressions.   The
  9179.         time  a  GROUP  is  matched  against  an  input record, the GROUP
  9180.         expressions are evaluated and  the  internal  regular  expression
  9181.         form for the GROUP is rederived. 
  9182.         
  9183.          Refer  to  arrays in Section 6, for the use of arrays as regular
  9184.         expressions.  Arrays may be utilized anywhere in a expressions  a
  9185.         regular  expression  is  used.   The internal form of the regular
  9186.         expression is retained after the expression has  been  executed. 
  9187.         The  internal  regular  expression  form is deleted only when the
  9188.         array is changed.  The use of arrays as regular expressions gives
  9189.         the  user  more  control over the dynamic changing of the regular
  9190.         expression internal form. 
  9191.  
  9192.  
  9193.  
  9194.  
  9195.  
  9196.         QTAwk                       - 12-32 -                       QTAwk
  9197.  
  9198.  
  9199.  
  9200.  
  9201.  
  9202.  
  9203.         Section 13.0                               User-Defined Functions
  9204.  
  9205.  
  9206.         13.0 User-Defined Functions
  9207.         
  9208.          QTAwk supports user-defined functions and has enhanced them over
  9209.         Awk in several important aspects. 
  9210.         
  9211.         13.1 Local Variables
  9212.         
  9213.          In QTAwk it is no longer necessary to declare local variables as
  9214.         excess arguments in the function definition.  QTAwk has  included
  9215.         the  'local'  keyword.   This keyword may be used in any compound
  9216.         statement,  but  was  invented  specifically   for   user-defined
  9217.         functions.  Consider the simple function to accumulate words from
  9218.         the current input record in the formatting utility:
  9219.         
  9220.         # accumulate words for line
  9221.         function addword(w) {
  9222.             local lw = length(w); # length of added word
  9223.         
  9224.                 # check new line length
  9225.             if ( cnt + size + lw >= width ) printline(yes);
  9226.             line[++cnt] = w; # add word to line array
  9227.             size += lw;
  9228.         }
  9229.         
  9230.          That lw is local to the function and  will  disappear  when  the
  9231.         function  is  exited is obvious from the definition of lw.  It is
  9232.         also now easy to pick out the function  arguments,  'w'  in  this
  9233.         case.   The  initialization  of  lw to the length of the argument
  9234.         passed is also easily picked up from the definition.  The 'local'
  9235.         keyword  thus  truly  separates local variables from the function
  9236.         arguments. 
  9237.         
  9238.         13.2 Argument Checking
  9239.         
  9240.          By using the '_arg_chk' built-in variable, it is  also  possible
  9241.         to  have  QTAwk  now  do some argument checking for the user.  If
  9242.         _arg_chk is TRUE, then QTAwk will, at run-time, check the  number
  9243.         of  arguments passed against the number of arguments defined.  If
  9244.         the number  passed  differs  from  the  number  defined,  then  a
  9245.         run-time  error  is  issued  and QTAwk halts.  When '_arg_chk' is
  9246.         FALSE, QTAwk will check at  run-time  only  that  the  number  of
  9247.         arguments  passed  is  less than or equal to the number defined. 
  9248.         This follows the Awk practice and allows for the use of arguments
  9249.         defined,  but  not passed, as local variables.  The default value
  9250.         of '_arg_chk' is FALSE.  It is recommended that '_arg_chk' be set
  9251.         to TRUE and the 'local' keyword used to define variables meant to
  9252.  
  9253.  
  9254.         QTAwk                       - 13-1 -                        QTAwk
  9255.  
  9256.  
  9257.  
  9258.  
  9259.  
  9260.  
  9261.         Section 13.2                               User-Defined Functions
  9262.  
  9263.  
  9264.         be local to a function. 
  9265.         
  9266.         13.3 Variable Length Argument Lists
  9267.         
  9268.          QTAwk  allows  user-defined  functions  to  be  defined  with  a
  9269.         variable  number  of  arguments.   The actual number of arguments
  9270.         will be determined from the call at run-time.  QTAwk follows  the
  9271.         C  syntax  for  defining  a  function  with  a variable number of
  9272.         arguments:
  9273.         
  9274.         # function to determine maximum value
  9275.         function max(...) {
  9276.             local max = vargv[1];
  9277.             local i;
  9278.         
  9279.             for ( i = 2 ; i <= vargc ; i++ )
  9280.               if ( max < vargv[i] ) max = vargv[i];
  9281.             return max;
  9282.         }
  9283.         
  9284.          The  ellipses,  '...',  is  used  as  the  last  argument  in  a
  9285.         user-defined  argument list to indicate that a variable number of
  9286.         arguments follow.  In the max function shown, no fixed  arguments
  9287.         are  indicated.   Within the function, the variable arguments are
  9288.         accessed via the built-in singly-dimensioned array, 'vargv'.  The
  9289.         built-in  variable 'vargc' is set equal to the number of elements
  9290.         of the array and, hence, the variable number of arguments  passed
  9291.         to  the  function.   Since the variable arguments are passed in a
  9292.         singly dimensioned array, the 'for'  statement  may  be  used  to
  9293.         access each in turn:
  9294.         
  9295.         # function to determine maximum value
  9296.         function max(...) {
  9297.             local max = vargv[1];
  9298.             local i;
  9299.         
  9300.             for ( i in vargv )
  9301.               if ( max < vargv[i] ) max = vargv[i];
  9302.             return max;
  9303.         }
  9304.         
  9305.          A  user-defined function may have fixed arguments and a variable
  9306.         number of arguments following:
  9307.         
  9308.         # function with both  fixed  and  variable  number  of  arguments
  9309.         function sample(arg1,arg2,...) {
  9310.  
  9311.  
  9312.         QTAwk                       - 13-2 -                        QTAwk
  9313.  
  9314.  
  9315.  
  9316.  
  9317.  
  9318.  
  9319.         Section 13.3                               User-Defined Functions
  9320.  
  9321.  
  9322.             .
  9323.             .
  9324.             .
  9325.         }
  9326.         
  9327.          If  a  user-defined  function  is  to  have a variable number of
  9328.         arguments, then the 'local' keyword must be used to define  local
  9329.         variables.   The ellipses denoting the variable arguments must be
  9330.         last in the function definition argument list. 
  9331.         
  9332.         13.4 Null Argument List
  9333.         
  9334.          A user defined function  may  be  defined  with  no  arguments. 
  9335.         Consider  the function to accumulate words from input records for
  9336.         the text formatter:
  9337.         
  9338.         # function to add current line to parsed text
  9339.         function add_line() {
  9340.             for ( i = 1 ; i <= NF ; i++ ) if ( length($i) ) addword($i);
  9341.         }
  9342.         
  9343.          In the case of a user-defined function with no arguments  to  be
  9344.         passed,  the  function  may  be  invoked  with  no  parenthesized
  9345.         parameter list.  Consider the invocation of the add-line function
  9346.         in  the  text  formatter.   The action executed for input records
  9347.         which do not start with a format control word is:
  9348.         
  9349.             {
  9350.             if ( format ) add_line;
  9351.               else if ( table_f ) format_table($0);
  9352.               else output_line($0,FALSE);
  9353.         }
  9354.         
  9355.          In QTAwk, the add_line function may be invoked as "add_line"  as
  9356.         above  or  as  "add_line()",  with a null length parameter list. 
  9357.         
  9358.          QTAwk has also relaxed the Awk rule that the left parenthesis of
  9359.         the   parameter  list  must  immediately  follow  a  user-defined
  9360.         function invocation.  QTAwk allows blanks between  the  name  and
  9361.         the left parenthesis.  The blanks are ignored. 
  9362.         
  9363.         13.5 Arrays and Used-Defined Functions
  9364.         
  9365.          Just as arrays are integrated into QTAwk expressions, arrays are
  9366.         also integrated into the passing of arguments to, and the  return
  9367.         value  from,  user-defined functions.  Used-defined functions may
  9368.  
  9369.  
  9370.         QTAwk                       - 13-3 -                        QTAwk
  9371.  
  9372.  
  9373.  
  9374.  
  9375.  
  9376.  
  9377.         Section 13.5                               User-Defined Functions
  9378.  
  9379.  
  9380.         return arrays as well as scalars.  This will be illustrated in  a
  9381.         sample utility later. 
  9382.         
  9383.          QTAwk  passes  scalar  arguments  to  user-defined  functions by
  9384.         value, i.e., if a scalar variable is specified as an argument  to
  9385.         a  function, a copy of the variable is passed to the function and
  9386.         not the variable itself.  This is called pass by value.  Thus, if
  9387.         the  function  alters  the value of the argument, the variable is
  9388.         not altered, only the copy.  When the  function  terminates,  the
  9389.         copy  is  discarded,  and the variable still retains its original
  9390.         value. 
  9391.         
  9392.          In contrast, QTAwk passes array variables by "reference".   This
  9393.         means  that  the  local  variable  represented  by  the  function
  9394.         argument, is the referenced variable and not a copy.  Any changes
  9395.         to  the  local  variable  are  actually  made  to  the referenced
  9396.         variable. 
  9397.         
  9398.          In QTAwk, function arguments may also be constant arrays and not
  9399.         variable  arrays,  i.e.,  the  argument  may  be the result of an
  9400.         arithmetic operation on an array.  For example, if A is an array,
  9401.         then the result of the expression
  9402.         
  9403.         "A + 10"
  9404.         
  9405.          is  an  array  and  would  be  passed  as  a constant array as a
  9406.         function  argument.   Such  arrays  are   discard   at   function
  9407.         termination. 
  9408.         
  9409.          QTAwk passes by reference under three conditions:
  9410.         
  9411.         1.  The  argument  is  a  global  or local variable and an array,
  9412.             
  9413.         2.  The argument is a global or local variable  and  used  as  an
  9414.             array,  i.e.,  indexed or referenced by an 'in' statement, in
  9415.             the called function.  This is  true  whether  the  referenced
  9416.             variable  is  a scalar or array when the function is called. 
  9417.             If the referenced variable was a scalar when the function  is
  9418.             called,  then at function termination, if the statement(s) in
  9419.             which the argument was indexed WERE EXECUTED, the  referenced
  9420.             variable  will be an array with the index values referenced. 
  9421.             This behavior is identical  to  creating  array  elements  in
  9422.             global variables by referencing the elements. 
  9423.             
  9424.         3.  The  argument  is  a  global  or local scalar variable and at
  9425.             function termination the argument is an array.  In this case,
  9426.  
  9427.  
  9428.         QTAwk                       - 13-4 -                        QTAwk
  9429.  
  9430.  
  9431.  
  9432.  
  9433.  
  9434.  
  9435.         Section 13.5                               User-Defined Functions
  9436.  
  9437.  
  9438.             the  argument  may  not  have  been directly referenced as an
  9439.             array, but may be the result of  an  operation  involving  an
  9440.             array.   Alternatively  the  argument may have been passed to
  9441.             another function which referenced it as an array or set it to
  9442.             the result of operations on arrays. 
  9443.         
  9444.          The  following  QTAwk  utility with a user-defined function will
  9445.         illustrate the use of arrays and scalars  as  function  arguments
  9446.         and the return of arrays by user-defined functions. 
  9447.  
  9448.  
  9449.  
  9450.  
  9451.  
  9452.  
  9453.  
  9454.  
  9455.  
  9456.  
  9457.  
  9458.  
  9459.  
  9460.  
  9461.  
  9462.  
  9463.  
  9464.  
  9465.  
  9466.  
  9467.  
  9468.  
  9469.  
  9470.  
  9471.  
  9472.  
  9473.  
  9474.  
  9475.  
  9476.  
  9477.  
  9478.  
  9479.  
  9480.  
  9481.  
  9482.  
  9483.  
  9484.  
  9485.  
  9486.         QTAwk                       - 13-5 -                        QTAwk
  9487.  
  9488.  
  9489.  
  9490.  
  9491.  
  9492.  
  9493.         Section 13.5                               User-Defined Functions
  9494.  
  9495.  
  9496.         BEGIN {
  9497.                 # create arrays 'a' and 'b'
  9498.             for ( i = 1 ; i < 6 ; i++ ) a[i] = b[i] = i;
  9499.                 # create scalars 'c' and 'f'
  9500.             c = f = 10;
  9501.                 # pass scalar variables/values and return scalar value
  9502.             print "scalar : "set_var(c,c,c)" and c == "c;
  9503.                 # pass two arrays, 'a' & 'b',
  9504.                 # and one scalar constant, 'c+0'
  9505.                 # function will return an array "== a + b + (c+0)"
  9506.             d = set_var(a,b,c+0);
  9507.                 # print returned array 'd' (== a + b + (c+0))
  9508.             for ( i in d ) print "d["i"] = "d[i];
  9509.                 #print scalar 'c' to show unchanged
  9510.             print c;
  9511.                 # pass two arrays, 'a' & 'b',
  9512.                 # and one scalar variable, 'c'
  9513.                 # function will return an array "== a + b + c"
  9514.             e = set_var(a,b,c);
  9515.                 # print returned array
  9516.             for ( i in e ) print "e["i"] = "e[i];
  9517.                 # print former scalar, 'c',
  9518.                 # converted to array by operation c = b + 2;
  9519.             for ( i in c ) print "c["i"] = "c[i];
  9520.                 # pass two arrays, 'a' & 'b', and constant array, 'b+0'
  9521.             h = set_var(a,b,b+0);
  9522.                 # print returned array
  9523.             for ( i in h ) print "h["i"] = "h[i];
  9524.                 # print array 'b' to assure that unchanged
  9525.             for ( i in b ) print "b["i"] = "b[i];
  9526.                 # attempt illegal operation in function: w = f + b
  9527.                 # adding array, 'b', to scalar, 'f'.
  9528.                 # error message will be issued and execution halted
  9529.             g = set_var(f,b,f);
  9530.         }
  9531.         
  9532.         function set_var(x,y,z) {
  9533.                 # create local variable
  9534.             local w = x + y + z;
  9535.                 # alter third argument
  9536.                 # if first & second arguments arrays,
  9537.                 # this will convert third to an array
  9538.                 # (if not already passed as an array).
  9539.             z = y + 2;
  9540.             return w;
  9541.         }
  9542.  
  9543.  
  9544.         QTAwk                       - 13-6 -                        QTAwk
  9545.  
  9546.  
  9547.  
  9548.  
  9549.  
  9550.  
  9551.  
  9552.  
  9553.  
  9554.  
  9555.  
  9556.  
  9557.  
  9558.  
  9559.  
  9560.  
  9561.  
  9562.  
  9563.  
  9564.  
  9565.  
  9566.  
  9567.  
  9568.  
  9569.  
  9570.  
  9571.  
  9572.  
  9573.  
  9574.  
  9575.  
  9576.  
  9577.  
  9578.  
  9579.  
  9580.  
  9581.  
  9582.  
  9583.  
  9584.  
  9585.  
  9586.  
  9587.  
  9588.  
  9589.  
  9590.  
  9591.  
  9592.  
  9593.  
  9594.  
  9595.  
  9596.  
  9597.  
  9598.  
  9599.  
  9600.  
  9601.  
  9602.         QTAwk                       - 13-7 -                        QTAwk
  9603.  
  9604.  
  9605.  
  9606.  
  9607.  
  9608.  
  9609.         Section 13.5                               User-Defined Functions
  9610.  
  9611.  
  9612.          This QTAwk utility illustrates several ideas in using arrays and
  9613.         user-defined functions in QTAwk.  The line:
  9614.         
  9615.             print "scalar : "set_var(c,c,c)" and c == "c;
  9616.         
  9617.          calls the function 'set_var' with three  scalar  variables,  all
  9618.         'c'.   Three  copies  of  'c'  are  actually  passed.   The local
  9619.         variable, 'w', is computed  using  scalar  quantities  and  is  a
  9620.         scalar  quantity.   Since  argument 'y' is a scalar quantity, the
  9621.         result of the expression:
  9622.         
  9623.             z = y + 2;
  9624.         
  9625.          is a scalar and  the  third  argument,  'c',  is  unchanged.   A
  9626.         functional value of 30 (== c + c + c) is returned. 
  9627.         
  9628.          The line:
  9629.         
  9630.             d = set_var(a,b,c+0);
  9631.         
  9632.          passes  arrays  as  the  first  and second arguments.  The third
  9633.         argument is a constant scalar value, and thus cannot  be  changed
  9634.         by the function called.  The return value of the function:
  9635.         
  9636.         w = x + y + z; (== a + b + 10;)
  9637.         
  9638.          is an array.  The line:
  9639.         
  9640.             for ( i in d ) print "d["i"] = "d[i];
  9641.         
  9642.          prints the values of the array:
  9643.         
  9644.         d[1] = 12
  9645.         d[2] = 14
  9646.         d[3] = 16
  9647.         d[4] = 18
  9648.         d[5] = 20
  9649.         
  9650.          The line:
  9651.         
  9652.             e = set_var(a,b,c);
  9653.         
  9654.          passes  arrays  as  the  first  and second arguments.  The third
  9655.         argument is a variable scalar value, and thus can be  changed  by
  9656.         the function called if the third argument at function termination
  9657.         is an array.  The return value of the function:
  9658.  
  9659.  
  9660.         QTAwk                       - 13-8 -                        QTAwk
  9661.  
  9662.  
  9663.  
  9664.  
  9665.  
  9666.  
  9667.         Section 13.5                               User-Defined Functions
  9668.  
  9669.  
  9670.         w = x + y + z; (== a + b + c;)
  9671.         
  9672.          is an array as above.  Note that at  function  termination,  the
  9673.         third  argument is now an array since it was set to the result of
  9674.         an operation on an array:
  9675.         
  9676.             z = y + 2;
  9677.         
  9678.          which is now equivalent to:
  9679.         
  9680.             z = b + 2;
  9681.         
  9682.          Thus, at function termination the scalar variable 'c'  has  been
  9683.         converted to an array.  The line:
  9684.         
  9685.             for ( i in c ) print "c["i"] = "c[i];
  9686.         
  9687.          will print the values of the array elements:
  9688.         
  9689.         c[1] = 3 ( == b[1] + 2)
  9690.         c[2] = 4 ( == b[2] + 2)
  9691.         c[3] = 5 ( == b[3] + 2)
  9692.         c[4] = 6 ( == b[4] + 2)
  9693.         c[5] = 7 ( == b[5] + 2)
  9694.         
  9695.          The line:
  9696.         
  9697.             h = set_var(a,b,b+0);
  9698.         
  9699.          passes  arrays  as  the  first  and second arguments.  The third
  9700.         argument is a constant array value, and thus cannot be changed by
  9701.         the  function  called.   The  return  value of the function is an
  9702.         array as above.  Note that at  function  termination,  the  third
  9703.         argument is again an array as above.  However, the third argument
  9704.         has been passed as a constant  array  and  thus  no  variable  is
  9705.         changed  as  'c'  was  above.  The third argument is discarded at
  9706.         function termination.  The line:
  9707.         
  9708.             for ( i in b ) print "b["i"] = "b[i];
  9709.         
  9710.          prints the array 'b' to assure that it was not changed. 
  9711.         
  9712.          The line:
  9713.         
  9714.             g = set_var(f,b,f);
  9715.         
  9716.  
  9717.  
  9718.         QTAwk                       - 13-9 -                        QTAwk
  9719.  
  9720.  
  9721.  
  9722.  
  9723.  
  9724.  
  9725.         Section 13.5                               User-Defined Functions
  9726.  
  9727.  
  9728.          will result in an illegal operation in the function:
  9729.         
  9730.             local w = x + y + z; (== f + b + f;)
  9731.         
  9732.          this operation is now attempting to add an array  to  a  scalar:
  9733.         
  9734.             f + b
  9735.         
  9736.          This  operation  will  result  in  an  error  message  and  halt
  9737.         execution. 
  9738.         
  9739.          The  above  sample  QTAwk  utility  illustrates  the  power   of
  9740.         user-defined  functions  in  automatically  handling  scalars and
  9741.         arrays  as  both  arguments  and  return  values  and   adjusting
  9742.         accordingly.   The  same function may be used interchangeably for
  9743.         both arrays and scalars with natural  and  predictable  results. 
  9744.  
  9745.  
  9746.  
  9747.  
  9748.  
  9749.  
  9750.  
  9751.  
  9752.  
  9753.  
  9754.  
  9755.  
  9756.  
  9757.  
  9758.  
  9759.  
  9760.  
  9761.  
  9762.  
  9763.  
  9764.  
  9765.  
  9766.  
  9767.  
  9768.  
  9769.  
  9770.  
  9771.  
  9772.  
  9773.  
  9774.  
  9775.  
  9776.         QTAwk                       - 13-10 -                       QTAwk
  9777.  
  9778.  
  9779.  
  9780.  
  9781.  
  9782.  
  9783.         Section 14.0                                 Format Specification
  9784.  
  9785.  
  9786.         14.0 Format Specification
  9787.         
  9788.          QTAwk  follows the Draft ANSI C language standard for the format
  9789.         string in the 'printf' and 'fprintf' functions except for the 'P'
  9790.         and   'n'   types,   which   are  not  supported  and  will  give
  9791.         unpredictable results. 
  9792.         
  9793.          A format specification has the form:
  9794.         
  9795.         %[flags][width][.precision][h | l | L]type
  9796.         
  9797.          which is matched by the following regular expression:
  9798.         
  9799.         /%{flags}?{width}?{precision}?[hlL]?{type}/
  9800.         
  9801.          with:
  9802.         
  9803.         flags = /[-+\s#0]/;
  9804.         width = /([0-9]+|\*)/;
  9805.         precision = /(\.([0-9]+|\*))/;
  9806.         type = /[diouxXfeEgGcs]/;
  9807.         
  9808.          Each field of the format specification is a single character  or
  9809.         a  number  signifying  a  particular  format  option.   The  type
  9810.         character, which appears after the last  optional  format  field,
  9811.         enclosed  in  braces  '[..]',  determines  whether the associated
  9812.         argument is interpreted as a character, a string, or  a  number. 
  9813.         The  simplest format specification contains only the percent sign
  9814.         and a type character (for  example,  %s).   The  optional  fields
  9815.         control other aspects of the formatting, as follows:
  9816.         
  9817.         1.  flags  ==>  Control  justification  of output and printing of
  9818.             signs,  blanks,  decimal  points,   octal   and   hexadecimal
  9819.             prefixes. 
  9820.             
  9821.         2.  width  ==>  Control  minimum  number  of  characters output. 
  9822.             
  9823.         3.  precision ==> Controls maximum number of  characters  printed
  9824.             for  all  or  part  of the output field, or minimum number of
  9825.             digits printed for integer values. 
  9826.             
  9827.         4.  h,  l,  L  ==>  Prefixes  that  determine  size  of  argument
  9828.             expected  (this field is retained only for compatibility to C
  9829.             format strings). 
  9830.             
  9831.             a)  h ==> Used as a prefix with the integer types  d,  i,  o,
  9832.  
  9833.  
  9834.         QTAwk                       - 14-1 -                        QTAwk
  9835.  
  9836.  
  9837.  
  9838.  
  9839.  
  9840.  
  9841.         Section 14.0                                 Format Specification
  9842.  
  9843.  
  9844.                 x,  and  X  to specify that the argument is short int, or
  9845.                 with u to specify a short unsigned int
  9846.                 
  9847.             b)  l == > Used as a prefix with d, i, o, x, and X  types  to
  9848.                 specify  that  the  argument  is  long  int, or with u to
  9849.                 specify a long unsigned int; also used as a  prefix  with
  9850.                 e,  E, f, g, and G types to specify a double, rather than
  9851.                 a float
  9852.                 
  9853.             c)  L ==> Used as a prefix with e, E, f, g, and  G  types  to
  9854.                 specify a long double
  9855.         
  9856.          If  a  percent sign, '%', is followed by a character that has no
  9857.         meaning as a format field, the character is simply copied to  the
  9858.         output.   For  example,  to  print  a percent-sign character, use
  9859.         "%%". 
  9860.         
  9861.         14.1 Output Types
  9862.         
  9863.          Type characters:
  9864.         
  9865.         1.  d ==> integer, Signed decimal integer
  9866.         2.  i ==> integer, Signed decimal integer
  9867.         3.  u ==> integer, Unsigned decimal integer
  9868.         4.  o ==> integer, Unsigned octal integer
  9869.         5.  x ==> integer, Unsigned hexadecimal integer,  using  "abcdef"
  9870.         6.  X  ==>  integer, Unsigned hexadecimal integer, using "ABCDEF"
  9871.         7.  f ==> float, Signed value having the form
  9872.             
  9873.             [-]dddd.dddd
  9874.             
  9875.              where dddd is one or more decimal  digits.   The  number  of
  9876.             digits  before  the decimal point depends on the magnitude of
  9877.             the number, and the number of digits after the decimal  point
  9878.             depends on the requested precision. 
  9879.             
  9880.         8.  e ==> float, Signed value having the form
  9881.             
  9882.             [-]d.dddde[sign]ddd,
  9883.             
  9884.              where  d  is  a  single  decimal  digit, dddd is one or more
  9885.             decimal digits, ddd is exactly three decimal digits, and sign
  9886.             is + or -. 
  9887.             
  9888.         9.  E  ==>  float,  Identical  to  the  e  format,  except that E
  9889.             introduces the exponent instead of e. 
  9890.  
  9891.  
  9892.         QTAwk                       - 14-2 -                        QTAwk
  9893.  
  9894.  
  9895.  
  9896.  
  9897.  
  9898.  
  9899.         Section 14.1                                 Format Specification
  9900.  
  9901.  
  9902.         10.  g ==>  float,  Signed  value  printed  in  f  or  e  format,
  9903.             whichever is more compact for the given value and precision. 
  9904.             The e format is used only when the exponent of the  value  is
  9905.             less  than  -4  or  greater  than  the  precision  argument. 
  9906.             Trailing zeros are truncated and the  decimal  point  appears
  9907.             only if one or more digits follow it. 
  9908.             
  9909.         11.  G  ==>  float,  Identical  to  the  g  format, except that E
  9910.             introduces the exponent (where appropriate)  instead  of  e. 
  9911.             
  9912.         12.  c ==> character, Single character
  9913.             
  9914.         13.  s  ==>  string,  Characters  printed  up  to  the first null
  9915.             character ('\0') or until the precision  value  is  reached. 
  9916.         
  9917.         14.2 Output Flags
  9918.         
  9919.          Flag Characters
  9920.         
  9921.         1.  '-'  ==>  Left  justify  the  result  within  the given field
  9922.             width.  Default: Right justify. 
  9923.             
  9924.         2.  '+' ==> Prefix the output value with a sign (+ or -)  if  the
  9925.             output value is of a signed type.  Default: Sign appears only
  9926.             for negative signed values (-). 
  9927.             
  9928.         3.  blank (' ') ==> Prefix the output value with a blank  if  the
  9929.             output value is signed and positive.  The blank is ignored if
  9930.             both the blank and  +  flags  appear.   Default:  No  blank. 
  9931.             
  9932.         4.  '#'  ==>  When  used  with  the o, x, or X format, the # flag
  9933.             prefixes  any  nonzero  output  value  with  0,  0x,  or  0X,
  9934.             respectively.  Default: No blank. 
  9935.             
  9936.         5.  '#'  ==>  When  used  with  the e, E, or f format, the # flag
  9937.             forces the output value to contain a  decimal  point  in  all
  9938.             cases.   Default: Decimal point appears only if digits follow
  9939.             it. 
  9940.             
  9941.         6.  '#' ==> When used with the g or G format, the #  flag  forces
  9942.             the  output value to contain a decimal point in all cases and
  9943.             prevents the truncation of trailing zeros.  Default:  Decimal
  9944.             point  appears  only if digits follow it.  Trailing zeros are
  9945.             truncated. 
  9946.             
  9947.         7.  '#' ==> Ignored when used with c, d, i, u or s
  9948.  
  9949.  
  9950.         QTAwk                       - 14-3 -                        QTAwk
  9951.  
  9952.  
  9953.  
  9954.  
  9955.  
  9956.  
  9957.         Section 14.2                                 Format Specification
  9958.  
  9959.  
  9960.         8.  '0' ==> For d, i, o, u, x, X, e, E, f, g, and G  conversions,
  9961.             leading  zeros (following any indication of sign or base) are
  9962.             used  to  pad  to  the  field  width;  no  space  padding  is
  9963.             performed.  If the 0 and - flags both appear, the 0 flag will
  9964.             be ignored.  For d, i, o, u,  x,  and  X  conversions,  if  a
  9965.             precision  is  specified,  the  0  flag will be ignored.  For
  9966.             other conversions the behavior is  undefined.   Default:  Use
  9967.             blank padding
  9968.         
  9969.          If  the  argument corresponding to a floating-point specifier is
  9970.         infinite or indefinite, the following output is produced:
  9971.         
  9972.         + infinity ==> 1.#INFrandom-digits
  9973.         - infinity ==> -1.#INFrandom-digits
  9974.         Indefinite ==> digit.#INDrandom-digits
  9975.         
  9976.         14.3 Output Width
  9977.         
  9978.          The width argument is a non-negative decimal integer controlling
  9979.         the  minimum  number  of  characters  printed.   If the number of
  9980.         characters in the output value is less than the specified  width,
  9981.         blanks  are  added  to  the  left  or  the  right  of  the values
  9982.         (depending on whether the - flag is specified) until the  minimum
  9983.         width  is reached.  If width is prefixed with a 0 flag, zeros are
  9984.         added  until  the  minimum  width  is  reached  (not  useful  for
  9985.         left-justified numbers). 
  9986.         
  9987.          The width specification never causes a value to be truncated; if
  9988.         the number of characters in the output value is greater than  the
  9989.         specified  width,  or  width  is not given, all characters of the
  9990.         value are printed  (subject  to  the  precision  specification). 
  9991.         
  9992.          The width specification may be an asterisk (*), in which case an
  9993.         integer argument from the argument list supplies the value.   The
  9994.         width  argument  must  precede  the  value being formatted in the
  9995.         argument list.  A nonexistent or small field width does not cause
  9996.         a  truncation  of a field; if the result of a conversion is wider
  9997.         than the field width, the field expands to contain the conversion
  9998.         result. 
  9999.         
  10000.         14.4 Output Precision
  10001.         
  10002.          The  precision  specification  is a non-negative decimal integer
  10003.         preceded  by  a  period,  '.',  which  specifies  the  number  of
  10004.         characters  to  be  printed, the number of decimal places, or the
  10005.         number of significant digits.  Unlike  the  width  specification,
  10006.  
  10007.  
  10008.         QTAwk                       - 14-4 -                        QTAwk
  10009.  
  10010.  
  10011.  
  10012.  
  10013.  
  10014.  
  10015.         Section 14.4                                 Format Specification
  10016.  
  10017.  
  10018.         the  precision  can  cause  truncation  of  the  output value, or
  10019.         rounding in the case of a floating-point value. 
  10020.         
  10021.          The precision specification may be an asterisk,  '*',  in  which
  10022.         case  an  integer  argument  from  the argument list supplies the
  10023.         value.  The precision  argument  must  precede  the  value  being
  10024.         formatted in the argument list. 
  10025.         
  10026.          The  interpretation of the precision value, and the default when
  10027.         precision is omitted, depend on the type, as shown below:
  10028.         
  10029.         1.  d,i,u,o,x,X ==> The precision specifies  the  minimum  number
  10030.             of  digits  to  be  printed.   If the number of digits in the
  10031.             argument is less than precision, the output value  is  padded
  10032.             on  the left with zeros.  The value is not truncated when the
  10033.             number of digits exceeds precision.  Default: If precision is
  10034.             0 or omitted entirely, or if the period (.) appears without a
  10035.             number following it, the precision is set to 1. 
  10036.             
  10037.         2.  e, E ==> The precision specifies the number of digits  to  be
  10038.             printed  after  the decimal point.  The last printed digit is
  10039.             rounded.  Default: Default precision is 6; if precision is  0
  10040.             or  the  period (.) appears without a number following it, no
  10041.             decimal point is printed. 
  10042.             
  10043.         3.  f ==> The precision value  specifies  the  number  of  digits
  10044.             after  the  decimal  point.   If  a decimal point appears, at
  10045.             least one digit appears before it.  The value is  rounded  to
  10046.             the appropriate number of digits.  Default: Default precision
  10047.             is 6; if precision is 0, or if the period (.) appears without
  10048.             a number following it, no decimal point appears. 
  10049.             
  10050.         4.  g,  G  ==>  The  precision  specifies  the  maximum number of
  10051.             significant digits printed.  Default: Six significant  digits
  10052.             are  printed, without any trailing zeros that are truncated. 
  10053.             
  10054.         5.  c ==> No effect.  Default: Character printed
  10055.             
  10056.         6.  s  ==>  The  precision  specifies  the  maximum   number   of
  10057.             characters  to be printed.  Characters in excess of precision
  10058.             are not printed.  Default: All characters of the  string  are
  10059.             printed. 
  10060.  
  10061.  
  10062.  
  10063.  
  10064.  
  10065.  
  10066.         QTAwk                       - 14-5 -                        QTAwk
  10067.  
  10068.  
  10069.  
  10070.  
  10071.  
  10072.  
  10073.  
  10074.  
  10075.  
  10076.  
  10077.  
  10078.  
  10079.  
  10080.  
  10081.  
  10082.  
  10083.  
  10084.  
  10085.  
  10086.  
  10087.  
  10088.  
  10089.  
  10090.  
  10091.  
  10092.  
  10093.  
  10094.  
  10095.  
  10096.  
  10097.  
  10098.  
  10099.  
  10100.  
  10101.  
  10102.  
  10103.  
  10104.  
  10105.  
  10106.  
  10107.  
  10108.  
  10109.  
  10110.  
  10111.  
  10112.  
  10113.  
  10114.  
  10115.  
  10116.  
  10117.  
  10118.  
  10119.  
  10120.  
  10121.  
  10122.  
  10123.  
  10124.         QTAwk                       - 14-6 -                        QTAwk
  10125.  
  10126.  
  10127.  
  10128.  
  10129.  
  10130.  
  10131.         Section 15.0                                     Trace Statements
  10132.  
  10133.  
  10134.         15.0 Trace Statements
  10135.         
  10136.          QTAwk  has  added  a  facility  for  debugging  utilities.  This
  10137.         facility is activated through  the  built-in  variable  'TRACE'. 
  10138.         QTAwk can trace the loop control statements, 'if', 'while', 'do',
  10139.         'for'  (both  forms),  and  'switch'.   In   addition,   built-in
  10140.         functions and user-defined functions are traced. 
  10141.         
  10142.          By  default,  TRACE is set to FALSE and no tracing is done.  The
  10143.         variable may be set to any  value,  numeric,  string  or  regular
  10144.         expression  and  the value will determine the statements traced. 
  10145.         If TRACE has a nonzero numeric value then QTAwk  will  trace  all
  10146.         statements of the type listed. 
  10147.         
  10148.         15.1 Selective Statement Tracing
  10149.         
  10150.          If TRACE has a string value, then the string is compared against
  10151.         the keywords:
  10152.         
  10153.         1.  if
  10154.         2.  while
  10155.         3.  do
  10156.         4.  for
  10157.         5.  switch
  10158.         6.  function_b (built-in functions)
  10159.         7.  function_u (user-defined functions)
  10160.         
  10161.          If an exact  match  (case  is  important)  is  found,  then  the
  10162.         statement  is  traced.   If TRACE is set to a regular expression,
  10163.         then the keywords are matched against the regular expression.  If
  10164.         a match is found, then the statement is traced. 
  10165.         
  10166.         15.2 Trace Output
  10167.         
  10168.          In  tracing  a statement, QTAwk issues a message to the standard
  10169.         output file.  The message issued will have the form:
  10170.         
  10171.         Stmt Trace: stmt_str value_str
  10172.         Action File line: xxxx
  10173.         Scanning File: FILENAME
  10174.         Line: xxxxx
  10175.         Record: xxxxxx
  10176.         
  10177.          where stmt_str is the appropriate keyword listed above  for  the
  10178.         statement  traced  and  value_str  is  a value dependent upon the
  10179.         statement traced as listed below:
  10180.  
  10181.  
  10182.         QTAwk                       - 15-1 -                        QTAwk
  10183.  
  10184.  
  10185.  
  10186.  
  10187.  
  10188.  
  10189.         Section 15.2                                     Trace Statements
  10190.  
  10191.  
  10192.         keyword           value string                                   
  10193.         if           ==>  0/1 conditional expression TRUE/FALSE          
  10194.         while        ==>  0/1 conditional expression TRUE/FALSE          
  10195.         do           ==>  0/1 conditional expression TRUE/FALSE          
  10196.         for          ==>  0/1 conditional expression TRUE/FALSE          
  10197.         for          ==>  subscript value                                
  10198.         switch       ==>  switch expression value                        
  10199.         function_b   ==>  function name                                  
  10200.         function_u   ==>  function name                                  
  10201.         
  10202.          When a statement that can be traced is  encountered,  the  value
  10203.         of  the statement is determined, e.g., for an 'if' statement, the
  10204.         value of the conditional is evaluated before  issuing  the  trace
  10205.         statement. 
  10206.         
  10207.          The  following TRACE values will trace the statements indicated:
  10208.         
  10209.         1.  TRACE = "if";
  10210.             This value will trace all  'if'  statements,  indicating  the
  10211.             TRUE/FALSE value of the conditional. 
  10212.             
  10213.         2.  TRACE = /^[iwd]/;
  10214.             This  value will trace all 'if', 'while' and 'do' statements,
  10215.             indicating the TRUE/FALSE value of the conditional. 
  10216.             
  10217.         3.  TRACE = /_u$/;
  10218.             This value will trace all user-defined functions,  indicating
  10219.             the function name in the trace message. 
  10220.  
  10221.  
  10222.  
  10223.  
  10224.  
  10225.  
  10226.  
  10227.  
  10228.  
  10229.  
  10230.  
  10231.  
  10232.  
  10233.  
  10234.  
  10235.  
  10236.  
  10237.  
  10238.  
  10239.  
  10240.         QTAwk                       - 15-2 -                        QTAwk
  10241.  
  10242.  
  10243.  
  10244.  
  10245.  
  10246.  
  10247.         Section 16.0                                       Invoking QTAwk
  10248.  
  10249.  
  10250.         16.0 Invoking QTAwk
  10251.         
  10252.          There are two ways of specifying utilities to QTAwk:
  10253.         1.  Specifying the utility on the command line, e.g.,
  10254.             
  10255.             {apc}      "/^{_w}*$/{if(!bc++)print;next;}{bc=FALSE;print;}"
  10256.             file1
  10257.             
  10258.              This short command line utility will  read  file1,  printing
  10259.             only  the  first  blank line in a series of blank lines.  All
  10260.             nonblank lines are printed. 
  10261.             
  10262.              Note that the "utility" has been enclosed in double  quotes,
  10263.             ".   This  is  necessary  to  keep  the operating system from
  10264.             interpreting the utility as a  file.   In  addition,  if  the
  10265.             utility  contains  symbols recognized by the operating system
  10266.             command line interpreter, e.g., the  re-direction  operators,
  10267.             '<'  or '>', the quotes keep the interpreter from recognizing
  10268.             the  symbols.   If  the  utility  contains  quotes,  e.g.,  a
  10269.             constant  string  definition, then the imbedded quotes should
  10270.             be preceded by a back-slash, '\'. 
  10271.             
  10272.              For example, the short utility:
  10273.             
  10274.             QTAwk "{print FNR\" : \"$0;}" file1
  10275.             
  10276.              prints each line of file1 preceded by the line number.   The
  10277.             constant string,
  10278.             
  10279.              " : "
  10280.             
  10281.              separates  the line number from the line.  Back-slashes must
  10282.             precede the quotes surrounding the constant string. 
  10283.             
  10284.         2.  -fufile
  10285.             or
  10286.             -f ufile
  10287.             
  10288.              When a utility may be used frequently or grows too  long  to
  10289.             include on the command line as above, it becomes necessary to
  10290.             store it in a file.  The utility may  then  be  specified  to
  10291.             QTAwk  with  this  option.  The blank between the 'f' command
  10292.             line option and the utility file name is optional. 
  10293.         
  10294.         16.1 Multiple QTAwk Utilities
  10295.         
  10296.  
  10297.  
  10298.         QTAwk                       - 16-1 -                        QTAwk
  10299.  
  10300.  
  10301.  
  10302.  
  10303.  
  10304.  
  10305.         Section 16.1                                       Invoking QTAwk
  10306.  
  10307.  
  10308.          More than one utility file may be specified  to  QTAwk  in  this
  10309.         manner.   Each  utility  file  specified  is  read  in  the order
  10310.         specified and combined into a  single  QTAwk  utility.   In  this
  10311.         manner  it is possible to keep constantly used pattern-actions or
  10312.         user-defined functions in separate files and  combine  them  into
  10313.         QTAwk  utilities as necessary.  The order of the utility files is
  10314.         not important except for the order in which  predefined  patterns
  10315.         are  executed  and  the  order  in which pattern-action pairs are
  10316.         executed.   Thus  if  a  utility  file  contained   only   common
  10317.         user-defined  functions,  it  may  be  defined  in  any  order in
  10318.         relation  to  other  utility  files.   See  also  the   "include"
  10319.         directive discussed below. 
  10320.         
  10321.          Scanning  of  the command line for arguments may be stopped with
  10322.         the double hyphen command line argument, "--".  This argument  is
  10323.         not passed to the QTAwk utility. 
  10324.         
  10325.          This  method of specifying utilities to QTAwk cannot be combined
  10326.         with the command line utility definition method. 
  10327.         
  10328.          The command line is scanned for all utility files specified with
  10329.         the  'f'  option  prior to reading the utility files or any input
  10330.         files.  The utility files are then  "removed"  from  the  command
  10331.         line and the command line argument count. 
  10332.         
  10333.         16.1.1 #include Directive
  10334.         
  10335.          A  second  method  for  specifying  multiple  utility  files  is
  10336.         available that follows the "C" practice of "including" a file  at
  10337.         a  particular  point  in  a  file.  QTAwk follows the "C" syntax:
  10338.         
  10339.          #include "filename.ext"
  10340.         
  10341.          or
  10342.         
  10343.          #include <filename.ext>
  10344.         
  10345.          The two forms differ only in where QTAwk searches for  the  file
  10346.         to  include.  The first form, with double quotes, will search for
  10347.         the specified file only in the current directory if  no  path  is
  10348.         specified.   If a path is specified, then the specified path only
  10349.         is searched. 
  10350.         
  10351.          The second form, with the angle brackets, will search  first  in
  10352.         the  current  directory and then in the QTAwk default directories
  10353.         specified with the QTAWK  environment  setting.   If  a  path  is
  10354.  
  10355.  
  10356.         QTAwk                       - 16-2 -                        QTAwk
  10357.  
  10358.  
  10359.  
  10360.  
  10361.  
  10362.  
  10363.         Section 16.1.1                                     Invoking QTAwk
  10364.  
  10365.  
  10366.         specified  with  this form, the specified path only is searched. 
  10367.         
  10368.          White space is allowed before and after the  '#'  symbol.   This
  10369.         directive  is  not  recognized  within  the action portion of any
  10370.         pattern. 
  10371.         
  10372.          By using the "include" directive,  a  master  file  may  include
  10373.         pattern/actions  and  user-defined functions as necessary.  It is
  10374.         then necessary to specify only one file  on  the  command  line. 
  10375.         This  makes  it much easier to build utilities from several files
  10376.         and remember only one file name to accomplish a desired purpose. 
  10377.         
  10378.         16.2 Command Line Options
  10379.         
  10380.          QTAwk supports the following command line options:
  10381.         
  10382.         1.  f - utility file specification as described above. 
  10383.             
  10384.         2.  F  -  set  field  separator  to  single character.  Described
  10385.             below. 
  10386.             
  10387.         3.  v - set variable value before utility  execution.   Described
  10388.             below. 
  10389.             
  10390.         4.  Wd  -  delay  input  parsing.   Described  under the built-in
  10391.             variable DELAY_INPUT_PARSE. 
  10392.             
  10393.         5.  Ww - write internal form of utility to specified file.   With
  10394.             this option, QTAwk writes the internal form of the utility to
  10395.             the file specified.  The filename is specified on the command
  10396.             line  in  a  manner  similar to that used for the 'f' option:
  10397.             
  10398.             -Wwfilename
  10399.                 
  10400.             -Ww filename
  10401.             
  10402.              After writing the utility to the specified file, QTAwk stops
  10403.             execution.   The  file  to  which  the  internal  form of the
  10404.             utility has been written may be specified as an input utility
  10405.             file with the 'f' option.  However, only one such file may be
  10406.             input and may not be combined  with  ordinary  ASCII  utility
  10407.             files. 
  10408.         
  10409.         16.3 File Search Sequence
  10410.         
  10411.          QTAwk  may  search for input files in more than one place.  Many
  10412.  
  10413.  
  10414.         QTAwk                       - 16-3 -                        QTAwk
  10415.  
  10416.  
  10417.  
  10418.  
  10419.  
  10420.  
  10421.         Section 16.3                                       Invoking QTAwk
  10422.  
  10423.  
  10424.         times it is convenient to gather all QTAwk utility files  into  a
  10425.         single  directory  on  a  convenient  drive,  e.g., the directory
  10426.         "\{ap}\{utl}" may be used.  It would then be convenient to invoke
  10427.         any  utility  without the necessity of always specifying the full
  10428.         path to the utility.  QTAwk recognizes the  environment  variable
  10429.         setting of "QTAWK" for this purpose.  At program invocation QTAwk
  10430.         searches the environment for the setting for "QTAWK" and sets the
  10431.         string  value  of  the  built-in  variable  "QTAwk_Path"  to this
  10432.         string. 
  10433.         
  10434.          For input files, if a drive and/or path is  specified  with  the
  10435.         filename,  then  that  drive  and  path only are searched for the
  10436.         desired file.  If no drive or path is specified, then the current
  10437.         directory  is  searched, if the file is not found, then the paths
  10438.         (optionally with a drive specifier) specified by  the  string  in
  10439.         the  built-in  variable  QTAwk_Path  are  searched for the file. 
  10440.         Multiple paths may be specified in QTAwk_Path by separating  them
  10441.         with semi-colons. 
  10442.         
  10443.          The  string  value  of  the  built-in variable QTAwk_Path may be
  10444.         altered by the executing utility at any time to change the  paths
  10445.         searched for input files. 
  10446.         
  10447.         16.4 Setting the Field Separator
  10448.         
  10449.          The  QTAwk input record separator, FS, may be set on the command
  10450.         line with the 'F' option. 
  10451.         
  10452.          QTAwk -F "/:/"
  10453.         
  10454.          or
  10455.         
  10456.          QTAwk -F/:/
  10457.         
  10458.          The blank between the 'F' and the string or  regular  expression
  10459.         defining the new input record separator is optional.  This option
  10460.         may only be specified once on the command line.  The command line
  10461.         is scanned for all 'F' options prior to reading any utility files
  10462.         or input files.  The option and the new value  for  FS  are  then
  10463.         "removed"  from  the  command  line  and the command line count. 
  10464.         
  10465.          Another method is available for setting FS prior to reading  the
  10466.         input  files.   This  method  is  more  general  and  may be used
  10467.         multiple times on the command line and may be  used  to  set  any
  10468.         utility variable and not just FS. 
  10469.         
  10470.  
  10471.  
  10472.         QTAwk                       - 16-4 -                        QTAwk
  10473.  
  10474.  
  10475.  
  10476.  
  10477.  
  10478.  
  10479.         Section 16.5                                       Invoking QTAwk
  10480.  
  10481.  
  10482.         16.5 Command Line Variables
  10483.         
  10484.          Including the following on the command line:
  10485.         
  10486.          -v"var = value"
  10487.         
  10488.          or
  10489.         
  10490.          -vvar=value
  10491.         
  10492.          or
  10493.         
  10494.          "var = value"
  10495.         
  10496.          or
  10497.         
  10498.          var=value
  10499.         
  10500.          will  set  the variable 'var' to the value specified.  'var' may
  10501.         be any built-in or user-defined variable in the  QTAwk  utility. 
  10502.         'var'  must be a variable defined in the current QTAwk utility or
  10503.         a run-time error will occur and QTAwk will stop  processing.   If
  10504.         preceeded  with  the option string '-v' as indicated in the first
  10505.         two examples, the value of the variable is set  before  execution
  10506.         of  the  utility starts.  If the 'v' option is not specified, the
  10507.         value of 'var' is set when the token is encountered in processing
  10508.         command line file tokens. 
  10509.         
  10510.         16.6 QTAwk Execution Sequence
  10511.         
  10512.          QTAwk execution follows the sequence:
  10513.         
  10514.         1.  The  command  line  is  scanned  for any options, 'f', 'W' or
  10515.             'v'.  If any such options are found, they are interpreted and
  10516.             removed  from  the command line.  Upon encountering a command
  10517.             line argument of the form '--' (double hyphen),  scanning  of
  10518.             the  command  line  is  halted.  The '--' argument is removed
  10519.             from the command line. 
  10520.             
  10521.         2.  The QTAwk utility is read and converted  to  internal  form. 
  10522.             If  any  'f'  options  were  found in the preceding step, the
  10523.             associated utility files are opened, read  and  converted  in
  10524.             the  order  specified.  If no 'f' options were specified, the
  10525.             first command line argument is processed as the QTAwk utility
  10526.             and  then removed from the command line arguments.  If a 'Ww'
  10527.             option was specified, the associated utility file  is  opened
  10528.  
  10529.  
  10530.         QTAwk                       - 16-5 -                        QTAwk
  10531.  
  10532.  
  10533.  
  10534.  
  10535.  
  10536.  
  10537.         Section 16.6                                       Invoking QTAwk
  10538.  
  10539.  
  10540.             and the internal form utility written. 
  10541.             
  10542.         3.  The  ARGC  and  ARGV  built-in variables are set according to
  10543.             the command line parameters.  The ARGI built-in  variable  is
  10544.             set to 1. 
  10545.             
  10546.         4.  Any  variable  values  set  on  the command line with the 'v'
  10547.             option are set as specified. 
  10548.             
  10549.         5.  Any "BEGIN" actions in the QTAwk utility are executed.   This
  10550.             is  done  prior  to any further interpretation of the command
  10551.             line arguments. 
  10552.             
  10553.         6.  The command line argument, ARGV[ARGI], is examined.   One  of
  10554.             two  actions  is taken depending on the form of the argument:
  10555.                 
  10556.             a)  An argument of the form:
  10557.                 
  10558.                  var = value
  10559.                 
  10560.                  or
  10561.                 
  10562.                  var=value
  10563.                 
  10564.                  is interpreted as setting the variable specified, to the
  10565.                 value specified. 
  10566.                 
  10567.             b)  Any  other  argument  is interpreted as a file name.  The
  10568.                 file specified is opened for input.  If the file does not
  10569.                 exist,  an error message is issued and execution halted. 
  10570.                 If a single hyphen, '-', is specified, it is  interpreted
  10571.                 as  representing  the standard input file.  If no command
  10572.                 line arguments are specified beyond the QTAwk utility  or
  10573.                 variable  setting  commands,  the  standard input file is
  10574.                 read for input. 
  10575.             
  10576.         7.  Any "INITIAL" actions in the  QTAwk  utility  are  executed. 
  10577.             
  10578.         8.  The  input  file is read record by record and matched against
  10579.             the  patterns  present  in  the   QTAwk   utility.    If   no
  10580.             pattern/action  pairs  are  given  in the QTAwk utility, each
  10581.             record is read, the NF, FNR, NR and field variables  are  set
  10582.             and  the record is then discarded.  If an 'exit' or 'endfile'
  10583.             statement is executed, action passes to the next step below. 
  10584.             
  10585.         9.  When  the  end  of  the input file is reached or an "exit" or
  10586.  
  10587.  
  10588.         QTAwk                       - 16-6 -                        QTAwk
  10589.  
  10590.  
  10591.  
  10592.  
  10593.  
  10594.  
  10595.         Section 16.6                                       Invoking QTAwk
  10596.  
  10597.  
  10598.             "endfile" statement is  executed,  any  'FINAL'  actions  are
  10599.             executed. 
  10600.             
  10601.         10.  The input file is closed. 
  10602.             
  10603.         11.  If  an  "exit"  statement was executed, processing passes to
  10604.             step 12.  below,  else  the  following  steps  are  executed:
  10605.             
  10606.             a)  The  element  of ARGV corresponding the the current index
  10607.                 value of ARGI is sought.  If none  is  found,  processing
  10608.                 proceeds as if the "exit" statement was executed. 
  10609.             b)  ARGI  is  set  to  the index value of the next element of
  10610.                 ARGV.  If there is no next element  of  ARGV,  processing
  10611.                 proceeds as if the "exit" statement was executed. 
  10612.             c)  processing continues with step 6) above. 
  10613.             
  10614.         12.  Any  "END"  actions  in  the  QTAwk  utility  are executed. 
  10615.             
  10616.         13.  QTAwk execution halts. 
  10617.  
  10618.  
  10619.  
  10620.  
  10621.  
  10622.  
  10623.  
  10624.  
  10625.  
  10626.  
  10627.  
  10628.  
  10629.  
  10630.  
  10631.  
  10632.  
  10633.  
  10634.  
  10635.  
  10636.  
  10637.  
  10638.  
  10639.  
  10640.  
  10641.  
  10642.  
  10643.  
  10644.  
  10645.  
  10646.         QTAwk                       - 16-7 -                        QTAwk
  10647.  
  10648.  
  10649.  
  10650.  
  10651.  
  10652.  
  10653.  
  10654.  
  10655.  
  10656.  
  10657.  
  10658.  
  10659.  
  10660.  
  10661.  
  10662.  
  10663.  
  10664.  
  10665.  
  10666.  
  10667.  
  10668.  
  10669.  
  10670.  
  10671.  
  10672.  
  10673.  
  10674.  
  10675.  
  10676.  
  10677.  
  10678.  
  10679.  
  10680.  
  10681.  
  10682.  
  10683.  
  10684.  
  10685.  
  10686.  
  10687.  
  10688.  
  10689.  
  10690.  
  10691.  
  10692.  
  10693.  
  10694.  
  10695.  
  10696.  
  10697.  
  10698.  
  10699.  
  10700.  
  10701.  
  10702.  
  10703.  
  10704.         QTAwk                       - 16-8 -                        QTAwk
  10705.  
  10706.  
  10707.  
  10708.  
  10709.  
  10710.  
  10711.         Section 17.0                                         QTAwk Limits
  10712.  
  10713.  
  10714.         17.0 QTAwk Limits
  10715.         
  10716.          QTAwk has the following limitations:
  10717.         
  10718.         1024 fields
  10719.             
  10720.         4096 characters per input record
  10721.             
  10722.         4096 characters per formatted output record
  10723.             
  10724.         256  characters  in  character  class  (with   character   ranges
  10725.             expanded)
  10726.             
  10727.         256 user-defined functions
  10728.             
  10729.         256 local variables
  10730.             
  10731.         256 global variables
  10732.             
  10733.         1024 characters in constant strings
  10734.             
  10735.         1024 characters in regular expressions on input
  10736.             
  10737.         4096  characters  in regular expressions after expansion of named
  10738.             expressions and repetition operators. 
  10739.             
  10740.         4096 characters in strings  used  as  regular  expressions  after
  10741.             expansion  of  named  expressions  and repetition operators. 
  10742.             
  10743.         4096  characters  in  strings  returned  by  'replace'  functions
  10744.             
  10745.         4096  characters in input strings read by 'getline' and fgetline'
  10746.             functions
  10747.             
  10748.         4096 characters in strings  after  substitution  for  'gsub'  and
  10749.             'sub' functions
  10750.             
  10751.         4096   characters   maximum  in  strings  returned  by  following
  10752.             functions:
  10753.             1.  copies
  10754.             2.  deletec
  10755.             3.  insert
  10756.             4.  overlay
  10757.             5.  remove
  10758.  
  10759.  
  10760.  
  10761.  
  10762.         QTAwk                       - 17-1 -                        QTAwk
  10763.  
  10764.  
  10765.  
  10766.  
  10767.  
  10768.  
  10769.  
  10770.  
  10771.  
  10772.  
  10773.  
  10774.  
  10775.  
  10776.  
  10777.  
  10778.  
  10779.  
  10780.  
  10781.  
  10782.  
  10783.  
  10784.  
  10785.  
  10786.  
  10787.  
  10788.  
  10789.  
  10790.  
  10791.  
  10792.  
  10793.  
  10794.  
  10795.  
  10796.  
  10797.  
  10798.  
  10799.  
  10800.  
  10801.  
  10802.  
  10803.  
  10804.  
  10805.  
  10806.  
  10807.  
  10808.  
  10809.  
  10810.  
  10811.  
  10812.  
  10813.  
  10814.  
  10815.  
  10816.  
  10817.  
  10818.  
  10819.  
  10820.         QTAwk                       - 17-2 -                        QTAwk
  10821.  
  10822.  
  10823.  
  10824.  
  10825.  
  10826.  
  10827.         Section 18.0                                                    2
  10828.  
  10829.  
  10830.         18.0 Appendix i
  10831.         
  10832.          ASCII character set
  10833.         ( escape sequences shown for non-printable characters )
  10834.         
  10835.         dec hex char        dec hex  char   dec hex char   dec    hex char
  10836.                   ╤          ╤         ╤
  10837.          0  00        NUL   │ 32    20    \s  │ 64    40  @     │ 96    60  `
  10838.          1  01    ^   SOH   │ 33  21   !    │ 65  41  A      │ 97     61  a
  10839.          2  02    ^     STX   │ 34  22   "    │ 66  42  B    │ 98   62  b
  10840.          3  03    ^     ETX   │ 35  23   #    │ 67  43  C    │ 99   63  c
  10841.          4  04    ^     EOT   │ 36  24   $    │ 68  44  D    │ 100  64  d
  10842.          5  05    ^     ENQ   │ 37  25   %    │ 69  45  E    │ 101  65  e
  10843.          6  06    ^     ACK   │ 38  26   &    │ 70  46  F    │ 102  66  f
  10844.          7  07    ^\a BEL   │ 39    27   '    │ 71  47  G    │ 103  67  g
  10845.          8  08    ^\b BS      │ 40    28   (      │ 72    48  H     │ 104    68  h
  10846.          9  09    ^    \t HT      │ 41    29   )      │ 73    49  I     │ 105    69  i
  10847.         10  0A    ^ \n LF    │ 42  2A   *    │ 74  4A  J    │ 106  6A  j
  10848.         11  0B    ^ \v VT      │ 43    2B   +      │ 75    4B  K     │ 107    6B  k
  10849.         12  0C    ^ \f FF      │ 44    2C   ,      │ 76    4C  L     │ 108    6C  l
  10850.         13  0D    ^\r CR      │ 45    2D   -      │ 77    4D  M     │ 109    6D  m
  10851.         14  0E    ^   SO      │ 46    2E   .      │ 78    4E  N     │ 110    6E  n
  10852.         15  0F    ^   SI      │ 47    2F   /      │ 79    4F  O     │ 111    6F  o
  10853.         16  10    ^     DLE   │ 48  30   0    │ 80  50  P    │ 112  70  p
  10854.         17  11    ^     DC1   │ 49  31   1    │ 81  51  Q    │ 113  71  q
  10855.         18  12    ^     DC2   │ 50  32   2    │ 82  52  R    │ 114  72  r
  10856.         19  13    ^     DC3   │ 51  33   3    │ 83  53  S    │ 115  73  s
  10857.         20  14    ^     DC4   │ 52  34   4    │ 84  54  T    │ 116  74  t
  10858.         21  15    ^     NAK   │ 53  35   5    │ 85  55  U    │ 117  75  u
  10859.         22  16    ^     SYN   │ 54  36   6    │ 86  56  V    │ 118  76  v
  10860.         23  17    ^     ETB   │ 55  37   7    │ 87  57  W    │ 119  77  w
  10861.         24  18    ^     CAN   │ 56  38   8    │ 88  58  X    │ 120  78  x
  10862.         25  19    ^           │ 57  39   9    │ 89  59  Y    │ 121  79  y
  10863.         26  1A        SUB   │ 58    3A   :      │ 90    5A  Z     │ 122    7A  z
  10864.         27  1B    ^     ESC   │ 59  3B   ;    │ 91  5B  [    │ 123  7B  {
  10865.         28  1C    ^     FS    │ 60  3C   <    │ 92  5C  \    │ 124  7C  |
  10866.         29  1D    ^     GS    │ 61  3D   =    │ 93  5D  ]    │ 125  7D  }
  10867.         30  1E    ^           │ 62  3E   >    │ 94  5E  ^    │ 126  7E  ~
  10868.         31  1F    ^           │ 63  3F   ?    │ 95  5F  _    │ 127  7F
  10869.         
  10870.  
  10871.  
  10872.  
  10873.  
  10874.  
  10875.  
  10876.  
  10877.  
  10878.         QTAwk                       - 18-1 -                        QTAwk
  10879.  
  10880.  
  10881.  
  10882.  
  10883.  
  10884.  
  10885.         Section 18.0                                                    2
  10886.  
  10887.  
  10888.         ASCII character sets. (continued)
  10889.         
  10890.         dec  hex char  dec  hex char dec  hex char  dec  hex char
  10891.                  ╤           ╤          ╤
  10892.         128  80  ^Ç   │ 160  A0  á    │ 192  C0  └   │ 224  E0  α
  10893.         129  81  ^ü   │ 161  A1  í    │ 193  C1  ┴   │ 225  E1  ß
  10894.         130  82  ^é   │ 162  A2  ó    │ 194  C2  ┬   │ 226  E2  Γ
  10895.         131  83  ^â   │ 163  A3  ú    │ 195  C3  ├   │ 227  E3  π
  10896.         132  84  ^ä   │ 164  A4  ñ    │ 196  C4  ─   │ 228  E4  Σ
  10897.         133  85  ^à   │ 165  A5  Ñ    │ 197  C5  ┼   │ 229  E5  σ
  10898.         134  86  ^å   │ 166  A6  ª    │ 198  C6  ╞   │ 230  E6  µ
  10899.         135  87  ^ç   │ 167  A7  º    │ 199  C7  ╟   │ 231  E7  τ
  10900.         136  88  ^ê   │ 168  A8  ¿    │ 200  C8  ╚   │ 232  E8  Φ
  10901.         137  89  ^ë   │ 169  A9  ⌐    │ 201  C9  ╔   │ 233  E9  Θ
  10902.         138  8A  ^è   │ 170  AA  ¬    │ 202  CA  ╩   │ 234  EA  Ω
  10903.         139  8B  ^ï   │ 171  AB  ½    │ 203  CB  ╦   │ 235  EB  δ
  10904.         140  8C  ^î   │ 172  AC  ¼    │ 204  CC  ╠   │ 236  EC  ∞
  10905.         141  8D  ^ì   │ 173  AD  ¡    │ 205  CD  ═   │ 237  ED  
  10906.         142  8E  ^Ä   │ 174  AE  «    │ 206  CE  ╬   │ 238  EE  
  10907.         143  8F  ^Å   │ 175  AF  »    │ 207  CF  ╧   │ 239  EF  ∩
  10908.         144  90  ^É   │ 176  B0  ░    │ 208  D0  ╨   │ 240  F0  ≡
  10909.         145  91  ^æ   │ 177  B1  ▒    │ 209  D1  ╤   │ 241  F1  ±
  10910.         146  92  ^Æ   │ 178  B2  ▓    │ 210  D2  ╥   │ 242  F2  ≥
  10911.         147  93  ^ô   │ 179  B3  │    │ 211  D3  ╙   │ 243  F3  ≤
  10912.         148  94  ^ö   │ 180  B4  ┤    │ 212  D4  ╘   │ 244  F4  ⌠
  10913.         149  95  ^ò   │ 181  B5  ╡    │ 213  D5  ╒   │ 245  F5  ⌡
  10914.         150  96  ^û   │ 182  B6  ╢    │ 214  D6  ╓   │ 246  F6  ÷
  10915.         151  97  ^ù   │ 183  B7  ╖    │ 215  D7  ╫   │ 247  F7  ≈
  10916.         152  98  ^ÿ   │ 184  B8  ╕    │ 216  D8  ╪   │ 248  F8  °
  10917.         153  99  ^Ö   │ 185  B9  ╣    │ 217  D9  ┘   │ 249  F9  ∙
  10918.         154  9A  ^Ü   │ 186  BA  ║    │ 218  DA  ┌   │ 250  FA  ·
  10919.         155  9B  ^¢   │ 187  BB  ╗    │ 219  DB  █   │ 251  FB  
  10920.         156  9C  ^£   │ 188  BC  ╝    │ 220  DC  ▄   │ 252  FC  
  10921.         157  9D  ^¥   │ 189  BD  ╜    │ 221  DD  ▌   │ 253  FD  ²
  10922.         158  9E  ^₧   │ 190  BE  ╛    │ 222  DE  ▐   │ 254  FE  ■
  10923.         159  9F  ^ƒ   │ 191  BF  ┐    │ 223  DF  ▀   │ 255  FF
  10924.         
  10925.  
  10926.  
  10927.  
  10928.  
  10929.  
  10930.  
  10931.  
  10932.  
  10933.  
  10934.  
  10935.  
  10936.         QTAwk                       - 18-2 -                        QTAwk
  10937.  
  10938.  
  10939.  
  10940.  
  10941.  
  10942.  
  10943.         Section 19.0                                                    |
  10944.  
  10945.  
  10946.         19.0 Appendix ii
  10947.         
  10948.          Keyboard Codes
  10949.         
  10950.          These tables lists the  ASCII  code,  in  hexadecimal,  and  the
  10951.         keyboard  scan  code  returned  by  keyboard keys for 101/102-key
  10952.         keyboards.  In the tables the ASCII code and scan code are listed
  10953.         as  a number pair, ss/aa, where ss is the scan code and aa is the
  10954.         ASCII code.  Keys and key combinations marked '**'  are  used  by
  10955.         the  computer  keyboard,  but do not put values into the keyboard
  10956.         buffer.  Keys and key combinations marked '--' are ignored by the
  10957.         computer  keyboard.   Note: In the United States, the 101/102-key
  10958.         keyboard is shipped with 101 keys.   Overseas  versions  have  an
  10959.         additional  key  sandwiched  between the left Shift key and the Z
  10960.         key.  This additional key is identified in these tables  as  "Key
  10961.         45." 
  10962.         
  10963.          Table  1  is organized by keystroke, following the layout of the
  10964.         keyboard.  Table 2 is organized  in  ascending  ASCII  code,  and
  10965.         Table 3 is organized in ascending scan code. 
  10966.         
  10967.                                      Table 1                             
  10968.         Keystroke                  Hexadecimal      Decimal              
  10969.         
  10970.         Esc                        01/1B            001/027              
  10971.         1                          02/31            002/049              
  10972.         2                          03/32            003/050              
  10973.         3                          04/33            004/051              
  10974.         4                          05/34            005/052              
  10975.         5                          06/35            006/053              
  10976.         6                          07/36            007/054              
  10977.         7                          08/37            008/055              
  10978.         8                          09/38            009/056              
  10979.         9                          0A/39            010/057              
  10980.         0                          0B/30            011/048              
  10981.         -                          0C/2D            012/045              
  10982.         =                          0D/3D            013/061              
  10983.         Backspace                  0E/08            014/008              
  10984.         Tab                        0F/09            015/009              
  10985.         q                          10/71            016/113              
  10986.         w                          11/77            017/119              
  10987.         e                          12/65            018/101              
  10988.         r                          13/72            019/114              
  10989.         t                          14/74            020/116              
  10990.         y                          15/79            021/121              
  10991.         u                          16/75            022/117              
  10992.  
  10993.  
  10994.         QTAwk                       - 19-1 -                        QTAwk
  10995.  
  10996.  
  10997.  
  10998.  
  10999.  
  11000.  
  11001.         Section 19.0                                                    |
  11002.  
  11003.  
  11004.         i                          17/69            023/105              
  11005.         o                          18/6F            024/111              
  11006.         p                          19/70            025/112              
  11007.         [                          1A/5B            026/091              
  11008.         ]                          1B/5D            027/093              
  11009.         Enter                      1C/0D            028/013              
  11010.         Ctrl                       **               **                   
  11011.         a                          1E/61            030/097              
  11012.         s                          1F/73            031/115              
  11013.         d                          20/64            032/100              
  11014.         f                          21/66            033/102              
  11015.         g                          22/67            034/103              
  11016.         h                          23/68            035/104              
  11017.         j                          24/6A            036/106              
  11018.         k                          25/6B            037/107              
  11019.         l                          26/6C            038/108              
  11020.         ;                          27/3B            039/059              
  11021.         '                          28/27            040/039              
  11022.         `                          29/60            041/096              
  11023.         Shift                      **               **                   
  11024.         \                          2B/5C            043/092              
  11025.         z                          2C/7A            044/122              
  11026.         x                          2D/78            045/120              
  11027.         c                          2E/63            046/099              
  11028.         v                          2F/76            047/118              
  11029.         b                          30/62            048/098              
  11030.         n                          31/6E            049/110              
  11031.         m                          32/6D            050/109              
  11032.         ,                          33/2C            051/044              
  11033.         .                          34/2E            052/046              
  11034.         /                          35/2F            053/047              
  11035.         Gray *                     37/2A            055/042              
  11036.         Alt                        **               **                   
  11037.         Space                      39/20            057/032              
  11038.         Caps Lock                  **               **                   
  11039.         F1                         3B/00            059/000              
  11040.         F2                         3C/00            060/000              
  11041.         F3                         3D/00            061/000              
  11042.         F4                         3E/00            062/000              
  11043.         F5                         3F/00            063/000              
  11044.         F6                         40/00            064/000              
  11045.         F7                         41/00            065/000              
  11046.         F8                         42/00            066/000              
  11047.         F9                         43/00            067/000              
  11048.         F10                        44/00            068/000              
  11049.         F11                        85/00            133/000              
  11050.  
  11051.  
  11052.         QTAwk                       - 19-2 -                        QTAwk
  11053.  
  11054.  
  11055.  
  11056.  
  11057.  
  11058.  
  11059.         Section 19.0                                                    |
  11060.  
  11061.  
  11062.         F12                        86/00            134/000              
  11063.         Num Lock                   **               **                   
  11064.         Scroll Lock                **               **                   
  11065.         White Home                 47/00            071/000              
  11066.         White Up Arrow             48/00            072/000              
  11067.         White PgUp                 49/00            073/000              
  11068.         Gray -                     4A/2D            074/045              
  11069.         White Left Arrow           4B/00            075/000              
  11070.         Center Key                 4C/00            076/000              
  11071.         White Right Arrow          4D/00            077/000              
  11072.         Gray +                     4E/2B            078/043              
  11073.         White End                  4F/00            079/000              
  11074.         White Down Arrow           50/00            080/000              
  11075.         White PgDn                 51/00            081/000              
  11076.         White Ins                  52/00            082/000              
  11077.         White Del                  53/00            083/000              
  11078.         SysReq                     **               **                   
  11079.         Key 45                     56/5C            086/092              
  11080.         Enter (number keypad)      1C/0D            028/013              
  11081.         Gray /                     35/2F            053/047              
  11082.         PrtSc                      **               **                   
  11083.         Pause                      **               **                   
  11084.         Gray Home                  47/00            071/000              
  11085.         Gray Up Arrow              48/00            072/000              
  11086.         Gray Page Up               49/00            073/000              
  11087.         Gray Left Arrow            4B/00            075/000              
  11088.         Gray Right Arrow           4D/00            077/000              
  11089.         Gray End                   4F/00            079/000              
  11090.         Gray Down Arrow            50/00            080/000              
  11091.         Gray Page Down             51/00            081/000              
  11092.         Gray Insert                52/00            082/000              
  11093.         Gray Delete                53/00            083/000              
  11094.         Shift Esc                  01/1B            001/027              
  11095.         !                          02/21            002/033              
  11096.         @                          03/40            003/064              
  11097.         #                          04/23            004/035              
  11098.         $                          05/24            005/036              
  11099.         %                          06/25            006/037              
  11100.         ^                          07/5E            007/094              
  11101.         &                          08/26            008/038              
  11102.         * (white)                  09/2A            009/042              
  11103.         (                          0A/28            010/040              
  11104.         )                          0B/29            011/041              
  11105.         _                          0C/5F            012/095              
  11106.         + (white)                  0D/2B            013/043              
  11107.         Shift Backspace            0E/08            014/008              
  11108.  
  11109.  
  11110.         QTAwk                       - 19-3 -                        QTAwk
  11111.  
  11112.  
  11113.  
  11114.  
  11115.  
  11116.  
  11117.         Section 19.0                                                    |
  11118.  
  11119.  
  11120.         Shift Tab (Backtab)        0F/00            015/000              
  11121.         Q                          10/51            016/081              
  11122.         W                          11/57            017/087              
  11123.         E                          12/45            018/069              
  11124.         R                          13/52            019/082              
  11125.         T                          14/54            020/084              
  11126.         Y                          15/59            021/089              
  11127.         U                          16/55            022/085              
  11128.         I                          17/49            023/073              
  11129.         O                          18/4F            024/079              
  11130.         P                          19/50            025/080              
  11131.         {                          1A/7B            026/123              
  11132.         }                          1B/7D            027/125              
  11133.         Shift Enter                1C/0D            028/013              
  11134.         Shift Ctrl                 **               **                   
  11135.         A                          1E/41            030/065              
  11136.         S                          1F/53            031/083              
  11137.         D                          20/44            032/068              
  11138.         F                          21/46            033/070              
  11139.         G                          22/47            034/071              
  11140.         H                          23/48            035/072              
  11141.         J                          24/4A            036/074              
  11142.         K                          25/4B            037/075              
  11143.         L                          26/4C            038/076              
  11144.         :                          27/3A            039/058              
  11145.         "                          28/22            040/034              
  11146.         ~                          29/7E            041/126              
  11147.         |                          2B/7C            043/124              
  11148.         Z                          2C/5A            044/090              
  11149.         X                          2D/58            045/088              
  11150.         C                          2E/43            046/067              
  11151.         V                          2F/56            047/086              
  11152.         B                          30/42            048/066              
  11153.         N                          31/4E            049/078              
  11154.         M                          32/4D            050/077              
  11155.         <                          33/3C            051/060              
  11156.         >                          34/3E            052/062              
  11157.         ?                          35/3F            053/063              
  11158.         Shift Gray *               37/2A            055/042              
  11159.         Shift Alt                  **               **                   
  11160.         Shift Space                39/20            057/032              
  11161.         Shift Caps Lock            **               **                   
  11162.         Shift F1                   54/00            084/000              
  11163.         Shift F2                   55/00            085/000              
  11164.         Shift F3                   56/00            086/000              
  11165.         Shift F4                   57/00            087/000              
  11166.  
  11167.  
  11168.         QTAwk                       - 19-4 -                        QTAwk
  11169.  
  11170.  
  11171.  
  11172.  
  11173.  
  11174.  
  11175.         Section 19.0                                                    |
  11176.  
  11177.  
  11178.         Shift F5                   58/00            088/000              
  11179.         Shift F6                   59/00            089/000              
  11180.         Shift F7                   5A/00            090/000              
  11181.         Shift F8                   5B/00            091/000              
  11182.         Shift F9                   5C/00            092/000              
  11183.         Shift F10                  5D/00            093/000              
  11184.         Shift F11                  87/00            135/000              
  11185.         Shift F12                  88/00            136/000              
  11186.         Shift Num Lock             **               **                   
  11187.         Shift Scroll Lock          **               **                   
  11188.         Shift 7 (number pad)       47/37            071/055              
  11189.         Shift 8 (number pad)       48/38            072/056              
  11190.         Shift 9 (number pad)       49/39            073/057              
  11191.         Shift Gray -               4A/2D            074/045              
  11192.         Shift 4 (number pad)       4B/34            075/052              
  11193.         Shift 5 (number pad)       4C/35            076/053              
  11194.         Shift 6 (number pad)       4D/36            077/054              
  11195.         Shift Gray +               4E/2B            078/043              
  11196.         Shift 1 (number pad)       4F/31            079/049              
  11197.         Shift 2 (number pad)       50/32            080/050              
  11198.         Shift 3 (number pad)       51/33            081/051              
  11199.         Shift 0 (number pad)       52/30            082/048              
  11200.         Shift . (number pad)       53/2E            083/046              
  11201.         Shift SysReq               **               **                   
  11202.         Shift Key 45               56/7C            086/124              
  11203.         Shift Enter (number pad)   1C/0D            028/013              
  11204.         Shift Gray /               35/2F            053/047              
  11205.         Shift PrtSc                **               **                   
  11206.         Shift Pause                **               **                   
  11207.         Shift Gray Home            47/00            071/000              
  11208.         Shift Gray Up Arrow        48/00            072/000              
  11209.         Shift Gray Page Up         49/00            073/000              
  11210.         Shift Gray Left Arrow      4B/00            075/000              
  11211.         Shift Gray Right Arrow     4D/00            077/000              
  11212.         Shift Gray End             4F/00            079/000              
  11213.         Shift Gray Down Arrow      50/00            080/000              
  11214.         Shift Gray Page Down       51/00            081/000              
  11215.         Shift Gray Insert          52/00            082/000              
  11216.         Shift Gray Delete          53/00            083/000              
  11217.         Ctrl Esc                   01/1B            001/027              
  11218.         Ctrl 1                     --               --                   
  11219.         Ctrl 2 (NUL)               03/00            003/000              
  11220.         Ctrl 3                     --               --                   
  11221.         Ctrl 4                     --               --                   
  11222.         Ctrl 5                     --               --                   
  11223.         Ctrl 6 (RS)                07/1E            007/030              
  11224.  
  11225.  
  11226.         QTAwk                       - 19-5 -                        QTAwk
  11227.  
  11228.  
  11229.  
  11230.  
  11231.  
  11232.  
  11233.         Section 19.0                                                    |
  11234.  
  11235.  
  11236.         Ctrl 7                     --               --                   
  11237.         Ctrl 8                     --               --                   
  11238.         Ctrl 9                     --               --                   
  11239.         Ctrl 0                     --               --                   
  11240.         Ctrl -                     0C/1F            012/031              
  11241.         Ctrl =                     --               --                   
  11242.         Ctrl Backspace (DEL)       0E/7F            014/127              
  11243.         Ctrl Tab                   94/00            148/000              
  11244.         Ctrl q (DC1)               10/11            016/017              
  11245.         Ctrl w (ETB)               11/17            017/023              
  11246.         Ctrl e (ENQ)               12/05            018/005              
  11247.         Ctrl r (DC2)               13/12            019/018              
  11248.         Ctrl t (DC4)               14/14            020/020              
  11249.         Ctrl y (EM)                15/19            021/025              
  11250.         Ctrl u (NAK)               16/15            022/021              
  11251.         Ctrl i (HT)                17/09            023/009              
  11252.         Ctrl o (SI)                18/0F            024/015              
  11253.         Ctrl p (DEL)               19/10            025/016              
  11254.         Ctrl [ (ESC)               1A/1B            026/027              
  11255.         Ctrl ] (GS)                1B/1D            027/029              
  11256.         Ctrl Enter (LF)            1C/0A            028/010              
  11257.         Ctrl a (SOH)               1E/01            030/001              
  11258.         Ctrl s (DC3)               1F/13            031/019              
  11259.         Ctrl d (EOT)               20/04            032/004              
  11260.         Ctrl f (ACK)               21/06            033/006              
  11261.         Ctrl g (BEL)               22/07            034/007              
  11262.         Ctrl h (Backspace)         23/08            035/008              
  11263.         Ctrl j (LF)                24/0A            036/010              
  11264.         Ctrl k (VT)                25/0B            037/011              
  11265.         Ctrl l (FF)                26/0C            038/012              
  11266.         Ctrl ;                     --               --                   
  11267.         Ctrl '                     --               --                   
  11268.         Ctrl `                     --               --                   
  11269.         Ctrl Shift                 **               **                   
  11270.         Ctrl \ (FS)                2B/1C            043/028              
  11271.         Ctrl z (SUB)               2C/1A            044/026              
  11272.         Ctrl x (CAN)               2D/18            045/024              
  11273.         Ctrl c (ETX)               2E/03            046/003              
  11274.         Ctrl v (SYN)               2F/16            047/022              
  11275.         Ctrl b (STX)               30/02            048/002              
  11276.         Ctrl n (SO)                31/0E            049/014              
  11277.         Ctrl m (CR)                32/0D            050/013              
  11278.         Ctrl ,                     --               --                   
  11279.         Ctrl .                     --               --                   
  11280.         Ctrl /                     --               --                   
  11281.         Ctrl Gray *                96/00            150/000              
  11282.  
  11283.  
  11284.         QTAwk                       - 19-6 -                        QTAwk
  11285.  
  11286.  
  11287.  
  11288.  
  11289.  
  11290.  
  11291.         Section 19.0                                                    |
  11292.  
  11293.  
  11294.         Ctrl Alt                   **               **                   
  11295.         Ctrl Space                 39/20            057/032              
  11296.         Ctrl Caps Lock             --               --                   
  11297.         Ctrl F1                    5E/00            094/000              
  11298.         Ctrl F2                    5F/00            095/000              
  11299.         Ctrl F3                    60/00            096/000              
  11300.         Ctrl F4                    61/00            097/000              
  11301.         Ctrl F5                    62/00            098/000              
  11302.         Ctrl F6                    63/00            099/000              
  11303.         Ctrl F7                    64/00            100/000              
  11304.         Ctrl F8                    65/00            101/000              
  11305.         Ctrl F9                    66/00            102/000              
  11306.         Ctrl F10                   67/00            103/000              
  11307.         Ctrl F11                   89/00            137/000              
  11308.         Ctrl F12                   8A/00            138/000              
  11309.         Ctrl Num Lock              --               --                   
  11310.         Ctrl Scroll Lock           --               --                   
  11311.         Ctrl White Home            77/00            119/000              
  11312.         Ctrl White Up Arrow        8D/00            141/000              
  11313.         Ctrl White PgUp            84/00            132/000              
  11314.         Ctrl Gray -                8E/00            142/000              
  11315.         Ctrl White Left Arrow      73/00            115/000              
  11316.         Ctrl 5 (number pad)        8F/00            143/000              
  11317.         Ctrl White Right Arrow     74/00            116/000              
  11318.         Ctrl Gray +                90/00            144/000              
  11319.         Ctrl White End             75/00            117/000              
  11320.         Ctrl White Down Arrow      91/00            145/000              
  11321.         Ctrl White PgDn            76/00            118/000              
  11322.         Ctrl White Ins             92/00            146/000              
  11323.         Ctrl White Del             93/00            147/000              
  11324.         Ctrl SysReq                **               **                   
  11325.         Ctrl Key 45                --               --                   
  11326.         Ctrl Enter (number pad)    1C/0A            028/010              
  11327.         Ctrl / (number pad)        95/00            149/000              
  11328.         Ctrl PrtSc                 72/00            114/000              
  11329.         Ctrl Break                 00/00            000/000              
  11330.         Ctrl Gray Home             77/00            119/000              
  11331.         Ctrl Gray Up Arrow         8D/E0            141/224              
  11332.         Ctrl Gray Page Up          84/00            132/000              
  11333.         Ctrl Gray Left Arrow       73/00            115/000              
  11334.         Ctrl Gray Right Arrow      74/00            116/000              
  11335.         Ctrl Gray End              75/00            117/000              
  11336.         Ctrl Gray Down Arrow       91/E0            145/224              
  11337.         Ctrl Gray Page Down        76/00            118/000              
  11338.         Ctrl Gray Insert           92/E0            146/224              
  11339.         Ctrl Gray Delete           93/E0            147/224              
  11340.  
  11341.  
  11342.         QTAwk                       - 19-7 -                        QTAwk
  11343.  
  11344.  
  11345.  
  11346.  
  11347.  
  11348.  
  11349.         Section 19.0                                                    |
  11350.  
  11351.  
  11352.         Alt Esc                    01/00            001/000              
  11353.         Alt 1                      78/00            120/000              
  11354.         Alt 2                      79/00            121/000              
  11355.         Alt 3                      7A/00            122/000              
  11356.         Alt 4                      7B/00            123/000              
  11357.         Alt 5                      7C/00            124/000              
  11358.         Alt 6                      7D/00            125/000              
  11359.         Alt 7                      7E/00            126/000              
  11360.         Alt 8                      7F/00            127/000              
  11361.         Alt 9                      80/00            128/000              
  11362.         Alt 0                      81/00            129/000              
  11363.         Alt -                      82/00            130/000              
  11364.         Alt =                      83/00            131/000              
  11365.         Alt Backspace              0E/00            014/000              
  11366.         Alt Tab                    A5/00            165/000              
  11367.         Alt q                      10/00            016/000              
  11368.         Alt w                      11/00            017/000              
  11369.         Alt e                      12/00            018/000              
  11370.         Alt r                      13/00            019/000              
  11371.         Alt t                      14/00            020/000              
  11372.         Alt y                      15/00            021/000              
  11373.         Alt u                      16/00            022/000              
  11374.         Alt i                      17/00            023/000              
  11375.         Alt o                      18/00            024/000              
  11376.         Alt p                      19/00            025/000              
  11377.         Alt [                      1A/00            026/000              
  11378.         Alt ]                      1B/00            027/000              
  11379.         Alt Enter                  1C/00            028/000              
  11380.         Alt Ctrl                   **               **                   
  11381.         Alt a                      1E/00            030/000              
  11382.         Alt s                      1F/00            031/000              
  11383.         Alt d                      20/00            032/000              
  11384.         Alt f                      21/00            033/000              
  11385.         Alt g                      22/00            034/000              
  11386.         Alt h                      23/00            035/000              
  11387.         Alt j                      24/00            036/000              
  11388.         Alt k                      25/00            037/000              
  11389.         Alt l                      26/00            038/000              
  11390.         Alt ;                      27/00            039/000              
  11391.         Alt '                      28/00            040/000              
  11392.         Alt `                      29/00            041/000              
  11393.         Alt Shift                  **               **                   
  11394.         Alt \                      2B/00            043/000              
  11395.         Alt z                      2C/00            044/000              
  11396.         Alt x                      2D/00            045/000              
  11397.         Alt c                      2E/00            046/000              
  11398.  
  11399.  
  11400.         QTAwk                       - 19-8 -                        QTAwk
  11401.  
  11402.  
  11403.  
  11404.  
  11405.  
  11406.  
  11407.         Section 19.0                                                    |
  11408.  
  11409.  
  11410.         Alt v                      2F/00            047/000              
  11411.         Alt b                      30/00            048/000              
  11412.         Alt n                      31/00            049/000              
  11413.         Alt m                      32/00            050/000              
  11414.         Alt ,                      33/00            051/000              
  11415.         Alt .                      34/00            052/000              
  11416.         Alt /                      35/00            053/000              
  11417.         Alt Gray *                 37/00            055/000              
  11418.         Alt Space                  39/20            057/032              
  11419.         Alt Caps Lock              **               **                   
  11420.         Alt F1                     68/00            104/000              
  11421.         Alt F2                     69/00            105/000              
  11422.         Alt F3                     6A/00            106/000              
  11423.         Alt F4                     6B/00            107/000              
  11424.         Alt F5                     6C/00            108/000              
  11425.         Alt F6                     6D/00            109/000              
  11426.         Alt F7                     6E/00            110/000              
  11427.         Alt F8                     6F/00            111/000              
  11428.         Alt F9                     70/00            112/000              
  11429.         Alt F10                    71/00            113/000              
  11430.         Alt F11                    8B/00            139/000              
  11431.         Alt F12                    8C/00            140/000              
  11432.         Alt Num Lock               **               **                   
  11433.         Alt Scroll Lock            **               **                   
  11434.         Alt Gray -                 4A/00            074/000              
  11435.         Alt Gray +                 4E/00            078/000              
  11436.         Alt 7 (number pad)         #                #                    
  11437.         Alt 8 (number pad)         #                #                    
  11438.         Alt 9 (number pad)         #                #                    
  11439.         Alt 4 (number pad)         #                #                    
  11440.         Alt 5 (number pad)         #                #                    
  11441.         Alt 6 (number pad)         #                #                    
  11442.         Alt 1 (number pad)         #                #                    
  11443.         Alt 2 (number pad)         #                #                    
  11444.         Alt 3 (number pad)         #                #                    
  11445.         Alt Del                    --               --                   
  11446.         Alt SysReq                 **               **                   
  11447.         Alt Key 45                 --               --                   
  11448.         Alt Enter (number pad)     A6/00            166/000              
  11449.         Alt / (number pad)         A4/00            164/000              
  11450.         Alt PrtSc                  **               **                   
  11451.         Alt Pause                  **               **                   
  11452.         Alt Gray Home              97/00            151/000              
  11453.         Alt Gray Up Arrow          98/00            152/000              
  11454.         Alt Gray Page Up           99/00            153/000              
  11455.         Alt Gray Left Arrow        9B/00            155/000              
  11456.  
  11457.  
  11458.         QTAwk                       - 19-9 -                        QTAwk
  11459.  
  11460.  
  11461.  
  11462.  
  11463.  
  11464.  
  11465.         Section 19.0                                                    |
  11466.  
  11467.  
  11468.         Alt Gray Right Arrow       9D/00            157/000              
  11469.         Alt Gray End               9F/00            159/000              
  11470.         Alt Gray Down Arrow        A0/00            160/000              
  11471.         Alt Gray Page Down         A1/00            161/000              
  11472.         Alt Gray Insert            A2/00            162/000              
  11473.         Alt Gray Delete            A3/00            163/000              
  11474.  
  11475.  
  11476.  
  11477.  
  11478.  
  11479.  
  11480.  
  11481.  
  11482.  
  11483.  
  11484.  
  11485.  
  11486.  
  11487.  
  11488.  
  11489.  
  11490.  
  11491.  
  11492.  
  11493.  
  11494.  
  11495.  
  11496.  
  11497.  
  11498.  
  11499.  
  11500.  
  11501.  
  11502.  
  11503.  
  11504.  
  11505.  
  11506.  
  11507.  
  11508.  
  11509.  
  11510.  
  11511.  
  11512.  
  11513.  
  11514.  
  11515.  
  11516.         QTAwk                       - 19-10 -                       QTAwk
  11517.  
  11518.  
  11519.  
  11520.  
  11521.  
  11522.  
  11523.         Section 19.0                                                    |
  11524.  
  11525.  
  11526.                                      Table 2                             
  11527.         Keystroke                  Hexadecimal      Decimal              
  11528.         
  11529.         Ctrl Break                 00/00            000/000              
  11530.         Alt Esc                    01/00            001/000              
  11531.         Ctrl 2 (NUL)               03/00            003/000              
  11532.         Alt Backspace              0E/00            014/000              
  11533.         Shift Tab (Backtab)        0F/00            015/000              
  11534.         Alt q                      10/00            016/000              
  11535.         Alt w                      11/00            017/000              
  11536.         Alt e                      12/00            018/000              
  11537.         Alt r                      13/00            019/000              
  11538.         Alt t                      14/00            020/000              
  11539.         Alt y                      15/00            021/000              
  11540.         Alt u                      16/00            022/000              
  11541.         Alt i                      17/00            023/000              
  11542.         Alt o                      18/00            024/000              
  11543.         Alt p                      19/00            025/000              
  11544.         Alt [                      1A/00            026/000              
  11545.         Alt ]                      1B/00            027/000              
  11546.         Alt Enter                  1C/00            028/000              
  11547.         Alt a                      1E/00            030/000              
  11548.         Alt s                      1F/00            031/000              
  11549.         Alt d                      20/00            032/000              
  11550.         Alt f                      21/00            033/000              
  11551.         Alt g                      22/00            034/000              
  11552.         Alt h                      23/00            035/000              
  11553.         Alt j                      24/00            036/000              
  11554.         Alt k                      25/00            037/000              
  11555.         Alt l                      26/00            038/000              
  11556.         Alt ;                      27/00            039/000              
  11557.         Alt '                      28/00            040/000              
  11558.         Alt `                      29/00            041/000              
  11559.         Alt \                      2B/00            043/000              
  11560.         Alt z                      2C/00            044/000              
  11561.         Alt x                      2D/00            045/000              
  11562.         Alt c                      2E/00            046/000              
  11563.         Alt v                      2F/00            047/000              
  11564.         Alt b                      30/00            048/000              
  11565.         Alt n                      31/00            049/000              
  11566.         Alt m                      32/00            050/000              
  11567.         Alt ,                      33/00            051/000              
  11568.         Alt .                      34/00            052/000              
  11569.         Alt /                      35/00            053/000              
  11570.         Alt Gray *                 37/00            055/000              
  11571.         F1                         3B/00            059/000              
  11572.  
  11573.  
  11574.         QTAwk                       - 19-11 -                       QTAwk
  11575.  
  11576.  
  11577.  
  11578.  
  11579.  
  11580.  
  11581.         Section 19.0                                                    |
  11582.  
  11583.  
  11584.         F2                         3C/00            060/000              
  11585.         F3                         3D/00            061/000              
  11586.         F4                         3E/00            062/000              
  11587.         F5                         3F/00            063/000              
  11588.         F6                         40/00            064/000              
  11589.         F7                         41/00            065/000              
  11590.         F8                         42/00            066/000              
  11591.         F9                         43/00            067/000              
  11592.         F10                        44/00            068/000              
  11593.         White Home                 47/00            071/000              
  11594.         Gray Home                  47/00            071/000              
  11595.         Shift Gray Home            47/00            071/000              
  11596.         White Up Arrow             48/00            072/000              
  11597.         Gray Up Arrow              48/00            072/000              
  11598.         Shift Gray Up Arrow        48/00            072/000              
  11599.         White PgUp                 49/00            073/000              
  11600.         Gray Page Up               49/00            073/000              
  11601.         Shift Gray Page Up         49/00            073/000              
  11602.         Alt Gray -                 4A/00            074/000              
  11603.         White Left Arrow           4B/00            075/000              
  11604.         Gray Left Arrow            4B/00            075/000              
  11605.         Shift Gray Left Arrow      4B/00            075/000              
  11606.         Center Key                 4C/00            076/000              
  11607.         White Right Arrow          4D/00            077/000              
  11608.         Gray Right Arrow           4D/00            077/000              
  11609.         Shift Gray Right Arrow     4D/00            077/000              
  11610.         Alt Gray +                 4E/00            078/000              
  11611.         White End                  4F/00            079/000              
  11612.         Gray End                   4F/00            079/000              
  11613.         Shift Gray End             4F/00            079/000              
  11614.         White Down Arrow           50/00            080/000              
  11615.         Gray Down Arrow            50/00            080/000              
  11616.         Shift Gray Down Arrow      50/00            080/000              
  11617.         White PgDn                 51/00            081/000              
  11618.         Gray Page Down             51/00            081/000              
  11619.         Shift Gray Page Down       51/00            081/000              
  11620.         White Ins                  52/00            082/000              
  11621.         Gray Insert                52/00            082/000              
  11622.         Shift Gray Insert          52/00            082/000              
  11623.         White Del                  53/00            083/000              
  11624.         Gray Delete                53/00            083/000              
  11625.         Shift Gray Delete          53/00            083/000              
  11626.         Shift F1                   54/00            084/000              
  11627.         Shift F2                   55/00            085/000              
  11628.         Shift F3                   56/00            086/000              
  11629.         Shift F4                   57/00            087/000              
  11630.  
  11631.  
  11632.         QTAwk                       - 19-12 -                       QTAwk
  11633.  
  11634.  
  11635.  
  11636.  
  11637.  
  11638.  
  11639.         Section 19.0                                                    |
  11640.  
  11641.  
  11642.         Shift F5                   58/00            088/000              
  11643.         Shift F6                   59/00            089/000              
  11644.         Shift F7                   5A/00            090/000              
  11645.         Shift F8                   5B/00            091/000              
  11646.         Shift F9                   5C/00            092/000              
  11647.         Shift F10                  5D/00            093/000              
  11648.         Ctrl F1                    5E/00            094/000              
  11649.         Ctrl F2                    5F/00            095/000              
  11650.         Ctrl F3                    60/00            096/000              
  11651.         Ctrl F4                    61/00            097/000              
  11652.         Ctrl F5                    62/00            098/000              
  11653.         Ctrl F6                    63/00            099/000              
  11654.         Ctrl F7                    64/00            100/000              
  11655.         Ctrl F8                    65/00            101/000              
  11656.         Ctrl F9                    66/00            102/000              
  11657.         Ctrl F10                   67/00            103/000              
  11658.         Alt F1                     68/00            104/000              
  11659.         Alt F2                     69/00            105/000              
  11660.         Alt F3                     6A/00            106/000              
  11661.         Alt F4                     6B/00            107/000              
  11662.         Alt F5                     6C/00            108/000              
  11663.         Alt F6                     6D/00            109/000              
  11664.         Alt F7                     6E/00            110/000              
  11665.         Alt F8                     6F/00            111/000              
  11666.         Alt F9                     70/00            112/000              
  11667.         Alt F10                    71/00            113/000              
  11668.         Ctrl PrtSc                 72/00            114/000              
  11669.         Ctrl White Left Arrow      73/00            115/000              
  11670.         Ctrl Gray Left Arrow       73/00            115/000              
  11671.         Ctrl White Right Arrow     74/00            116/000              
  11672.         Ctrl Gray Right Arrow      74/00            116/000              
  11673.         Ctrl White End             75/00            117/000              
  11674.         Ctrl Gray End              75/00            117/000              
  11675.         Ctrl White PgDn            76/00            118/000              
  11676.         Ctrl Gray Page Down        76/00            118/000              
  11677.         Ctrl White Home            77/00            119/000              
  11678.         Ctrl Gray Home             77/00            119/000              
  11679.         Alt 1                      78/00            120/000              
  11680.         Alt 2                      79/00            121/000              
  11681.         Alt 3                      7A/00            122/000              
  11682.         Alt 4                      7B/00            123/000              
  11683.         Alt 5                      7C/00            124/000              
  11684.         Alt 6                      7D/00            125/000              
  11685.         Alt 7                      7E/00            126/000              
  11686.         Alt 8                      7F/00            127/000              
  11687.         Alt 9                      80/00            128/000              
  11688.  
  11689.  
  11690.         QTAwk                       - 19-13 -                       QTAwk
  11691.  
  11692.  
  11693.  
  11694.  
  11695.  
  11696.  
  11697.         Section 19.0                                                    |
  11698.  
  11699.  
  11700.         Alt 0                      81/00            129/000              
  11701.         Alt -                      82/00            130/000              
  11702.         Alt =                      83/00            131/000              
  11703.         Ctrl White PgUp            84/00            132/000              
  11704.         Ctrl Gray Page Up          84/00            132/000              
  11705.         F11                        85/00            133/000              
  11706.         F12                        86/00            134/000              
  11707.         Shift F11                  87/00            135/000              
  11708.         Shift F12                  88/00            136/000              
  11709.         Ctrl F11                   89/00            137/000              
  11710.         Ctrl F12                   8A/00            138/000              
  11711.         Alt F11                    8B/00            139/000              
  11712.         Alt F12                    8C/00            140/000              
  11713.         Ctrl White Up Arrow        8D/00            141/000              
  11714.         Ctrl Gray -                8E/00            142/000              
  11715.         Ctrl 5 (number pad)        8F/00            143/000              
  11716.         Ctrl Gray +                90/00            144/000              
  11717.         Ctrl White Down Arrow      91/00            145/000              
  11718.         Ctrl White Ins             92/00            146/000              
  11719.         Ctrl White Del             93/00            147/000              
  11720.         Ctrl Tab                   94/00            148/000              
  11721.         Ctrl / (number pad)        95/00            149/000              
  11722.         Ctrl Gray *                96/00            150/000              
  11723.         Alt Gray Home              97/00            151/000              
  11724.         Alt Gray Up Arrow          98/00            152/000              
  11725.         Alt Gray Page Up           99/00            153/000              
  11726.         Alt Gray Left Arrow        9B/00            155/000              
  11727.         Alt Gray Right Arrow       9D/00            157/000              
  11728.         Alt Gray End               9F/00            159/000              
  11729.         Alt Gray Down Arrow        A0/00            160/000              
  11730.         Alt Gray Page Down         A1/00            161/000              
  11731.         Alt Gray Insert            A2/00            162/000              
  11732.         Alt Gray Delete            A3/00            163/000              
  11733.         Alt / (number pad)         A4/00            164/000              
  11734.         Alt Tab                    A5/00            165/000              
  11735.         Alt Enter (number pad)     A6/00            166/000              
  11736.         Ctrl a (SOH)               1E/01            030/001              
  11737.         Ctrl b (STX)               30/02            048/002              
  11738.         Ctrl c (ETX)               2E/03            046/003              
  11739.         Ctrl d (EOT)               20/04            032/004              
  11740.         Ctrl e (ENQ)               12/05            018/005              
  11741.         Ctrl f (ACK)               21/06            033/006              
  11742.         Ctrl g (BEL)               22/07            034/007              
  11743.         Backspace                  0E/08            014/008              
  11744.         Shift Backspace            0E/08            014/008              
  11745.         Ctrl h (Backspace)         23/08            035/008              
  11746.  
  11747.  
  11748.         QTAwk                       - 19-14 -                       QTAwk
  11749.  
  11750.  
  11751.  
  11752.  
  11753.  
  11754.  
  11755.         Section 19.0                                                    |
  11756.  
  11757.  
  11758.         Tab                        0F/09            015/009              
  11759.         Ctrl i (HT)                17/09            023/009              
  11760.         Ctrl Enter (LF)            1C/0A            028/010              
  11761.         Ctrl Enter (number pad)    1C/0A            028/010              
  11762.         Ctrl j (LF)                24/0A            036/010              
  11763.         Ctrl k (VT)                25/0B            037/011              
  11764.         Ctrl l (FF)                26/0C            038/012              
  11765.         Enter                      1C/0D            028/013              
  11766.         Enter (number keypad)      1C/0D            028/013              
  11767.         Shift Enter                1C/0D            028/013              
  11768.         Shift Enter (number pad)   1C/0D            028/013              
  11769.         Ctrl m (CR)                32/0D            050/013              
  11770.         Ctrl n (SO)                31/0E            049/014              
  11771.         Ctrl o (SI)                18/0F            024/015              
  11772.         Ctrl p (DEL)               19/10            025/016              
  11773.         Ctrl q (DC1)               10/11            016/017              
  11774.         Ctrl r (DC2)               13/12            019/018              
  11775.         Ctrl s (DC3)               1F/13            031/019              
  11776.         Ctrl t (DC4)               14/14            020/020              
  11777.         Ctrl u (NAK)               16/15            022/021              
  11778.         Ctrl v (SYN)               2F/16            047/022              
  11779.         Ctrl w (ETB)               11/17            017/023              
  11780.         Ctrl x (CAN)               2D/18            045/024              
  11781.         Ctrl y (EM)                15/19            021/025              
  11782.         Ctrl z (SUB)               2C/1A            044/026              
  11783.         Esc                        01/1B            001/027              
  11784.         Shift Esc                  01/1B            001/027              
  11785.         Ctrl Esc                   01/1B            001/027              
  11786.         Ctrl [ (ESC)               1A/1B            026/027              
  11787.         Ctrl \ (FS)                2B/1C            043/028              
  11788.         Ctrl ] (GS)                1B/1D            027/029              
  11789.         Ctrl 6 (RS)                07/1E            007/030              
  11790.         Ctrl -                     0C/1F            012/031              
  11791.         Space                      39/20            057/032              
  11792.         Shift Space                39/20            057/032              
  11793.         Ctrl Space                 39/20            057/032              
  11794.         Alt Space                  39/20            057/032              
  11795.         !                          02/21            002/033              
  11796.         "                          28/22            040/034              
  11797.         #                          04/23            004/035              
  11798.         $                          05/24            005/036              
  11799.         %                          06/25            006/037              
  11800.         &                          08/26            008/038              
  11801.         '                          28/27            040/039              
  11802.         (                          0A/28            010/040              
  11803.         )                          0B/29            011/041              
  11804.  
  11805.  
  11806.         QTAwk                       - 19-15 -                       QTAwk
  11807.  
  11808.  
  11809.  
  11810.  
  11811.  
  11812.  
  11813.         Section 19.0                                                    |
  11814.  
  11815.  
  11816.         * (white)                  09/2A            009/042              
  11817.         Gray *                     37/2A            055/042              
  11818.         Shift Gray *               37/2A            055/042              
  11819.         + (white)                  0D/2B            013/043              
  11820.         Gray +                     4E/2B            078/043              
  11821.         Shift Gray +               4E/2B            078/043              
  11822.         ,                          33/2C            051/044              
  11823.         -                          0C/2D            012/045              
  11824.         Gray -                     4A/2D            074/045              
  11825.         Shift Gray -               4A/2D            074/045              
  11826.         .                          34/2E            052/046              
  11827.         Shift . (number pad)       53/2E            083/046              
  11828.         /                          35/2F            053/047              
  11829.         Gray /                     35/2F            053/047              
  11830.         Shift Gray /               35/2F            053/047              
  11831.         0                          0B/30            011/048              
  11832.         Shift 0 (number pad)       52/30            082/048              
  11833.         1                          02/31            002/049              
  11834.         Shift 1 (number pad)       4F/31            079/049              
  11835.         2                          03/32            003/050              
  11836.         Shift 2 (number pad)       50/32            080/050              
  11837.         3                          04/33            004/051              
  11838.         Shift 3 (number pad)       51/33            081/051              
  11839.         4                          05/34            005/052              
  11840.         Shift 4 (number pad)       4B/34            075/052              
  11841.         5                          06/35            006/053              
  11842.         Shift 5 (number pad)       4C/35            076/053              
  11843.         6                          07/36            007/054              
  11844.         Shift 6 (number pad)       4D/36            077/054              
  11845.         7                          08/37            008/055              
  11846.         Shift 7 (number pad)       47/37            071/055              
  11847.         8                          09/38            009/056              
  11848.         Shift 8 (number pad)       48/38            072/056              
  11849.         9                          0A/39            010/057              
  11850.         Shift 9 (number pad)       49/39            073/057              
  11851.         :                          27/3A            039/058              
  11852.         ;                          27/3B            039/059              
  11853.         <                          33/3C            051/060              
  11854.         =                          0D/3D            013/061              
  11855.         >                          34/3E            052/062              
  11856.         ?                          35/3F            053/063              
  11857.         @                          03/40            003/064              
  11858.         A                          1E/41            030/065              
  11859.         B                          30/42            048/066              
  11860.         C                          2E/43            046/067              
  11861.         D                          20/44            032/068              
  11862.  
  11863.  
  11864.         QTAwk                       - 19-16 -                       QTAwk
  11865.  
  11866.  
  11867.  
  11868.  
  11869.  
  11870.  
  11871.         Section 19.0                                                    |
  11872.  
  11873.  
  11874.         E                          12/45            018/069              
  11875.         F                          21/46            033/070              
  11876.         G                          22/47            034/071              
  11877.         H                          23/48            035/072              
  11878.         I                          17/49            023/073              
  11879.         J                          24/4A            036/074              
  11880.         K                          25/4B            037/075              
  11881.         L                          26/4C            038/076              
  11882.         M                          32/4D            050/077              
  11883.         N                          31/4E            049/078              
  11884.         O                          18/4F            024/079              
  11885.         P                          19/50            025/080              
  11886.         Q                          10/51            016/081              
  11887.         R                          13/52            019/082              
  11888.         S                          1F/53            031/083              
  11889.         T                          14/54            020/084              
  11890.         U                          16/55            022/085              
  11891.         V                          2F/56            047/086              
  11892.         W                          11/57            017/087              
  11893.         X                          2D/58            045/088              
  11894.         Y                          15/59            021/089              
  11895.         Z                          2C/5A            044/090              
  11896.         [                          1A/5B            026/091              
  11897.         \                          2B/5C            043/092              
  11898.         Key 45                     56/5C            086/092              
  11899.         ]                          1B/5D            027/093              
  11900.         ^                          07/5E            007/094              
  11901.         _                          0C/5F            012/095              
  11902.         `                          29/60            041/096              
  11903.         a                          1E/61            030/097              
  11904.         b                          30/62            048/098              
  11905.         c                          2E/63            046/099              
  11906.         d                          20/64            032/100              
  11907.         e                          12/65            018/101              
  11908.         f                          21/66            033/102              
  11909.         g                          22/67            034/103              
  11910.         h                          23/68            035/104              
  11911.         i                          17/69            023/105              
  11912.         j                          24/6A            036/106              
  11913.         k                          25/6B            037/107              
  11914.         l                          26/6C            038/108              
  11915.         m                          32/6D            050/109              
  11916.         n                          31/6E            049/110              
  11917.         o                          18/6F            024/111              
  11918.         p                          19/70            025/112              
  11919.         q                          10/71            016/113              
  11920.  
  11921.  
  11922.         QTAwk                       - 19-17 -                       QTAwk
  11923.  
  11924.  
  11925.  
  11926.  
  11927.  
  11928.  
  11929.         Section 19.0                                                    |
  11930.  
  11931.  
  11932.         r                          13/72            019/114              
  11933.         s                          1F/73            031/115              
  11934.         t                          14/74            020/116              
  11935.         u                          16/75            022/117              
  11936.         v                          2F/76            047/118              
  11937.         w                          11/77            017/119              
  11938.         x                          2D/78            045/120              
  11939.         y                          15/79            021/121              
  11940.         z                          2C/7A            044/122              
  11941.         {                          1A/7B            026/123              
  11942.         |                          2B/7C            043/124              
  11943.         Shift Key 45               56/7C            086/124              
  11944.         }                          1B/7D            027/125              
  11945.         ~                          29/7E            041/126              
  11946.         Ctrl Backspace (DEL)       0E/7F            014/127              
  11947.         Ctrl Gray Up Arrow         8D/E0            141/224              
  11948.         Ctrl Gray Down Arrow       91/E0            145/224              
  11949.         Ctrl Gray Insert           92/E0            146/224              
  11950.         Ctrl Gray Delete           93/E0            147/224              
  11951.         Alt 7 (number pad)         #                #                    
  11952.         Alt 8 (number pad)         #                #                    
  11953.         Alt 9 (number pad)         #                #                    
  11954.         Alt 4 (number pad)         #                #                    
  11955.         Alt 5 (number pad)         #                #                    
  11956.         Alt 6 (number pad)         #                #                    
  11957.         Alt 1 (number pad)         #                #                    
  11958.         Alt 2 (number pad)         #                #                    
  11959.         Alt 3 (number pad)         #                #                    
  11960.         Ctrl                       **               **                   
  11961.         Shift                      **               **                   
  11962.         Alt                        **               **                   
  11963.         Caps Lock                  **               **                   
  11964.         Num Lock                   **               **                   
  11965.         Scroll Lock                **               **                   
  11966.         SysReq                     **               **                   
  11967.         PrtSc                      **               **                   
  11968.         Pause                      **               **                   
  11969.         Shift Ctrl                 **               **                   
  11970.         Shift Alt                  **               **                   
  11971.         Shift Caps Lock            **               **                   
  11972.         Shift Num Lock             **               **                   
  11973.         Shift Scroll Lock          **               **                   
  11974.         Shift SysReq               **               **                   
  11975.         Shift PrtSc                **               **                   
  11976.         Shift Pause                **               **                   
  11977.         Ctrl Shift                 **               **                   
  11978.  
  11979.  
  11980.         QTAwk                       - 19-18 -                       QTAwk
  11981.  
  11982.  
  11983.  
  11984.  
  11985.  
  11986.  
  11987.         Section 19.0                                                    |
  11988.  
  11989.  
  11990.         Ctrl Alt                   **               **                   
  11991.         Ctrl SysReq                **               **                   
  11992.         Alt Ctrl                   **               **                   
  11993.         Alt Shift                  **               **                   
  11994.         Alt Caps Lock              **               **                   
  11995.         Alt Num Lock               **               **                   
  11996.         Alt Scroll Lock            **               **                   
  11997.         Alt SysReq                 **               **                   
  11998.         Alt PrtSc                  **               **                   
  11999.         Alt Pause                  **               **                   
  12000.         Ctrl 1                     --               --                   
  12001.         Ctrl 3                     --               --                   
  12002.         Ctrl 4                     --               --                   
  12003.         Ctrl 5                     --               --                   
  12004.         Ctrl 7                     --               --                   
  12005.         Ctrl 8                     --               --                   
  12006.         Ctrl 9                     --               --                   
  12007.         Ctrl 0                     --               --                   
  12008.         Ctrl =                     --               --                   
  12009.         Ctrl ;                     --               --                   
  12010.         Ctrl '                     --               --                   
  12011.         Ctrl `                     --               --                   
  12012.         Ctrl ,                     --               --                   
  12013.         Ctrl .                     --               --                   
  12014.         Ctrl /                     --               --                   
  12015.         Ctrl Caps Lock             --               --                   
  12016.         Ctrl Num Lock              --               --                   
  12017.         Ctrl Scroll Lock           --               --                   
  12018.         Ctrl Key 45                --               --                   
  12019.         Alt Del                    --               --                   
  12020.         Alt Key 45                 --               --                   
  12021.  
  12022.  
  12023.  
  12024.  
  12025.  
  12026.  
  12027.  
  12028.  
  12029.  
  12030.  
  12031.  
  12032.  
  12033.  
  12034.  
  12035.  
  12036.  
  12037.  
  12038.         QTAwk                       - 19-19 -                       QTAwk
  12039.  
  12040.  
  12041.  
  12042.  
  12043.  
  12044.  
  12045.         Section 19.0                                                    |
  12046.  
  12047.  
  12048.                                      Table 3                             
  12049.         Keystroke                  Hexadecimal      Decimal              
  12050.         
  12051.         Ctrl Break                 00/00            000/000              
  12052.         Alt Esc                    01/00            001/000              
  12053.         Esc                        01/1B            001/027              
  12054.         Shift Esc                  01/1B            001/027              
  12055.         Ctrl Esc                   01/1B            001/027              
  12056.         !                          02/21            002/033              
  12057.         1                          02/31            002/049              
  12058.         Ctrl 2 (NUL)               03/00            003/000              
  12059.         2                          03/32            003/050              
  12060.         @                          03/40            003/064              
  12061.         #                          04/23            004/035              
  12062.         3                          04/33            004/051              
  12063.         $                          05/24            005/036              
  12064.         4                          05/34            005/052              
  12065.         %                          06/25            006/037              
  12066.         5                          06/35            006/053              
  12067.         Ctrl 6 (RS)                07/1E            007/030              
  12068.         6                          07/36            007/054              
  12069.         ^                          07/5E            007/094              
  12070.         &                          08/26            008/038              
  12071.         7                          08/37            008/055              
  12072.         * (white)                  09/2A            009/042              
  12073.         8                          09/38            009/056              
  12074.         (                          0A/28            010/040              
  12075.         9                          0A/39            010/057              
  12076.         )                          0B/29            011/041              
  12077.         0                          0B/30            011/048              
  12078.         Ctrl -                     0C/1F            012/031              
  12079.         -                          0C/2D            012/045              
  12080.         _                          0C/5F            012/095              
  12081.         + (white)                  0D/2B            013/043              
  12082.         =                          0D/3D            013/061              
  12083.         Alt Backspace              0E/00            014/000              
  12084.         Backspace                  0E/08            014/008              
  12085.         Shift Backspace            0E/08            014/008              
  12086.         Ctrl Backspace (DEL)       0E/7F            014/127              
  12087.         Shift Tab (Backtab)        0F/00            015/000              
  12088.         Tab                        0F/09            015/009              
  12089.         Alt q                      10/00            016/000              
  12090.         Ctrl q (DC1)               10/11            016/017              
  12091.         Q                          10/51            016/081              
  12092.         q                          10/71            016/113              
  12093.         Alt w                      11/00            017/000              
  12094.  
  12095.  
  12096.         QTAwk                       - 19-20 -                       QTAwk
  12097.  
  12098.  
  12099.  
  12100.  
  12101.  
  12102.  
  12103.         Section 19.0                                                    |
  12104.  
  12105.  
  12106.         Ctrl w (ETB)               11/17            017/023              
  12107.         W                          11/57            017/087              
  12108.         w                          11/77            017/119              
  12109.         Alt e                      12/00            018/000              
  12110.         Ctrl e (ENQ)               12/05            018/005              
  12111.         E                          12/45            018/069              
  12112.         e                          12/65            018/101              
  12113.         Alt r                      13/00            019/000              
  12114.         Ctrl r (DC2)               13/12            019/018              
  12115.         R                          13/52            019/082              
  12116.         r                          13/72            019/114              
  12117.         Alt t                      14/00            020/000              
  12118.         Ctrl t (DC4)               14/14            020/020              
  12119.         T                          14/54            020/084              
  12120.         t                          14/74            020/116              
  12121.         Alt y                      15/00            021/000              
  12122.         Ctrl y (EM)                15/19            021/025              
  12123.         Y                          15/59            021/089              
  12124.         y                          15/79            021/121              
  12125.         Alt u                      16/00            022/000              
  12126.         Ctrl u (NAK)               16/15            022/021              
  12127.         U                          16/55            022/085              
  12128.         u                          16/75            022/117              
  12129.         Alt i                      17/00            023/000              
  12130.         Ctrl i (HT)                17/09            023/009              
  12131.         I                          17/49            023/073              
  12132.         i                          17/69            023/105              
  12133.         Alt o                      18/00            024/000              
  12134.         Ctrl o (SI)                18/0F            024/015              
  12135.         O                          18/4F            024/079              
  12136.         o                          18/6F            024/111              
  12137.         Alt p                      19/00            025/000              
  12138.         Ctrl p (DEL)               19/10            025/016              
  12139.         P                          19/50            025/080              
  12140.         p                          19/70            025/112              
  12141.         Alt [                      1A/00            026/000              
  12142.         Ctrl [ (ESC)               1A/1B            026/027              
  12143.         [                          1A/5B            026/091              
  12144.         {                          1A/7B            026/123              
  12145.         Alt ]                      1B/00            027/000              
  12146.         Ctrl ] (GS)                1B/1D            027/029              
  12147.         ]                          1B/5D            027/093              
  12148.         }                          1B/7D            027/125              
  12149.         Alt Enter                  1C/00            028/000              
  12150.         Ctrl Enter (LF)            1C/0A            028/010              
  12151.         Ctrl Enter (number pad)    1C/0A            028/010              
  12152.  
  12153.  
  12154.         QTAwk                       - 19-21 -                       QTAwk
  12155.  
  12156.  
  12157.  
  12158.  
  12159.  
  12160.  
  12161.         Section 19.0                                                    |
  12162.  
  12163.  
  12164.         Enter                      1C/0D            028/013              
  12165.         Enter (number keypad)      1C/0D            028/013              
  12166.         Shift Enter                1C/0D            028/013              
  12167.         Shift Enter (number pad)   1C/0D            028/013              
  12168.         Alt a                      1E/00            030/000              
  12169.         Ctrl a (SOH)               1E/01            030/001              
  12170.         A                          1E/41            030/065              
  12171.         a                          1E/61            030/097              
  12172.         Alt s                      1F/00            031/000              
  12173.         Ctrl s (DC3)               1F/13            031/019              
  12174.         S                          1F/53            031/083              
  12175.         s                          1F/73            031/115              
  12176.         Alt d                      20/00            032/000              
  12177.         Ctrl d (EOT)               20/04            032/004              
  12178.         D                          20/44            032/068              
  12179.         d                          20/64            032/100              
  12180.         Alt f                      21/00            033/000              
  12181.         Ctrl f (ACK)               21/06            033/006              
  12182.         F                          21/46            033/070              
  12183.         f                          21/66            033/102              
  12184.         Alt g                      22/00            034/000              
  12185.         Ctrl g (BEL)               22/07            034/007              
  12186.         G                          22/47            034/071              
  12187.         g                          22/67            034/103              
  12188.         Alt h                      23/00            035/000              
  12189.         Ctrl h (Backspace)         23/08            035/008              
  12190.         H                          23/48            035/072              
  12191.         h                          23/68            035/104              
  12192.         Alt j                      24/00            036/000              
  12193.         Ctrl j (LF)                24/0A            036/010              
  12194.         J                          24/4A            036/074              
  12195.         j                          24/6A            036/106              
  12196.         Alt k                      25/00            037/000              
  12197.         Ctrl k (VT)                25/0B            037/011              
  12198.         K                          25/4B            037/075              
  12199.         k                          25/6B            037/107              
  12200.         Alt l                      26/00            038/000              
  12201.         Ctrl l (FF)                26/0C            038/012              
  12202.         L                          26/4C            038/076              
  12203.         l                          26/6C            038/108              
  12204.         Alt ;                      27/00            039/000              
  12205.         :                          27/3A            039/058              
  12206.         ;                          27/3B            039/059              
  12207.         Alt '                      28/00            040/000              
  12208.         "                          28/22            040/034              
  12209.         '                          28/27            040/039              
  12210.  
  12211.  
  12212.         QTAwk                       - 19-22 -                       QTAwk
  12213.  
  12214.  
  12215.  
  12216.  
  12217.  
  12218.  
  12219.         Section 19.0                                                    |
  12220.  
  12221.  
  12222.         Alt `                      29/00            041/000              
  12223.         `                          29/60            041/096              
  12224.         ~                          29/7E            041/126              
  12225.         Alt \                      2B/00            043/000              
  12226.         Ctrl \ (FS)                2B/1C            043/028              
  12227.         \                          2B/5C            043/092              
  12228.         |                          2B/7C            043/124              
  12229.         Alt z                      2C/00            044/000              
  12230.         Ctrl z (SUB)               2C/1A            044/026              
  12231.         Z                          2C/5A            044/090              
  12232.         z                          2C/7A            044/122              
  12233.         Alt x                      2D/00            045/000              
  12234.         Ctrl x (CAN)               2D/18            045/024              
  12235.         X                          2D/58            045/088              
  12236.         x                          2D/78            045/120              
  12237.         Alt c                      2E/00            046/000              
  12238.         Ctrl c (ETX)               2E/03            046/003              
  12239.         C                          2E/43            046/067              
  12240.         c                          2E/63            046/099              
  12241.         Alt v                      2F/00            047/000              
  12242.         Ctrl v (SYN)               2F/16            047/022              
  12243.         V                          2F/56            047/086              
  12244.         v                          2F/76            047/118              
  12245.         Alt b                      30/00            048/000              
  12246.         Ctrl b (STX)               30/02            048/002              
  12247.         B                          30/42            048/066              
  12248.         b                          30/62            048/098              
  12249.         Alt n                      31/00            049/000              
  12250.         Ctrl n (SO)                31/0E            049/014              
  12251.         N                          31/4E            049/078              
  12252.         n                          31/6E            049/110              
  12253.         Alt m                      32/00            050/000              
  12254.         Ctrl m (CR)                32/0D            050/013              
  12255.         M                          32/4D            050/077              
  12256.         m                          32/6D            050/109              
  12257.         Alt ,                      33/00            051/000              
  12258.         ,                          33/2C            051/044              
  12259.         <                          33/3C            051/060              
  12260.         Alt .                      34/00            052/000              
  12261.         .                          34/2E            052/046              
  12262.         >                          34/3E            052/062              
  12263.         Alt /                      35/00            053/000              
  12264.         /                          35/2F            053/047              
  12265.         Gray /                     35/2F            053/047              
  12266.         Shift Gray /               35/2F            053/047              
  12267.         ?                          35/3F            053/063              
  12268.  
  12269.  
  12270.         QTAwk                       - 19-23 -                       QTAwk
  12271.  
  12272.  
  12273.  
  12274.  
  12275.  
  12276.  
  12277.         Section 19.0                                                    |
  12278.  
  12279.  
  12280.         Alt Gray *                 37/00            055/000              
  12281.         Gray *                     37/2A            055/042              
  12282.         Shift Gray *               37/2A            055/042              
  12283.         Space                      39/20            057/032              
  12284.         Shift Space                39/20            057/032              
  12285.         Ctrl Space                 39/20            057/032              
  12286.         Alt Space                  39/20            057/032              
  12287.         F1                         3B/00            059/000              
  12288.         F2                         3C/00            060/000              
  12289.         F3                         3D/00            061/000              
  12290.         F4                         3E/00            062/000              
  12291.         F5                         3F/00            063/000              
  12292.         F6                         40/00            064/000              
  12293.         F7                         41/00            065/000              
  12294.         F8                         42/00            066/000              
  12295.         F9                         43/00            067/000              
  12296.         F10                        44/00            068/000              
  12297.         White Home                 47/00            071/000              
  12298.         Gray Home                  47/00            071/000              
  12299.         Shift Gray Home            47/00            071/000              
  12300.         Shift 7 (number pad)       47/37            071/055              
  12301.         White Up Arrow             48/00            072/000              
  12302.         Gray Up Arrow              48/00            072/000              
  12303.         Shift Gray Up Arrow        48/00            072/000              
  12304.         Shift 8 (number pad)       48/38            072/056              
  12305.         White PgUp                 49/00            073/000              
  12306.         Gray Page Up               49/00            073/000              
  12307.         Shift Gray Page Up         49/00            073/000              
  12308.         Shift 9 (number pad)       49/39            073/057              
  12309.         Alt Gray -                 4A/00            074/000              
  12310.         Gray -                     4A/2D            074/045              
  12311.         Shift Gray -               4A/2D            074/045              
  12312.         White Left Arrow           4B/00            075/000              
  12313.         Gray Left Arrow            4B/00            075/000              
  12314.         Shift Gray Left Arrow      4B/00            075/000              
  12315.         Shift 4 (number pad)       4B/34            075/052              
  12316.         Center Key                 4C/00            076/000              
  12317.         Shift 5 (number pad)       4C/35            076/053              
  12318.         White Right Arrow          4D/00            077/000              
  12319.         Gray Right Arrow           4D/00            077/000              
  12320.         Shift Gray Right Arrow     4D/00            077/000              
  12321.         Shift 6 (number pad)       4D/36            077/054              
  12322.         Alt Gray +                 4E/00            078/000              
  12323.         Gray +                     4E/2B            078/043              
  12324.         Shift Gray +               4E/2B            078/043              
  12325.         White End                  4F/00            079/000              
  12326.  
  12327.  
  12328.         QTAwk                       - 19-24 -                       QTAwk
  12329.  
  12330.  
  12331.  
  12332.  
  12333.  
  12334.  
  12335.         Section 19.0                                                    |
  12336.  
  12337.  
  12338.         Gray End                   4F/00            079/000              
  12339.         Shift Gray End             4F/00            079/000              
  12340.         Shift 1 (number pad)       4F/31            079/049              
  12341.         White Down Arrow           50/00            080/000              
  12342.         Gray Down Arrow            50/00            080/000              
  12343.         Shift Gray Down Arrow      50/00            080/000              
  12344.         Shift 2 (number pad)       50/32            080/050              
  12345.         White PgDn                 51/00            081/000              
  12346.         Gray Page Down             51/00            081/000              
  12347.         Shift Gray Page Down       51/00            081/000              
  12348.         Shift 3 (number pad)       51/33            081/051              
  12349.         White Ins                  52/00            082/000              
  12350.         Gray Insert                52/00            082/000              
  12351.         Shift Gray Insert          52/00            082/000              
  12352.         Shift 0 (number pad)       52/30            082/048              
  12353.         White Del                  53/00            083/000              
  12354.         Gray Delete                53/00            083/000              
  12355.         Shift Gray Delete          53/00            083/000              
  12356.         Shift . (number pad)       53/2E            083/046              
  12357.         Shift F1                   54/00            084/000              
  12358.         Shift F2                   55/00            085/000              
  12359.         Shift F3                   56/00            086/000              
  12360.         Key 45                     56/5C            086/092              
  12361.         Shift Key 45               56/7C            086/124              
  12362.         Shift F4                   57/00            087/000              
  12363.         Shift F5                   58/00            088/000              
  12364.         Shift F6                   59/00            089/000              
  12365.         Shift F7                   5A/00            090/000              
  12366.         Shift F8                   5B/00            091/000              
  12367.         Shift F9                   5C/00            092/000              
  12368.         Shift F10                  5D/00            093/000              
  12369.         Ctrl F1                    5E/00            094/000              
  12370.         Ctrl F2                    5F/00            095/000              
  12371.         Ctrl F3                    60/00            096/000              
  12372.         Ctrl F4                    61/00            097/000              
  12373.         Ctrl F5                    62/00            098/000              
  12374.         Ctrl F6                    63/00            099/000              
  12375.         Ctrl F7                    64/00            100/000              
  12376.         Ctrl F8                    65/00            101/000              
  12377.         Ctrl F9                    66/00            102/000              
  12378.         Ctrl F10                   67/00            103/000              
  12379.         Alt F1                     68/00            104/000              
  12380.         Alt F2                     69/00            105/000              
  12381.         Alt F3                     6A/00            106/000              
  12382.         Alt F4                     6B/00            107/000              
  12383.         Alt F5                     6C/00            108/000              
  12384.  
  12385.  
  12386.         QTAwk                       - 19-25 -                       QTAwk
  12387.  
  12388.  
  12389.  
  12390.  
  12391.  
  12392.  
  12393.         Section 19.0                                                    |
  12394.  
  12395.  
  12396.         Alt F6                     6D/00            109/000              
  12397.         Alt F7                     6E/00            110/000              
  12398.         Alt F8                     6F/00            111/000              
  12399.         Alt F9                     70/00            112/000              
  12400.         Alt F10                    71/00            113/000              
  12401.         Ctrl PrtSc                 72/00            114/000              
  12402.         Ctrl White Left Arrow      73/00            115/000              
  12403.         Ctrl Gray Left Arrow       73/00            115/000              
  12404.         Ctrl White Right Arrow     74/00            116/000              
  12405.         Ctrl Gray Right Arrow      74/00            116/000              
  12406.         Ctrl White End             75/00            117/000              
  12407.         Ctrl Gray End              75/00            117/000              
  12408.         Ctrl White PgDn            76/00            118/000              
  12409.         Ctrl Gray Page Down        76/00            118/000              
  12410.         Ctrl White Home            77/00            119/000              
  12411.         Ctrl Gray Home             77/00            119/000              
  12412.         Alt 1                      78/00            120/000              
  12413.         Alt 2                      79/00            121/000              
  12414.         Alt 3                      7A/00            122/000              
  12415.         Alt 4                      7B/00            123/000              
  12416.         Alt 5                      7C/00            124/000              
  12417.         Alt 6                      7D/00            125/000              
  12418.         Alt 7                      7E/00            126/000              
  12419.         Alt 8                      7F/00            127/000              
  12420.         Alt 9                      80/00            128/000              
  12421.         Alt 0                      81/00            129/000              
  12422.         Alt -                      82/00            130/000              
  12423.         Alt =                      83/00            131/000              
  12424.         Ctrl White PgUp            84/00            132/000              
  12425.         Ctrl Gray Page Up          84/00            132/000              
  12426.         F11                        85/00            133/000              
  12427.         F12                        86/00            134/000              
  12428.         Shift F11                  87/00            135/000              
  12429.         Shift F12                  88/00            136/000              
  12430.         Ctrl F11                   89/00            137/000              
  12431.         Ctrl F12                   8A/00            138/000              
  12432.         Alt F11                    8B/00            139/000              
  12433.         Alt F12                    8C/00            140/000              
  12434.         Ctrl White Up Arrow        8D/00            141/000              
  12435.         Ctrl Gray Up Arrow         8D/E0            141/224              
  12436.         Ctrl Gray -                8E/00            142/000              
  12437.         Ctrl 5 (number pad)        8F/00            143/000              
  12438.         Ctrl Gray +                90/00            144/000              
  12439.         Ctrl White Down Arrow      91/00            145/000              
  12440.         Ctrl Gray Down Arrow       91/E0            145/224              
  12441.         Ctrl White Ins             92/00            146/000              
  12442.  
  12443.  
  12444.         QTAwk                       - 19-26 -                       QTAwk
  12445.  
  12446.  
  12447.  
  12448.  
  12449.  
  12450.  
  12451.         Section 19.0                                                    |
  12452.  
  12453.  
  12454.         Ctrl Gray Insert           92/E0            146/224              
  12455.         Ctrl White Del             93/00            147/000              
  12456.         Ctrl Gray Delete           93/E0            147/224              
  12457.         Ctrl Tab                   94/00            148/000              
  12458.         Ctrl / (number pad)        95/00            149/000              
  12459.         Ctrl Gray *                96/00            150/000              
  12460.         Alt Gray Home              97/00            151/000              
  12461.         Alt Gray Up Arrow          98/00            152/000              
  12462.         Alt Gray Page Up           99/00            153/000              
  12463.         Alt Gray Left Arrow        9B/00            155/000              
  12464.         Alt Gray Right Arrow       9D/00            157/000              
  12465.         Alt Gray End               9F/00            159/000              
  12466.         Alt Gray Down Arrow        A0/00            160/000              
  12467.         Alt Gray Page Down         A1/00            161/000              
  12468.         Alt Gray Insert            A2/00            162/000              
  12469.         Alt Gray Delete            A3/00            163/000              
  12470.         Alt / (number pad)         A4/00            164/000              
  12471.         Alt Tab                    A5/00            165/000              
  12472.         Alt Enter (number pad)     A6/00            166/000              
  12473.         Alt 7 (number pad)         #                #                    
  12474.         Alt 8 (number pad)         #                #                    
  12475.         Alt 9 (number pad)         #                #                    
  12476.         Alt 4 (number pad)         #                #                    
  12477.         Alt 5 (number pad)         #                #                    
  12478.         Alt 6 (number pad)         #                #                    
  12479.         Alt 1 (number pad)         #                #                    
  12480.         Alt 2 (number pad)         #                #                    
  12481.         Alt 3 (number pad)         #                #                    
  12482.         Ctrl                       **               **                   
  12483.         Shift                      **               **                   
  12484.         Alt                        **               **                   
  12485.         Caps Lock                  **               **                   
  12486.         Num Lock                   **               **                   
  12487.         Scroll Lock                **               **                   
  12488.         SysReq                     **               **                   
  12489.         PrtSc                      **               **                   
  12490.         Pause                      **               **                   
  12491.         Shift Ctrl                 **               **                   
  12492.         Shift Alt                  **               **                   
  12493.         Shift Caps Lock            **               **                   
  12494.         Shift Num Lock             **               **                   
  12495.         Shift Scroll Lock          **               **                   
  12496.         Shift SysReq               **               **                   
  12497.         Shift PrtSc                **               **                   
  12498.         Shift Pause                **               **                   
  12499.         Ctrl Shift                 **               **                   
  12500.  
  12501.  
  12502.         QTAwk                       - 19-27 -                       QTAwk
  12503.  
  12504.  
  12505.  
  12506.  
  12507.  
  12508.  
  12509.         Section 19.0                                                    |
  12510.  
  12511.  
  12512.         Ctrl Alt                   **               **                   
  12513.         Ctrl SysReq                **               **                   
  12514.         Alt Ctrl                   **               **                   
  12515.         Alt Shift                  **               **                   
  12516.         Alt Caps Lock              **               **                   
  12517.         Alt Num Lock               **               **                   
  12518.         Alt Scroll Lock            **               **                   
  12519.         Alt SysReq                 **               **                   
  12520.         Alt PrtSc                  **               **                   
  12521.         Alt Pause                  **               **                   
  12522.         Ctrl 1                     --               --                   
  12523.         Ctrl 3                     --               --                   
  12524.         Ctrl 4                     --               --                   
  12525.         Ctrl 5                     --               --                   
  12526.         Ctrl 7                     --               --                   
  12527.         Ctrl 8                     --               --                   
  12528.         Ctrl 9                     --               --                   
  12529.         Ctrl 0                     --               --                   
  12530.         Ctrl =                     --               --                   
  12531.         Ctrl ;                     --               --                   
  12532.         Ctrl '                     --               --                   
  12533.         Ctrl `                     --               --                   
  12534.         Ctrl ,                     --               --                   
  12535.         Ctrl .                     --               --                   
  12536.         Ctrl /                     --               --                   
  12537.         Ctrl Caps Lock             --               --                   
  12538.         Ctrl Num Lock              --               --                   
  12539.         Ctrl Scroll Lock           --               --                   
  12540.         Ctrl Key 45                --               --                   
  12541.         Alt Del                    --               --                   
  12542.         Alt Key 45                 --               --                   
  12543.  
  12544.  
  12545.  
  12546.  
  12547.  
  12548.  
  12549.  
  12550.  
  12551.  
  12552.  
  12553.  
  12554.  
  12555.  
  12556.  
  12557.  
  12558.  
  12559.  
  12560.         QTAwk                       - 19-28 -                       QTAwk
  12561.  
  12562.  
  12563.  
  12564.  
  12565.  
  12566.  
  12567.         Section 20.0                                                    |
  12568.  
  12569.  
  12570.         20.0 Appendix iii
  12571.         
  12572.                        Differences Between QTAwk and Awk:                
  12573.         
  12574.         1.  Expanded Regular Expressions
  12575.             All  of the Awk regular expression operators are allowed plus
  12576.             the following:
  12577.             a)  complemented character  class  using  the  Awk  notation,
  12578.                 '[^...]', as well as the Awk/QTAwk and C logical negation
  12579.                 operator, '[!...]'. 
  12580.                 
  12581.             b)  Matched character classes, '[#...]'.  These  classes  are
  12582.                 used  in pairs.  The position of the character matched in
  12583.                 the first class of the  pair,  determines  the  character
  12584.                 which  must  match in the position occupied by the second
  12585.                 class of the pair. 
  12586.                 
  12587.             c)  Look-ahead  Operator.   r@t  regular  expression   r   is
  12588.                 matched  only  when  followed  by  regular expression t. 
  12589.                 
  12590.             d)  Repetition Operator.  r{n1,n2} at least n1 and up  to  n2
  12591.                 repetitions of regular expression r. 
  12592.                 
  12593.             e)  Named  Expressions.   {named_expr}  is  replaced  by  the
  12594.                 string value of the corresponding variable. 
  12595.                 
  12596.             f)  Tagged Expressions.  Enclosing a  portion  of  a  regular
  12597.                 expression,  in  parenthesis,  "()"  makes  the  matching
  12598.                 string available for use with the  Tag  Operator,  '$$'. 
  12599.             
  12600.         2.  Consistent  statement  termination syntax.  The QTAwk Utility
  12601.             Creation Tool utilizes the semi-colon, ';', to terminate  all
  12602.             statements.   The  practice  in  Awk  of  using  new lines to
  12603.             "sometimes"  terminate  statements  is  no  longer  allowed. 
  12604.             
  12605.         3.  Expanded Operator Set
  12606.             The  Awk  set of operators has been changed to make them more
  12607.             consistent and to more closely match those  of  C.   The  Awk
  12608.             match  operator,  '~',  has  been changed to '~~' so that the
  12609.             similarity between the match operators, '~~' and '!~', to the
  12610.             equality  operators,  '==' and '!=", is complete.  The single
  12611.             tilde  symbol,  '~',  reverts  to  the  C  one's   complement
  12612.             operator,  an  addition  to  the  operator set over Awk.  The
  12613.             introduction of the explicit string  concatenation  operator,
  12614.             '∩'  (ASCII  239,  0x0ef).   The remaining "new" operators to
  12615.             QTAwk are:
  12616.  
  12617.  
  12618.         QTAwk                       - 20-1 -                        QTAwk
  12619.  
  12620.  
  12621.  
  12622.  
  12623.  
  12624.  
  12625.         Section 20.0                                                    |
  12626.  
  12627.  
  12628.             
  12629.             
  12630.             
  12631.             
  12632.             Operation             Operator                               
  12633.             tag                   $$                                     
  12634.             one's complement      ~                                      
  12635.             concatenation         ∩                                      
  12636.             shift left/right      << >>                                  
  12637.             matching              ~~ !~                                  
  12638.             bit-wise AND          &                                      
  12639.             bit-wise XOR          @                                      
  12640.             bit-wise OR           |                                      
  12641.             sequence              ,                                      
  12642.             
  12643.              The carat, '^', remains as the exponentiation operator.  The
  12644.             symbol '@' is used for the exclusive OR operator.  For string
  12645.             operands, the shift  operators,  '<<'  and  '>>',  shift  the
  12646.             strings  with  wrap-around  instead  of  a  bit  shift as for
  12647.             numeric operands. 
  12648.             
  12649.         4.  Expanded set of recognized constants:
  12650.             a)  decimal integers,
  12651.             b)  octal integers,
  12652.             c)  hexadecimal integers,
  12653.             d)  character constants, and
  12654.             e)  floating point constants. 
  12655.             
  12656.              These constants are recognized in utilitys, input fields and
  12657.             strings. 
  12658.             
  12659.         5.  Expanded predefined patterns giving more control:
  12660.             a)  INIITAL  -  similar  to  BEGIN.   Actions  executed after
  12661.                 opening each input file and before reading first record. 
  12662.                 
  12663.             b)  FINAL  -  similar to END.  Actions executed after reading
  12664.                 last record of each input file and before closing  file. 
  12665.                 
  12666.             c)  NOMATCH  -  actions  executed  for  each input record for
  12667.                 which no pattern was matched. 
  12668.                 
  12669.             d)  GROUP - used to group multiple  regular  expressions  for
  12670.                 search  optimization.   Can  speed  search by a factor of
  12671.                 six. 
  12672.             
  12673.         6.  True multidimensional Arrays
  12674.  
  12675.  
  12676.         QTAwk                       - 20-2 -                        QTAwk
  12677.  
  12678.  
  12679.  
  12680.  
  12681.  
  12682.  
  12683.         Section 20.0                                                    |
  12684.  
  12685.  
  12686.             The use  of  the  comma  in  index  expressions  to  simulate
  12687.             multiple array indices is no longer supported.  True multiple
  12688.             indices  are  supported.   Indexing  is  in  the  C   manner,
  12689.             'a[i1][i2]'.   The use of the SUBSEP built-in variable of Awk
  12690.             has been redefined. 
  12691.             
  12692.         7.  Integer array indices as well as string indices
  12693.             Array indices have been expanded to include integers as  well
  12694.             as  the string indices of Awk.  Indices are not automatically
  12695.             converted to strings as  in  Awk.   Thus,  for  true  integer
  12696.             indices, the index ordering follows the numeric sequence with
  12697.             an integer index value of '10' following an integer value  of
  12698.             '2' instead of preceding it. 
  12699.             
  12700.         8.  Arrays integrated into QTAwk
  12701.             QTAwk integrates arrays with arithmetic operators so that the
  12702.             operations are carried out on the entire array.   QTAwk  also
  12703.             integrates  arrays  into  user-defined functions so that they
  12704.             can be passed to  and  returned  from  such  functions  in  a
  12705.             natural  and  intuitive manner.  Awk does not allow returning
  12706.             arrays  from  user-defined  functions  or  allow   arithmetic
  12707.             operators to operate on whole arrays. 
  12708.             
  12709.              In  addition,  with  version 6.00 for PC/MS-DOS VERSION 1.00
  12710.             FOR OS/2, arrays have been fully integrated into all  aspects
  12711.             of  QTAwk  including  the match operators, '~~' and '!~', and
  12712.             their implied use in patterns  and  the  built-in  functions,
  12713.             'sub',   'gsub',   and  'match'.   The  MATCH_INDEX  built-in
  12714.             variable has been added to return the matching array  element
  12715.             index  when an array has been used for pattern matching.  The
  12716.             string value of the SUBSEP built-in variable is used  as  the
  12717.             index  separator in MATCH_INDEX for multidimensional arrays. 
  12718.             
  12719.              Arrays used as regular expressions with the match operators,
  12720.             both  explicit  and  implied,  retain  their internal regular
  12721.             expression form between  uses.   In  addition,  the  internal
  12722.             regular expression form is assigned when the array as a whole
  12723.             is  assigned  to  another  variable,  the  internal   regular
  12724.             expression  form  is  also  assigned.   The  internal regular
  12725.             expression form is discarded only when the array is changed. 
  12726.             This  gives  the  user  a  more balanced control over dynamic
  12727.             regular expressions between that of true regular expressions,
  12728.             which retain the internal form until execution is halted, and
  12729.             strings  used  as  regular  expressions,  which  discard  the
  12730.             internal regular expression form after each use. 
  12731.             
  12732.  
  12733.  
  12734.         QTAwk                       - 20-3 -                        QTAwk
  12735.  
  12736.  
  12737.  
  12738.  
  12739.  
  12740.  
  12741.         Section 20.0                                                    |
  12742.  
  12743.  
  12744.         9.  NEW Keywords:
  12745.             
  12746.             a)  cycle
  12747.                 similar  to  'next' except that may use current record in
  12748.                 restarting outer pattern matching loop. 
  12749.                 
  12750.             b)  deletea
  12751.                 similar  to  'delete'  except  that  ALL   array   values
  12752.                 deleted. 
  12753.                 
  12754.             c)  switch, case, default
  12755.                 similar  to C syntax with the allowed 'switch' values and
  12756.                 'case'  labels  expanded  to  include  any  legal   QTAwk
  12757.                 expression,  evaluated  at run-time.  The expressions may
  12758.                 evaluate to any value including any numeric value, string
  12759.                 or regular expression. 
  12760.                 
  12761.             d)  local
  12762.                 new  keyword  to  allow  the declaration and use of local
  12763.                 variables   within   compound    statements,    including
  12764.                 user-defined   functions.    Its   use  in  user  defined
  12765.                 functions instead of the Awk practice of defining  excess
  12766.                 formal  parameters,  leads to easier to read and maintain
  12767.                 functions.  The C 'practice' of  allowing  initialization
  12768.                 in the 'local' statement is followed. 
  12769.                 
  12770.             e)  endfile
  12771.                 similar  to  'exit'.  Simulates end of current input file
  12772.                 only, any remaining input  files  are  still  processed. 
  12773.             
  12774.         10.  New Arithmetic Functions
  12775.             QTAwk  includes 18 built-in arithmetic functions.  All of the
  12776.             functions supported by Awk plus the following:
  12777.             a)  acos(x) - arc-cosine of x
  12778.             b)  asin(x) - arc-sine of x
  12779.             c)  cosh(x) - hyperbolic cosine of x
  12780.             d)  jdn or jdn() or jdn(fdate) or jdn(y,m,d) or jdn(fdate)  -
  12781.                 Julian Day Number of date specified
  12782.             e)  fract(x) - fractional portion of x
  12783.             f)  log10(x) - logarithm base 10
  12784.             g)  pi or pi() - pi
  12785.             h)  sinh(x) - hyperbolic sine of x
  12786.             
  12787.         11.  New String Functions
  12788.             QTAwk  includes  33  built-in  string  functions.  All of the
  12789.             functions supported by Awk plus the following:
  12790.  
  12791.  
  12792.         QTAwk                       - 20-4 -                        QTAwk
  12793.  
  12794.  
  12795.  
  12796.  
  12797.  
  12798.  
  12799.         Section 20.0                                                    |
  12800.  
  12801.  
  12802.             a)  cal(fmt,jdn) - Julian Day Number to formatted date
  12803.             b)  center(s,w) or center(s,w,c) - center string
  12804.             c)  copies(s,n) - copies of string
  12805.             d)  deletec(s,p,n) - delete characters from a string
  12806.             e)  insert(s1,s2,p) - insert one string into  another  string
  12807.             f)  justify(a,n,w)   or  justify(a,n,w,c)  -  justify  string
  12808.             g)  overlay(s1,s2,p) - overlay one string on another
  12809.             h)  remove(s,c) - remove characters from a string
  12810.             i)  replace(s) - replace all variables in a string
  12811.             j)  sdate(fmt)  or  sdate(fmt,fdate)  or  sdate(fmt,y,m,d)  -
  12812.                 format date/time
  12813.             k)  srange(c1,c2)  -  return  string formed of all characters
  12814.                 from c1 to c2
  12815.             l)  srev(s) - reverse characters of string
  12816.             m)  stime(fmt)  or  stime(fmt,ftime)  or  stime(fmt,h,m,s)  -
  12817.                 format date/time
  12818.             n)  stran(s)  or  stran(s,st)  or  stran(s,st,sf) - translate
  12819.                 characters
  12820.             o)  strim(s) or strim(s,c) or  strim(s,c,d)  -  trim  leading
  12821.                 and/or trailing characters
  12822.             p)  strlwr(s) - translate to lower case
  12823.             q)  strupr(s) - translate to upper case
  12824.             
  12825.         12.  New Miscellaneous Functions
  12826.             a)  The  function  'rotate(a)'  is  provided  to  rotate  the
  12827.                 elements of the array a. 
  12828.             b)  execute(s) or execute(s,se) or execute(s,se,rf) - execute
  12829.                 string s
  12830.             c)  execute(a) or execute(a,se) or execute(a,se,rf) - execute
  12831.                 array a
  12832.             d)  findfile(var,pattern,attributes)  -   find   files   with
  12833.                 specified names and attributes
  12834.             e)  pd_sym - access pre-defined variables
  12835.             f)  ud_sym - access user defined variables
  12836.             g)  resetre  - return QTAwk utility to start-up condition for
  12837.                 all regular expressions,  including  patterns  and  GROUP
  12838.                 patterns.  Only the internal regular expression forms for
  12839.                 arrays are  not  re-initialized.   The  internal  regular
  12840.                 expression  forms  for arrays are re-initialized whenever
  12841.                 the array is changed in any manner. 
  12842.             
  12843.         13.  New I/O Functions
  12844.             I/O function syntax has been made consistent with  syntax  of
  12845.             other  functions.   The  redirection  operators, '<', '>' and
  12846.             '>>', and  pipeline  operator,  '|',  have  been  deleted  as
  12847.             excessively  error  prone  in  expressions.   The  functional
  12848.  
  12849.  
  12850.         QTAwk                       - 20-5 -                        QTAwk
  12851.  
  12852.  
  12853.  
  12854.  
  12855.  
  12856.  
  12857.         Section 20.0                                                    |
  12858.  
  12859.  
  12860.             syntax of the 'getline' function has been made  identical  to
  12861.             that  of  the  other  built-in  functions.  The new functions
  12862.             'fgetline', 'fprint' and 'fprintf' have been  introduced  for
  12863.             reading  and  writing  to  files other than the current input
  12864.             file and to replace the redirection operators. 
  12865.             
  12866.             a)  Single character input functions have been added:
  12867.                 1:  getc() - return next  character  from  current  input
  12868.                     file,
  12869.                 2:  fgetc(F)  -  return next character from named file, F
  12870.                 3:  putc(c) - output character c to standard output  file
  12871.                 4:  fputc(c,F) - output character c to file F
  12872.                 
  12873.             b)  The  dropped  file  re-direction operator, '>>', has been
  12874.                 replaced by the 'append' function:
  12875.                 
  12876.                  append(F) -- Opens the file F for output to the  end  of
  12877.                 the  file.  All subsequent output to the file is appended
  12878.                 to the end of the file.  This  function  must  be  called
  12879.                 before  the  first  output  to  the  file to append.  Any
  12880.                 output to the file prior to calling  this  function  will
  12881.                 open  the  file  and discard any existing contents, i.e.,
  12882.                 truncate to zero length. 
  12883.                 
  12884.             c)  Two functions to search files for  one  or  more  regular
  12885.                 expressions:
  12886.                 
  12887.                 1:  srchrecord( sp )
  12888.                     or srchrecord( sp , rs )
  12889.                     or srchrecord( sp , rs , var )
  12890.                     search  current input file for next record containing
  12891.                     match to 'sp', using 'rs' as record separator (RS  if
  12892.                     'rs' not specified), returning record found in 'var',
  12893.                     $0 if 'var' not specified.  Update NR and FNR.   Also
  12894.                     reparse  $0  if  'var'  not specified and update NF. 
  12895.                     
  12896.                      Returns:
  12897.                     a|  n ==> Record Present And Read,  n  ==  Number  Of
  12898.                         Characters  In  Record  plus  EOR length plus 1. 
  12899.                     b|  0 ==> End-Of-File, EOF, Encountered
  12900.                     c|  -1 ==> Read Error Occurred (Including Failure  To
  12901.                         Open File)
  12902.                     
  12903.                 2:  fsrchrecord( fn , sp )
  12904.                     or fsrchrecord( fn , sp , rs )
  12905.                     or fsrchrecord( fn , sp , rs , var )
  12906.  
  12907.  
  12908.         QTAwk                       - 20-6 -                        QTAwk
  12909.  
  12910.  
  12911.  
  12912.  
  12913.  
  12914.  
  12915.         Section 20.0                                                    |
  12916.  
  12917.  
  12918.                     search  file 'fn' for next record containing match to
  12919.                     'sp', using 'rs' as record separator (RS if 'rs'  not
  12920.                     specified),  returning  record  found in 'var', $0 if
  12921.                     'var'  not  specified.   Reparse  $0  if  'var'   not
  12922.                     specified and update NF. 
  12923.                     
  12924.                      Returns:
  12925.                     a|  n  ==>  Record  Present  And Read, n == Number Of
  12926.                         Characters In Record plus  EOR  length  plus  1. 
  12927.                     b|  0 ==> End-Of-File, EOF, Encountered
  12928.                     c|  -1  ==> Read Error Occurred (Including Failure To
  12929.                         Open File)
  12930.                 
  12931.             d)  The function  'get_FNR(F)'  has  been  introduced.   This
  12932.                 function  returns  the current record number of the input
  12933.                 file 'F'.  This  function  is  necessary  to  obtain  the
  12934.                 current input record number for input files used with the
  12935.                 'fgetline' and 'fsrchrecord' functions. 
  12936.             
  12937.         14.  Expanded capability of formatted Output. 
  12938.             The limited output formatting available with the Awk 'printf'
  12939.             function  has  been  expanded by adopting the complete output
  12940.             format specification of the ANSI C standard. 
  12941.             
  12942.         15.  'local' keyword
  12943.             The  'local'  keyword  has  been  introduced  to  allow   for
  12944.             variables  local  to user-defined functions (and any compound
  12945.             statement).   This  expansion  makes  the  Awk  practice   of
  12946.             defining  'extra'  formal  parameters  no  longer necessary. 
  12947.             
  12948.         16.  Expanded user-defined functions
  12949.             With the 'local' keyword, QTAwk allows  the  user  to  define
  12950.             functions  that  may  accept a variable number of arguments. 
  12951.             Functions, such as finding the minimum/maximum of a  variable
  12952.             number  of  variables,  are possible with one function rather
  12953.             than  defining   separate   functions   for   each   possible
  12954.             combination of arguments. 
  12955.             
  12956.         17.  User controlled trace capability
  12957.             A user controlled statement trace capability has been added. 
  12958.             This gives the user  a  simple  to  use  mechanism  to  trace
  12959.             utility  execution.   Rather  than adding 'print' statements,
  12960.             merely re-defining the value of a built-in variable will give
  12961.             utility  execution  trace information, including utility line
  12962.             number. 
  12963.             
  12964.  
  12965.  
  12966.         QTAwk                       - 20-7 -                        QTAwk
  12967.  
  12968.  
  12969.  
  12970.  
  12971.  
  12972.  
  12973.         Section 20.0                                                    |
  12974.  
  12975.  
  12976.         18.  Expanded built-in variable list
  12977.             With  57  built-in  variables,  QTAwk  includes  all  of  the
  12978.             built-in  variables  of  Awk  plus  the following: (Note: the
  12979.             definition and use of SUBSEP has been changed  from  that  in
  12980.             Awk)
  12981.             
  12982.             a)  _arg_chk  -  used to determine whether to check number of
  12983.                 arguments passed to user-defined functions. 
  12984.                 
  12985.             b)  ARGI  -  index  value  in  ARGV  of  next  command   line
  12986.                 argument.   Gives  more  control of command line argument
  12987.                 processing. 
  12988.                 
  12989.             c)  CONVFMT - used for converting floating point  numbers  to
  12990.                 strings.   OFMT  used  only  for  output  floating  point
  12991.                 numbers. 
  12992.                 
  12993.             d)  CLENGTH - similar to 'RLENGTH' of Awk.   Set  whenever  a
  12994.                 'case' value evaluates to a regular expression. 
  12995.                 
  12996.             e)  CSTART  -  similar  to  'RSTART'  of Awk.  Set whenever a
  12997.                 'case' value evaluates to a regular expression. 
  12998.                 
  12999.             f)  CYCLE_COUNT - count number  of  outer  loop  cycles  with
  13000.                 current input record. 
  13001.                 
  13002.             g)  DEGREES  - if TRUE, trigonometric functions assume degree
  13003.                 values, radians if FALSE. 
  13004.                 
  13005.             h)  ENVIRON - one dimensional array with  elements  equal  to
  13006.                 the environment strings passed to QTAwk
  13007.                 
  13008.             i)  ECHO_INPUT  -  controls  echo  of  standard input file to
  13009.                 standard output file. 
  13010.                 
  13011.             j)  FALSE - predefined with constant value, 0. 
  13012.                 
  13013.             k)  FIELDFILL - string value used for  filling  fixed  length
  13014.                 fields when fields changed. 
  13015.                 
  13016.             l)  FIELDWIDTHS  -  can  be  assigned a value for fixed width
  13017.                 fields, over-riding the use of FS for  splitting  current
  13018.                 record into fields. 
  13019.                 
  13020.             m)  FILEATTR  --  file  attributes  of  current  input file. 
  13021.                 
  13022.  
  13023.  
  13024.         QTAwk                       - 20-8 -                        QTAwk
  13025.  
  13026.  
  13027.  
  13028.  
  13029.  
  13030.  
  13031.         Section 20.0                                                    |
  13032.  
  13033.  
  13034.             n)  FILEDATE -- date in DOS format of  current  input  file. 
  13035.                 
  13036.             o)  FILETIME  --  time  in DOS format of current input file. 
  13037.                 
  13038.             p)  FILEDATE_CREATE --  creation  date  in  operating  system
  13039.                 format of current input file. 
  13040.                 
  13041.             q)  FILETIME_CREATE  --  creation  time  in  operating system
  13042.                 format of current input file. 
  13043.                 
  13044.             r)  FILEDATE_LACCESS  --  last  access   creation   date   in
  13045.                 operating system format of current input file. 
  13046.                 
  13047.             s)  FILETIME_LACCESS  -- last access time in operating system
  13048.                 format of current input file. 
  13049.                 
  13050.             t)  FILESIZE -- size in bytes of current input file. 
  13051.                 
  13052.             u)  FILE_SORT -- string value to define sort order  of  array
  13053.                 returned by "findfile" function. 
  13054.                 
  13055.             v)  FILE_SEARCH  --  TRUE/FALSE value to search current input
  13056.                 file  for   record(s)   containing   match   to   regular
  13057.                 expression(s)  in FILE_SEARCH_PAT.  Default value FALSE. 
  13058.                 
  13059.             w)  FILE_SEARCH_PAT -- contains  one  or  more  patterns  for
  13060.                 searching current input file. 
  13061.                 
  13062.             x)  FS  allowed  to be an array.  If FS is an array, multiple
  13063.                 patterns may be set for field separators. 
  13064.                 
  13065.             y)  Gregorian  --  TRUE/FALSE  value  to  distinguish   using
  13066.                 Gregorian  or  Julian  calendar  in  computing Julian Day
  13067.                 Number or converting back to calendar date. 
  13068.                 
  13069.             z)  IGNORECASE - if assigned  a  true  value,  QTAwk  ignores
  13070.                 case   is   all   string  and  regular  expression  match
  13071.                 operations. 
  13072.                 
  13073.             aa)  LONGEST_EXP - used to control  whether  the  longest  or
  13074.                 the first string matching a regular expression is found. 
  13075.                 
  13076.             ab)  MATCH_INDEX - assigned the string value of the  matching
  13077.                 array  element  when an array used for regular expression
  13078.                 match. 
  13079.                 
  13080.  
  13081.  
  13082.         QTAwk                       - 20-9 -                        QTAwk
  13083.  
  13084.  
  13085.  
  13086.  
  13087.  
  13088.  
  13089.         Section 20.0                                                    |
  13090.  
  13091.  
  13092.             ac)  MAX_CYCLE  -  maximum  number  of  outer   loop   cycles
  13093.                 permitted with current input record. 
  13094.                 
  13095.             ad)  MLENGTH  -  similar to 'RLENGTH' of Awk.  Set whenever a
  13096.                 stand-alone  regular   expression   is   encountered   in
  13097.                 evaluating a pattern. 
  13098.                 
  13099.             ae)  MSTART  -  similar  to  'RSTART' of Awk.  Set whenever a
  13100.                 stand-alone  regular   expression   is   encountered   in
  13101.                 evaluating a pattern. 
  13102.                 
  13103.             af)  NF  -  if value changed, current input record changed to
  13104.                 reflect new value. 
  13105.                 
  13106.             ag)  NG - equal to the number of the regular expression in  a
  13107.                 GROUP  matching  a  string  in the current input record. 
  13108.                 
  13109.             ah)  OFMT - string value used only as format  for  output  of
  13110.                 floating point numbers. 
  13111.                 
  13112.             ai)  RECLEN  - if assigned a non-zero numeric value, integral
  13113.                 value used for length of fixed length  records.   RS  not
  13114.                 used unless RECLEN has a zero numeric value. 
  13115.                 
  13116.             aj)  RETAIN_FS  -  if TRUE the original characters separating
  13117.                 the fields of  the  current  input  record  are  retained
  13118.                 whenever  a field is changed, causing the input record to
  13119.                 be re-constructed.  If FALSE the output field  separator,
  13120.                 OFS,  is  used  to  separate  fields in the current input
  13121.                 record during reconstruction.  The latter practice is the
  13122.                 only method available in Awk. 
  13123.                 
  13124.             ak)  RS  allowed  to  be  an  array.   If RS is an array, and
  13125.                 RECLEN has a zero numeric value, multiple patterns may be
  13126.                 set for record separators. 
  13127.                 
  13128.             al)  RT  -  automatically  assigned  string  value  of record
  13129.                 terminator for current input record. 
  13130.                 
  13131.             am)  SUBSEP -- string value used as the array  element  index
  13132.                 separator in MATCH_INDEX. 
  13133.                 
  13134.             an)  SPAN_RECORDS  --  TRUE/FALSE,  default  value FALSE.  if
  13135.                 TRUE allows matches to FILE_SEARCH_PAT to  span  multiple
  13136.                 input  records  and  return  multiple  records in $0.  If
  13137.                 FALSE,  matches  confined  to  a  single  record.    Also
  13138.  
  13139.  
  13140.         QTAwk                       - 20-10 -                       QTAwk
  13141.  
  13142.  
  13143.  
  13144.  
  13145.  
  13146.  
  13147.         Section 20.0                                                    |
  13148.  
  13149.  
  13150.                 controls  matches  spanning  records  in 'srchrecord' and
  13151.                 'fsrchrecord' functions. 
  13152.                 
  13153.             ao)  TRACE  -  value  used  to  determine  utility  tracing. 
  13154.                 
  13155.             ap)  TRANS_FROM/TRANS_TO  -  strings used by 'stran' function
  13156.                 if second and/or third arguments not specified. 
  13157.                 
  13158.             aq)  TRUE - predefined with constant value, 1
  13159.                 
  13160.             ar)  QTAwk_Path  -  initialized  from   'QTAWK'   environment
  13161.                 variable.  Sets paths searched for input files. 
  13162.                 
  13163.             as)  vargc  -  used  only  in  used-defined functions defined
  13164.                 with a variable number of arguments.   At  run-time,  set
  13165.                 equal to the actual number of variable arguments passed. 
  13166.                 
  13167.             at)  vargv - used  only  in  used-defined  functions  defined
  13168.                 with  a  variable  number  of arguments.  At run-time, an
  13169.                 single dimensioned array with each  element  set  to  the
  13170.                 argument actually passed. 
  13171.             
  13172.         19.  New command line options available:
  13173.             
  13174.             a)  -ffilename  ==> multiple utility files may be specified. 
  13175.                 In addition, the file directive:
  13176.                 
  13177.                 #include "filename"
  13178.                 
  13179.                  may be used to include other files. 
  13180.                 
  13181.             b)  -vvar=value ==> sets 'var' to value  before  any  "BEGIN"
  13182.                 actions executed
  13183.                 
  13184.             c)  -Wd  - delays parsing of input record until any fields or
  13185.                 the NF variable referenced. 
  13186.                 
  13187.             d)  -Wwfilename - writes internal  form  of  utility  to  the
  13188.                 file "filename".  The file may then be specified with the
  13189.                 'f' option.  Speeds initial reading  of  utility  files. 
  13190.             
  13191.         20.  Definition  of  built-in variable, RS, expanded.  When value
  13192.             assigned to RS, it is converted to regular expression  form. 
  13193.             Strings matching regular expression act as record separator. 
  13194.             Similar in behavior to field separator,  FS.   If  an  array,
  13195.             multiple record separator patterns may be specified. 
  13196.  
  13197.  
  13198.         QTAwk                       - 20-11 -                       QTAwk
  13199.  
  13200.  
  13201.  
  13202.  
  13203.  
  13204.  
  13205.         Section 20.0                                                    |
  13206.  
  13207.  
  13208.         21.  In  QTAwk, setting built-in variable, "FILENAME", to another
  13209.             value will  change  the  current  input  file.   Setting  the
  13210.             variable in Awk, has no effect on current input file. 
  13211.             
  13212.         22.  In  QTAwk,  setting  built-in  variable, NF to another value
  13213.             will change the current contents of $0.  If the new value  is
  13214.             greater  than  the  current  value, the current input line is
  13215.             lengthened with new empty  fields  separated  by  the  output
  13216.             field  separator strings, OFS.  If the new value is less than
  13217.             the current value, then $0 is shortened by truncating at  the
  13218.             end of the field corresponding to the new NF value. 
  13219.             
  13220.         23.  The  Tag  Operator,  $$,  may be used in a manner similar to
  13221.             field operator, $.  The Tag operator may be used to obtain or
  13222.             to  set  a particular part of the string matching the regular
  13223.             expression pattern. 
  13224.             
  13225.         24.  The return value of the 'getline' function has been  changed
  13226.             when  a  valid record has been read.  The return value is the
  13227.             length of the record plus the  length  of  the  End-Of-Record
  13228.             plus 1. 
  13229.             
  13230.         25.  Corrected   admitted   problems   with  Awk.   The  problems
  13231.             mentioned on page 182 of "The Awk Programming Language"  have
  13232.             been corrected.  Specifically:
  13233.             a)  true   multidimensional  arrays  have  been  implemented,
  13234.                 
  13235.             b)  the 'getline' syntax has  been  made  to  match  that  of
  13236.                 other functions,
  13237.                 
  13238.             c)  declaring  local  variables in user-defined functions has
  13239.                 been corrected,
  13240.                 
  13241.             d)  intervening blanks are allowed between the function  call
  13242.                 name and the opening parenthesis (in fact, under QTAwk it
  13243.                 is permissible to have no opening parenthesis or argument
  13244.                 list  for  user-defined  functions that have been defined
  13245.                 with no formal arguments). 
  13246.  
  13247.  
  13248.  
  13249.  
  13250.  
  13251.  
  13252.  
  13253.  
  13254.  
  13255.  
  13256.         QTAwk                       - 20-12 -                       QTAwk
  13257.  
  13258.  
  13259.  
  13260.  
  13261.  
  13262.  
  13263.         Section 21.0                                                    |
  13264.  
  13265.  
  13266.         21.0 Appendix iv
  13267.         
  13268.         
  13269.          The following QTAwk utility is designed to search C source  code
  13270.         files  for  keywords  defined  in  the  ANSI  C  standard.  It is
  13271.         included here to illustrate the use of the the 'GROUP'  keyword. 
  13272.         
  13273.         # QTAwk utility to scan C source files for keywords
  13274.         # defined in the ANSI C standard keywords:
  13275.         # macro or function names defined in the standard
  13276.         # types or constants defined in the standard
  13277.         #
  13278.         # program to illustrate GROUP pattern keyword
  13279.         #
  13280.         # input: C source file
  13281.         #  output:  all lines containing ANSI C standard defined keywords
  13282.         #
  13283.         # use 'GROUP' pattern keyword to form one large GROUP of
  13284.         # patterns to speed search.  Only two actions defined:
  13285.         # 1) action to print macro or function names
  13286.         # 2) action to print types or constants
  13287.         #
  13288.         #
  13289.         BEGIN {
  13290.                     #
  13291.                     # ANSI C key words
  13292.                     #
  13293.                     # expression for leader
  13294.                 ldr = /(^|[\s\t])/;
  13295.                     # opening function parenthesis - look-ahead to find
  13296.                 o_p = /@[\s\t]*\(/;
  13297.                     #
  13298.                     # define strings for formatted output
  13299.                     #
  13300.                 tls = "Total Lines Scanned: %lu\n";
  13301.                 tlc = "Total Line containing macro/function names: %lu\n";
  13302.                 tlt = "Total Line containing type/constant names: %lu\n";
  13303.         }
  13304.                     #
  13305.                     #
  13306.                     # Following are macro or functions names as defined
  13307.                     # by ANSI C standard
  13308.                     #
  13309.                     # 1
  13310.         GROUP /{ldr}assert{o_p}/
  13311.                     # 2
  13312.  
  13313.  
  13314.         QTAwk                       - 21-1 -                        QTAwk
  13315.  
  13316.  
  13317.  
  13318.  
  13319.  
  13320.  
  13321.         Section 21.0                                                    |
  13322.  
  13323.  
  13324.                     # Following regular expression split across 2 lines
  13325.                     # for documentation only.
  13326.         GROUP /{ldr}is(al(num|pha)|cntrl|x?digit|graph|
  13327.                 p(rint|unct)|space|(low|upp)er){o_p}/
  13328.                     # 3
  13329.         GROUP /{ldr}to(low|upp)er{o_p}/
  13330.                     # 4
  13331.         GROUP /{ldr}set(locale|v?buf){o_p}/
  13332.                     # 5
  13333.         GROUP /{ldr}a(cos|sin|tan2?|bort){o_p}/
  13334.                     # 6
  13335.         GROUP /{ldr}(cos|sin|tan)h?{o_p}/
  13336.                     # 7
  13337.         GROUP /{ldr}(fr|ld)?exp{o_p}/
  13338.                     # 8
  13339.         GROUP /{ldr}log(10)?{o_p}/
  13340.                     # 9
  13341.         GROUP /{ldr}modf{o_p}/
  13342.                     # 10
  13343.         GROUP /{ldr}pow{o_p}/
  13344.                     # 11
  13345.         GROUP /{ldr}sqrt{o_p}/
  13346.                     # 12
  13347.         GROUP /{ldr}ceil{o_p}/
  13348.                     # 13
  13349.         GROUP /{ldr}(f|l)?abs{o_p}/
  13350.                     # 14
  13351.         GROUP /{ldr}f(loor|mod){o_p}/
  13352.                     # 15
  13353.         GROUP /{ldr}jmp_buf{o_p}/
  13354.                     # 16
  13355.         GROUP /{ldr}(set|long)jmp{o_p}/
  13356.                     # 17
  13357.         GROUP /{ldr}signal{o_p}/
  13358.                     # 18
  13359.         GROUP /{ldr}raise{o_p}/
  13360.                     # 19
  13361.         GROUP /{ldr}va_(arg|end|list|start){o_p}/
  13362.                     # 20
  13363.         GROUP /{ldr}re(move|name|wind){o_p}/
  13364.                     # 21
  13365.         GROUP /{ldr}tmp(file|nam){o_p}/
  13366.                     # 22
  13367.         GROUP /{ldr}(v?[fs])?printf{o_p}/
  13368.                     # 23
  13369.         GROUP /{ldr}[fs]?scanf{o_p}/
  13370.  
  13371.  
  13372.         QTAwk                       - 21-2 -                        QTAwk
  13373.  
  13374.  
  13375.  
  13376.  
  13377.  
  13378.  
  13379.         Section 21.0                                                    |
  13380.  
  13381.  
  13382.                     # 24
  13383.         GROUP /{ldr}f?get(c(har)?|s|env){o_p}/
  13384.                     # 25
  13385.         GROUP /{ldr}f?put(c(har)?|s){o_p}/
  13386.                     # 26
  13387.         GROUP /{ldr}ungetc{o_p}/
  13388.                     # 27
  13389.                     # Following regular expression split across 2 lines
  13390.                     # for documentation only.
  13391.         GROUP /{ldr}f(close|flush|(re)?open|read|write|
  13392.                 [gs]etpos|seek|tell|eof|ree|pos_t){o_p}/
  13393.                     # 28
  13394.         GROUP /{ldr}clearerr{o_p}/
  13395.                     # 29
  13396.         GROUP /{ldr}[fp]error{o_p}/
  13397.                     # 30
  13398.         GROUP /{ldr}ato[fil]{o_p}/
  13399.                     # 31
  13400.                     # Following regular expression split across 2 lines
  13401.                     # for documentation only.
  13402.         GROUP /{ldr}str(to(d|k|u?l)|n?c(py|at|mp)|
  13403.                 coll|r?chr|c?spn|pbrk|str|error|len){o_p}/
  13404.                     # 32
  13405.         GROUP /{ldr}s?rand{o_p}/
  13406.                     # 33
  13407.         GROUP /{ldr}(c|m|re)?alloc{o_p}/
  13408.                     # 34
  13409.         GROUP /{ldr}_?exit{o_p}/
  13410.                     # 35
  13411.         GROUP /{ldr}(f|mk|asc|c|gm|local|strf)?time{o_p}/ {
  13412.                 printf("Macro/function\n%uE - %luR: %s\n%s\n",NG,FNR,$0,$$0);
  13413.                 mf_count++;
  13414.         }
  13415.                     #
  13416.                     # following are types or constants
  13417.                     #
  13418.                     # 36
  13419.         GROUP /errno/
  13420.                     # 37
  13421.         GROUP /NULL/
  13422.                     # 38
  13423.         GROUP /offsetof/
  13424.                     # 39
  13425.         GROUP /(fpos|ptrdiff|size|wchar)_t/
  13426.                     # 41
  13427.         GROUP /NDEBUG/
  13428.  
  13429.  
  13430.         QTAwk                       - 21-3 -                        QTAwk
  13431.  
  13432.  
  13433.  
  13434.  
  13435.  
  13436.  
  13437.         Section 21.0                                                    |
  13438.  
  13439.  
  13440.                     # 42
  13441.         GROUP /LC_(ALL|COLLATE|CTYPE|NUMERIC|TIME)/
  13442.                     # 43
  13443.         GROUP /E(DOM|RANGE|OF)/
  13444.                     # 44
  13445.         GROUP /HUGE_VAL/
  13446.                     # 45
  13447.         GROUP /sig_atomic_t/
  13448.                     # 46
  13449.         GROUP /SIG(_(DFL|ERR|IGN)|ABRT|FPE|ILL|INT|SEGV|TERM)/
  13450.                     # 47
  13451.         GROUP /FILE/
  13452.                     # 48
  13453.         GROUP /_IO[FLN]BF/
  13454.                     # 49
  13455.         GROUP /BUFSIZ/
  13456.                     # 50
  13457.         GROUP /L_tmpnam/
  13458.                     # 51
  13459.         GROUP /(OPEN|RAND|TMP|U(CHAR|INT|LONG|SHRT))_MAX/
  13460.                     # 52
  13461.         GROUP /SEEK_(CUR|END|SET)/
  13462.                     # 53
  13463.         GROUP /std(err|in|out)/
  13464.                     # 54
  13465.         GROUP /l?div_t/
  13466.                     # 55
  13467.         GROUP /CLK_TCK/
  13468.                     # 56
  13469.         GROUP /(clock|time)_t/
  13470.                     # 57
  13471.         GROUP /tm_(sec|min|hour|[mwy]day|mon|year|isdst)/
  13472.                     # 58
  13473.         GROUP /CHAR_(BIT|M(AX|IN))/
  13474.                     # 59
  13475.         GROUP /(INT|LONG|S(CHAR|HRT))_(M(IN|AX))/
  13476.                     # 60
  13477.         GROUP   /(L?DBL|FLT)_((MANT_)?DIG|EPSILON|M(AX|IN)(_(10_)?EXP)?)/
  13478.                     # 61
  13479.         GROUP /FLT_R(ADIX|OUNDS)/ {
  13480.                 printf("type/constant\n%uE - %luR: %s\n%s\n",NG,FNR,$0,$$0);
  13481.                 tc_count++;
  13482.         }
  13483.             
  13484.         FINAL {
  13485.                 printf(tls,FNR);
  13486.  
  13487.  
  13488.         QTAwk                       - 21-4 -                        QTAwk
  13489.  
  13490.  
  13491.  
  13492.  
  13493.  
  13494.  
  13495.         Section 21.0                                                    |
  13496.  
  13497.  
  13498.                 printf(tlc,mf_count);
  13499.                 printf(tlt,tc_count);
  13500.         }
  13501.  
  13502.  
  13503.  
  13504.  
  13505.  
  13506.  
  13507.  
  13508.  
  13509.  
  13510.  
  13511.  
  13512.  
  13513.  
  13514.  
  13515.  
  13516.  
  13517.  
  13518.  
  13519.  
  13520.  
  13521.  
  13522.  
  13523.  
  13524.  
  13525.  
  13526.  
  13527.  
  13528.  
  13529.  
  13530.  
  13531.  
  13532.  
  13533.  
  13534.  
  13535.  
  13536.  
  13537.  
  13538.  
  13539.  
  13540.  
  13541.  
  13542.  
  13543.  
  13544.  
  13545.  
  13546.         QTAwk                       - 21-5 -                        QTAwk
  13547.  
  13548.  
  13549.  
  13550.  
  13551.  
  13552.  
  13553.  
  13554.  
  13555.  
  13556.  
  13557.  
  13558.  
  13559.  
  13560.  
  13561.  
  13562.  
  13563.  
  13564.  
  13565.  
  13566.  
  13567.  
  13568.  
  13569.  
  13570.  
  13571.  
  13572.  
  13573.  
  13574.  
  13575.  
  13576.  
  13577.  
  13578.  
  13579.  
  13580.  
  13581.  
  13582.  
  13583.  
  13584.  
  13585.  
  13586.  
  13587.  
  13588.  
  13589.  
  13590.  
  13591.  
  13592.  
  13593.  
  13594.  
  13595.  
  13596.  
  13597.  
  13598.  
  13599.  
  13600.  
  13601.  
  13602.  
  13603.  
  13604.         QTAwk                       - 21-6 -                        QTAwk
  13605.  
  13606.  
  13607.  
  13608.  
  13609.  
  13610.  
  13611.         Section 22.0                                                    |
  13612.  
  13613.  
  13614.         22.0 Appendix v
  13615.         
  13616.          This is a complete copy of the data file, states.dta, used in to
  13617.         illustrate QTAwk.  The fields of the first record for the default
  13618.         field  separator  FS  =  /{_z}+/  is  shown below followed by the
  13619.         fields for  the  record  separator  FS  =  /{_w}+[\#()]({_w}+|$)/
  13620.         
  13621.         
  13622.          Fields for Default FS = /{_z}+/
  13623.         1.  US -- country/continent name
  13624.         2.  # -- separator
  13625.         3.  47750 -- area, square miles
  13626.         4.  # -- separator
  13627.         5.  4515 -- population in thousands
  13628.         6.  # -- separator
  13629.         7.  LA -- abbreviation (US & Canada only)
  13630.         8.  # -- separator
  13631.         9.  Baton -- first half capital city name
  13632.         10.  Rouge -- second half capital city name
  13633.         11.  ( -- separator
  13634.         12.  Louisiana -- state/country name
  13635.         13.  ) -- Terminator
  13636.         
  13637.          Fields for FS = /{_w}+[\#()]({_w}+|$)/:
  13638.         1.  US -- country/continent name
  13639.         2.  47750 -- area, square miles
  13640.         3.  4515 -- population in thousands
  13641.         4.  LA -- abbreviation (US & Canada only)
  13642.         5.  Baton Rouge -- full capital city name
  13643.         6.  Louisiana -- state/country name
  13644.         
  13645.         US # 10461 # 4375 # MD # Annapolis ( Maryland )
  13646.         US # 40763 # 5630 # VA # Richmond ( Virginia )
  13647.         US # 2045 # 620 # DE # Dover ( Delaware )
  13648.         US # 24236 # 1995 # WV # Charleston ( West Virginia )
  13649.         US # 46047 # 12025 # PA # Harrisburg ( Pennsylvania )
  13650.         US # 7787 # 7555 # NJ # Trenton ( New Jersey )
  13651.         US # 52737 # 17895 # NY # Albany ( New York )
  13652.         US # 9614 # 535 # VT # Montpelier ( Vermont )
  13653.         US # 9278 # 975 # NH # Concord ( New Hampshire )
  13654.         US # 33265 # 1165 # ME # Augusta ( Maine )
  13655.         US # 8286 # 5820 # MA # Boston ( Massachusetts )
  13656.         US # 5019 # 3160 # CT # Hartford ( Connecticut )
  13657.         US # 1212 # 975 # RI # Providence ( Rhode Island )
  13658.         US # 52669 # 6180 # NC # Raleigh ( North Carolina )
  13659.         US # 31116 # 3325 # SC # Columbia ( South Carolina )
  13660.  
  13661.  
  13662.         QTAwk                       - 22-1 -                        QTAwk
  13663.  
  13664.  
  13665.  
  13666.  
  13667.  
  13668.  
  13669.         Section 22.0                                                    |
  13670.  
  13671.  
  13672.         US # 58914 # 5820 # GA # Atlanta ( Georgia )
  13673.         US # 51704 # 4015 # AL # Montgomery ( Alabama )
  13674.         US # 42143 # 4755 # TN # Nashville ( Tennessee )
  13675.         US # 40414 # 3780 # KY # Frankfort ( Kentucky )
  13676.         US # 58668 # 10925 # FL # Tallahassee ( Florida )
  13677.         US # 68139 # 4395 # WA # Olympia ( Washington )
  13678.         US # 412582 # 8985 # OR # Salem ( Oregon )
  13679.         US # 147045 # 830 # MT # Helena ( Montana )
  13680.         US # 83566 # 1020 # ID # Boise ( Idaho )
  13681.         US # 110562 # 945 # NV # Carson City ( Nevada )
  13682.         US # 84902 # 1690 # UT # Salt Lake City ( Utah )
  13683.         US # 97808 # 525 # WY # Cheyenne ( Wyoming )
  13684.         US # 104094 # 3210 # CO # Denver ( Colorado )
  13685.         US # 158704 # 25620 # CA # Sacramento ( California )
  13686.         US # 121594 # 1425 # NM # Sante Fe ( New Mexico )
  13687.         US # 114002 # 3040 # AZ # Phoenix ( Arizona )
  13688.         US # 70702 # 690 # ND # Bismark ( North Dakota )
  13689.         US # 77120 # 715 # SD # Pierre ( South Dakota )
  13690.         US # 77350 # 1615 # NE # Lincoln ( Nebraska )
  13691.         US # 82282 # 2450 # KS # Topeka ( Kansas )
  13692.         US # 69697 # 5040 # MO # Jefferson City ( Missouri )
  13693.         US # 69957 # 3375 # OK # Oklahoma City ( Oklahoma )
  13694.         US # 266805 # 16090 # TX # Austin ( Texas )
  13695.         US # 86614 # 4205 # MN # St Paul ( Minnesota )
  13696.         US # 56275 # 2970 # IA # Des Moines ( Iowa )
  13697.         US # 53191 # 2375 # AR # Little Rock ( Arkansas )
  13698.         US # 47750 # 4515 # LA # Baton Rouge ( Louisiana )
  13699.         US # 47691 # 2640 # MS # Jackson ( Mississippi )
  13700.         US # 57872 # 11620 # IL # Springfield ( Illinois )
  13701.         US # 66213 # 4800 # WI # Madison ( Wisconsin )
  13702.         US # 97107 # 9090 # MI # Lansing ( Michigan )
  13703.         US # 36417 # 5585 # IN # Indianapolis ( Indiana )
  13704.         US # 44786 # 10760 # OH # Columbus ( Ohio )
  13705.         US # 591004 # 515 # AK # Juneau ( Alaska )
  13706.         US # 6473 # 1045 # HI # Honolulu ( Hawaii )
  13707.         Canada # 255285 # 2370 # AB # Edmonton ( Alberta )
  13708.         Canada  #  366255  #  2885  #  BC # Victoria ( British Columbia )
  13709.         Canada # 251000 # 1060 # MB # Winnipeg ( Manitoba )
  13710.         Canada # 251700 # 1010 # SK # Regina ( Saskatchewan )
  13711.         Canada # 21425 # 875 # NS # Halifax ( Nova Scotia )
  13712.         Canada # 594860 # 6585 # PQ # Quebec ( Quebec )
  13713.         Canada # 2184 # 126 # PE # Charlottetown ( Prince Edward Island )
  13714.         Canada # 156185 # 585 # NF # St John's ( New Foundland )
  13715.         Canada # 28354 # 715 # NB # Fredericton ( New Brunswick )
  13716.         Canada # 412582 # 8985 # ON # Toronto ( Ontario )
  13717.         Canada  # 1304903 # 51 # NW # Yellowknife ( Northwest Territories
  13718.  
  13719.  
  13720.         QTAwk                       - 22-2 -                        QTAwk
  13721.  
  13722.  
  13723.  
  13724.  
  13725.  
  13726.  
  13727.         Section 22.0                                                    |
  13728.  
  13729.  
  13730.             )
  13731.         Canada # 186300 # 23 # YU # Whitehorse ( Yukon Territory )
  13732.         Europe # 92100 # 14030 # Bonn ( West Germany )
  13733.         Europe # 211208 # 55020 # Paris ( France )
  13734.         Europe # 94092 # 56040 # London ( United Kingdom )
  13735.         Europe # 27136 # 3595 # Dublin ( Ireland )
  13736.         Europe # 194882 # 38515 # Madrid ( Spain )
  13737.         Europe # 116319 # 56940 # Rome ( Italy )
  13738.         Europe # 8600383 # 275590 # Moscow ( Russia )
  13739.         Europe # 120728 # 37055 # Warsaw ( Poland )
  13740.         Europe # 32377 # 7580 # Vienna ( Austria )
  13741.         Europe # 35921 # 10675 # Budapest ( Hungary )
  13742.         
  13743.          Many times data such as that above is provided in  tabular  form
  13744.         for  so that the user can more easily identify the column of data
  13745.         desired.  The data is presented below in such  a  tabular  form. 
  13746.         Defining the variable FIELDWIDTHS as:
  13747.         
  13748.          FIELDWIDTHS = 8 25 6 15 9 10
  13749.         
  13750.          would  parse  each  line  of  the table as: (for the first line)
  13751.         $1 = US
  13752.         $2 = Maryland
  13753.         $3 = MD
  13754.         $4 = Annapolis
  13755.         $5 = 10461
  13756.         $6 = 4375
  13757.         
  13758.         Country State                    State Capital        Area     Population
  13759.         US      Maryland                 MD    Annapolis      10461    4375      
  13760.         US      Virginia                 VA    Richmond       40763    5630      
  13761.         US      Delaware                 DE    Dover          2045     620       
  13762.         US      West Virginia            WV    Charleston     24236    1995      
  13763.         US      Pennsylvania             PA    Harrisburg     46047    12025     
  13764.         US      New Jersey               NJ    Trenton        7787     7555      
  13765.         US      New York                 NY    Albany         52737    17895     
  13766.         US      Vermont                  VT    Montpelier     9614     535       
  13767.         US      New Hampshire            NH    Concord        9278     975       
  13768.         US      Maine                    ME    Augusta        33265    1165      
  13769.         US      Massachusetts            MA    Boston         8286     5820      
  13770.         US      Connecticut              CT    Hartford       5019     3160      
  13771.         US      Rhode Island             RI    Providence     1212     975       
  13772.         US      North Carolina           NC    Raleigh        52669    6180      
  13773.         US      South Carolina           SC    Columbia       31116    3325      
  13774.         US      Georgia                  GA    Atlanta        58914    5820      
  13775.         US      Alabama                  AL    Montgomery     51704    4015      
  13776.  
  13777.  
  13778.         QTAwk                       - 22-3 -                        QTAwk
  13779.  
  13780.  
  13781.  
  13782.  
  13783.  
  13784.  
  13785.         Section 22.0                                                    |
  13786.  
  13787.  
  13788.         US      Tennessee                TN    Nashville      42143    4755      
  13789.         US      Kentucky                 KY    Frankfort      40414    3780      
  13790.         US      Florida                  FL    Tallahassee    58668    10925     
  13791.         US      Washington               WA    Olympia        68139    4395      
  13792.         US      Oregon                   OR    Salem          412582   8985      
  13793.         US      Montana                  MT    Helena         147045   830       
  13794.         US      Idaho                    ID    Boise          83566    1020      
  13795.         US      Nevada                   NV    Carson City    110562   945       
  13796.         US      Utah                     UT    Salt Lake City 84902    1690      
  13797.         US      Wyoming                  WY    Cheyenne       97808    525       
  13798.         US      Colorado                 CO    Denver         104094   3210      
  13799.         US      California               CA    Sacramento     158704   25620     
  13800.         US      New Mexico               NM    Sante Fe       121594   1425      
  13801.         US      Arizona                  AZ    Phoenix        114002   3040      
  13802.         US      North Dakota             ND    Bismark        70702    690       
  13803.         US      South Dakota             SD    Pierre         77120    715       
  13804.         US      Nebraska                 NE    Lincoln        77350    1615      
  13805.         US      Kansas                   KS    Topeka         82282    2450      
  13806.         US      Missouri                 MO    Jefferson City 69697    5040      
  13807.         US      Oklahoma                 OK    Oklahoma City  69957    3375      
  13808.         US      Texas                    TX    Austin         266805   16090     
  13809.         US      Minnesota                MN    St Paul        86614    4205      
  13810.         US      Iowa                     IA    Des Moines     56275    2970      
  13811.         US      Arkansas                 AR    Little Rock    53191    2375      
  13812.         US      Louisiana                LA    Baton Rouge    47750    4515      
  13813.         US      Mississippi              MS    Jackson        47691    2640      
  13814.         US      Illinois                 IL    Springfield    57872    11620     
  13815.         US      Wisconsin                WI    Madison        66213    4800      
  13816.         US      Michigan                 MI    Lansing        97107    9090      
  13817.         US      Indiana                  IN    Indianapolis   36417    5585      
  13818.         US      Ohio                     OH    Columbus       44786    10760     
  13819.         US      Alaska                   AK    Juneau         591004   515       
  13820.         US      Hawaii                   HI    Honolulu       6473     1045      
  13821.         Canada  Alberta                  AB    Edmonton       255285   2370      
  13822.         Canada  British Columbia         BC    Victoria       366255   2885      
  13823.         Canada  Manitoba                 MB    Winnipeg       251000   1060      
  13824.         Canada  Saskatchewan             SK    Regina         251700   1010      
  13825.         Canada  Nova Scotia              NS    Halifax        21425    875       
  13826.         Canada  Quebec                   PQ    Quebec         594860   6585      
  13827.         Canada  Prince Edward Island     PE    Charlottetown  2184     126       
  13828.         Canada  New Foundland            NF    St John's      156185   585       
  13829.         Canada  New Brunswick            NB    Fredericton    28354    715       
  13830.         Canada  Ontario                  ON    Toronto        412582   8985      
  13831.         Canada  Northwest Territories    NW    Yellowknife    1304903  51        
  13832.         Canada  Yukon Territory          YU    Whitehorse     186300   23        
  13833.         Europe  West Germany                   Bonn           92100    14030     
  13834.  
  13835.  
  13836.         QTAwk                       - 22-4 -                        QTAwk
  13837.  
  13838.  
  13839.  
  13840.  
  13841.  
  13842.  
  13843.         Section 22.0                                                    |
  13844.  
  13845.  
  13846.         Europe  France                         Paris          211208   55020     
  13847.         Europe  United Kingdom                 London         94092    56040     
  13848.         Europe  Ireland                        Dublin         27136    3595      
  13849.         Europe  Spain                          Madrid         194882   38515     
  13850.         Europe  Italy                          Rome           116319   56940     
  13851.         Europe  Russia                         Moscow         8600383  275590    
  13852.         Europe  Poland                         Warsaw         120728   37055     
  13853.         Europe  Austria                        Vienna         32377    7580      
  13854.         Europe  Hungary                        Budapest       35921    10675     
  13855.         
  13856.          For such tabular data, using fixed width  fields  is  often  the
  13857.         easiest  method of splitting the record into the desired fields. 
  13858.         This is especially true when some  fields  of  some  records  are
  13859.         missing as for the european countries. 
  13860.  
  13861.  
  13862.  
  13863.  
  13864.  
  13865.  
  13866.  
  13867.  
  13868.  
  13869.  
  13870.  
  13871.  
  13872.  
  13873.  
  13874.  
  13875.  
  13876.  
  13877.  
  13878.  
  13879.  
  13880.  
  13881.  
  13882.  
  13883.  
  13884.  
  13885.  
  13886.  
  13887.  
  13888.  
  13889.  
  13890.  
  13891.  
  13892.  
  13893.  
  13894.         QTAwk                       - 22-5 -                        QTAwk
  13895.  
  13896.  
  13897.  
  13898.  
  13899.  
  13900.  
  13901.  
  13902.  
  13903.  
  13904.  
  13905.  
  13906.  
  13907.  
  13908.  
  13909.  
  13910.  
  13911.  
  13912.  
  13913.  
  13914.  
  13915.  
  13916.  
  13917.  
  13918.  
  13919.  
  13920.  
  13921.  
  13922.  
  13923.  
  13924.  
  13925.  
  13926.  
  13927.  
  13928.  
  13929.  
  13930.  
  13931.  
  13932.  
  13933.  
  13934.  
  13935.  
  13936.  
  13937.  
  13938.  
  13939.  
  13940.  
  13941.  
  13942.  
  13943.  
  13944.  
  13945.  
  13946.  
  13947.  
  13948.  
  13949.  
  13950.  
  13951.  
  13952.         QTAwk                       - 22-6 -                        QTAwk
  13953.  
  13954.  
  13955.  
  13956.  
  13957.  
  13958.  
  13959.         Section 23.0                                                    |
  13960.  
  13961.  
  13962.         23.0 Appendix vi
  13963.         
  13964.          The  Pre-Defined  variables are listed in the tables below.  The
  13965.         first table lists  the  variables  in  the  order  of  increasing
  13966.         integer  used  for  access  to the variable via the 'pd_sym(i,j)'
  13967.         function.  The first column of each table lists the value  passed
  13968.         in  'i'  to  access  the  variable.   The second column lists the
  13969.         string value returned as the value  of  'j'.   The  second  table
  13970.         lists the variables in alphabetical order. 
  13971.         
  13972.               Table 1                      Table 2                       
  13973.         i     j                      i     j                             
  13974.         1  <> RLENGTH                23 <> _arg_chk                      
  13975.         2  <> CLENGTH                24 <> ARGC                          
  13976.         3  <> MLENGTH                25 <> ARGI                          
  13977.         4  <> RSTART                 26 <> ARGV                          
  13978.         5  <> CSTART                 2  <> CLENGTH                       
  13979.         6  <> MSTART                 50 <> CONVFMT                       
  13980.         7  <> FALSE                  5  <> CSTART                        
  13981.         8  <> FILENAME               29 <> CYCLE_COUNT                   
  13982.         9  <> FNR                    22 <> DEGREES                       
  13983.         10 <> FS                     56 <> DELAY_INPUT_PARSE             
  13984.         11 <> LONGEST_EXP            32 <> ECHO_INPUT                    
  13985.         12 <> NF                     31 <> ENVIRON                       
  13986.         13 <> NR                     7  <> FALSE                         
  13987.         14 <> OFMT                   54 <> FIELDFILL                     
  13988.         15 <> OFS                    53 <> FIELDWIDTHS                   
  13989.         16 <> ORS                    48 <> FILEADATE                     
  13990.         17 <> RETAIN_FS              49 <> FILEATIME                     
  13991.         18 <> RS                     45 <> FILEATTR                      
  13992.         19 <> TRANS_FROM             46 <> FILECDATE                     
  13993.         20 <> TRANS_TO               47 <> FILECTIME                     
  13994.         21 <> TRUE                   41 <> FILEDATE                      
  13995.         22 <> DEGREES                8  <> FILENAME                      
  13996.         23 <> _arg_chk               44 <> FILEPATH                      
  13997.         24 <> ARGC                   43 <> FILESIZE                      
  13998.         25 <> ARGI                   42 <> FILETIME                      
  13999.         26 <> ARGV                   38 <> FILE_SEARCH                   
  14000.         27 <> TRACE                  39 <> FILE_SEARCH_PAT               
  14001.         28 <> NG                     35 <> FILE_SORT                     
  14002.         29 <> CYCLE_COUNT            9  <> FNR                           
  14003.         30 <> MAX_CYCLE              10 <> FS                            
  14004.         31 <> ENVIRON                34 <> Gregorian                     
  14005.         32 <> ECHO_INPUT             55 <> IGNORECASE                    
  14006.         33 <> QTAwk_Path             11 <> LONGEST_EXP                   
  14007.         34 <> Gregorian              37 <> MATCH_INDEX                   
  14008.  
  14009.  
  14010.         QTAwk                       - 23-1 -                        QTAwk
  14011.  
  14012.  
  14013.  
  14014.  
  14015.  
  14016.  
  14017.         Section 23.0                                                    |
  14018.  
  14019.  
  14020.         35 <> FILE_SORT              30 <> MAX_CYCLE                     
  14021.         36 <> SUBSEP                 3  <> MLENGTH                       
  14022.         37 <> MATCH_INDEX            6  <> MSTART                        
  14023.         38 <> FILE_SEARCH            12 <> NF                            
  14024.         39 <> FILE_SEARCH_PAT        28 <> NG                            
  14025.         40 <> SPAN_RECORDS           13 <> NR                            
  14026.         41 <> FILEDATE               14 <> OFMT                          
  14027.         42 <> FILETIME               15 <> OFS                           
  14028.         43 <> FILESIZE               16 <> ORS                           
  14029.         44 <> FILEPATH               33 <> QTAwk_Path                    
  14030.         45 <> FILEATTR               52 <> RECLEN                        
  14031.         46 <> FILECDATE              17 <> RETAIN_FS                     
  14032.         47 <> FILECTIME              1  <> RLENGTH                       
  14033.         48 <> FILEADATE              18 <> RS                            
  14034.         49 <> FILEATIME              4  <> RSTART                        
  14035.         50 <> CONVFMT                51 <> RT                            
  14036.         51 <> RT                     40 <> SPAN_RECORDS                  
  14037.         52 <> RECLEN                 36 <> SUBSEP                        
  14038.         53 <> FIELDWIDTHS            27 <> TRACE                         
  14039.         54 <> FIELDFILL              19 <> TRANS_FROM                    
  14040.         55 <> IGNORECASE             20 <> TRANS_TO                      
  14041.         56 <> DELAY_INPUT_PARSE      21 <> TRUE                          
  14042.  
  14043.  
  14044.  
  14045.  
  14046.  
  14047.  
  14048.  
  14049.  
  14050.  
  14051.  
  14052.  
  14053.  
  14054.  
  14055.  
  14056.  
  14057.  
  14058.  
  14059.  
  14060.  
  14061.  
  14062.  
  14063.  
  14064.  
  14065.  
  14066.  
  14067.  
  14068.         QTAwk                       - 23-2 -                        QTAwk
  14069.  
  14070.  
  14071.  
  14072.  
  14073.  
  14074.  
  14075.         Section 24.0                                                    |
  14076.  
  14077.  
  14078.         24.0 Appendix vii
  14079.         
  14080.          This  appendix  lists  the  utilitys  included  with  the  QTAwk
  14081.         package.  Each  utility  includes  a  short  description  of  its
  14082.         purpose  and  the  aspects  of QTAwk which may be best learned by
  14083.         examining the utility. 
  14084.         
  14085.         crv.dat
  14086.             input data for curvefit.exp utility. 
  14087.             
  14088.         setstd.dat
  14089.             input data for calcrp.exp utility. 
  14090.             
  14091.         addcomma.exp
  14092.             function  to  put  commas  in  numbers  passed  as   function
  14093.             argument.   Number with commas returned as a string.  Adapted
  14094.             from Awk, page 72.  Changes allow  the  calling  fumction  to
  14095.             specify the format for converting floating point numbers to a
  14096.             string instead of defaulting to the use of OFMT.  Illustrates
  14097.             recursion   and   the   use  of  'local'  variables,  regular
  14098.             expressions  and  the  'sub'  function  versus   the   'gsub'
  14099.             function. 
  14100.             
  14101.         alarm.exp
  14102.             utility   to   set   resident   alarm   clock  for  scheduled
  14103.             appointments.  Reads appointment file, finds appointments for
  14104.             today,  runs  program to set resident alarm clock program and
  14105.             displays appointments set.  Automatically schedules lunch and
  14106.             end  of day (close of business).  Utility takes no arguments,
  14107.             sets scan file in BEGIN action.  Illustrates the use  of  the
  14108.             'sdate'  and  'stime'  functions,  manipulation of ARGV array
  14109.             elements and ARGC to automatically set  input  file,  use  of
  14110.             'exit'  keyword  for  incorrect  invocation,  use of 'system'
  14111.             function to run other programs. 
  14112.             
  14113.         ansiclst.exp
  14114.             QTAwk program to scan C source files for keywords defined  in
  14115.             the ANSI C standard. 
  14116.             
  14117.         ansicstd.exp
  14118.             same as ansiclst.exp except uses GROUP patterns for searchs. 
  14119.             
  14120.         ansirsv.exp
  14121.             scans C source file for words defined as reserved by the ANSI
  14122.             C standard
  14123.             
  14124.  
  14125.  
  14126.         QTAwk                       - 24-1 -                        QTAwk
  14127.  
  14128.  
  14129.  
  14130.  
  14131.  
  14132.  
  14133.         Section 24.0                                                    |
  14134.  
  14135.  
  14136.         ansirsvg.exp
  14137.             same  as ansirsv.exp except uses GROUP patterns for searchs. 
  14138.             
  14139.         apptadd.exp
  14140.             
  14141.         apptdis.exp
  14142.             
  14143.         calcin.exp
  14144.             Calculator QTAwk Utility - Infix calculator.   Uses  ANSI.SYS
  14145.             to  highlight  display.  Illustrates the use of the 'execute'
  14146.             function.  The 'execute' function is used  to  execute  input
  14147.             expressions and return the result and the use of the 'ud_sym'
  14148.             function  for  displaying  user  defined  variables   without
  14149.             knowing the variables names. 
  14150.             
  14151.         calcinna.exp
  14152.             same   as   calcin.exp  without  dependence  on  ANSI.SYS  to
  14153.             highlight display. 
  14154.             
  14155.         calcrp.exp
  14156.             Calculator QTAwk Utility - Postfix calculator.  Uses ANSI.SYS
  14157.             to  highlight  display.   Illustrates  the  use  of  the  the
  14158.             "switch/case" keywords with regular expression  case  labels,
  14159.             and  string and character constants as 'case' labels, the use
  14160.             of the match  operator,  '~~',  user-defined  functions,  the
  14161.             'delete'  statement, the '#include' directive.  Uses ANSI.SYS
  14162.             to highlight display. 
  14163.             
  14164.         calcrpna.exp
  14165.             same as calcrp.exp without depdence on ANSI.SYS. 
  14166.             
  14167.         cdcl.exp
  14168.             Decipher C Declarator Syntax.  Illustrates the use  of  named
  14169.             expressions   in   regular   expressions,   the  use  of  the
  14170.             "switch/case" statements, the use of regular  expressions  as
  14171.             'case' statement labels. 
  14172.             
  14173.         cliche.exp
  14174.             generate an endless stream of cliches, adapted from Awk, page
  14175.             113.  Illustrates  use  of  'srand'  and  'rand'  functions. 
  14176.             
  14177.         compat.exp
  14178.             utility  to scan QTAwk utility checking for use of new and/or
  14179.             changed  keywords  and  built-in  functions  and  variables. 
  14180.             Illustrates  use  of  string constants spanning more than one
  14181.             line, the use of the 'split' function, the use of the  'gsub'
  14182.  
  14183.  
  14184.         QTAwk                       - 24-2 -                        QTAwk
  14185.  
  14186.  
  14187.  
  14188.  
  14189.  
  14190.  
  14191.         Section 24.0                                                    |
  14192.  
  14193.  
  14194.             function. 
  14195.             
  14196.         compress.exp
  14197.             utility  to  print input file to output compressing groups of
  14198.             blank lines to a single blank line. 
  14199.             
  14200.         curvefit.exp
  14201.             utility to find least squares best fit of input data to 1  of
  14202.             9  equations.   Illustrates  the  use  of  QTAwk as a numeric
  14203.             processor of input data, the use of the 'execute' function to
  14204.             execute  selected  equations,  GROUP  patterns,  user-defined
  14205.             functions. 
  14206.             
  14207.         dirsrch.exp
  14208.             function  to  search  directory   specified   for   filenames
  14209.             specified.   Returns  array  with path to file found and file
  14210.             sizes.  Function meant to  included  using  QTAwk  "#include"
  14211.             directive
  14212.             
  14213.         filename.exp
  14214.             simple  utility  to  split  input  lines  into  file path and
  14215.             filename  portions.   Uses  PC/MS-DOS   path   and   filename
  14216.             conventions.   Illustrates use of character classes and named
  14217.             expressions in regular expressions, use of 'sub' and 'substr'
  14218.             functions. 
  14219.             
  14220.         fin.exp
  14221.             financial  calculator  utility.   Assumes use of ANSI.SYS for
  14222.             highlighting display.  Illustrates use of 'execute' function,
  14223.             '#include"   directive,   use   of   'ud_sym'   function  and
  14224.             user-defined functions.  Extensive documentation on financial
  14225.             calculations included in utility. 
  14226.             
  14227.         finna.exp
  14228.             same  as  fin.exp  except  does  not assume use of ANSI.SYS. 
  14229.             
  14230.         fmtdoc.exp
  14231.             documanet formatter.  Recognizes formatting commands starting
  14232.             at  first character position of a record.  Illustrates use of
  14233.             'justify',  'split',   'copies',   'center'   and   'overlay'
  14234.             functions,  use  of  the  'keyboard'  file  for  input, GROUP
  14235.             patterns, and "switch/case' statements. 
  14236.             
  14237.         fmtdoc2p.exp
  14238.             same as 'fmtdoc.exp' except makes two passes over input files
  14239.             to format documents. 
  14240.  
  14241.  
  14242.         QTAwk                       - 24-3 -                        QTAwk
  14243.  
  14244.  
  14245.  
  14246.  
  14247.  
  14248.  
  14249.         Section 24.0                                                    |
  14250.  
  14251.  
  14252.         geodh.exp
  14253.             utility  to  convert  geodetic latitude, longitude to x, y, z
  14254.             position.  Illustrates use of arithmetic functions. 
  14255.             
  14256.         getdir.exp
  14257.             utility to find files matching a specified regular expression
  14258.             pattern.  Illustrates use of regular expressions and 'system'
  14259.             function.  Also illustrates the use of the 'execute' function
  14260.             to  convert  a  string  into  a regular expression to improve
  14261.             matching performance.  Assumes use  of  "4DOS"  "command.com"
  14262.             replacement.   If  "4DOS"  not used, a few statements must be
  14263.             modified to obtain correct reading of directory. 
  14264.             
  14265.         graph.exp
  14266.         histogrm.exp
  14267.         holiday.exp
  14268.         jdn.exp
  14269.         linenum.exp
  14270.         more.exp
  14271.         prdn.exp
  14272.         romn.exp
  14273.         screen.exp
  14274.         sincos.exp
  14275.         slike.exp
  14276.         soundix.exp
  14277.         soundx4.exp
  14278.         ssfuncs.exp
  14279.         state.exp
  14280.         table.exp
  14281.         toc.exp
  14282.         wordfreq.exp
  14283.  
  14284.  
  14285.  
  14286.  
  14287.  
  14288.  
  14289.  
  14290.  
  14291.  
  14292.  
  14293.  
  14294.  
  14295.  
  14296.  
  14297.  
  14298.  
  14299.  
  14300.         QTAwk                       - 24-4 -                        QTAwk
  14301.  
  14302.  
  14303.  
  14304.  
  14305.  
  14306.  
  14307.         Section 25.0                                                    |
  14308.  
  14309.  
  14310.         25.0 Appendix viii
  14311.         
  14312.          QTAwk error returns.  When QTAwk encounters an  error  which  it
  14313.         cannot correct, it generates and displays an error message in the
  14314.         format:
  14315.         
  14316.         1: Error (xxxx): Error Message Text
  14317.         2: From 'execute' Function. 
  14318.         3: Action File line: llll
  14319.         4: Scanning File: utility filename
  14320.         5: Record: rrrr
  14321.         
  14322.          Line 2 is generated only if the error occurred during  execution
  14323.         of the 'execute' function.  Lines 4 to 5 are displayed only if an
  14324.         input file is currently being scanned. 
  14325.         
  14326.          On  a  normal  exit  QTAwk  returns  a  value  of  zero,  0,  to
  14327.         PC/MS-DOS.   This value may be set with the 'exit' statement.  On
  14328.         encountering an error which generates  an  error  message,  QTAwk
  14329.         exits with a nonzero value between 1 and 6.  The warning messages
  14330.         below will exit with a value of zero.  The exit values  generated
  14331.         on detecting an error are:
  14332.         
  14333.         1.  Warning Errors ==> 0 , error value < 1000
  14334.         2.  File Errors ==> 2 , 2000 <= error value < 3000
  14335.         3.  Regular  Expression Errors ==> 3 , 3000 <= error value < 4000
  14336.         4.  Run-Time Errors ==> 4 , 4000 <= error value < 5000
  14337.         5.  Interpretation Errors ==> 5 , 5000  <=  error  value  <  6000
  14338.         6.  Memory Error ==> 6 , 6000 <= error value < 7000
  14339.         
  14340.          The 'error value' range shown in the above list, shown the range
  14341.         of the numeric value shown in the error message for that type  of
  14342.         error. 
  14343.         
  14344.          The  error  number  displayed  on line 1 may be used to find the
  14345.         error diagnostic from the following listing. 
  14346.         
  14347.         1.  Warning Errors
  14348.             0
  14349.                 Invalid Option. 
  14350.                 The only valid command line options are:
  14351.                 -- -> to stop command line option scanning
  14352.                 -f -> to specify a utility filename
  14353.                 -w -> to specify a utility filename for utility  internal
  14354.                     form
  14355.                 -F  ->  to  specify  the  input  record field separator. 
  14356.  
  14357.  
  14358.         QTAwk                       - 25-1 -                        QTAwk
  14359.  
  14360.  
  14361.  
  14362.  
  14363.  
  14364.  
  14365.         Section 25.0                                                    |
  14366.  
  14367.  
  14368.             10
  14369.                 Warning, Attempt To Close File Not Open. 
  14370.                 An attempt has been made to close a file with the 'close'
  14371.                 function, that is not currently open. 
  14372.             
  14373.         2.  File Errors
  14374.             2000
  14375.                 File Not Found: {filename}
  14376.                 The  filename  given  in  the  error  message,  was  been
  14377.                 specified on the command line.  The file named  does  not
  14378.                 exist.   QTAwk displays this error message and terminates
  14379.                 processing. 
  14380.                 
  14381.             2030
  14382.                 Only One Internal Form Utility File Allowed
  14383.                 When  specifying  utility  files,  only  one  utility  in
  14384.                 internal  form  may  be specified.  In addition, internal
  14385.                 form utility files may not be mixed  with  ASCII  utility
  14386.                 files. 
  14387.             
  14388.         3.  Regular Expression Errors
  14389.             3000
  14390.                 Stop pattern without a start
  14391.                 The range pattern has the form:
  14392.                 
  14393.                 expression , expression
  14394.                 
  14395.                  The  comma,  ',', is used to separate the expressions of
  14396.                 the pattern.  The associated action is executed when  the
  14397.                 first  or  start expression is TRUE.  Execution continues
  14398.                 for every input record until, and including,  the  second
  14399.                 or stop expression is TRUE.  A comma, ',', has been found
  14400.                 in a pattern  without  the  first  expression.   This  is
  14401.                 usually  caused  by  imbalanced  braces, "{}".  Check all
  14402.                 prior braces to ensure that every left brace, '{', has an
  14403.                 associated terminating right brace, '}'. 
  14404.                 
  14405.             3010
  14406.                 Already have a stop pattern
  14407.                 The  range  pattern has the form: expression , expression
  14408.                 The comma, ',', is used to separate  the  expressions  of
  14409.                 the  pattern.  The associated action is executed when the
  14410.                 first or start expression is TRUE.   Execution  continues
  14411.                 for  every  input record until, and including, the second
  14412.                 or stop expression is TRUE.  A  second  comma,  ',',  has
  14413.                 been  found  in  a  pattern.   This  may be caused by the
  14414.  
  14415.  
  14416.         QTAwk                       - 25-2 -                        QTAwk
  14417.  
  14418.  
  14419.  
  14420.  
  14421.  
  14422.  
  14423.         Section 25.0                                                    |
  14424.  
  14425.  
  14426.                 unbalanced braces as for  error  number  3000  above.   A
  14427.                 second cause may stem from the fact that new patterns for
  14428.                 pattern/action pairs  must  be  separated  from  previous
  14429.                 patterns  by  a  new-line if no action, i.e., the default
  14430.                 action, is associated with the previous pattern. 
  14431.             
  14432.         4.  Run-Time Errors
  14433.             4000
  14434.                 Command Line Variable Set - Not Used. 
  14435.                 Only variables defined in the QTAwk utility may be set on
  14436.                 the command line with the form "variable = value"
  14437.                 
  14438.             4010
  14439.                 Missing Opening Parenthesis On 'while'. 
  14440.                 The proper syntax for the 'while' statement is:
  14441.                 
  14442.                 while ( conditional_expression ) statement
  14443.                 
  14444.                 The  left  parenthesis,  '(',  starting  the  conditional
  14445.                 expression was not found following the 'while'  keyword. 
  14446.                 Check that the syntax conforms to the form above. 
  14447.                 
  14448.             4020
  14449.                 Missing Opening Parenthesis On 'switch'. 
  14450.                 The form of the 'switch' construct is:
  14451.                 
  14452.                 switch ( switch_expression ) statement
  14453.                 
  14454.                 The  left  parenthesis,  '(', was not found following the
  14455.                 'switch' keyword. 
  14456.                 
  14457.             4030
  14458.                 Unable to compile Regular Expression
  14459.                 QTAwk was unable  to  convert  a  regular  expression  to
  14460.                 internal  form.   Please  contact  the  QTAwk author with
  14461.                 information on the circumstances of this error  message. 
  14462.                 
  14463.             4040
  14464.                 Internal Array Error. 
  14465.                 Internal  error.   Please  contact  the QTAwk author with
  14466.                 information on the circumstances of this error  message. 
  14467.                 
  14468.             4050
  14469.                 pre/post '++' or '--' Needs a Variable. 
  14470.                 The  pre/post ++/-- operators operate on variables only. 
  14471.                 This error is usually generated because of  an  incorrect
  14472.  
  14473.  
  14474.         QTAwk                       - 25-3 -                        QTAwk
  14475.  
  14476.  
  14477.  
  14478.  
  14479.  
  14480.  
  14481.         Section 25.0                                                    |
  14482.  
  14483.  
  14484.                 understanding  of the precedence rules.  The operator was
  14485.                 associated by QTAwk when the utility line was parsed than
  14486.                 the  user  expected.   Check the precedence rules and the
  14487.                 syntax of the line cited. 
  14488.                 
  14489.             4070
  14490.                 Undefined Symbol. 
  14491.                 A symbol has been found which QTAwk does not  recognize. 
  14492.                 This  error  should  not occur and represents an internal
  14493.                 error.  Please contact the QTAwk author with  information
  14494.                 on the circumstances of this error message. 
  14495.                 
  14496.             4080
  14497.                 Internal Error #200
  14498.                 Internal  error.   Please  contact  the QTAwk author with
  14499.                 information on the circumstances of this error  message. 
  14500.                 
  14501.             4090
  14502.                 Attempt To Delete Nonexistent Array Element. 
  14503.                 The  'delete'  statement was followed with a reference to
  14504.                 an array element that does not exist. 
  14505.                 
  14506.             4095
  14507.                 Attempt  To   Delete   Array   Element   With   'deletea'
  14508.                 Statement. 
  14509.                 The  'deletea' statement is used to delete whole arrays. 
  14510.                 If it is desired to delete a single  array  element,  the
  14511.                 'delete' statement should be used. 
  14512.                 
  14513.             4100
  14514.                 Internal GROUP parse error 1001. 
  14515.                 Internal  error.   Please  contact  the QTAwk author with
  14516.                 information on the circumstances of this error  message. 
  14517.                 
  14518.             4100
  14519.                 Warning, Attempt To Close File Not Successful. 
  14520.                 An attempt has been made to close a file with the 'close'
  14521.                 function.  The close  action  has  not  been  successful,
  14522.                 usually because the file named does not exist.  Check the
  14523.                 name specified. 
  14524.                 
  14525.             4110
  14526.                 'strim' Function Result Exceeds Limits. 
  14527.                 The built-in function 'strim'  has  been  called  with  a
  14528.                 string  to  trim which exceeds the maximum limits of 4096
  14529.                 characters. 
  14530.  
  14531.  
  14532.         QTAwk                       - 25-4 -                        QTAwk
  14533.  
  14534.  
  14535.  
  14536.  
  14537.  
  14538.  
  14539.         Section 25.0                                                    |
  14540.  
  14541.  
  14542.             4120
  14543.                 Cannot Nest 'execute' Function. 
  14544.                 The  'execute'  function  cannot  be  executed   with   a
  14545.                 string/array  executed  by this function.  An attempt has
  14546.                 been made to do this.  Check the string/array  which  was
  14547.                 executed. 
  14548.                 
  14549.             4130
  14550.                 '(g)sub' Function Result Exceeds Limits. 
  14551.                 The  function  'sub' or 'gsub' has been called to replace
  14552.                 matching  strings  and   the   resultant   string   after
  14553.                 replacement  would  exceed the limit of 4096 characters. 
  14554.                 
  14555.             4140
  14556.                 Missing ')' for Function Call. 
  14557.                 A  built-in  function  has  been  called  with   a   left
  14558.                 parenthesis  starting  the  argument  list,  but no right
  14559.                 parenthesis terminating the  argument  list.   Check  the
  14560.                 line in question. 
  14561.                 
  14562.             4160
  14563.                 [sf]printf needs format string as first argument
  14564.                 The  'fprintf'  and  'sprintf'  functions  need  a format
  14565.                 string which specifies the output.  The format string  is
  14566.                 the  second  argument  and  must  be  specified for these
  14567.                 functions. 
  14568.                 
  14569.             4170
  14570.             4180
  14571.             4190
  14572.                 Format Specifications Exceed Arguments To Print. 
  14573.                 The 'printf', fprintf'  and  'sprintf'  functions  use  a
  14574.                 format  string to control the output.  Certain characters
  14575.                 strings in the format control the output of numerics  and
  14576.                 imbedded  strings.   There  must  be  exactly  one  extra
  14577.                 argument for each of these  character  control  strings. 
  14578.                 This  error  occurs  when  there are more control strings
  14579.                 than extra arguments. 
  14580.                 
  14581.             4220
  14582.                 Third Argument For '(g)sub' Function Must Be A Variable. 
  14583.                 The  optional  third  argument  of  the  'sub' and 'gsub'
  14584.                 functions must be a variable.  The string value  of  this
  14585.                 variable  is  replaced after string substitution has been
  14586.                 accomplished. 
  14587.                 
  14588.  
  14589.  
  14590.         QTAwk                       - 25-5 -                        QTAwk
  14591.  
  14592.  
  14593.  
  14594.  
  14595.  
  14596.  
  14597.         Section 25.0                                                    |
  14598.  
  14599.  
  14600.             4222
  14601.                 First  Argument  For  'findfile'  Function  Must   Be   A
  14602.                 Variable. 
  14603.                 Findfile returns the results of a directory search in the
  14604.                 variable specified as the first argument of the  findfile
  14605.                 function  call.   Thus,  this  argument must a variable. 
  14606.                 
  14607.             4223
  14608.                 'findfile' Function: Cannot Assign Array To Scalar
  14609.                 Findfile returns the results of a directory search in the
  14610.                 variable  specified as the first argument of the findfile
  14611.                 function call.  Since the result returned is an array and
  14612.                 an  array  cannot  be  assigned to the element of another
  14613.                 array, the first argument cannot be  an  array  element. 
  14614.                 
  14615.             4230
  14616.                 Excessive Length Specified 'substr' Function. 
  14617.                 The  form  of the 'substr' function is: substr(s,p[,n]). 
  14618.                 The third argument is optional, but if  specified  cannot
  14619.                 exceed 4096. 
  14620.                 
  14621.             4240
  14622.                 Start  Position  Specified Too Great, 'substr' Function. 
  14623.                 The form of the 'substr' function  is:  substr(s,p[,n]). 
  14624.                 The second argument cannot exceed 4096. 
  14625.                 
  14626.             4270
  14627.                 'rotate' Function Needs Array Member As Argument. 
  14628.                 The argument for the 'rotate' function must be an array. 
  14629.                 If a variable is used, make sure that it is an array when
  14630.                 the function is called. 
  14631.                 
  14632.             4280
  14633.                 Excessive Width Specified 'center' Function. 
  14634.                 The  second  argument  specifies the width of the line in
  14635.                 which to center the string value of the first  argument. 
  14636.                 The width specified cannot exceed 4096. 
  14637.                 
  14638.             4290
  14639.                 Excessive Copies Specified 'copies' Function. 
  14640.                 The  second  argument  of the 'copies' function specifies
  14641.                 the number of copies of the string  value  of  the  first
  14642.                 argument  to  return.   The  number  of  copies specified
  14643.                 cannot exceed 65,536.  See error number 4300 below also. 
  14644.                 
  14645.             4300
  14646.  
  14647.  
  14648.         QTAwk                       - 25-6 -                        QTAwk
  14649.  
  14650.  
  14651.  
  14652.  
  14653.  
  14654.  
  14655.         Section 25.0                                                    |
  14656.  
  14657.  
  14658.                 'copies' Function Return Exceeds Limits. 
  14659.                 The  'copies'  function  returns  the string value of the
  14660.                 first argument, copied the number of times  specified  by
  14661.                 the  second  argument.   The total length of the returned
  14662.                 string:
  14663.                 
  14664.                 arg2 * length(arg1)
  14665.                 
  14666.                 cannot exceed 4096 characters. 
  14667.                 
  14668.             4310
  14669.                 Excessive  Characters  Specified   'deletec'   Function. 
  14670.                 The  'deletec'  function deletes the number of characters
  14671.                 specified by the third argument starting at the  position
  14672.                 specified by the second argument from the string value of
  14673.                 the first argument.  The form of the function is:
  14674.                 
  14675.                 deletec(string,start,num)
  14676.                 
  14677.                 The number of  characters  specified  to  delete,  'num',
  14678.                 cannot  exceed  65,536.   If 'num' is zero or exceeds the
  14679.                 number of characters remaining in  the  string  from  the
  14680.                 start  position,  then  the  remainder  of  the string is
  14681.                 deleted.  See also error 4320 below. 
  14682.                 
  14683.             4320
  14684.                 Excessive  Characters  Specified   'deletec'   Function. 
  14685.                 The  'deletec'  function deletes the number of characters
  14686.                 specified by the third argument starting at the  position
  14687.                 specified by the second argument from the string value of
  14688.                 the first argument.  The form of the function is:
  14689.                 
  14690.                 deletec(string,start,num)
  14691.                 
  14692.                 The start is negative or greater than the length  of  the
  14693.                 string  value  of  the first argument, then no characters
  14694.                 are deleted. 
  14695.                 
  14696.             4330
  14697.                 'deletec' Intermediate Result Exceeds Limits. 
  14698.                 The 'deletec' function deletes the number  of  characters
  14699.                 specified  by the third argument starting at the position
  14700.                 specified by the second argument from the string value of
  14701.                 the first argument.  The form of the function is:
  14702.                 
  14703.                 deletec(string,start,num)
  14704.  
  14705.  
  14706.         QTAwk                       - 25-7 -                        QTAwk
  14707.  
  14708.  
  14709.  
  14710.  
  14711.  
  14712.  
  14713.         Section 25.0                                                    |
  14714.  
  14715.  
  14716.                 If  the  length of the string value of the first argument
  14717.                 exceeds 4096 then this error is triggered. 
  14718.                 
  14719.             4340
  14720.                 Start Position Specified Too Great,  'insert'  Function. 
  14721.                 The  'insert'  function  inserts  the string value of the
  14722.                 second argument  into  the  string  value  of  the  first
  14723.                 argument, starting at the position specified by the third
  14724.                 argument.  The form of the function is:
  14725.                 
  14726.                 insert(string1,string2,start)
  14727.                 
  14728.                 The  third  argument  cannot  exceed  65,536.   If  start
  14729.                 exceeds the length of the string value of 'string1', then
  14730.                 the string value of 'string2' is  concatenated  onto  the
  14731.                 string value of 'string1'
  14732.                 
  14733.             4350
  14734.                 'insert'  Function  Intermediate  Result Exceeds Limits. 
  14735.                 The 'insert' function inserts the  string  value  of  the
  14736.                 second  argument  into  the  string  value  of  the first
  14737.                 argument, starting at the position specified by the third
  14738.                 argument.  The form of the function is:
  14739.                 
  14740.                 insert(string1,string2,start)
  14741.                 
  14742.                 The  length of the string value value of 'string1' cannot
  14743.                 exceed 4096 in length.  The result  of  insert  'string2'
  14744.                 into 'string1' cannot exceed 4096 also.  See error number
  14745.                 4360 below. 
  14746.                 
  14747.             4360
  14748.                 'insert' Function Return Exceeds Limits. 
  14749.                 The 'insert' function inserts the  string  value  of  the
  14750.                 second  argument  into  the  string  value  of  the first
  14751.                 argument, starting at the position specified by the third
  14752.                 argument.  The form of the function is:
  14753.                 
  14754.                 insert(string1,string2,start)
  14755.                 
  14756.                 The  length of the string value value of 'string1' cannot
  14757.                 exceed 4096 in length.  The result  of  insert  'string2'
  14758.                 into 'string1' cannot exceed 4096 also.  See error number
  14759.                 4350 above. 
  14760.                 
  14761.             4370
  14762.  
  14763.  
  14764.         QTAwk                       - 25-8 -                        QTAwk
  14765.  
  14766.  
  14767.  
  14768.  
  14769.  
  14770.  
  14771.         Section 25.0                                                    |
  14772.  
  14773.  
  14774.                 Start Position Specified Too Great, 'overlay'  Function. 
  14775.                 The  'overlay'  function overlays the string value of the
  14776.                 second argument  into  the  string  value  of  the  first
  14777.                 argument, starting at the position specified by the third
  14778.                 argument.  The form of the function is:
  14779.                 
  14780.                 overlay(string1,string2,start)
  14781.                 
  14782.                 The  third  argument  cannot  exceed  65,536.   If  start
  14783.                 exceeds the length of the string value of 'string1', then
  14784.                 blanks are appended to 'string1' to create  a  string  of
  14785.                 length  'start'.   The second string is then concatenated
  14786.                 to this string.  See also error numbers 4380,  4390,  and
  14787.                 4400 below. 
  14788.                 
  14789.             4380
  14790.                 'overlay' Function Result Exceeds Limits. 
  14791.                 The  'overlay'  function overlays the string value of the
  14792.                 second argument  into  the  string  value  of  the  first
  14793.                 argument, starting at the position specified by the third
  14794.                 argument.  The form of the function is:
  14795.                 
  14796.                 overlay(string1,string2,start)
  14797.                 
  14798.                 The third argument cannot exceed 4096.  If start  exceeds
  14799.                 the  length of the string value of 'string1', then blanks
  14800.                 are appended to 'string1' to create a  string  of  length
  14801.                 'start'.   The second string is then concatenated to this
  14802.                 string.  See also error number 4370 above  and  4390  and
  14803.                 4400 below. 
  14804.                 
  14805.             4390
  14806.                 'overlay'  Function  Intermediate Result Exceeds Limits. 
  14807.                 The 'overlay' function overlays the string value  of  the
  14808.                 second  argument  into  the  string  value  of  the first
  14809.                 argument, starting at the position specified by the third
  14810.                 argument.  The form of the function is:
  14811.                 
  14812.                 overlay(string1,string2,start)
  14813.                 
  14814.                 The  length  of  the  string  value  of  'string1' cannot
  14815.                 exceed 4096 characters.  See also error number  4370  and
  14816.                 4380 above and 4400 below. 
  14817.                 
  14818.             4400
  14819.                 'overlay' Function Result Exceeds Limits. 
  14820.  
  14821.  
  14822.         QTAwk                       - 25-9 -                        QTAwk
  14823.  
  14824.  
  14825.  
  14826.  
  14827.  
  14828.  
  14829.         Section 25.0                                                    |
  14830.  
  14831.  
  14832.                 The  'overlay'  function overlays the string value of the
  14833.                 second argument  into  the  string  value  of  the  first
  14834.                 argument, starting at the position specified by the third
  14835.                 argument.  The form of the function is:
  14836.                 
  14837.                 overlay(string1,string2,start)
  14838.                 
  14839.                 The length  of  the  resultant  string  after  overlaying
  14840.                 'string2'  onto  'string1'  cannot exceed 4096.  See also
  14841.                 error numbers 4370, 4380, and 4390 above. 
  14842.                 
  14843.             4410
  14844.                 'remove' Function Intermediate  Result  Exceeds  Limits. 
  14845.                 The 'remove' function removes all characters specified by
  14846.                 the second argument from the string value  of  the  first
  14847.                 argument.  The form of the function is:
  14848.                 
  14849.                 remove(string,char)
  14850.                 
  14851.                 The  length  of 'string' before any character are removed
  14852.                 cannot exceed 4096. 
  14853.                 
  14854.             4420
  14855.                 Excessive Width Specified 'justify' Function. 
  14856.                 The 'justify' function forms a string from  the  elements
  14857.                 of the array specified by the first argument.  The string
  14858.                 will have a length specified by the integer value of  the
  14859.                 third  argument  and  will  be  formed from the number of
  14860.                 array elements specified by  the  second  argument.   Any
  14861.                 padding  characters  necessary between array elements can
  14862.                 be specified by the optional fourth argument.   The  form
  14863.                 of the function is:
  14864.                 
  14865.                 justify(array_var,count,width [,pad_char] );
  14866.                 
  14867.                 The  width  specified  cannot  exceed  65,536.   See also
  14868.                 error number 4430 below. 
  14869.                 
  14870.             4430
  14871.                 Excessive Number Of Array  Elements  Specified  'justify'
  14872.                 Function. 
  14873.                 The  'justify'  function forms a string from the elements
  14874.                 of the array specified by the first argument.  The string
  14875.                 will  have a length specified by the integer value of the
  14876.                 third argument and will be  formed  from  the  number  of
  14877.                 array  elements  specified  by  the second argument.  Any
  14878.  
  14879.  
  14880.         QTAwk                       - 25-10 -                       QTAwk
  14881.  
  14882.  
  14883.  
  14884.  
  14885.  
  14886.  
  14887.         Section 25.0                                                    |
  14888.  
  14889.  
  14890.                 padding characters necessary between array  elements  can
  14891.                 be  specified  by the optional fourth argument.  The form
  14892.                 of the function is:
  14893.                 
  14894.                 justify(array_var,count,width [,pad_char] );
  14895.                 
  14896.                 The  count  of  array  elements  to  use  cannot   exceed
  14897.                 65,536.  See also error number 4420 above. 
  14898.                 
  14899.             4440
  14900.                 Bad Function Call - Internal Error. 
  14901.                 An  internal  error  has  occurred  in calling a built-in
  14902.                 function.   Please  contact   the   QTAwk   author   with
  14903.                 information on the circumstances of this error. 
  14904.                 
  14905.             4450
  14906.                 Missing ')' for Function Call. 
  14907.                 A  user-defined function has been called with an argument
  14908.                 list and  no  right  parenthesis,  ')',  terminating  the
  14909.                 argument list. 
  14910.                 
  14911.             4460
  14912.                 More  Arguments  For  Function  Than  Defined.  Function:
  14913.                 {User_Function_Name}. 
  14914.                 More argument are passed to  the  user  defined  function
  14915.                 named  in  the  error  message  than were defined for the
  14916.                 function.  Check the user function name or the definition
  14917.                 of the function for necessary extra arguments. 
  14918.                 
  14919.             4470
  14920.                 Less Arguments For User Function Than Defined.  Function:
  14921.                 '{User_Function_Name}'. 
  14922.                 Less arguments are passed to the  user  defined  function
  14923.                 named  in  the  error  message  than were defined for the
  14924.                 function.  This error message is generated  ONLY  if  the
  14925.                 built-in variable '_arg_chk' has a TRUE value.  Variables
  14926.                 local to a user-defined function should be  defined  with
  14927.                 the 'local' keyword. 
  14928.                 
  14929.             4480
  14930.                 Constant Passed For Function Array Parameter. 
  14931.                 A  parameter  to a user defined function used as an array
  14932.                 within the function cannot be passed a  constant  value. 
  14933.                 Only a variable can be passed for this parameter.  If the
  14934.                 statement where the variable is indexed as  an  array  is
  14935.                 executed,  the variable will be an array upon return from
  14936.  
  14937.  
  14938.         QTAwk                       - 25-11 -                       QTAwk
  14939.  
  14940.  
  14941.  
  14942.  
  14943.  
  14944.  
  14945.         Section 25.0                                                    |
  14946.  
  14947.  
  14948.                 the function. 
  14949.                 
  14950.             4490
  14951.                 Internal Error - Misalignment Of Local List ( ). 
  14952.                 This is an internal QTAwk error.  It should ideally never
  14953.                 happen.   If  this  error  message  is  generated, please
  14954.                 contact  the  QTAwk  author  with  information   on   the
  14955.                 circumstances. 
  14956.                 
  14957.             4500
  14958.                 Cannot Assign Array To Array Element. 
  14959.                 Arrays  can  be  assigned to variables, however, it is an
  14960.                 error it attempt to assign an array to a  single  element
  14961.                 of another array. 
  14962.                 
  14963.             4510
  14964.                 Array Cannot Operate on Scalar. 
  14965.                 A  scalar may operate on an array, but the reverse is not
  14966.                 true. 
  14967.                 
  14968.             4520
  14969.                 Assignment Operator needs a Variable on left. 
  14970.                 The   assignment   operator,   '=',   or   any   of   the
  14971.                 operator/assignment  operators,  'op=', only operate on a
  14972.                 variable to the left of the operator. 
  14973.                 
  14974.             4530
  14975.                 Stack Underflow
  14976.                 Internal stack error.  Please contact  the  QTAwk  author
  14977.                 with  information  on  the  circumstances  of  this error
  14978.                 message. 
  14979.                 
  14980.             4540
  14981.                 String  Type  Variable  Needed  For  Pattern   String   -
  14982.                 'findfile' Function
  14983.                 The second argument of the 'findfile' function, if given,
  14984.                 must be a string type expression
  14985.             
  14986.         5.  Interpretation Errors
  14987.                 
  14988.             5030
  14989.                 Internal Error #3. 
  14990.                 Internal error.  Please contact  the  QTAwk  author  with
  14991.                 information  on the circumstances of this error message. 
  14992.                 
  14993.             5040
  14994.  
  14995.  
  14996.         QTAwk                       - 25-12 -                       QTAwk
  14997.  
  14998.  
  14999.  
  15000.  
  15001.  
  15002.  
  15003.         Section 25.0                                                    |
  15004.  
  15005.  
  15006.                 Internal Error #2. 
  15007.                 Internal error.  Please contact  the  QTAwk  author  with
  15008.                 information  on the circumstances of this error message. 
  15009.                 
  15010.             5050
  15011.                 BEGIN/END/NOMATCH/INITIAL/FINAL Patterns or User Function
  15012.                 Require An Action. 
  15013.                 The predefined patterns:
  15014.                 
  15015.                 BEGIN
  15016.                 INITIAL
  15017.                 NOMATCH
  15018.                 FINAL
  15019.                 END
  15020.                 
  15021.                 must  have  actions  associated  with  them.   The  brace
  15022.                 opening the action must  be  on  the  same  line  as  the
  15023.                 predefined pattern. 
  15024.                 
  15025.             5060
  15026.                 Exceeded Internal Stack Size on Scan. 
  15027.                 The  internal stack for containing parsed tokens has been
  15028.                 exceeded.  Attempt to simplify the utility  in  the  area
  15029.                 where this error occurred. 
  15030.                 
  15031.             5070
  15032.                 Underflow Internal Stack on Scan. 
  15033.                 This  is  an internal error.  If this error occurs please
  15034.                 contact  the  QTAwk  author  with  information   on   the
  15035.                 circumstances of this error message. 
  15036.                 
  15037.             5080
  15038.                 Missing ')' For Function Call. 
  15039.                 A  used defined function argument list must be terminated
  15040.                 with a right parenthesis, ')'.  A symbol has  been  found
  15041.                 which  cannot  be  part of the argument list and is not a
  15042.                 right parenthesis. 
  15043.                 
  15044.             5090
  15045.                 Function  Call  Without  Parenthesized  Argument   List. 
  15046.                 A  user  defined  function  definition  must  include  an
  15047.                 argument list.  The argument list  may  be  empty,  e.g.,
  15048.                 "()", if there are no formal arguments. 
  15049.                 
  15050.             5100
  15051.                 'fprint' Function Takes A minimum Of 1 Argument. 
  15052.  
  15053.  
  15054.         QTAwk                       - 25-13 -                       QTAwk
  15055.  
  15056.  
  15057.  
  15058.  
  15059.  
  15060.  
  15061.         Section 25.0                                                    |
  15062.  
  15063.  
  15064.                 The  'fprint'  built-in  function  must have at least the
  15065.                 name name of the output file specified. 
  15066.                 
  15067.             5110
  15068.                 printf and  'sprintf'  Functions  Take  A  Minimum  Of  1
  15069.                 Argument. 
  15070.                 These  functions  must  have  at  least  a  format string
  15071.                 defined. 
  15072.                 
  15073.             5120
  15074.                 'fprintf' Function Needs A  Minimum  of  Two  Arguments. 
  15075.                 This  function  needs  an  output  file name and a format
  15076.                 string. 
  15077.                 
  15078.             5130
  15079.                 Second Argument Of 'fgetline'  Has  To  Be  A  Variable. 
  15080.                 If   two  arguments  are  specified  for  the  'fgetline'
  15081.                 built-in function, the second must be a variable. 
  15082.                 
  15083.             5140
  15084.                 Argument Of 'getline' Has To Be A Variable. 
  15085.                 If an argument for the 'getline' function  is  specified,
  15086.                 it must be a variable. 
  15087.                 
  15088.             5150
  15089.                 split  Function  Needs Variable Name As Second Argument. 
  15090.                 The second second argument for the 'split' function  must
  15091.                 be  a variable.  The pieces into which the first argument
  15092.                 is split will  be  returned  as  array  elements  of  the
  15093.                 variable specified. 
  15094.                 
  15095.             5160
  15096.                 'rotate' Function Needs Variable As Argument. 
  15097.                 The  argument of the 'rotate' function has to be an array
  15098.                 variable. 
  15099.                 
  15100.             5170
  15101.                 'justify' Function Needs  Variable  As  First  Argument. 
  15102.                 The format of the 'justify' built-in function is:
  15103.                 
  15104.                 justify(a,n,w)
  15105.                 
  15106.                  or
  15107.                 
  15108.                 justify(a,n,w,c)
  15109.                 
  15110.  
  15111.  
  15112.         QTAwk                       - 25-14 -                       QTAwk
  15113.  
  15114.  
  15115.  
  15116.  
  15117.  
  15118.  
  15119.         Section 25.0                                                    |
  15120.  
  15121.  
  15122.                 The  first argument, 'a', must be an array variable.  The
  15123.                 first n elements of the array are concatenated to form  a
  15124.                 string  'w'  characters  long.  a single space is used to
  15125.                 separate the  concatenated  elements.   If  the  optional
  15126.                 third  argument  is  specified,  it  is  converted  to  a
  15127.                 character value  and  used  to  separate  the  elements. 
  15128.                 
  15129.             5180
  15130.                 '[pu]_sym'  Function  Needs Variable As Second Argument. 
  15131.                 The second argument must be variable whose value  can  be
  15132.                 changed  to  equal  the string value of the name variable
  15133.                 specified. 
  15134.                 
  15135.             5190
  15136.                 Bad Function Call
  15137.                 Internal QTAwk error.  Please contact  the  QTAwk  author
  15138.                 with  information  on  the  circumstances of this error. 
  15139.                 
  15140.             5200
  15141.                 Improper Number Of Arguments, {Function_Name}  Function. 
  15142.                 The  built-in  function specified has been called with an
  15143.                 improper number of arguments for the function.  Check the
  15144.                 user   manual   for  the  correct  use  of  the  intended
  15145.                 function. 
  15146.                 
  15147.             5210
  15148.                 Need Variable On Left Side Of Assignment. 
  15149.                 In an assignment statement of the form:
  15150.                 
  15151.                 variable = expression;
  15152.                 
  15153.                 a variable must be specified on  the  left  side  of  the
  15154.                 assignment   operator   to   receive  the  value  of  the
  15155.                 expression on the right side of the operator. 
  15156.                 
  15157.             5220
  15158.                 Conditional Expression Error - Missing ':'
  15159.                 The form of the conditional expression is :
  15160.                 
  15161.                 test_expression ? expression_1 : expression_2;
  15162.                 
  15163.                 test_expression is  evaluated,  if  the  result  is  TRUE
  15164.                 (nonzero  numeric  or  non-null  string), expression_1 is
  15165.                 evaluated  and  the  value  becomes  the  value  of   the
  15166.                 conditional  expression.  If the value of test_expression
  15167.                 is FALSE (zero numeric or null string),  expression_2  is
  15168.  
  15169.  
  15170.         QTAwk                       - 25-15 -                       QTAwk
  15171.  
  15172.  
  15173.  
  15174.  
  15175.  
  15176.  
  15177.         Section 25.0                                                    |
  15178.  
  15179.  
  15180.                 evaluated   and  the  value  becomes  the  value  of  the
  15181.                 conditional expression. 
  15182.                 
  15183.             5230
  15184.                 'in' Operator Needs Array As Right Operand
  15185.                 The form of the 'in' operator is:
  15186.                 
  15187.                 expression in array_var
  15188.                 
  15189.                 The operand to the right of 'in', array_var here, has  to
  15190.                 be a variable.  If the variable is not an array, then the
  15191.                 value of the expression is FALSE. 
  15192.                 
  15193.             5240
  15194.                 Missing ')' in Expression Grouping. 
  15195.                 An  expression   has   been   scanned   with   unbalanced
  15196.                 parenthesis.   Check  for  a  missing  terminating  right
  15197.                 parenthesis. 
  15198.                 
  15199.             5250
  15200.                 Pre-Increment/Decrement Operators Need Variable. 
  15201.                 The increment and decrement  operators,  '++'  and  '--',
  15202.                 only operate on variables.  An instance has been found in
  15203.                 which the operator has been used as a prefix operator  on
  15204.                 something other than a variable.  Check that grouping has
  15205.                 not changed a post-fix operator into a prefix  operator. 
  15206.                 
  15207.             5260
  15208.                 Undefined Symbol. 
  15209.                 A  symbol  has  been found which matches no defined QTAwk
  15210.                 syntax.  This usually, but not always,  occurs  when  the
  15211.                 terminating   semi-colon,   ';',  has  been  left  off  a
  15212.                 statement. 
  15213.                 
  15214.             5270
  15215.                 Need Variable for Array Reference
  15216.                 A  left  bracket  for  indexing   an   array   has   been
  15217.                 encountered.   However,  the  preceding  symbol was not a
  15218.                 variable.  Only variables may  be  arrays  and  indexed. 
  15219.                 
  15220.             5280
  15221.                 Missing Index For Array
  15222.                 A   left   bracket   for   indexing  an  array  has  been
  15223.                 encountered.  However, the index expression  is  missing:
  15224.                 var[] a null index is not allowed in QTAwk. 
  15225.                 
  15226.  
  15227.  
  15228.         QTAwk                       - 25-16 -                       QTAwk
  15229.  
  15230.  
  15231.  
  15232.  
  15233.  
  15234.  
  15235.         Section 25.0                                                    |
  15236.  
  15237.  
  15238.             5290
  15239.                 Missing ']' Terminating array index. 
  15240.                 A  left  bracket  and an index expression for indexing an
  15241.                 array have been encountered.  However, the right  bracket
  15242.                 terminating  the  index  expression  was not recognized. 
  15243.                 Check that the array index follows the form:
  15244.                 
  15245.                 var[index_expression]
  15246.                 
  15247.             5300
  15248.                 Post-Increment/Decrement Operators Need Variable. 
  15249.                 The increment and decrement  operators,  '++'  and  '--',
  15250.                 only operate on variables.  An instance has been found in
  15251.                 which the operator has been used as a  post-fix  operator
  15252.                 on  something other than a variable.  Check that grouping
  15253.                 has  not  changed  a  prefix  operator  into  a  post-fix
  15254.                 operator. 
  15255.                 
  15256.             5310
  15257.                 'if' Keyword - No Expression To Test. 
  15258.                 The proper syntax for the 'if' statement is:
  15259.                 
  15260.                 if ( conditional_expression ) statement
  15261.                 
  15262.                 The  left  parenthesis,  '(',  starting  the  conditional
  15263.                 expression was not found  following  the  'if'  keyword. 
  15264.                 Check that the syntax conforms to the form above. 
  15265.                 
  15266.             5320
  15267.                 'if'  Keyword  -  No Terminating ')' On Test Expression. 
  15268.                 The proper syntax for the 'if' statement is:
  15269.                 
  15270.                 if ( conditional_expression ) statement
  15271.                 
  15272.                 The right parenthesis, ')', terminating  the  conditional
  15273.                 expression  was  not  found.   Check  that  the syntax to
  15274.                 conforms the form above. 
  15275.                 
  15276.             5330
  15277.                 'while' Keyword - No Terminating ')' On Test Expression. 
  15278.                 The proper syntax for the 'while' statement is:
  15279.                 
  15280.                 while ( conditional_expression ) statement
  15281.                 
  15282.                 The  right  parenthesis, ')', terminating the conditional
  15283.                 expression was not  found.   Check  that  the  syntax  to
  15284.  
  15285.  
  15286.         QTAwk                       - 25-17 -                       QTAwk
  15287.  
  15288.  
  15289.  
  15290.  
  15291.  
  15292.  
  15293.         Section 25.0                                                    |
  15294.  
  15295.  
  15296.                 conforms the form above. 
  15297.                 
  15298.             5340
  15299.                 Missing 'while' Part Of 'do'. 
  15300.                 The proper syntax for the 'do' statement is:
  15301.                 
  15302.                 do statement while ( conditional_expression );
  15303.                 
  15304.                 The   'while'   keyword   was  not  found  following  the
  15305.                 statement portion.  Check that  a  possible  left  brace,
  15306.                 '{',  starting a compound statement may have been deleted
  15307.                 or for the possible misuse of a keyword as  a  variable. 
  15308.                 
  15309.             5350
  15310.                 Missing '(' On 'while' Part Of 'do'. 
  15311.                 The proper syntax for the 'do' statement is:
  15312.                 
  15313.                 do statement while ( conditional_expression );
  15314.                 
  15315.                 The  left  parenthesis,  '(',  starting  the  conditional
  15316.                 expression was not found following the 'while'  keyword. 
  15317.                 Check that the syntax conforms to the form above. 
  15318.                 
  15319.             5360
  15320.                 Missing ')' On 'while' Part Of 'do'. 
  15321.                 The proper syntax for the 'do' statement is:
  15322.                 
  15323.                 do statement while ( conditional_expression );
  15324.                 
  15325.                 The  right  parenthesis, ')', terminating the conditional
  15326.                 expression was not  found.   Check  that  the  syntax  to
  15327.                 conforms the form above. 
  15328.                 
  15329.             5370
  15330.                 Missing ';' Terminating 'do - while'. 
  15331.                 The proper syntax for the 'do' statement is:
  15332.                 
  15333.                 do statement while ( conditional_expression );
  15334.                 
  15335.                 Note   the  semicolon  following  the  right  parenthesis
  15336.                 terminating the conditional expression.  The semicolon is
  15337.                 necessary here. 
  15338.                 
  15339.             5380
  15340.                 Missing Opening Parenthesis On 'for'. 
  15341.                 The proper syntax for the 'for' statement is:
  15342.  
  15343.  
  15344.         QTAwk                       - 25-18 -                       QTAwk
  15345.  
  15346.  
  15347.  
  15348.  
  15349.  
  15350.  
  15351.         Section 25.0                                                    |
  15352.  
  15353.  
  15354.                 for   (  initial_expression  ;  conditional_expression  ;
  15355.                 loop_expression )
  15356.                 statement
  15357.                 
  15358.                 or
  15359.                 
  15360.                 for ( variable_name in array_name ) statement
  15361.                 
  15362.                 The left parenthesis, '(', was not  found  following  the
  15363.                 'for'  keyword.   Check  that  the syntax conforms to the
  15364.                 form above. 
  15365.                 
  15366.             5390
  15367.             5400
  15368.             5420
  15369.                 Improper Syntax - 'for' Conditional. 
  15370.                 The proper syntax for the 'for' statement is:
  15371.                 
  15372.                 for  (  initial_expression  ;  conditional_expression   ;
  15373.                 loop_expression )
  15374.                 statement
  15375.                 
  15376.                 One  of  the  semicolons separating the three expressions
  15377.                 or the terminating  right  parenthesis  was  not  found. 
  15378.                 Check that the syntax follows the form above
  15379.                 
  15380.             5410
  15381.                 'in'  Operator  Needs  Variable  As Left Operand in 'for'
  15382.                 Expression. 
  15383.                 The proper syntax for the 'for' statement is:
  15384.                 
  15385.                 for ( variable_name in array_name ) statement
  15386.                 
  15387.                 the symbol following the left parenthesis  and  preceding
  15388.                 the 'in' keyword must be a valid variable name. 
  15389.                 
  15390.             5430
  15391.                 break/continue Keyword Outside Of Loop. 
  15392.                 Either  of  these  keywords  must  be  used  inside  of a
  15393.                 'while', 'for' or 'do' loop.  In  addition,  the  'break'
  15394.                 statement may be used inside a 'switch-case' construct to
  15395.                 terminate execution flow.  One of the keywords  has  been
  15396.                 found   outside  of  such  a  construct.   Check  for  an
  15397.                 imbalance   of   braces,   '{}',    enclosing    compound
  15398.                 statements. 
  15399.                 
  15400.  
  15401.  
  15402.         QTAwk                       - 25-19 -                       QTAwk
  15403.  
  15404.  
  15405.  
  15406.  
  15407.  
  15408.  
  15409.         Section 25.0                                                    |
  15410.  
  15411.  
  15412.             5440
  15413.                 'return' Statement Outside Of User Function. 
  15414.                 The  'return'  statement  may  only  be  used inside of a
  15415.                 user-defined  function  to  terminate  execution  of  the
  15416.                 function and cause execution to return to the place where
  15417.                 the  function  was  called.   The  'return'  keyword  was
  15418.                 encountered   outside   of   the  definition  of  such  a
  15419.                 function.  Check for the use of the keyword as a variable
  15420.                 or  for unbalanced braces, '{}', enclosing the statements
  15421.                 of the function. 
  15422.                 
  15423.             5450
  15424.                 Exceeded Limits on Number of Local  Variable  Definitions
  15425.                 (1). 
  15426.                 QTAwk  places  a  limit of 256 local variables within any
  15427.                 compound statement.  An attempt has been made  to  define
  15428.                 more local variables than this limit allows. 
  15429.                 
  15430.             5460
  15431.                 No Variables Defined With 'local' Keyword. 
  15432.                 The  form  of  local variable definition with the 'local'
  15433.                 keyword follows the form:
  15434.                 
  15435.                 local var1, var2 = optional_expression;
  15436.                 
  15437.                 The 'local' keyword was encountered followed  immediately
  15438.                 by  a semicolon.  Check that the syntax follows the above
  15439.                 form. 
  15440.                 
  15441.             5470
  15442.                 'switch' Keyword - No  Terminating  ')'  On  Expression. 
  15443.                 The form of the 'switch' construct is:
  15444.                 
  15445.                 switch ( switch_expression ) statement
  15446.                 
  15447.                 The    right    parenthesis,    ')',    terminating   the
  15448.                 switch_expression was not found. 
  15449.                 
  15450.             5480
  15451.                 'case/default Statement Without Switch Statement. 
  15452.                 The 'case' keyword is used within the 'switch'  statement
  15453.                 to  specify  case  expressions  to which execution should
  15454.                 transfer after matching the switch expression.  A  'case'
  15455.                 keyword  was  found  outside  of the 'switch' statement. 
  15456.                 Check for the use of the keyword as  a  variable  or  for
  15457.                 unbalanced   braces   enclosing   a   compound   'switch'
  15458.  
  15459.  
  15460.         QTAwk                       - 25-20 -                       QTAwk
  15461.  
  15462.  
  15463.  
  15464.  
  15465.  
  15466.  
  15467.         Section 25.0                                                    |
  15468.  
  15469.  
  15470.                 statement. 
  15471.                 
  15472.             5490
  15473.                 Multiple 'default' Statements in 'switch'. 
  15474.                 The 'default' keyword is used within a 'switch' statement
  15475.                 to  specify  a transfer point at execution should proceed
  15476.                 when   the   switch_expression   fails   to   match   any
  15477.                 case_expression.   Only  one  'default' transfer point is
  15478.                 allowed  per  'switch'  statement.   Check  for  possible
  15479.                 unbalanced  braces,  '{}', enclosing a compound statement
  15480.                 in previous 'case' statements. 
  15481.                 
  15482.             5500
  15483.                 Missing ':' Following Expression On Case Label. 
  15484.                 The form of the 'case' statement is:
  15485.                 
  15486.                 case case_expression:
  15487.                 
  15488.                 A colon, ':', must terminate the case expression.   QTAwk
  15489.                 did not find the terminating colon. 
  15490.                 
  15491.             5510
  15492.                 Need Variable For 'delete' Reference
  15493.                 The form of the 'delete' statement is:
  15494.                 
  15495.                 delete variable_name;
  15496.                 
  15497.                  or
  15498.                 
  15499.                 delete (variable_name);
  15500.                 
  15501.                  or
  15502.                 
  15503.                 delete variable_name[index];
  15504.                 
  15505.                  or
  15506.                 
  15507.                 delete (variable_name[index]);
  15508.                 
  15509.                  where  variable  must  be  a  global or local variable. 
  15510.                 
  15511.             5520
  15512.                 'deletea' Statement Variable Cannot Be Indexed. 
  15513.                 The form of the 'deletea' statement is:
  15514.                 
  15515.                 deletea variable_name;
  15516.  
  15517.  
  15518.         QTAwk                       - 25-21 -                       QTAwk
  15519.  
  15520.  
  15521.  
  15522.  
  15523.  
  15524.  
  15525.         Section 25.0                                                    |
  15526.  
  15527.  
  15528.                  or
  15529.                 
  15530.                 deletea (variable_name);
  15531.                 
  15532.                  where variable must be a global or  local  variable  and
  15533.                 cannot be indexed. 
  15534.                 
  15535.             5530
  15536.                 Need Variable For 'deletea' Reference
  15537.                 The form of the 'deletea' statement is:
  15538.                 
  15539.                 deletea variable_name;
  15540.                 
  15541.                  or
  15542.                 
  15543.                 deletea (variable_name);
  15544.                 
  15545.                  where  variable  must  be  a  global or local variable. 
  15546.                 
  15547.             5540
  15548.                 No ';' Terminating Statement. 
  15549.                 All statements in QTAwk are terminated by  a  semicolon. 
  15550.                 The terminating semicolon was not found by QTAwk. 
  15551.                 
  15552.             5550
  15553.                 Internal Compilation Error - Action Strings. 
  15554.                 This  is  an  QTAwk  internal  error  that  should  never
  15555.                 happen.  If this error  message  in  encountered,  please
  15556.                 contact   the   QTAwk  author  with  information  on  the
  15557.                 circumstances of this error. 
  15558.                 
  15559.             5560
  15560.                 Error On Single Line Action.  No Termination. 
  15561.                 In parsing/compiling an action entered from  the  command
  15562.                 line or by executing the 'execute' built-in function, the
  15563.                 end of the line was reached without reaching the  end  of
  15564.                 the  action expression(s).  Typically caused by a missing
  15565.                 right bracket, '}' (or unbalanced brackets  -  more  left
  15566.                 brackets than right brackets). 
  15567.                 
  15568.             5570
  15569.                 Too Many User Functions Defined. 
  15570.                 QTAwk   currently   has  a  limit  of  256  user  defined
  15571.                 functions.  The currently utility has attempted to define
  15572.                 more  than  that  limit.  Please contact the QTAwk author
  15573.                 with information  on  the  circumstances  of  this  error
  15574.  
  15575.  
  15576.         QTAwk                       - 25-22 -                       QTAwk
  15577.  
  15578.  
  15579.  
  15580.  
  15581.  
  15582.  
  15583.         Section 25.0                                                    |
  15584.  
  15585.  
  15586.                 message. 
  15587.                 
  15588.             5580
  15589.                 Exceeded  Limits  on Number of Local Variable Definitions
  15590.                 (2). 
  15591.                 QTAwk currently has a  limit  of  256  'local'  variables
  15592.                 defined   within  any  single  compound  statement.   The
  15593.                 currently utility has attempted to define more than  that
  15594.                 limit.   Please contact the QTAwk author with information
  15595.                 on the circumstances of this error message. 
  15596.                 
  15597.             5590
  15598.                 Expecting Function Name To Follow 'function'  Keyword  In
  15599.                 Pattern. 
  15600.                 The  'function' keyword has been encountered in a pattern
  15601.                 without a  function  name  immediately  following.   This
  15602.                 syntax  error  may  be corrected by inserting the missing
  15603.                 name  or  by  removing  the  function  keyword  from  the
  15604.                 pattern. 
  15605.                 
  15606.             5600
  15607.                 Multi-Defined Function Name. 
  15608.                 The  name  supplied  for a user defined function has been
  15609.                 used previously.  The current usage attempts to  redefine
  15610.                 the name.  Change either the first use of the name or the
  15611.                 present. 
  15612.                 
  15613.             5610
  15614.                 Unexpected Symbol - Function Argument  List  Definition. 
  15615.                 A  user  defined  function  has been encountered with the
  15616.                 accompanying list defining the  passed  argument  names. 
  15617.                 The  form of the list is a variable name followed by 1) a
  15618.                 comma and more names, 2) an ellipses, '...' followed by a
  15619.                 right  parenthesis,  or 3) a right parenthesis ending the
  15620.                 list.  A symbol other than a comma or  right  parenthesis
  15621.                 has been found following a variable name. 
  15622.                 
  15623.             5620
  15624.                 Expecting  ')'  To  Terminate  Function  Parameter List. 
  15625.                 A user defined function has  been  encountered  with  the
  15626.                 accompanying  list  defining  the passed argument names. 
  15627.                 The form of the list is a variable name followed by 1)  a
  15628.                 comma and more names, 2) an ellipses, '...' followed by a
  15629.                 right parenthesis, or 3) a right parenthesis  ending  the
  15630.                 list.   A  symbol  has  been  found  other than the right
  15631.                 parenthesis following the ellipses. 
  15632.  
  15633.  
  15634.         QTAwk                       - 25-23 -                       QTAwk
  15635.  
  15636.  
  15637.  
  15638.  
  15639.  
  15640.  
  15641.         Section 25.0                                                    |
  15642.  
  15643.  
  15644.             5630
  15645.                 Unexpected Symbol - Function Argument  List  Definition. 
  15646.                 A  user  defined  function  has been encountered with the
  15647.                 accompanying list defining the  passed  argument  names. 
  15648.                 The  form of the list is a variable name followed by 1) a
  15649.                 comma and more names, 2) an ellipses, '...' followed by a
  15650.                 right  parenthesis,  or 3) a right parenthesis ending the
  15651.                 list.  A symbol other than a comma or  right  parenthesis
  15652.                 has been found following a variable name. 
  15653.                 
  15654.             5640
  15655.                 Expecting  Parenthesized  Argument  Definition  List  For
  15656.                 Function. 
  15657.                 A user defined function has the following form:  function
  15658.                 function_name  (  argument_list ) The left parenthesis of
  15659.                 the argument list was not found. 
  15660.                 
  15661.             5650
  15662.                 Improper Syntax - Improper Ending For Pattern
  15663.                 A pattern expression must be ended by: 1)  a  comma  (the
  15664.                 first expression in a range expression only), 2) the left
  15665.                 brace,  '{',  starting  the  associated  action,  3)   an
  15666.                 End-of-File,  or  4) new line.  a symbol other than above
  15667.                 has been encountered. 
  15668.                 
  15669.                 
  15670.             5670
  15671.                 Internal Parse Error: 1001. 
  15672.                 Internal parser error.  Please contact the  QTAwk  author
  15673.                 with  information  on  the  circumstances  of  this error
  15674.                 message. 
  15675.                 
  15676.             5680
  15677.                 Local Variable With Reserved Name. 
  15678.                 An attempt has been made to define a  local  variable  in
  15679.                 either  a user defined function argument list or with the
  15680.                 'local' keyword, with a name equal to a  reserved  word. 
  15681.                 
  15682.             5690
  15683.                 Improper Use of Keyword. 
  15684.                 A  pattern  keyword  has  been  encountered  in an action
  15685.                 statement. 
  15686.                 
  15687.             5700
  15688.                 User Function Variable Argument Keyword Outside  Of  User
  15689.                 Function. 
  15690.  
  15691.  
  15692.         QTAwk                       - 25-24 -                       QTAwk
  15693.  
  15694.  
  15695.  
  15696.  
  15697.  
  15698.  
  15699.         Section 25.0                                                    |
  15700.  
  15701.  
  15702.                 The  two  predefined local variables: vargc and vargv can
  15703.                 only be used within user  defined  functions  which  have
  15704.                 been  defined  with a variable length argument list using
  15705.                 the ellipsis, '...'.  One of  these  variables  has  been
  15706.                 encountered outside of a user defined function. 
  15707.                 
  15708.             5710
  15709.                 Variable   Argument  Keyword  In  User  Function  Defined
  15710.                 Without Variable Number Of Arguments. 
  15711.                 The two predefined local variables: vargc and  vargv  can
  15712.                 only  be  used  within  user defined functions which have
  15713.                 been defined with a variable length argument  list  using
  15714.                 the  ellipsis,  '...'.   One  of these variables has been
  15715.                 encountered inside of a user defined function  which  was
  15716.                 not defined with a variable length argument list. 
  15717.                 
  15718.             5720
  15719.                 Internal Error - Variable Argument List Variable. 
  15720.                 The  two  predefined local variables: vargc and vargv can
  15721.                 only be used within user  defined  functions  which  have
  15722.                 been  defined  with a variable length argument list using
  15723.                 the ellipsis, '...'.  One of  these  variables  has  been
  15724.                 previously defined as a local variable within the current
  15725.                 compound statement. 
  15726.                 
  15727.             5730
  15728.                 Internal Error - Variable Argument List Variable. 
  15729.                 The two predefined local variables: vargc and  vargv  can
  15730.                 only  be  used  within  user defined functions which have
  15731.                 been defined with a variable length argument  list  using
  15732.                 the  ellipsis,  '...'.   One  of these variables has been
  15733.                 previously defined as a global variable. 
  15734.                 
  15735.             5740
  15736.                 Internal Parse Error: 1002. 
  15737.                 Internal parser error.  Please contact the  QTAwk  author
  15738.                 with  information  on  the  circumstances  of  this error
  15739.                 message. 
  15740.                 
  15741.             5742
  15742.             5744
  15743.                 Constant Exceeds Numerical Limits: xxxxxxxxxxxx
  15744.                 The constant shown (indicated by 'xxxxxxxxxxxx' in  error
  15745.                 message),   exceeds   the   numerical   limits  for  this
  15746.                 implementation of QTAwk.  Reduce the size of the  numeric
  15747.                 
  15748.  
  15749.  
  15750.         QTAwk                       - 25-25 -                       QTAwk
  15751.  
  15752.  
  15753.  
  15754.  
  15755.  
  15756.  
  15757.         Section 25.0                                                    |
  15758.  
  15759.  
  15760.             5750
  15761.                 Internal Parse Error: 1003. 
  15762.                 Internal  parser  error.  Please contact the QTAwk author
  15763.                 with information  on  the  circumstances  of  this  error
  15764.                 message. 
  15765.                 
  15766.             5760
  15767.                 Empty Regular Expression. 
  15768.                 A  regular  expression  must have some characters between
  15769.                 the beginning and ending slashes.  A  regular  expression
  15770.                 has been encountered with none. 
  15771.                 
  15772.             5770
  15773.                 Regular Expression - No Terminating /. 
  15774.                 A  regular  expression  constant must be contained on one
  15775.                 line and be terminated by a slash.  A regular  expression
  15776.                 has  been  been  found with a no terminating slash before
  15777.                 encountering a new line. 
  15778.                 
  15779.             5780
  15780.                 Internal Parse Error: 1004. 
  15781.                 Internal parser error.  Please contact the  QTAwk  author
  15782.                 with  information  on  the  circumstances  of  this error
  15783.                 message. 
  15784.                 
  15785.             5785
  15786.                 Escape to Continue Quoted Line Not Allowed  in  Pattern. 
  15787.                 Using  a  escape character, '\', at the end of a line and
  15788.                 within a quoted string to continue the string on the next
  15789.                 line,  is not allowed within a pattern.  Patterns must be
  15790.                 contained on a single line. 
  15791.                 
  15792.             5788
  15793.                 Unexpected End-of-File While Scanning Utility. 
  15794.                 QTAwk  encountered  the  End-Of-File  while  reading  and
  15795.                 interpreting a utility and before the expected end of the
  15796.                 utility. 
  15797.                 
  15798.             5790
  15799.                 String Constant - No Terminating ". 
  15800.                 A string constant must be contained on one  line  and  be
  15801.                 terminated by a double quote.  A string constant has been
  15802.                 been found with a  no  terminating  double  quote  before
  15803.                 encountering a new line. 
  15804.                 
  15805.             5800
  15806.  
  15807.  
  15808.         QTAwk                       - 25-26 -                       QTAwk
  15809.  
  15810.  
  15811.  
  15812.  
  15813.  
  15814.  
  15815.         Section 25.0                                                    |
  15816.  
  15817.  
  15818.                 Internal Parse Error: 1005. 
  15819.                 Internal  parser  error.  Please contact the QTAwk author
  15820.                 with information  on  the  circumstances  of  this  error
  15821.                 message. 
  15822.                 
  15823.             5810
  15824.                 Character Constant - No Terminating '. 
  15825.                 a character constant must be contained on one line and be
  15826.                 terminated by a single quote.  A character  constant  has
  15827.                 been been found with a no terminating single quote before
  15828.                 encountering a new line. 
  15829.                 
  15830.             5820
  15831.                 Character Constant Longer Than One Character
  15832.                 A character constant is a  single  character  bounded  by
  15833.                 single  quotes  as  in 'A'.  Escape sequences may also be
  15834.                 used  for  specifying  the  character  for  a   character
  15835.                 constant,  e.g., '\f' or '\x012' or '\022' are three ways
  15836.                 to specify a single  form  feed  character.   This  error
  15837.                 reports  that  an  attempt  has  been  made to use single
  15838.                 quotes to bound more than a single character. 
  15839.                 
  15840.             5830
  15841.                 Lexical Error - Illegal '.'
  15842.                 Periods are used only in floating point  numerics,  e.g.,
  15843.                 0.88  or  .33, or in user defined function definitions to
  15844.                 indicate a variable number of arguments, e.g.,
  15845.                 
  15846.                 function max(...) {
  15847.                 
  15848.                 A period has been found which does not  match  either  of
  15849.                 these uses. 
  15850.                 
  15851.             5840
  15852.                 Lexical Error
  15853.                 A  character  has been read which does not fit any syntax
  15854.                 for a valid utility. 
  15855.                 
  15856.             5850
  15857.                 Exceeded Max.  Limits On Number Of Variables. 
  15858.                 A maximum of 256 global variables may be defined  in  any
  15859.                 single QTAwk utility. 
  15860.             
  15861.         6.  Memory Errors
  15862.             6000
  15863.                 Out of Memory (n: , s: )
  15864.  
  15865.  
  15866.         QTAwk                       - 25-27 -                       QTAwk
  15867.  
  15868.  
  15869.  
  15870.  
  15871.  
  15872.  
  15873.         Section 25.0                                                    |
  15874.  
  15875.  
  15876.                 The  QTAwk  utility  has  used  all  available memory and
  15877.                 attempted to exceed that limit.  It is  recommended  that
  15878.                 the  utility  be  made  shorter,  or  split into multiple
  15879.                 utilities run separately. 
  15880.                 
  15881.             6010
  15882.                 Insufficient Memory. 
  15883.                 The QTAwk utility  has  used  all  available  memory  and
  15884.                 attempted  to  exceed that limit.  It is recommended that
  15885.                 the utility be  made  shorter,  or  split  into  multiple
  15886.                 utilities run separately. 
  15887.                 
  15888.             6030
  15889.                 Action Too Long
  15890.                 An  action  has been defined which exceeds the limits set
  15891.                 for the internal length.   The  maximum  length  for  the
  15892.                 internal  form  of  any  action  is  409,600 characters. 
  15893.                 
  15894.             6040
  15895.             6050
  15896.             6060
  15897.                 Out of Memory
  15898.                 The QTAwk utility  has  used  all  available  memory  and
  15899.                 attempted  to  exceed that limit.  It is recommended that
  15900.                 the utility be  made  shorter,  or  split  into  multiple
  15901.                 utilities run separately. 
  15902.                 
  15903.             6070
  15904.                 Stack Overflow
  15905.                 QTAwk   maintains  an  internal  stack  for  intermediate
  15906.                 results.  The current  utility  has  generated  too  many
  15907.                 intermediate    results   for   this   stack.    Simplify
  15908.                 expressions. 
  15909.             
  15910.         7.  Regular Expression Errors
  15911.             7000
  15912.                 Unbalanced Parenthesis in Regular Expression. 
  15913.                 Sequence Number: ssssss, Expression Number: eeeeee
  15914.                 Parenthesis in a regular expression are unbalanced, i.e.,
  15915.                 there  are  more  opening  left  parenthesis,  '(',  than
  15916.                 closing right parenthesis, ')'. 
  15917.  
  15918.  
  15919.  
  15920.  
  15921.  
  15922.  
  15923.  
  15924.         QTAwk                       - 25-28 -                       QTAwk
  15925.  
  15926.  
  15927.  
  15928.  
  15929.  
  15930.  
  15931.                                                         Table of Contents
  15932.  
  15933.  
  15934.         Table of Contents
  15935.         
  15936.         QTAwk License ............................................... iii
  15937.         QTAwk 6.00 PC/MS_DOS Order Form ............................... v
  15938.         QTAwk 1.00 OS/2 Order Form .................................... v
  15939.         == Order Information ......................................... vi
  15940.         == International Orders: ..................................... vi
  15941.         == Company Purchase Orders: .................................. vi
  15942.         == Multi-System Licenses: .................................... vi
  15943.         
  15944.         1.0 Introduction .......................................... xxiii
  15945.         
  15946.         2.0 Getting Started ......................................... 2-1
  15947.         2.1 Running QTAwk ........................................... 2-2
  15948.         
  15949.         3.0 Regular Expressions ..................................... 3-1
  15950.         3.1 'OR' Operator ........................................... 3-2
  15951.         3.2 Character Classes ....................................... 3-2
  15952.         3.3 Closure ................................................. 3-4
  15953.         3.4 Repetition Operator ..................................... 3-6
  15954.         3.5 Escape Sequences ........................................ 3-8
  15955.         3.6 Position Operators ...................................... 3-9
  15956.         3.7 Examples ............................................... 3-10
  15957.         3.8 Look Ahead Operator .................................... 3-11
  15958.         3.9 Match Classes .......................................... 3-11
  15959.         3.10 Named Expressions ..................................... 3-12
  15960.         3.11 Predefined Names ...................................... 3-14
  15961.         3.12 Tagged Strings ........................................ 3-15
  15962.         3.13 Regular Expression Operator Summary ................... 3-19
  15963.         
  15964.         4.0 Variables ............................................... 4-1
  15965.         
  15966.         5.0 Built-in Variables ...................................... 5-1
  15967.         
  15968.         6.0 Expressions ............................................. 6-1
  15969.         6.1 Operators ............................................... 6-1
  15970.         6.2 Numeric Forms and Arithmetic Operations ................. 6-2
  15971.         6.3 Numerics and Strings .................................... 6-4
  15972.         6.3.1 Assignment Operators .................................. 6-5
  15973.         6.4 Grouping Operators: () .................................. 6-5
  15974.         6.5 Arithmetic Operators .................................... 6-6
  15975.         6.5.1 Unary Ones Complement: ~ .............................. 6-6
  15976.         6.5.2 Unary Increment/Decrement: ++ -- ...................... 6-6
  15977.         6.5.3 Unary Plus/Minus: + - ................................. 6-7
  15978.         6.5.4 Exponentiation: ^ ..................................... 6-7
  15979.         6.5.5 Multiplicative and Additive Operators: * / % and + - .. 6-8
  15980.  
  15981.  
  15982.                                      - ii -                             |
  15983.  
  15984.  
  15985.  
  15986.  
  15987.  
  15988.  
  15989.                                                         Table of Contents
  15990.  
  15991.  
  15992.         6.6 Bitwise And, Or and Xor: & | @ .......................... 6-8
  15993.         6.7 Subscripting: [] ........................................ 6-8
  15994.         6.8 Shift Operators: << >> .................................. 6-9
  15995.         6.9 String Concatenation Operator: ∩ ........................ 6-9
  15996.         6.10 Field operator: $ ..................................... 6-11
  15997.         6.11 Tagged String Operator: $$ ............................ 6-12
  15998.         6.12 Logical Operators: && || .............................. 6-15
  15999.         6.13 Comparison Operators: < <= > >= == ~= ~~ !~ ........... 6-17
  16000.         6.13.1 Match Operator Variables ............................ 6-18
  16001.         6.14 Conditional Operator: ? : ............................. 6-18
  16002.         6.15 Logical Negation: ! ................................... 6-19
  16003.         6.16 Array Membership: in .................................. 6-19
  16004.         6.17 Sequence Operator: , .................................. 6-19
  16005.         6.18 White Space ........................................... 6-20
  16006.         6.19 Constants ............................................. 6-21
  16007.         6.19.1 Numeric Constants ................................... 6-21
  16008.         6.19.2 Character Constants ................................. 6-22
  16009.         6.19.3 String Constants .................................... 6-22
  16010.         6.19.4 Regular Expression Constants ........................ 6-23
  16011.         
  16012.         7.0 Arrays .................................................. 7-1
  16013.         7.1 Multidimensional Arrays ................................. 7-1
  16014.         7.2 Integer and String Indices .............................. 7-1
  16015.         7.3 QTAwk Arrays in Arithmetic Expressions .................. 7-2
  16016.         7.4 Arrays as Regular Expressions ........................... 7-6
  16017.         
  16018.         8.0 Strings, Regular Expressions and Arrays ................. 8-1
  16019.         8.1 Regular Expression and String Translation ............... 8-1
  16020.         8.2 Regular Expressions in Patterns ......................... 8-1
  16021.         
  16022.         9.0 Pattern-Actions ......................................... 9-1
  16023.         9.1 QTAwk Patterns .......................................... 9-1
  16024.         9.2 QTAwk Predefined Patterns ............................... 9-3
  16025.         
  16026.         10.0 Group Patterns ........................................ 10-1
  16027.         10.1 GROUP Pattern Advantage ............................... 10-1
  16028.         10.2 GROUP Pattern Disadvantage ............................ 10-1
  16029.         10.3 GROUP Pattern Regular Expressions ..................... 10-2
  16030.         
  16031.         11.0 Statements ............................................ 11-1
  16032.         11.1 QTAwk Keywords ........................................ 11-1
  16033.         11.2 Statements ............................................ 11-1
  16034.         11.3 'cycle' and 'next' .................................... 11-2
  16035.         11.4 'delete' and 'deletea' ................................ 11-4
  16036.         11.5 'if'/'else' ........................................... 11-6
  16037.         11.6 'switch', 'case', 'default' ........................... 11-6
  16038.  
  16039.  
  16040.                                      - iii -                            |
  16041.  
  16042.  
  16043.  
  16044.  
  16045.  
  16046.  
  16047.                                                         Table of Contents
  16048.  
  16049.  
  16050.         11.7 Loops ................................................. 11-8
  16051.         11.7.1 'while' ............................................. 11-8
  16052.         11.7.2 'for' ............................................... 11-8
  16053.         11.7.3 'do'/'while' ........................................ 11-9
  16054.         11.8 'local' ............................................... 11-9
  16055.         11.9 'endfile' ............................................ 11-10
  16056.         11.10 'break' ............................................. 11-10
  16057.         11.11 'continue' .......................................... 11-10
  16058.         11.12 'exit opt_expr_list' ................................ 11-10
  16059.         11.13 'return opt_expr_list' .............................. 11-11
  16060.         
  16061.         12.0 Built-in Functions .................................... 12-1
  16062.         12.1 Arithmetic Functions .................................. 12-1
  16063.         12.2 String Functions ...................................... 12-3
  16064.         12.3 File Functions ....................................... 12-14
  16065.         12.3.1 Input Functions .................................... 12-15
  16066.         12.3.2 Output Functions ................................... 12-18
  16067.         12.3.3 Miscellaneous File Functions ....................... 12-19
  16068.         12.3.4 Standard Files ..................................... 12-21
  16069.         12.4 Miscellaneous Functions .............................. 12-23
  16070.         12.4.1 Expression Type .................................... 12-23
  16071.         12.4.2 Execute String ..................................... 12-23
  16072.         12.4.3 Array Function ..................................... 12-26
  16073.         12.4.4 System Control Function ............................ 12-26
  16074.         12.4.5 Variable Access .................................... 12-26
  16075.         12.4.6 File Search Function ............................... 12-29
  16076.         12.4.7 Re-Set Regular Expressions ......................... 12-32
  16077.         
  16078.         13.0 User-Defined Functions ................................ 13-1
  16079.         13.1 Local Variables ....................................... 13-1
  16080.         13.2 Argument Checking ..................................... 13-1
  16081.         13.3 Variable Length Argument Lists ........................ 13-2
  16082.         13.4 Null Argument List .................................... 13-3
  16083.         13.5 Arrays and Used-Defined Functions ..................... 13-3
  16084.         
  16085.         14.0 Format Specification .................................. 14-1
  16086.         14.1 Output Types .......................................... 14-2
  16087.         14.2 Output Flags .......................................... 14-3
  16088.         14.3 Output Width .......................................... 14-4
  16089.         14.4 Output Precision ...................................... 14-4
  16090.         
  16091.         15.0 Trace Statements ...................................... 15-1
  16092.         15.1 Selective Statement Tracing ........................... 15-1
  16093.         15.2 Trace Output .......................................... 15-1
  16094.         
  16095.         16.0 Invoking QTAwk ........................................ 16-1
  16096.  
  16097.  
  16098.                                      - iv -                             |
  16099.  
  16100.  
  16101.  
  16102.  
  16103.  
  16104.  
  16105.                                                         Table of Contents
  16106.  
  16107.  
  16108.         16.1 Multiple QTAwk Utilities .............................. 16-1
  16109.         16.1.1 #include Directive .................................. 16-2
  16110.         16.2 Command Line Options .................................. 16-3
  16111.         16.3 File Search Sequence .................................. 16-3
  16112.         16.4 Setting the Field Separator ........................... 16-4
  16113.         16.5 Command Line Variables ................................ 16-5
  16114.         16.6 QTAwk Execution Sequence .............................. 16-5
  16115.         
  16116.         17.0 QTAwk Limits .......................................... 17-1
  16117.         
  16118.         18.0 Appendix i ............................................ 18-1
  16119.         
  16120.         19.0 Appendix ii ........................................... 19-1
  16121.         
  16122.         20.0 Appendix iii .......................................... 20-1
  16123.         
  16124.         21.0 Appendix iv ........................................... 21-1
  16125.         
  16126.         22.0 Appendix v ............................................ 22-1
  16127.         
  16128.         23.0 Appendix vi ........................................... 23-1
  16129.         
  16130.         24.0 Appendix vii .......................................... 24-1
  16131.         
  16132.         25.0 Appendix viii ......................................... 25-1
  16133.  
  16134.  
  16135.  
  16136.  
  16137.  
  16138.  
  16139.  
  16140.  
  16141.  
  16142.  
  16143.  
  16144.  
  16145.  
  16146.  
  16147.  
  16148.  
  16149.  
  16150.  
  16151.  
  16152.  
  16153.  
  16154.  
  16155.  
  16156.                                       - v -                             |
  16157.