SignatureHelper.java

/*
** Module   : SignatureHelper
** Abstract : Signature helper method.
**
** Copyright (c) 2013-2025, Golden Code Development Corporation.
**
** -#- -I- --Date-- ---------------------------------Description----------------------------------
** 001 EVL 20130304 Created initial version.
** 002 CA  20130313 Fixed signature of KW_SUBSTIT.
** 003 SVL 20130319 Fixed signature of KW_LENGTH and KW_STRING, added "fuzzy" matching for
**                  getSignature.
** 004 OM  20130325 Fixed signature of KW_DATETIME and KW_DATE_TZ.
** 005 OM  20130712 Fixed signature of KW_NEXT_VAL.
** 006 OM  20150922 Fixed signature of KW_SCR_2ITM method. Added mapping for attribute types.
** 007 CA  20160421 Added P2J-REMOTE-CALL function (language extension, not real 4GL).
** 008 HC  20170819 Added extension widget method GET-MOUSE-POSITION.
** 009 SVL 20171030 Added KW_RPT_DSGN and KW_RPT_QRY.
** 010 CA  20171111 Added WIDGET:BGCOLOR-RGB and WIDGET:FGCOLOR-RGB FWD extension attributes
** 011 SVL 20180208 Added KW_REPORT and KW_RPT_SRC.
** 012 CA  20180323 Added SESSION:SUPPRESS-WARNINGS-LIST.
**                  Added BUFFER:DATA-SOURCE-ROWID attribute.
** 013 GES 20180511 Added DISABLE-REDRAW().
** 014 CA  20181029 Add all attributes and methods from the ProgressParser, no need to maintain a
**                  separate map.
** 015 CA  20181128 Added GET-DB-CLIENT signature.
** 016 HC  20181128 Implemented TREEVIEW widget and related changes.
** 017 HC  20181228 Extended TREEEVIEW interface with new methods and attributes needed by a
**                  real-world application of the widget.
** 018 HC  20181220 Added additional TREEVIEW methods.
**     CA  20181220 GET-CODEPAGE must use BDT and default to 'longchar' for unknown.
**     HC  20190110 Fixed signature of TreeList.createSubNode method.
** 019 HC  20190206 Added very early stage of TABSET widget implementation only providing public
**                  interface and to allow conversion of legacy code.
**         20190213 Fixed signature entry for REMOVE-NODE method.
**     HC  20190313 Initial implementation of TREELIST widget. TREEVIEW widget refactored to make
**                  it the base for the TREELIST widget.
** 020 OM  20190411 Added methods related to DataSet. Sorted the methods alphabetically.
** 021 CA  20190423 ASC is an INT function, not INT64.
** 022 IAS 20190501 Added SECURITY-POLICY support.
** 023 CA  20190508 MAX() and MIN() have BDT parameters, not INT.
** 024 EVL 20191126 Adding support for CreateSubNode2 TREE widget based feature.
**     HC  20191127 Implemented tooltips for TREEVIEW and TREELIST widgets.
**     HC  20200108 Added conversion support for widget attribute SCROLL-WHEEL-LINES, and methods
**                  GET-NODE-FGCOLOR and SET-NODE-FGCOLOR.
**     CA  20200304 Added SIGNATURE methods.
** 025 CA  20200331 GET-CODEPAGE and GET-CODEPAGES are the same token, and behave both as a 
**                  builtin variable or function.
** 026 CA  20200428 Added PROFILER:WRITE-DATA and USER-DATA mthd signatures.
** 027 CA  20200910 Added BUFFER:SERIALIZE-ROW() method signature.  Fixed WRITE-JSON() signature.
** 028 CA  20220514 KEYLABEL and KEYFUNCTION have an INT64 argument, not INTEGER.
**                  Added signature for SESSION:MESSAGE-AREA-MSG().
** 029 GBB 20231121 Added SESSION:NEW-SESSION.
** 030 GBB 20240515 Added SESSION:GET-LOGIN-PARAMETER.
** 031 PMP 20250218 Registered button list related methods.
** 032 CA  20250130 Fixed signature for WEB-CONTEXT methods.  WEB-CONTEXT:URL-ENCODE is not yet fixed.
** 033 ICP 20250416 Added HASH-CODE built-in function.
**     ICP 20250312 Added TENANT-NAME and TENANT-ID methods.
*/

/*
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU Affero General Public License as
** published by the Free Software Foundation, either version 3 of the
** License, or (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU Affero General Public License for more details.
**
** You may find a copy of the GNU Affero GPL version 3 at the following
** location: https://www.gnu.org/licenses/agpl-3.0.en.html
** 
** Additional terms under GNU Affero GPL version 3 section 7:
** 
**   Under Section 7 of the GNU Affero GPL version 3, the following additional
**   terms apply to the works covered under the License.  These additional terms
**   are non-permissive additional terms allowed under Section 7 of the GNU
**   Affero GPL version 3 and may not be removed by you.
** 
**   0. Attribution Requirement.
** 
**     You must preserve all legal notices or author attributions in the covered
**     work or Appropriate Legal Notices displayed by works containing the covered
**     work.  You may not remove from the covered work any author or developer
**     credit already included within the covered work.
** 
**   1. No License To Use Trademarks.
** 
**     This license does not grant any license or rights to use the trademarks
**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
**     of Golden Code Development Corporation. You are not authorized to use the
**     name Golden Code, FWD, or the names of any author or contributor, for
**     publicity purposes without written authorization.
** 
**   2. No Misrepresentation of Affiliation.
** 
**     You may not represent yourself as Golden Code Development Corporation or FWD.
** 
**     You may not represent yourself for publicity purposes as associated with
**     Golden Code Development Corporation, FWD, or any author or contributor to
**     the covered work, without written authorization.
** 
**   3. No Misrepresentation of Source or Origin.
** 
**     You may not represent the covered work as solely your work.  All modified
**     versions of the covered work must be marked in a reasonable way to make it
**     clear that the modified work is not originating from Golden Code Development
**     Corporation or FWD.  All modified versions must contain the notices of
**     attribution required in this license.
*/

package com.goldencode.p2j.convert;

import java.util.*;
import com.goldencode.p2j.uast.*;

/**
 * Encodes the signatures of all Progress built-in functions (FUNC_*) and handle-based
 * methods (METH_*).  Provides methods to inspect these signatures. This is used during
 * conversion to do type analysis of expressions and for other tasks such as knowing the
 * proper type to emit for an unknown literal used as a parameter to a built-in.
 */
public class SignatureHelper
implements ProgressParserTokenTypes
{
   /** Stores the core mapping data for built-in functions by keyword token type. */
   private static final HashMap<Integer, FuncDef> map_func = new HashMap<>();

   /** Stores the core mapping data for handle related methods by keyword token type. */
   private static final HashMap<Integer, FuncDef> map_meth = new HashMap<>();
   
   /** Stores the datatypes of each attribute/widget option. */
   private static final HashMap<Integer, Integer> map_attr = new HashMap<>();

   static
   {  // The 98 column restriction is not followed here because this form is much more readable.
      map_func.put(KW_ABS,      new FuncDef(FUNC_POLY        , KW_ABS      , 1, new ParmType[] { ParmType.NUM }));
      map_func.put(KW_CBIT,     new FuncDef(FUNC_LOGICAL     , KW_CBIT     , 2, new ParmType[] { ParmType.CHAR, ParmType.INT }));
      map_func.put(KW_U_MSG,    new FuncDef(FUNC_INT         , KW_U_MSG    , 1, new ParmType[] { ParmType.NUM }));

      // add the rest of the FUNC_* and METH_* built-ins here!
      map_func.put(KW_ACCUM,    new FuncDef(FUNC_POLY        , KW_ACCUM    , 2, new ParmType[] { ParmType.BDT, ParmType.BDT }));
      map_func.put(KW_ADD_INVL, new FuncDef(FUNC_POLY        , KW_ADD_INVL , 3, new ParmType[] { ParmType.DATE, ParmType.INT, ParmType.CHAR }));
      map_func.put(KW_ALIAS,    new FuncDef(FUNC_CHAR        , KW_ALIAS    , 1, new ParmType[] { ParmType.INT }));
      map_func.put(KW_AMBIG,    new FuncDef(FUNC_LOGICAL     , KW_AMBIG    , 1, new ParmType[] { ParmType.RECORD }));
      map_func.put(KW_ASC,      new FuncDef(FUNC_INT         , KW_ASC      , 1, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_func.put(KW_AUD_ENAB, new FuncDef(FUNC_LOGICAL     , KW_AUD_ENAB , 0, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_AVAIL,    new FuncDef(FUNC_LOGICAL     , KW_AVAIL    , 1, new ParmType[] { ParmType.RECORD }));
      map_func.put(KW_BASE64_D, new FuncDef(FUNC_MEMPTR      , KW_BASE64_D , 1, new ParmType[] { ParmType.TEXT }));
      map_func.put(KW_BASE64_E, new FuncDef(FUNC_LONGCHAR    , KW_BASE64_E , 1, new ParmType[] { ParmType.BIN }));
      map_func.put(KW_BL_G_GR,  new FuncDef(FUNC_HANDLE      , KW_BL_G_GR  , 1, new ParmType[] { ParmType.INT }));
      map_func.put(KW_BL_G_GRI, new FuncDef(FUNC_HANDLE      , KW_BL_G_GRI , 1, new ParmType[] { ParmType.INT }));
      map_func.put(KW_BL_G_KEY, new FuncDef(FUNC_CHAR        , KW_BL_G_KEY , 0, null));
      map_func.put(KW_BL_GADD,  new FuncDef(FUNC_HANDLE      , KW_BL_GADD  , 3, new ParmType[] { ParmType.NUM, ParmType.CHAR, ParmType.CHAR }));
      map_func.put(KW_BL_GCLR,  new FuncDef(FUNC_LOGICAL     , KW_BL_GCLR  , 0, null));
      map_func.put(KW_BL_GIFP,  new FuncDef(FUNC_HANDLE      , KW_BL_GIFP  , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_func.put(KW_BL_IADD,  new FuncDef(FUNC_HANDLE      , KW_BL_IADD  , 4, new ParmType[] { ParmType.INT, ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_func.put(KW_BOX,      new FuncDef(FUNC_CLASS       , KW_BOX      , 1, new ParmType[] { ParmType.BDT, ParmType.CHAR }));
      map_func.put(KW_CAN_DO,   new FuncDef(FUNC_LOGICAL     , KW_CAN_DO   , 1, new ParmType[] { ParmType.BDT, ParmType.CHAR }));
      map_func.put(KW_CAN_FIND, new FuncDef(FUNC_LOGICAL     , KW_CAN_FIND , 1, new ParmType[] { ParmType.RECORD, ParmType.RECORD, ParmType.LOG, ParmType.INT, ParmType.HANDLE, ParmType.WID, ParmType.HANDLE, ParmType.WID, ParmType.INT, ParmType.LOG, ParmType.LOG }));
      map_func.put(KW_CAN_QRY,  new FuncDef(FUNC_LOGICAL     , KW_CAN_QRY  , 2, new ParmType[] { ParmType.HANDLE, ParmType.CHAR }));
      map_func.put(KW_CAN_SET,  new FuncDef(FUNC_LOGICAL     , KW_CAN_SET  , 2, new ParmType[] { ParmType.HANDLE, ParmType.CHAR }));
      map_func.put(KW_CAPS,     new FuncDef(FUNC_CHAR        , KW_CAPS     , 1, new ParmType[] { ParmType.TEXT }));
      // Function UPPER() has the same mapping as CAPS()
      map_func.put(KW_CAST,     new FuncDef(FUNC_CLASS       , KW_CAST     , 2, new ParmType[] { ParmType.BDT, ParmType.BDT }));
      map_func.put(KW_CHR,      new FuncDef(FUNC_CHAR        , KW_CHR      , 1, new ParmType[] { ParmType.INT, ParmType.CHAR, ParmType.CHAR }));
      map_func.put(KW_CLR_NODS, new FuncDef(METH_VOID        , KW_CLR_NODS , 0, null));
      map_func.put(KW_CP_CVT,   new FuncDef(FUNC_CHAR        , KW_CP_CVT   , 1, new ParmType[] { ParmType.TEXT, ParmType.CHAR, ParmType.CHAR }));
      map_func.put(KW_COMPARE,  new FuncDef(FUNC_LOGICAL     , KW_COMPARE  , 4, new ParmType[] { ParmType.TEXT, ParmType.CHAR, ParmType.TEXT, ParmType.CHAR, ParmType.CHAR }));
      map_func.put(KW_CONN_ED,  new FuncDef(FUNC_LOGICAL     , KW_CONN_ED  , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_COUNT_OF, new FuncDef(FUNC_INT         , KW_COUNT_OF , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_CUR_CHG,  new FuncDef(FUNC_LOGICAL     , KW_CUR_CHG  , 1, new ParmType[] { ParmType.RECORD }));
      map_func.put(KW_CUR_RES,  new FuncDef(FUNC_INT         , KW_CUR_RES  , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_CUR_VAL,  new FuncDef(FUNC_INT64       , KW_CUR_VAL  , 1, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.INT }));
      map_func.put(KW_DATA_SM,  new FuncDef(FUNC_LOGICAL     , KW_DATA_SM  , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_DATE,     new FuncDef(FUNC_DATE        , KW_DATE     , new SignDef[] { new SignDef(3, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT } ), new SignDef(1, new ParmType[] { ParmType.BDT } ) } ));
      map_func.put(KW_DATETIME, new FuncDef(FUNC_DATETIME    , KW_DATETIME , new SignDef[] { new SignDef(1, new ParmType[] { ParmType.DATE, ParmType.INT } ), new SignDef(1, new ParmType[] { ParmType.CHAR } ), new SignDef(5, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT } ) } ));
      map_func.put(KW_DATE_TZ,  new FuncDef(FUNC_DATETIME_TZ , KW_DATE_TZ  , new SignDef[] { new SignDef(1, new ParmType[] { ParmType.DATE, ParmType.INT, ParmType.INT } ), new SignDef(1, new ParmType[] { ParmType.DT, ParmType.INT } ), new SignDef(5, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT } ), new SignDef(1, new ParmType[] { ParmType.CHAR } ) } ));
      map_func.put(KW_DAY,      new FuncDef(FUNC_INT         , KW_DAY      , 1, new ParmType[] { ParmType.DATE }));
      map_func.put(KW_DBCP,     new FuncDef(FUNC_CHAR        , KW_DBCP     , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_DBCOLL,   new FuncDef(FUNC_CHAR        , KW_DBCOLL   , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_DBPARAM,  new FuncDef(FUNC_CHAR        , KW_DBPARAM  , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_DB_REM_H, new FuncDef(FUNC_CHAR        , KW_DB_REM_H , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_DBREST,   new FuncDef(FUNC_CHAR        , KW_DBREST   , 1, new ParmType[] { ParmType.BDT, ParmType.CHAR }));
      map_func.put(KW_DBTASKID, new FuncDef(FUNC_INT         , KW_DBTASKID , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_DBTYPE,   new FuncDef(FUNC_CHAR        , KW_DBTYPE   , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_DBVERS,   new FuncDef(FUNC_CHAR        , KW_DBVERS   , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_DEC,      new FuncDef(FUNC_DEC         , KW_DEC      , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_DECRYPT,  new FuncDef(FUNC_MEMPTR      , KW_DECRYPT  , 1, new ParmType[] { ParmType.BIN, ParmType.RAW, ParmType.RAW, ParmType.CHAR }));
      map_func.put(KW_DIS_REDR, new FuncDef(FUNC_LOGICAL     , KW_DIS_REDR , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_func.put(KW_DYN_CAST, new FuncDef(FUNC_CLASS       , KW_DYN_CAST , 2, new ParmType[] { ParmType.BDT, ParmType.CHAR }));
      map_func.put(KW_DYN_CURV, new FuncDef(FUNC_INT64       , KW_DYN_CURV , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.INT }));
      map_func.put(KW_DYN_FUNC, new FuncDef(FUNC_POLY        , KW_DYN_FUNC , new SignDef[] { new SignDef(1, new ParmType[] { ParmType.CHAR, ParmType.BDT_VARARGS } ), new SignDef(2, new ParmType[] { ParmType.CHAR, ParmType.HANDLE, ParmType.BDT_VARARGS } ) } )); 
      map_func.put(KW_DYN_INVK, new FuncDef(FUNC_POLY        , KW_DYN_INVK , 2, new ParmType[] { ParmType.BDT, ParmType.CHAR, ParmType.BDT_VARARGS }));
      map_func.put(KW_DYN_NEXV, new FuncDef(FUNC_INT64       , KW_DYN_NEXV , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.INT }));
      map_func.put(KW_ENCODE,   new FuncDef(FUNC_CHAR        , KW_ENCODE   , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_ENCRYPT,  new FuncDef(FUNC_MEMPTR      , KW_ENCRYPT  , 1, new ParmType[] { ParmType.BDT, ParmType.RAW, ParmType.RAW, ParmType.CHAR }));
      map_func.put(KW_ENTERED,  new FuncDef(FUNC_LOGICAL     , KW_ENTERED  , 1, new ParmType[] { ParmType.WID }));
      map_func.put(KW_ENTRY,    new FuncDef(FUNC_CHAR        , KW_ENTRY    , 2, new ParmType[] { ParmType.INT, ParmType.TEXT, ParmType.CHAR }));
      map_func.put(KW_ERROR,    new FuncDef(FUNC_LOGICAL     , KW_ERROR    , 1, new ParmType[] { ParmType.BIN }));
      map_func.put(KW_ETIME,    new FuncDef(FUNC_INT         , KW_ETIME    , 0, new ParmType[] { ParmType.LOG }));
      map_func.put(KW_EXP,      new FuncDef(FUNC_DEC         , KW_EXP      , 2, new ParmType[] { ParmType.NUM, ParmType.NUM }));
      map_func.put(KW_EXTENT,   new FuncDef(FUNC_INT         , KW_EXTENT   , 1, new ParmType[] { ParmType.BDT_ARRAY }));
      map_func.put(KW_FILL,     new FuncDef(FUNC_CHAR        , KW_FILL     , 2, new ParmType[] { ParmType.CHAR, ParmType.INT }));
      map_func.put(KW_FIRST,    new FuncDef(FUNC_LOGICAL     , KW_FIRST    , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_FIRST_OF, new FuncDef(FUNC_LOGICAL     , KW_FIRST_OF , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_FR_COL,   new FuncDef(FUNC_DEC         , KW_FR_COL   , 0, new ParmType[] { ParmType.WID }));
      map_func.put(KW_FR_DOWN,  new FuncDef(FUNC_INT         , KW_FR_DOWN  , 0, new ParmType[] { ParmType.WID }));
      map_func.put(KW_FR_LINE,  new FuncDef(FUNC_INT         , KW_FR_LINE  , 0, new ParmType[] { ParmType.WID }));
      map_func.put(KW_FR_ROW,   new FuncDef(FUNC_DEC         , KW_FR_ROW   , 0, new ParmType[] { ParmType.WID }));
      map_func.put(KW_GEN_PBEK, new FuncDef(FUNC_RAW         , KW_GEN_PBEK , 1, new ParmType[] { ParmType.BIN, ParmType.RAW }));
      map_func.put(KW_GET_BITS, new FuncDef(FUNC_INT         , KW_GET_BITS , 3, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT }));
      map_func.put(KW_GET_BYTE, new FuncDef(FUNC_INT         , KW_GET_BYTE , 2, new ParmType[] { ParmType.BIN, ParmType.INT }));
      map_func.put(KW_GET_B_OR, new FuncDef(FUNC_INT         , KW_GET_B_OR , 1, new ParmType[] { ParmType.MEM }));
      map_func.put(KW_GET_BYTS, new FuncDef(FUNC_POLY        , KW_GET_BYTS , 3, new ParmType[] { ParmType.BIN, ParmType.INT, ParmType.INT }));
      map_func.put(KW_GET_CODP, new FuncDef(FUNC_CHAR        , KW_GET_CODP , 0, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_GET_CLL,  new FuncDef(FUNC_CHAR        , KW_GET_CLL  , 1, new ParmType[] { ParmType.CLOB }));
      map_func.put(KW_GET_COLL, new FuncDef(FUNC_CHAR        , KW_GET_COLL , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_GET_DBCL, new FuncDef(FUNC_LOGICAL     , KW_GET_DBCL , 0, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_GET_DBL,  new FuncDef(FUNC_DEC         , KW_GET_DBL  , 2, new ParmType[] { ParmType.BIN, ParmType.INT }));
      map_func.put(KW_GET_FLT,  new FuncDef(FUNC_DEC         , KW_GET_FLT  , 2, new ParmType[] { ParmType.BIN, ParmType.INT }));
      map_func.put(KW_GET_I64,  new FuncDef(FUNC_INT64       , KW_GET_I64  , 2, new ParmType[] { ParmType.BIN, ParmType.INT }));
      map_func.put(KW_GET_LONG, new FuncDef(FUNC_INT         , KW_GET_LONG , 2, new ParmType[] { ParmType.BIN, ParmType.INT }));
      map_func.put(KW_GET_PTR,  new FuncDef(FUNC_INT64       , KW_GET_PTR  , 1, new ParmType[] { ParmType.MEM }));
      map_func.put(KW_GET_SHRT, new FuncDef(FUNC_INT         , KW_GET_SHRT , 2, new ParmType[] { ParmType.BIN, ParmType.INT }));
      map_func.put(KW_GET_SZ,   new FuncDef(FUNC_INT64       , KW_GET_SZ   , 1, new ParmType[] { ParmType.MEM }));
      map_func.put(KW_GET_STR,  new FuncDef(FUNC_CHAR        , KW_GET_STR  , 2, new ParmType[] { ParmType.BIN, ParmType.INT, ParmType.INT }));
      map_func.put(KW_GET_TNOD, new FuncDef(FUNC_HANDLE      , KW_GET_TNOD , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_GET_UL,   new FuncDef(FUNC_INT64       , KW_GET_UL   , 2, new ParmType[] { ParmType.BIN, ParmType.INT }));
      map_func.put(KW_GET_USHT, new FuncDef(FUNC_INT         , KW_GET_USHT , 2, new ParmType[] { ParmType.BIN, ParmType.INT }));
      map_func.put(KW_GUID,     new FuncDef(FUNC_CHAR        , KW_GUID     , 0, new ParmType[] { ParmType.RAW }));
      map_func.put(KW_HANDLE,   new FuncDef(FUNC_HANDLE      , KW_HANDLE   , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_HASHCODE, new FuncDef(FUNC_INT         , KW_HASHCODE , 0, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_HEX_DECD, new FuncDef(FUNC_RAW         , KW_HEX_DECD , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_HEX_ENCD, new FuncDef(FUNC_CHAR        , KW_HEX_ENCD , 1, new ParmType[] { ParmType.RAW }));
      map_func.put(KW_IF,       new FuncDef(FUNC_POLY        , KW_IF       , 1, new ParmType[] { ParmType.LOG, ParmType.BDT, ParmType.BDT }));
      map_func.put(KW_INDEX,    new FuncDef(FUNC_INT         , KW_INDEX    , 2, new ParmType[] { ParmType.TEXT, ParmType.TEXT, ParmType.INT }));
      map_func.put(KW_INPUT,    new FuncDef(FUNC_POLY        , KW_INPUT    , 1, new ParmType[] { ParmType.BDT, ParmType.BDT }));
      map_func.put(KW_INT,      new FuncDef(FUNC_INT         , KW_INT      , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_INT64,    new FuncDef(FUNC_INT64       , KW_INT64    , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_INTERVAL, new FuncDef(FUNC_INT64       , KW_INTERVAL , 3, new ParmType[] { ParmType.DATE, ParmType.DATE, ParmType.CHAR }));
      map_func.put(KW_IS_CP_FX, new FuncDef(FUNC_LOGICAL     , KW_IS_CP_FX , 1, new ParmType[] { ParmType.LC }));
      map_func.put(KW_IS_COLCP, new FuncDef(FUNC_LOGICAL     , KW_IS_COLCP , 1, new ParmType[] { ParmType.CLOB }));
      map_func.put(KW_IS_LEAD,  new FuncDef(FUNC_LOGICAL     , KW_IS_LEAD  , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_ISO_DATE, new FuncDef(FUNC_CHAR        , KW_ISO_DATE , 1, new ParmType[] { ParmType.DATE }));
      map_func.put(KW_KBLABEL,  new FuncDef(FUNC_CHAR        , KW_KBLABEL  , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_KEYCODE,  new FuncDef(FUNC_INT         , KW_KEYCODE  , 1, new ParmType[] { ParmType.CHAR }));
//      map_func.put("key-code"             , FUNC_INT        , true );
      map_func.put(KW_KEYFUNC,  new FuncDef(FUNC_CHAR        , KW_KEYFUNC  , 1, new ParmType[] { ParmType.INT64 }));
//      map_func.put("key-function"         , FUNC_CHAR       , true );
      map_func.put(KW_KEYLAB,   new FuncDef(FUNC_CHAR        , KW_KEYLAB   , 1, new ParmType[] { ParmType.INT64 }));
//      map_func.put("key-label"            , FUNC_CHAR       , true );
      map_func.put(KW_KW,       new FuncDef(FUNC_CHAR        , KW_KW       , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_KW_ALL,   new FuncDef(FUNC_CHAR        , KW_KW_ALL   , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_LAST,     new FuncDef(FUNC_LOGICAL     , KW_LAST     , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_LAST_OF,  new FuncDef(FUNC_LOGICAL     , KW_LAST_OF  , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_LC,       new FuncDef(FUNC_CHAR        , KW_LC       , 1, new ParmType[] { ParmType.TEXT }));
      // Function LOWER() has the same mapping as LC()
      map_func.put(KW_LDBNAME,  new FuncDef(FUNC_CHAR        , KW_LDBNAME  , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_L_TRIM,   new FuncDef(FUNC_CHAR        , KW_L_TRIM   , 1, new ParmType[] { ParmType.TEXT, ParmType.CHAR }));
      map_func.put(KW_LENGTH,   new FuncDef(FUNC_INT         , KW_LENGTH   , new SignDef[] { new SignDef(1, new ParmType[] { ParmType.CHAR, ParmType.CHAR }), new SignDef(1, new ParmType[] { ParmType.RAW, ParmType.CHAR })}));
      map_func.put(KW_LIB,      new FuncDef(FUNC_CHAR        , KW_LIB      , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_LINE_CNT, new FuncDef(FUNC_INT         , KW_LINE_CNT , 0, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_LST_EVNT, new FuncDef(FUNC_CHAR        , KW_LST_EVNT , 1, new ParmType[] { ParmType.HANDLE, ParmType.CHAR }));
      map_func.put(KW_LST_QRY,  new FuncDef(FUNC_CHAR        , KW_LST_QRY  , 1, new ParmType[] { ParmType.HANDLE }));
      map_func.put(KW_LST_SET,  new FuncDef(FUNC_CHAR        , KW_LST_SET  , 1, new ParmType[] { ParmType.HANDLE }));
      map_func.put(KW_LST_WID,  new FuncDef(FUNC_CHAR        , KW_LST_WID  , 1, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_func.put(KW_LOAD_PIC, new FuncDef(FUNC_COM_HANDLE  , KW_LOAD_PIC , 0, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_LOCKED,   new FuncDef(FUNC_LOGICAL     , KW_LOCKED   , 1, new ParmType[] { ParmType.RECORD }));
      map_func.put(KW_LOG,      new FuncDef(FUNC_DEC         , KW_LOG      , 1, new ParmType[] { ParmType.DEC, ParmType.NUM }));
      map_func.put(KW_LOGICAL,  new FuncDef(FUNC_LOGICAL     , KW_LOGICAL  , 1, new ParmType[] { ParmType.BDT, ParmType.CHAR }));
      map_func.put(KW_LOOKUP,   new FuncDef(FUNC_INT         , KW_LOOKUP   , 2, new ParmType[] { ParmType.CHAR, ParmType.TEXT, ParmType.CHAR }));
      map_func.put(KW_MAX,      new FuncDef(FUNC_POLY        , KW_MAX      , 2, new ParmType[] { ParmType.BDT, ParmType.BDT, ParmType.BDT_VARARGS }));
      map_func.put(KW_MD5_DIG,  new FuncDef(FUNC_RAW         , KW_MD5_DIG  , 1, new ParmType[] { ParmType.BDT, ParmType.BDT }));
      map_func.put(KW_MEMBER,   new FuncDef(FUNC_CHAR        , KW_MEMBER   , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_MIN,      new FuncDef(FUNC_POLY        , KW_MIN      , 2, new ParmType[] { ParmType.BDT, ParmType.BDT, ParmType.NUM_VARARGS }));
      map_func.put(KW_MONTH,    new FuncDef(FUNC_INT         , KW_MONTH    , 1, new ParmType[] { ParmType.DATE }));
      map_func.put(KW_MTIME,    new FuncDef(FUNC_INT         , KW_MTIME    , 0, new ParmType[] { ParmType.DT }));
      map_func.put(KW_NEW,      new FuncDef(FUNC_LOGICAL     , KW_NEW      , 1, new ParmType[] { ParmType.RECORD }));// Only new record function TODO: NEW object function??
      map_func.put(KW_NEXT_VAL, new FuncDef(FUNC_INT64       , KW_NEXT_VAL , 1, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.INT }));
      map_func.put(KW_NORMALZE, new FuncDef(FUNC_POLY        , KW_NORMALZE , 2, new ParmType[] { ParmType.TEXT, ParmType.CHAR }));
      map_func.put(NOT_ENTERED, new FuncDef(FUNC_LOGICAL     , NOT_ENTERED , 1, new ParmType[] { ParmType.WID }));
      map_func.put(KW_NOW,      new FuncDef(FUNC_DATETIME_TZ , KW_NOW      , 0, null));
      map_func.put(KW_NUM_ENT,  new FuncDef(FUNC_INT         , KW_NUM_ENT  , 1, new ParmType[] { ParmType.TEXT, ParmType.CHAR }));
      map_func.put(KW_NUM_RES,  new FuncDef(FUNC_INT         , KW_NUM_RES  , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_OS_G_ENV, new FuncDef(FUNC_CHAR        , KW_OS_G_ENV , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_P2J_RC,   new FuncDef(FUNC_CHAR        , KW_P2J_RC   , 1, new ParmType[] { ParmType.CHAR })); // P2J-extension, not real 4GL!
      map_func.put(KW_PAGE_NUM, new FuncDef(FUNC_INT         , KW_PAGE_NUM , 0, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_PAGE_SZ,  new FuncDef(FUNC_INT         , KW_PAGE_SZ  , 0, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_PDBNAME,  new FuncDef(FUNC_CHAR        , KW_PDBNAME  , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_PROGNAME, new FuncDef(FUNC_CHAR        , KW_PROGNAME , 1, new ParmType[] { ParmType.INT }));
      map_func.put(KW_QRY_OFF,  new FuncDef(FUNC_LOGICAL     , KW_QRY_OFF  , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_QUOTER,   new FuncDef(FUNC_CHAR        , KW_QUOTER   , 1, new ParmType[] { ParmType.BDT, ParmType.CHAR, ParmType.CHAR }));
      map_func.put(KW_R_INDEX,  new FuncDef(FUNC_INT         , KW_R_INDEX  , 2, new ParmType[] { ParmType.TEXT, ParmType.TEXT, ParmType.INT }));
      map_func.put(KW_RAW,      new FuncDef(FUNC_RAW         , KW_RAW      , 1, new ParmType[] { ParmType.BDT, ParmType.INT, ParmType.INT }));
      map_func.put(KW_RANDOM,   new FuncDef(FUNC_INT         , KW_RANDOM   , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_func.put(KW_RECID,    new FuncDef(FUNC_RECID       , KW_RECID    , 1, new ParmType[] { ParmType.RECORD }));
      map_func.put(KW_REC_LEN,  new FuncDef(FUNC_INT         , KW_REC_LEN  , 1, new ParmType[] { ParmType.RECORD }));
      map_func.put(KW_REJECTED, new FuncDef(FUNC_LOGICAL     , KW_REJECTED , 1, new ParmType[] { ParmType.RECORD }));// Temptable buffer??
      map_func.put(KW_REPLACE,  new FuncDef(FUNC_CHAR        , KW_REPLACE  , 3, new ParmType[] { ParmType.TEXT, ParmType.TEXT, ParmType.TEXT }));
      map_func.put(KW_RETRY,    new FuncDef(FUNC_LOGICAL     , KW_RETRY    , 0, null));
      map_func.put(KW_RGB_VAL,  new FuncDef(FUNC_INT         , KW_RGB_VAL  , 3, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT }));
      map_func.put(KW_R_TRIM,   new FuncDef(FUNC_CHAR        , KW_R_TRIM   , 1, new ParmType[] { ParmType.TEXT, ParmType.CHAR }));
      map_func.put(KW_ROUND,    new FuncDef(FUNC_DEC         , KW_ROUND    , 2, new ParmType[] { ParmType.DEC, ParmType.INT }));
      map_func.put(KW_ROWID,    new FuncDef(FUNC_ROWID       , KW_ROWID    , 1, new ParmType[] { ParmType.RECORD }));
      map_func.put(KW_ROW_STAT, new FuncDef(FUNC_INT         , KW_ROW_STAT , 1, new ParmType[] { ParmType.RECORD }));// Temptable buffer??
      map_func.put(KW_SDBNAME,  new FuncDef(FUNC_CHAR        , KW_SDBNAME  , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_SEARCH,   new FuncDef(FUNC_CHAR        , KW_SEARCH   , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_SEEK,     new FuncDef(FUNC_INT         , KW_SEEK     , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_SETUSER,  new FuncDef(FUNC_LOGICAL     , KW_SETUSER  , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_func.put(KW_SET_DBCL, new FuncDef(FUNC_LOGICAL     , KW_SET_DBCL , 1, new ParmType[] { ParmType.HANDLE, ParmType.BDT }));
      map_func.put(KW_SHA1_DIG, new FuncDef(FUNC_RAW         , KW_SHA1_DIG , 1, new ParmType[] { ParmType.BDT, ParmType.BDT }));
      map_func.put(KW_SQRT,     new FuncDef(FUNC_DEC         , KW_SQRT     , 1, new ParmType[] { ParmType.NUM }));
      map_func.put(KW_SSL_SRVN, new FuncDef(FUNC_CHAR        , KW_SSL_SRVN , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_STRING,   new FuncDef(FUNC_CHAR        , KW_STRING   , 1, new ParmType[] { ParmType.BDT, ParmType.CHAR }));
      map_func.put(KW_SUBSTIT,  new FuncDef(FUNC_CHAR        , KW_SUBSTIT  , 1, new ParmType[] { ParmType.TEXT, ParmType.TEXT_VARARGS }));
      map_func.put(KW_SUBSTR,   new FuncDef(FUNC_CHAR        , KW_SUBSTR   , 2, new ParmType[] { ParmType.TEXT, ParmType.INT, ParmType.INT, ParmType.CHAR }));
      map_func.put(KW_SUPER,    new FuncDef(FUNC_POLY        , KW_SUPER    , 0, new ParmType[] { ParmType.BDT_VARARGS }));
      map_func.put(KW_TIME,     new FuncDef(FUNC_INT         , KW_TIME     , 0, null));
      map_func.put(KW_TIMEZONE, new FuncDef(FUNC_INT         , KW_TIMEZONE , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_TO_ROWID, new FuncDef(FUNC_ROWID       , KW_TO_ROWID , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_TODAY,    new FuncDef(FUNC_DATE        , KW_TODAY    , 0, null));
      map_func.put(KW_TRANS,    new FuncDef(FUNC_LOGICAL     , KW_TRANS    , 0, null));
      map_func.put(KW_TRIM,     new FuncDef(FUNC_CHAR        , KW_TRIM     , 1, new ParmType[] { ParmType.TEXT, ParmType.CHAR }));
      map_func.put(KW_TRUNC,    new FuncDef(FUNC_DEC         , KW_TRUNC    , 2, new ParmType[] { ParmType.DEC, ParmType.INT }));
      map_func.put(KW_TYPE_OF,  new FuncDef(FUNC_LOGICAL     , KW_TYPE_OF  , 2, new ParmType[] { ParmType.BDT, ParmType.BDT }));
      map_func.put(KW_USERID,   new FuncDef(FUNC_CHAR        , KW_USERID   , 0, new ParmType[] { ParmType.CHAR }));
//      map_func.put("user"               , FUNC_CHAR           , false); The same as userid function
      map_func.put(KW_VAL_EVT,  new FuncDef(FUNC_LOGICAL     , KW_VAL_EVT  , 2, new ParmType[] { ParmType.HANDLE, ParmType.CHAR, ParmType.CHAR }));
      map_func.put(KW_VAL_HND,  new FuncDef(FUNC_LOGICAL     , KW_VAL_HND  , 1, new ParmType[] { ParmType.HANDLE }));
      map_func.put(KW_VAL_OBJ,  new FuncDef(FUNC_LOGICAL     , KW_VAL_OBJ  , 1, new ParmType[] { ParmType.BDT }));
      map_func.put(KW_WEEK,     new FuncDef(FUNC_INT         , KW_WEEK     , 1, new ParmType[] { ParmType.DATE }));
      map_func.put(KW_WID_HAND, new FuncDef(FUNC_HANDLE      , KW_WID_HAND , 1, new ParmType[] { ParmType.CHAR }));
      map_func.put(KW_YEAR,     new FuncDef(FUNC_INT         , KW_YEAR     , 1, new ParmType[] { ParmType.DATE }));
     
      // Methods added below
      map_meth.put(KW_ACC_CHG,  new FuncDef(METH_LOGICAL     , KW_ACC_CHG  , 0, null));
      map_meth.put(KW_ACC_RCHG, new FuncDef(METH_LOGICAL     , KW_ACC_RCHG , 0, null));
      map_meth.put(KW_ADD_1ST,  new FuncDef(METH_LOGICAL     , KW_ADD_1ST  , 1, new ParmType[] { ParmType.CHAR, ParmType.BDT }));
      map_meth.put(KW_ADD_BUF,  new FuncDef(METH_LOGICAL     , KW_ADD_BUF  , 1, new ParmType[] { ParmType.BDT }));
      map_meth.put(KW_ADD_C_C,  new FuncDef(METH_HANDLE      , KW_ADD_C_C  , 4, new ParmType[] { ParmType.BDT, ParmType.CHAR, ParmType.CHAR, ParmType.CHAR, ParmType.INT, ParmType.CHAR }));
      map_meth.put(KW_ADD_C_F,  new FuncDef(METH_LOGICAL     , KW_ADD_C_F  , 1, new ParmType[] { ParmType.BDT, ParmType.CHAR }));
      map_meth.put(KW_ADD_C_N,  new FuncDef(METH_HANDLE      , KW_ADD_C_N  , 2, new ParmType[] { ParmType.HANDLE, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_ADD_EVTP, new FuncDef(METH_LOGICAL     , KW_ADD_EVTP , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_ADD_F_F,  new FuncDef(METH_LOGICAL     , KW_ADD_F_F  , 1, new ParmType[] { ParmType.BDT, ParmType.CHAR }));
      map_meth.put(KW_ADD_F_N,  new FuncDef(METH_HANDLE      , KW_ADD_F_N  , 1, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_ADD_HENT, new FuncDef(METH_LOGICAL     , KW_ADD_HENT , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_ADD_IDXF, new FuncDef(METH_LOGICAL     , KW_ADD_IDXF , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_ADD_L_C,  new FuncDef(METH_HANDLE      , KW_ADD_L_C  , 1, new ParmType[] { ParmType.BDT, ParmType.INT, ParmType.CHAR }));
      map_meth.put(KW_ADD_L_N,  new FuncDef(METH_HANDLE      , KW_ADD_L_N  , 1, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_ADD_LAST, new FuncDef(METH_LOGICAL     , KW_ADD_LAST , 1, new ParmType[] { ParmType.CHAR, ParmType.BDT }));
      map_meth.put(KW_ADD_LIKF, new FuncDef(METH_LOGICAL     , KW_ADD_LIKF , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_ADD_LIKI, new FuncDef(METH_LOGICAL     , KW_ADD_LIKI , 3, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_ADD_N_N,  new FuncDef(METH_HANDLE      , KW_ADD_N_N  , 2, new ParmType[] { ParmType.HANDLE, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_ADD_NEWF, new FuncDef(METH_LOGICAL     , KW_ADD_NEWF , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.INT, ParmType.CHAR, ParmType.BDT, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_ADD_NEWI, new FuncDef(METH_LOGICAL     , KW_ADD_NEWI , 1, new ParmType[] { ParmType.CHAR, ParmType.LOG, ParmType.LOG, ParmType.LOG }));
      map_meth.put(KW_ADD_PREL, new FuncDef(METH_HANDLE      , KW_ADD_PREL , 2, new ParmType[] { ParmType.HANDLE, ParmType.HANDLE, ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_ADD_REL,  new FuncDef(METH_HANDLE      , KW_ADD_REL  , 2, new ParmType[] { ParmType.HANDLE, ParmType.HANDLE, ParmType.CHAR, ParmType.LOG, ParmType.LOG, ParmType.LOG, ParmType.LOG, ParmType.LOG }));
      map_meth.put(KW_ADD_SLOC, new FuncDef(METH_LOGICAL     , KW_ADD_SLOC , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_ADD_SRCB, new FuncDef(METH_LOGICAL     , KW_ADD_SRCB , 2, new ParmType[] { ParmType.HANDLE, ParmType.CHAR }));
      map_meth.put(KW_ADD_SUP,  new FuncDef(METH_LOGICAL     , KW_ADD_SUP  , 1, new ParmType[] { ParmType.HANDLE, ParmType.INT }));
      map_meth.put(KW_ADD_TAB,  new FuncDef(METH_VOID        , KW_ADD_TAB  , 3, new ParmType[] { ParmType.CHAR, ParmType.INT, ParmType.CHAR }));
      map_meth.put(KW_APPEND_C, new FuncDef(METH_LOGICAL     , KW_APPEND_C , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_APPL_CBK, new FuncDef(METH_LOGICAL     , KW_APPL_CBK , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_ATT_DSRC, new FuncDef(METH_LOGICAL     , KW_ATT_DSRC , 1, new ParmType[] { ParmType.HANDLE, ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_AUTHEN_F, new FuncDef(METH_LOGICAL     , KW_AUTHEN_F , 0, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_BEG_EV_G, new FuncDef(METH_CHAR        , KW_BEG_EV_G , 1, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_BUF_COMP, new FuncDef(METH_LOGICAL     , KW_BUF_COMP , 1, new ParmType[] { ParmType.HANDLE, ParmType.CHAR, ParmType.CHAR, ParmType.CHAR, ParmType.LOG }));
      map_meth.put(KW_BUF_COPY, new FuncDef(METH_LOGICAL     , KW_BUF_COPY , 1, new ParmType[] { ParmType.HANDLE, ParmType.CHAR, ParmType.CHAR, ParmType.LOG }));
      map_meth.put(KW_BUF_CREA, new FuncDef(METH_LOGICAL     , KW_BUF_CREA , 0, new ParmType[] { ParmType.BDT }));
      map_meth.put(KW_BUF_DEL,  new FuncDef(METH_LOGICAL     , KW_BUF_DEL  , 0, null));
      map_meth.put(KW_BUF_FLD,  new FuncDef(METH_LOGICAL     , KW_BUF_FLD  , 1, new ParmType[] { ParmType.BDT }));
      map_meth.put(KW_BUF_REL,  new FuncDef(METH_LOGICAL     , KW_BUF_REL  , 0, null));
      map_meth.put(KW_BUF_VAL,  new FuncDef(METH_POLY        , KW_BUF_VAL  , 0, new ParmType[] { ParmType.INT }));// New method
      map_meth.put(KW_BUF_VLID, new FuncDef(METH_LOGICAL     , KW_BUF_VLID , 0, null));
      map_meth.put(KW_CANC_BRK, new FuncDef(METH_LOGICAL     , KW_CANC_BRK , 0, new ParmType[] { ParmType.CHAR, ParmType.INT }));
      map_meth.put(KW_CANCEL_R, new FuncDef(METH_LOGICAL     , KW_CANCEL_R , 0, null));
      map_meth.put(KW_CLEAR,    new FuncDef(METH_LOGICAL     , KW_CLEAR    , 0, null));
      map_meth.put(KW_CLEA_TAB, new FuncDef(METH_VOID        , KW_CLEA_TAB , 0, null)); // FWD-extension, not real 4GL!
      map_meth.put(KW_CLEA_WIN, new FuncDef(METH_VOID        , KW_CLEA_WIN , 1, new ParmType[] { ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_CLONE_ND, new FuncDef(METH_LOGICAL     , KW_CLONE_ND , 2, new ParmType[] { ParmType.HANDLE, ParmType.LOG }));
      map_meth.put(KW_CLOSE_LG, new FuncDef(METH_LOGICAL     , KW_CLOSE_LG , 0, null));
      map_meth.put(KW_CLR_ALL,  new FuncDef(METH_VOID        , KW_CLR_ALL  , 0, null));
      map_meth.put(KW_CLR_AP_C, new FuncDef(METH_LOGICAL     , KW_CLR_AP_C , 0, null));
      map_meth.put(KW_CLR_LOG,  new FuncDef(METH_LOGICAL     , KW_CLR_LOG  , 0, null));
      map_meth.put(KW_CLR_S_AR, new FuncDef(METH_LOGICAL     , KW_CLR_S_AR , 0, null));
      map_meth.put(KW_CLR_SEL,  new FuncDef(METH_LOGICAL     , KW_CLR_SEL  , 0, null));
      map_meth.put(KW_CLR_TABS, new FuncDef(METH_VOID        , KW_CLR_TABS , 0, null));
      map_meth.put(KW_CNCL_R_A, new FuncDef(METH_LOGICAL     , KW_CNCL_R_A , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_COL_NODE, new FuncDef(METH_VOID        , KW_COL_NODE , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_COLL_A_E, new FuncDef(METH_VOID        , KW_COLL_A_E , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_COLL_ALL, new FuncDef(METH_VOID        , KW_COLL_ALL , 0, null));
      map_meth.put(KW_CONN_ED,  new FuncDef(METH_LOGICAL     , KW_CONN_ED  , 0, null));
      map_meth.put(KW_CONN,     new FuncDef(METH_LOGICAL     , KW_CONN     , 0, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_CPY_DSET, new FuncDef(METH_LOGICAL     , KW_CPY_DSET , 1, new ParmType[] { ParmType.HANDLE, ParmType.LOG, ParmType.LOG, ParmType.LOG, ParmType.CHAR, ParmType.LOG, ParmType.CHAR  }));
      map_meth.put(KW_CPY_SATR, new FuncDef(METH_LOGICAL     , KW_CPY_SATR , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_CPY_TTBL, new FuncDef(METH_LOGICAL     , KW_CPY_TTBL , 1, new ParmType[] { ParmType.HANDLE, ParmType.LOG, ParmType.LOG, ParmType.LOG, ParmType.CHAR }));
      map_meth.put(KW_CR_LK_SQ, new FuncDef(METH_LOGICAL     , KW_CR_LK_SQ , 1, new ParmType[] { ParmType.BDT, ParmType.CHAR }));
      map_meth.put(KW_CRE_IMAG, new FuncDef(METH_INT         , KW_CRE_IMAG , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_CREAT_LK, new FuncDef(METH_LOGICAL     , KW_CREAT_LK , 1, new ParmType[] { ParmType.BDT, ParmType.CHAR }));
      map_meth.put(KW_CREAT_ND, new FuncDef(METH_LOGICAL     , KW_CREAT_ND , 1, new ParmType[] { ParmType.BDT, ParmType.CHAR }));
      map_meth.put(KW_CREAT_NN, new FuncDef(METH_LOGICAL     , KW_CREAT_NN , 4, new ParmType[] { ParmType.HANDLE, ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_CREAT_RL, new FuncDef(METH_LOGICAL     , KW_CREAT_RL , 0, null));
      map_meth.put(KW_CREAT_SN, new FuncDef(METH_VOID        , KW_CREAT_SN , 7, new ParmType[] { ParmType.NUM, ParmType.CHAR, ParmType.CHAR, ParmType.LOG, ParmType.NUM, ParmType.NUM, ParmType.INT }));
      map_meth.put(KW_CRT_COL,  new FuncDef(METH_INT         , KW_CRT_COL  , 6, new ParmType[] { ParmType.TEXT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_CUR_QRY,  new FuncDef(METH_HANDLE      , KW_CUR_QRY  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_CVT_2OFF, new FuncDef(METH_INT         , KW_CVT_2OFF , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_DEBUG,    new FuncDef(METH_LOGICAL     , KW_DEBUG    , 0, null));
      map_meth.put(KW_DECL_NSP, new FuncDef(METH_LOGICAL     , KW_DECL_NSP , 1, new ParmType[] { ParmType.TEXT, ParmType.TEXT }));
      map_meth.put(KW_DEL_C_R,  new FuncDef(METH_LOGICAL     , KW_DEL_C_R  , 0, null));
      map_meth.put(KW_DEL_CHAR, new FuncDef(METH_LOGICAL     , KW_DEL_CHAR , 0, null));
      map_meth.put(KW_DEL_H_EN, new FuncDef(METH_LOGICAL     , KW_DEL_H_EN , 0, null));
      map_meth.put(KW_DEL_LINE, new FuncDef(METH_LOGICAL     , KW_DEL_LINE , 0, null));
      map_meth.put(KW_DEL_NODE, new FuncDef(METH_LOGICAL     , KW_DEL_NODE , 0, null));
      map_meth.put(KW_DEL_R_L,  new FuncDef(METH_LOGICAL     , KW_DEL_R_L  , 0, null));
      map_meth.put(KW_DEL_S_R,  new FuncDef(METH_LOGICAL     , KW_DEL_S_R  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_DEL_S_RS, new FuncDef(METH_LOGICAL     , KW_DEL_S_RS , 0, null));
      map_meth.put(KW_DELETE,   new FuncDef(METH_LOGICAL     , KW_DELETE   , 1, new ParmType[] { ParmType.BDT }));
      map_meth.put(KW_DESEL_FR, new FuncDef(METH_LOGICAL     , KW_DESEL_FR , 0, null));
      map_meth.put(KW_DESEL_R,  new FuncDef(METH_LOGICAL     , KW_DESEL_R  , 0, null));
      map_meth.put(KW_DESEL_SR, new FuncDef(METH_LOGICAL     , KW_DESEL_SR , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_DET_DSRC, new FuncDef(METH_LOGICAL     , KW_DET_DSRC , 0, null));
      map_meth.put(KW_DIS_D_TR, new FuncDef(METH_LOGICAL     , KW_DIS_D_TR , 0, null));
      map_meth.put(KW_DIS_L_TR, new FuncDef(METH_LOGICAL     , KW_DIS_L_TR , 1, new ParmType[] { ParmType.LOG }));
      map_meth.put(KW_DISABL_C, new FuncDef(METH_LOGICAL     , KW_DISABL_C , 0, null));
      map_meth.put(KW_DISABLE,  new FuncDef(METH_LOGICAL     , KW_DISABLE  , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_DISCONN,  new FuncDef(METH_LOGICAL     , KW_DISCONN  , 0, null));
      map_meth.put(KW_DISP_MSG, new FuncDef(METH_LOGICAL     , KW_DISP_MSG , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_DUMP_LGN, new FuncDef(METH_LOGICAL     , KW_DUMP_LGN , 1, new ParmType[] { ParmType.LOG }));
      map_meth.put(KW_EDIT_CLR, new FuncDef(METH_LOGICAL     , KW_EDIT_CLR , 0, null));
      map_meth.put(KW_EDIT_CPY, new FuncDef(METH_LOGICAL     , KW_EDIT_CPY , 0, null));
      map_meth.put(KW_EDIT_CUT, new FuncDef(METH_LOGICAL     , KW_EDIT_CUT , 0, null));
      map_meth.put(KW_EDIT_PAS, new FuncDef(METH_LOGICAL     , KW_EDIT_PAS , 0, null));
      map_meth.put(KW_EDIT_UND, new FuncDef(METH_LOGICAL     , KW_EDIT_UND , 0, null));
      map_meth.put(KW_EMPTY_DS, new FuncDef(METH_LOGICAL     , KW_EMPTY_DS , 0, null));
      map_meth.put(KW_EMPTY_TT, new FuncDef(METH_LOGICAL     , KW_EMPTY_TT , 0, null));
      map_meth.put(KW_ENABLE_C, new FuncDef(METH_LOGICAL     , KW_ENABLE_C , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_ENABLE_E, new FuncDef(METH_LOGICAL     , KW_ENABLE_E , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_ENABLE,   new FuncDef(METH_LOGICAL     , KW_ENABLE   , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_ENC_AMK,  new FuncDef(METH_LOGICAL     , KW_ENC_AMK  , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_END_DOC,  new FuncDef(METH_LOGICAL     , KW_END_DOC  , 0, null));
      map_meth.put(KW_END_ELEM, new FuncDef(METH_LOGICAL     , KW_END_ELEM , 1, new ParmType[] { ParmType.TEXT, ParmType.TEXT }));
      map_meth.put(KW_END_EV_G, new FuncDef(METH_LOGICAL     , KW_END_EV_G , 0, null));
      map_meth.put(KW_END_F_D,  new FuncDef(METH_LOGICAL     , KW_END_F_D  , 0, null));
      map_meth.put(KW_ENS_N_V,  new FuncDef(METH_VOID        , KW_ENS_N_V  , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_ENTRY,    new FuncDef(METH_LOGICAL     , KW_ENTRY    , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_EXP_NODE, new FuncDef(METH_VOID        , KW_EXP_NODE , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_EXPA_ALL, new FuncDef(METH_VOID        , KW_EXPA_ALL , 0, null));
      map_meth.put(KW_EXPORT_P, new FuncDef(METH_LOGICAL     , KW_EXPORT_P , 0, null));
      map_meth.put(KW_EXPORT,   new FuncDef(METH_LOGICAL     , KW_EXPORT   , 0, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_FETCH_SR, new FuncDef(METH_LOGICAL     , KW_FETCH_SR , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_FILL,     new FuncDef(METH_LOGICAL     , KW_FILL     , 0, null));
      map_meth.put(KW_FIND_1ST, new FuncDef(METH_LOGICAL     , KW_FIND_1ST , 1, new ParmType[] { ParmType.CHAR, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_FIND_BR,  new FuncDef(METH_LOGICAL     , KW_FIND_BR  , 1, new ParmType[] { ParmType.ROWID, ParmType.INT, ParmType.LOG }));
      map_meth.put(KW_FIND_CUR, new FuncDef(METH_LOGICAL     , KW_FIND_CUR , 0, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_FIND_LST, new FuncDef(METH_LOGICAL     , KW_FIND_LST , 1, new ParmType[] { ParmType.CHAR, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_FIND_UNI, new FuncDef(METH_LOGICAL     , KW_FIND_UNI , 1, new ParmType[] { ParmType.CHAR, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_FIX_C_L,  new FuncDef(METH_VOID        , KW_FIX_C_L  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_G_C_BGCO, new FuncDef(METH_INT         , KW_G_C_BGCO , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_G_C_FGCO, new FuncDef(METH_INT         , KW_G_C_FGCO , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_G_COL_P,  new FuncDef(METH_INT         , KW_G_COL_P  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_G_COL_W,  new FuncDef(METH_INT         , KW_G_COL_W  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_A_N,  new FuncDef(METH_LOGICAL     , KW_GET_A_N  , 2, new ParmType[] { ParmType.HANDLE, ParmType.CHAR }));
      map_meth.put(KW_GET_ATTR, new FuncDef(METH_LOGICAL     , KW_GET_ATTR , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_B_A,  new FuncDef(METH_INT         , KW_GET_B_A  , 0, null));
      map_meth.put(KW_GET_BDAT, new FuncDef(METH_MEMPTR      , KW_GET_BDAT , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_BLUE, new FuncDef(METH_INT         , KW_GET_BLUE , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_BR_C, new FuncDef(METH_HANDLE      , KW_GET_BR_C , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_BUFH, new FuncDef(METH_HANDLE      , KW_GET_BUFH , 1, new ParmType[] { ParmType.BDT }));
      map_meth.put(KW_GET_C_S,  new FuncDef(METH_VOID        , KW_GET_C_S  , 3, new ParmType[] { ParmType.NUM, ParmType.NUM, ParmType.CHAR }));
      map_meth.put(KW_GET_CBPC, new FuncDef(METH_HANDLE      , KW_GET_CBPC , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_CBPN, new FuncDef(METH_CHAR        , KW_GET_CBPN , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_CGIL, new FuncDef(METH_CHAR        , KW_GET_CGIL , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_CGIV, new FuncDef(METH_CHAR        , KW_GET_CGIV , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_GET_CGLV, new FuncDef(METH_LONGCHAR    , KW_GET_CGLV , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_GET_CHG,  new FuncDef(METH_LOGICAL     , KW_GET_CHG  , 1, new ParmType[] { ParmType.HANDLE, ParmType.LOG }));
      map_meth.put(KW_GET_CHLD, new FuncDef(METH_LOGICAL     , KW_GET_CHLD , 2, new ParmType[] { ParmType.HANDLE, ParmType.INT }));
      map_meth.put(KW_GET_CREL, new FuncDef(METH_HANDLE      , KW_GET_CREL , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_CLNT, new FuncDef(METH_HANDLE      , KW_GET_CLNT , 0, null));
      // GET-COLUMN(n)
      map_meth.put(KW_GET_CFGV, new FuncDef(METH_CHAR        , KW_GET_CFGV , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_1ST,  new FuncDef(METH_LOGICAL     , KW_GET_1ST  , 1, new ParmType[] { ParmType.INT, ParmType.LOG }));
      map_meth.put(KW_GET_CUR,  new FuncDef(METH_LOGICAL     , KW_GET_CUR  , 1, new ParmType[] { ParmType.INT, ParmType.LOG }));
      map_meth.put(KW_GET_D_E,  new FuncDef(METH_LOGICAL     , KW_GET_D_E  , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_GET_D_F,  new FuncDef(METH_CHAR        , KW_GET_D_F  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_DS_B, new FuncDef(METH_HANDLE      , KW_GET_DS_B , 0, null));
      map_meth.put(KW_GET_DYN,  new FuncDef(METH_LOGICAL     , KW_GET_DYN  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_ERRC, new FuncDef(METH_INT         , KW_GET_ERRC , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_ERRR, new FuncDef(METH_INT         , KW_GET_ERRR , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_FCN,  new FuncDef(METH_VOID        , KW_GET_FCN  , 2, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.CHAR }));
      map_meth.put(KW_GET_FNAM, new FuncDef(METH_CHAR        , KW_GET_FNAM , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_FOFF, new FuncDef(METH_INT         , KW_GET_FOFF , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_GRN,  new FuncDef(METH_INT         , KW_GET_GRN  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_HD_E, new FuncDef(METH_LOGICAL     , KW_GET_HD_E , 2, new ParmType[] { ParmType.HANDLE, ParmType.INT }));
      map_meth.put(KW_GET_IBNN, new FuncDef(METH_INT         , KW_GET_IBNN , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_GET_IBQN, new FuncDef(METH_INT         , KW_GET_IBQN , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_ITER, new FuncDef(METH_HANDLE      , KW_GET_ITER , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_LAST, new FuncDef(METH_LOGICAL     , KW_GET_LAST , 1, new ParmType[] { ParmType.INT, ParmType.LOG }));
      map_meth.put(KW_GET_LNBI, new FuncDef(METH_CHAR        , KW_GET_LNBI , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_LPRM, new FuncDef(METH_CHAR        , KW_GET_LPRM , 1, new ParmType[] { ParmType.CHAR, ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_GET_MSG,  new FuncDef(METH_CHAR        , KW_GET_MSG  , 1, new ParmType[] { ParmType.INT }));
      // GET-MESSAGE-TYPE(n)
      map_meth.put(KW_GET_N_AT, new FuncDef(METH_CHAR        , KW_GET_N_AT , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_GET_MOP,  new FuncDef(METH_POLY        , KW_GET_MOP  , 1, null));
      map_meth.put(KW_GET_N_BG, new FuncDef(METH_INT         , KW_GET_N_BG , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_N_FG, new FuncDef(METH_INT         , KW_GET_N_FG , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_N_HC, new FuncDef(METH_LOGICAL     , KW_GET_N_HC , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_N_N , new FuncDef(METH_INT         , KW_GET_N_N  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_NEXT, new FuncDef(METH_LOGICAL     , KW_GET_NEXT , 1, new ParmType[] { ParmType.INT, ParmType.LOG }));
      map_meth.put(KW_GET_NLEV, new FuncDef(METH_INT         , KW_GET_NLEV , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_NODE, new FuncDef(METH_LOGICAL     , KW_GET_NODE , 1, new ParmType[] { ParmType.BDT }));
      map_meth.put(KW_GET_NSN,  new FuncDef(METH_VOID        , KW_GET_NSN  , 2, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.CHAR }));
      map_meth.put(KW_GET_NUM,  new FuncDef(METH_INT         , KW_GET_NUM  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_NVV,  new FuncDef(METH_LOGICAL     , KW_GET_NVV  , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_PAR,  new FuncDef(METH_LOGICAL     , KW_GET_PAR  , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_GET_PARN, new FuncDef(METH_VOID        , KW_GET_PARN , 2, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.CHAR }));
      map_meth.put(KW_GET_PREV, new FuncDef(METH_LOGICAL     , KW_GET_PREV , 1, new ParmType[] { ParmType.INT, ParmType.LOG }));
      map_meth.put(KW_GET_PROP, new FuncDef(METH_CHAR        , KW_GET_PROP , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_PRT,  new FuncDef(METH_CHAR        , KW_GET_PRT  , 0, null));
      map_meth.put(KW_GET_PSN,  new FuncDef(METH_VOID        , KW_GET_PSN  , 2, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.CHAR }));
      map_meth.put(KW_GET_QNBI, new FuncDef(METH_CHAR        , KW_GET_QNBI , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_R_R,  new FuncDef(METH_INT         , KW_GET_R_R  , 0, null));
      map_meth.put(KW_GET_RED,  new FuncDef(METH_INT         , KW_GET_RED  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_REL,  new FuncDef(METH_HANDLE      , KW_GET_REL  , 1, new ParmType[] { ParmType.BDT }));
      map_meth.put(KW_GET_RGB,  new FuncDef(METH_INT         , KW_GET_RGB  , 1, new ParmType[] { ParmType.INT }));
      // GET-ROW()
      map_meth.put(KW_GET_SNC,  new FuncDef(METH_VOID        , KW_GET_SNC  , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_GET_S_O,  new FuncDef(METH_CHAR        , KW_GET_S_O  , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_SELW, new FuncDef(METH_HANDLE      , KW_GET_SELW , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_SER,  new FuncDef(METH_LONGCHAR    , KW_GET_SER  , 0, null));
      map_meth.put(KW_GET_SIG,  new FuncDef(METH_CHAR        , KW_GET_SIG  , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_SIMG, new FuncDef(METH_MEMPTR      , KW_GET_SIMG , 1, new ParmType[] { ParmType.CHAR, ParmType.CHAR })); // FWD-extension, not real 4GL!
      map_meth.put(KW_GET_SRCB, new FuncDef(METH_HANDLE      , KW_GET_SRCB , 0, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_TBI,  new FuncDef(METH_CHAR        , KW_GET_TBI  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_TBNN, new FuncDef(METH_CHAR        , KW_GET_TBNN , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_GET_TBQN, new FuncDef(METH_CHAR        , KW_GET_TBQN , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_THCH, new FuncDef(METH_DEC         , KW_GET_THCH , 0, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_THPX, new FuncDef(METH_INT         , KW_GET_THPX , 0, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_TI,   new FuncDef(METH_HANDLE      , KW_GET_TI   , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_TOPB, new FuncDef(METH_HANDLE      , KW_GET_TOPB , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_TWCH, new FuncDef(METH_DEC         , KW_GET_TWCH , 1, new ParmType[] { ParmType.CHAR, ParmType.INT }));
      map_meth.put(KW_GET_TWPX, new FuncDef(METH_INT         , KW_GET_TWPX , 1, new ParmType[] { ParmType.CHAR, ParmType.INT }));
      map_meth.put(KW_GET_UBI,  new FuncDef(METH_CHAR        , KW_GET_UBI  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_VBI,  new FuncDef(METH_CHAR        , KW_GET_VBI  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_GET_VBNN, new FuncDef(METH_CHAR        , KW_GET_VBNN , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_GET_VBQN, new FuncDef(METH_CHAR        , KW_GET_VBQN , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_GET_WAIT, new FuncDef(METH_CHAR        , KW_GET_WAIT , 0, null));
      map_meth.put(KW_IDX_INFO, new FuncDef(METH_CHAR        , KW_IDX_INFO , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_IMP_NODE, new FuncDef(METH_LOGICAL     , KW_IMP_NODE , 3, new ParmType[] { ParmType.HANDLE, ParmType.HANDLE, ParmType.LOG }));
      map_meth.put(KW_IMP_PRNC, new FuncDef(METH_LOGICAL     , KW_IMP_PRNC , 1, new ParmType[] { ParmType.RAW }));
      map_meth.put(KW_INC_EX_I, new FuncDef(METH_INT         , KW_INC_EX_I , 1, new ParmType[] { ParmType.INT }));
      // INITIALIZE()
      map_meth.put(KW_INIT_D_T, new FuncDef(METH_LOGICAL     , KW_INIT_D_T , 4, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_INITIATE, new FuncDef(METH_LOGICAL     , KW_INITIATE , 0, null));
      map_meth.put(KW_INS_ATTR, new FuncDef(METH_LOGICAL     , KW_INS_ATTR , 2, new ParmType[] { ParmType.TEXT, ParmType.TEXT, ParmType.TEXT }));
      map_meth.put(KW_INS_B4,   new FuncDef(METH_LOGICAL     , KW_INS_B4   , 2, new ParmType[] { ParmType.HANDLE, ParmType.HANDLE }));
      map_meth.put(KW_INS_BTAB, new FuncDef(METH_LOGICAL     , KW_INS_BTAB , 0, null));
      map_meth.put(KW_INS_FILE, new FuncDef(METH_LOGICAL     , KW_INS_FILE , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_INS_ROW,  new FuncDef(METH_LOGICAL     , KW_INS_ROW  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_INS_STR,  new FuncDef(METH_LOGICAL     , KW_INS_STR  , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_INS_TAB,  new FuncDef(METH_LOGICAL     , KW_INS_TAB  , 0, null));
      map_meth.put(KW_INSERT,   new FuncDef(METH_LOGICAL     , KW_INSERT   , new SignDef[] { new SignDef(2, new ParmType[] { ParmType.CHAR, ParmType.BDT } ), new SignDef(3, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.BDT } ) } ));
      map_meth.put(KW_INVOKE,   new FuncDef(METH_VOID        , KW_INVOKE   , 0, null));
      map_meth.put(KW_IS_C_VIS, new FuncDef(METH_LOGICAL     , KW_IS_C_VIS , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_IS_MSEL,  new FuncDef(METH_LOGICAL     , KW_IS_MSEL  , 1, new ParmType[] { ParmType.LOG }));
      map_meth.put(KW_IS_N_EXP, new FuncDef(METH_LOGICAL     , KW_IS_N_EXP , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_IS_P_SET, new FuncDef(METH_LOGICAL     , KW_IS_P_SET , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_IS_R_SEL, new FuncDef(METH_LOGICAL     , KW_IS_R_SEL , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_IS_SEL,   new FuncDef(METH_LOGICAL     , KW_IS_SEL   , 1, new ParmType[] { ParmType.BDT }));
      map_meth.put(KW_KPAD_HOT, new FuncDef(METH_VOID        , KW_KPAD_HOT , 6, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_KPAD_CLE, new FuncDef(METH_VOID        , KW_KPAD_CLE , 0, null)); // FWD-extension, not real 4GL!
      map_meth.put(KW_KPAD_QRY, new FuncDef(METH_INT         , KW_KPAD_QRY , 1, new ParmType[] { ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_LAST_OF,  new FuncDef(METH_LOGICAL     , KW_LAST_OF  , 1, new ParmType[] { ParmType.INT }));// Not defined in progress.g
      map_meth.put(KW_LCD_REFR, new FuncDef(METH_VOID        , KW_LCD_REFR , 5, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_LCD_SWIN, new FuncDef(METH_VOID        , KW_LCD_SWIN , 4, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_LCD_WSTR, new FuncDef(METH_VOID        , KW_LCD_WSTR , 6, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.CHAR, ParmType.CHAR })); // FWD-extension, not real 4GL!
      map_meth.put(KW_LCHR_2NV, new FuncDef(METH_LOGICAL     , KW_LCHR_2NV , 1, new ParmType[] { ParmType.LC }));
      map_meth.put(KW_LIST_PNM, new FuncDef(METH_CHAR        , KW_LIST_PNM , 0, null));
      map_meth.put(KW_LOAD_DMN, new FuncDef(METH_LOGICAL     , KW_LOAD_DMN , 1, new ParmType[] { ParmType.BDT }));
      map_meth.put(KW_LOAD_I_D, new FuncDef(METH_LOGICAL     , KW_LOAD_I_D , 1, new ParmType[] { ParmType.CHAR, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_LOAD_I_I, new FuncDef(METH_LOGICAL     , KW_LOAD_I_I , 1, new ParmType[] { ParmType.CHAR, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_LOAD_I_U, new FuncDef(METH_LOGICAL     , KW_LOAD_I_U , 1, new ParmType[] { ParmType.CHAR, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_LOAD_ICO, new FuncDef(METH_LOGICAL     , KW_LOAD_ICO , 1, new ParmType[] { ParmType.CHAR, ParmType.INT }));
      map_meth.put(KW_LOAD_IMG, new FuncDef(METH_LOGICAL     , KW_LOAD_IMG , 1, new ParmType[] { ParmType.CHAR, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_LOAD_M_P, new FuncDef(METH_LOGICAL     , KW_LOAD_M_P , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_LOAD_S_I, new FuncDef(METH_LOGICAL     , KW_LOAD_S_I , 1, new ParmType[] { ParmType.CHAR, ParmType.INT }));
      map_meth.put(KW_LOAD,     new FuncDef(METH_LOGICAL     , KW_LOAD     , 3, new ParmType[] { ParmType.CHAR, ParmType.BDT, ParmType.LOG }));// Not defined in progress.g
      map_meth.put(KW_LOCK_REG, new FuncDef(METH_LOGICAL     , KW_LOCK_REG , 0, null));
      map_meth.put(KW_LOG_A_EV, new FuncDef(METH_CHAR        , KW_LOG_A_EV , 2, new ParmType[] { ParmType.INT, ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_LOGOUT,   new FuncDef(METH_LOGICAL     , KW_LOGOUT   , 0, null));
      map_meth.put(KW_LOOKUP,   new FuncDef(METH_INT         , KW_LOOKUP   , 1, new ParmType[] { ParmType.CHAR }));
      // MARK-NEW()
      // MARK-ROW-STATE()
      map_meth.put(KW_M_D_I_P,  new FuncDef(METH_VOID        , KW_M_D_I_P  , 0, null));
      map_meth.put(KW_M_U_I_P,  new FuncDef(METH_VOID        , KW_M_U_I_P  , 0, null));
      map_meth.put(KW_MERGE_CH, new FuncDef(METH_LOGICAL     , KW_MERGE_CH , 1, new ParmType[] { ParmType.HANDLE, ParmType.LOG }));
      map_meth.put(KW_MERGE_RC, new FuncDef(METH_LOGICAL     , KW_MERGE_RC , 0, new ParmType[] { ParmType.HANDLE, ParmType.LOG }));
      map_meth.put(KW_MSG_AMSG, new FuncDef(METH_CHAR        , KW_MSG_AMSG , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_MOV_2_B,  new FuncDef(METH_LOGICAL     , KW_MOV_2_B  , 0, null));
      map_meth.put(KW_MOV_2_T,  new FuncDef(METH_LOGICAL     , KW_MOV_2_T  , 0, null));
      map_meth.put(KW_MOV_2EOF, new FuncDef(METH_LOGICAL     , KW_MOV_2EOF , 0, null));
      map_meth.put(KW_MOV_A_T,  new FuncDef(METH_LOGICAL     , KW_MOV_A_T  , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_MOV_B_T,  new FuncDef(METH_LOGICAL     , KW_MOV_B_T  , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_MOV_COL,  new FuncDef(METH_LOGICAL     , KW_MOV_COL  , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_MPTR_2NV, new FuncDef(METH_LOGICAL     , KW_MPTR_2NV , 1, new ParmType[] { ParmType.MEM }));
      map_meth.put(KW_NEW_SESS, new FuncDef(METH_VOID        , KW_NEW_SESS , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR })); // FWD-extension, not real 4GL!
      map_meth.put(KW_NODE_V2M, new FuncDef(METH_LOGICAL     , KW_NODE_V2M , 1, new ParmType[] { ParmType.MEM }));
      map_meth.put(KW_NODV_2LC, new FuncDef(METH_LOGICAL     , KW_NODV_2LC , 1, new ParmType[] { ParmType.LC, ParmType.CHAR }));
      map_meth.put(KW_NORMALZE, new FuncDef(METH_LOGICAL     , KW_NORMALZE , 0, null));
      map_meth.put(KW_NUM_PNTS, new FuncDef(METH_INT         , KW_NUM_PNTS , 0, null)); // FWD-extension, not real 4GL!
      map_meth.put(KW_QRY_CLOS, new FuncDef(METH_LOGICAL     , KW_QRY_CLOS , 0, null));
      map_meth.put(KW_QRY_OPEN, new FuncDef(METH_LOGICAL     , KW_QRY_OPEN , 0, null));
      map_meth.put(KW_QRY_PREP, new FuncDef(METH_LOGICAL     , KW_QRY_PREP , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_RAW_TRAN, new FuncDef(METH_LOGICAL     , KW_RAW_TRAN , 2, new ParmType[] { ParmType.LOG, ParmType.HANDLE }));
      map_meth.put(KW_READ_FIL, new FuncDef(METH_LOGICAL     , KW_READ_FIL , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_READ_JSN,  new FuncDef(METH_LOGICAL    , KW_READ_JSN , 2, new ParmType[] { ParmType.CHAR, ParmType.BDT, ParmType.CHAR}));
      map_meth.put(KW_READ_XML, new FuncDef(METH_LOGICAL     , KW_READ_XML , 5, new ParmType[] { ParmType.CHAR, ParmType.BDT, ParmType.CHAR, ParmType.CHAR, ParmType.LOG, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_READ_XSC, new FuncDef(METH_LOGICAL     , KW_READ_XSC , 3, new ParmType[] { ParmType.CHAR, ParmType.BDT, ParmType.LOG, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_READ,     new FuncDef(METH_LOGICAL     , KW_READ     , 3, new ParmType[] { ParmType.MEM, ParmType.INT, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_REFR_A_P, new FuncDef(METH_LOGICAL     , KW_REFR_A_P , 1, new ParmType[] { ParmType.BDT }));
      map_meth.put(KW_REFRESH,  new FuncDef(METH_LOGICAL     , KW_REFRESH  , 0, null));
      map_meth.put(KW_REG_DMN,  new FuncDef(METH_LOGICAL     , KW_REG_DMN  , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_REJ_CHGS, new FuncDef(METH_LOGICAL     , KW_REJ_CHGS , 0, null));
      map_meth.put(KW_REJ_RCHG, new FuncDef(METH_LOGICAL     , KW_REJ_RCHG , 0, null));
      map_meth.put(KW_REM_ATTR, new FuncDef(METH_LOGICAL     , KW_REM_ATTR , 1, new ParmType[] { ParmType.BDT, ParmType.CHAR }));
      map_meth.put(KW_REM_CHLD, new FuncDef(METH_LOGICAL     , KW_REM_CHLD , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_REM_EVTP, new FuncDef(METH_LOGICAL     , KW_REM_EVTP , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_REM_NODE, new FuncDef(METH_VOID        , KW_REM_NODE , 1, new ParmType[] { ParmType.NUM }));
      map_meth.put(KW_REM_SUP,  new FuncDef(METH_LOGICAL     , KW_REM_SUP  , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_REP_CHLD, new FuncDef(METH_LOGICAL     , KW_REP_CHLD , 2, new ParmType[] { ParmType.HANDLE, ParmType.HANDLE }));
      map_meth.put(KW_REP_STXT, new FuncDef(METH_LOGICAL     , KW_REP_STXT , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_REPLACE,  new FuncDef(METH_LOGICAL     , KW_REPLACE  , new SignDef[] { new SignDef(2, new ParmType[] { ParmType.CHAR, ParmType.BDT } ), new SignDef(3, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.BDT } ) } ));
      map_meth.put(KW_REPOS_2I, new FuncDef(METH_LOGICAL     , KW_REPOS_2I , 1, new ParmType[] { ParmType.ROWID_ARRAY, ParmType.INT }));
      map_meth.put(KW_REPOS_2R, new FuncDef(METH_LOGICAL     , KW_REPOS_2R , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_REPOS_B,  new FuncDef(METH_LOGICAL     , KW_REPOS_B  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_REPOS_F,  new FuncDef(METH_LOGICAL     , KW_REPOS_F  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_RESET,    new FuncDef(METH_LOGICAL     , KW_RESET    , 0, null));
      map_meth.put(KW_RESORT,   new FuncDef(METH_VOID        , KW_RESORT   , 0, null));
      map_meth.put(KW_S_C_BGCO, new FuncDef(METH_VOID        , KW_S_C_BGCO , 3, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_S_C_FGCO, new FuncDef(METH_VOID        , KW_S_C_FGCO , 3, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_S_COL_C,  new FuncDef(METH_VOID        , KW_S_COL_C  , 2, new ParmType[] { ParmType.INT, ParmType.CHAR }));
      map_meth.put(KW_S_COL_W,  new FuncDef(METH_VOID        , KW_S_COL_W  , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_SAVE_FIL, new FuncDef(METH_LOGICAL     , KW_SAVE_FIL , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_SAVE_RCH, new FuncDef(METH_LOGICAL     , KW_SAVE_RCH , 0, new ParmType[] { ParmType.BDT, ParmType.CHAR, ParmType.LOG }));
      map_meth.put(KW_SAVE,     new FuncDef(METH_LOGICAL     , KW_SAVE     , 1, new ParmType[] { ParmType.CHAR, ParmType.BDT }));
      map_meth.put(KW_SAX_PARF, new FuncDef(METH_VOID        , KW_SAX_PARF , 0, null));
      map_meth.put(KW_SAX_PARN, new FuncDef(METH_VOID        , KW_SAX_PARN , 0, null));
      map_meth.put(KW_SAX_PARS, new FuncDef(METH_VOID        , KW_SAX_PARS , 0, null));
      map_meth.put(KW_SCR_2CR,  new FuncDef(METH_LOGICAL     , KW_SCR_2CR  , 0, null));
      map_meth.put(KW_SCR_2ITM, new FuncDef(METH_LOGICAL     , KW_SCR_2ITM , 1, new ParmType[] { ParmType.BDT }));
      map_meth.put(KW_SCR_2SR,  new FuncDef(METH_LOGICAL     , KW_SCR_2SR  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_SCR_NTOP, new FuncDef(METH_VOID        , KW_SCR_NTOP , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_SCR_VERT, new FuncDef(METH_VOID        , KW_SCR_VERT , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_SEAL,     new FuncDef(METH_LOGICAL     , KW_SEAL     , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_SEARCH,   new FuncDef(METH_LOGICAL     , KW_SEARCH   , 2, new ParmType[] { ParmType.CHAR, ParmType.INT }));
      map_meth.put(KW_SEL_ALL,  new FuncDef(METH_LOGICAL     , KW_SEL_ALL  , 0, new ParmType[] { ParmType.ROWID_ARRAY, ParmType.ROWID_ARRAY }));
      map_meth.put(KW_SEL_FOCR, new FuncDef(METH_LOGICAL     , KW_SEL_FOCR , 0, null));
      map_meth.put(KW_SEL_NEXT, new FuncDef(METH_LOGICAL     , KW_SEL_NEXT , 0, null));
      map_meth.put(KW_SEL_PREV, new FuncDef(METH_LOGICAL     , KW_SEL_PREV , 0, null));
      map_meth.put(KW_SEL_ROW,  new FuncDef(METH_LOGICAL     , KW_SEL_ROW  , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_SEL_SFVN, new FuncDef(METH_VOID        , KW_SEL_SFVN , 1, new ParmType[] { ParmType.INT }));
      map_meth.put(KW_SERIALZR, new FuncDef(METH_LOGICAL     , KW_SERIALZR , 3, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.BDT,ParmType.LOG, ParmType.CHAR, ParmType.LOG, ParmType.LOG }));
      map_meth.put(KW_SET_ACTR, new FuncDef(METH_LOGICAL     , KW_SET_ACTR , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_SET_A_N,  new FuncDef(METH_LOGICAL     , KW_SET_A_N  , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_SET_ACTX, new FuncDef(METH_CHAR        , KW_SET_ACTX , 1, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_SET_ATTR, new FuncDef(METH_LOGICAL     , KW_SET_ATTR , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_SET_BLUE, new FuncDef(METH_LOGICAL     , KW_SET_BLUE , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_SET_BRK,  new FuncDef(METH_LOGICAL     , KW_SET_BRK  , 0, new ParmType[] { ParmType.CHAR, ParmType.INT }));
      map_meth.put(KW_SET_BUF,  new FuncDef(METH_LOGICAL     , KW_SET_BUF  , 1, new ParmType[] { ParmType.BDT_VARARGS }));
      map_meth.put(KW_SET_C_IC, new FuncDef(METH_VOID        , KW_SET_C_IC , 3, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_SET_C_P,  new FuncDef(METH_LOGICAL     , KW_SET_C_P  , 1, new ParmType[] { ParmType.CHAR, ParmType.HANDLE }));
      map_meth.put(KW_SET_C_S,  new FuncDef(METH_VOID        , KW_SET_C_S  , 3, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.CHAR }));
      map_meth.put(KW_SET_C_VI, new FuncDef(METH_VOID        , KW_SET_C_VI , 2, new ParmType[] { ParmType.INT, ParmType.LOG }));
      map_meth.put(KW_SET_CB_P, new FuncDef(METH_LOGICAL     , KW_SET_CB_P , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.HANDLE }));
      map_meth.put(KW_SET_CBAC, new FuncDef(METH_LOGICAL     , KW_SET_CBAC , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR, ParmType.BDT }));
      map_meth.put(KW_SET_CLNT, new FuncDef(METH_LOGICAL     , KW_SET_CLNT , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_SET_COMM, new FuncDef(METH_LOGICAL     , KW_SET_COMM , 0, null));
      map_meth.put(KW_SET_CPTM, new FuncDef(METH_VOID        , KW_SET_CPTM , 1, new ParmType[] { ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_SET_DYN,  new FuncDef(METH_LOGICAL     , KW_SET_DYN  , 2, new ParmType[] { ParmType.INT, ParmType.LOG }));
      map_meth.put(KW_SET_F_D,  new FuncDef(METH_VOID        , KW_SET_F_D  , 2, new ParmType[] { ParmType.CHAR, ParmType.INT }));
      map_meth.put(KW_SET_GRN,  new FuncDef(METH_LOGICAL     , KW_SET_GRN  , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_SET_IMGF, new FuncDef(METH_VOID        , KW_SET_IMGF , 1, new ParmType[] { ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_SET_IMGH, new FuncDef(METH_VOID        , KW_SET_IMGH , 1, new ParmType[] { ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_SET_IMGW, new FuncDef(METH_VOID        , KW_SET_IMGW , 1, new ParmType[] { ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_SET_ISRC, new FuncDef(METH_LOGICAL     , KW_SET_ISRC , 2, new ParmType[] { ParmType.CHAR, ParmType.BDT }));
      map_meth.put(KW_SET_JMOD, new FuncDef(METH_VOID        , KW_SET_JMOD , 1, new ParmType[] { ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_SET_JSTX, new FuncDef(METH_VOID        , KW_SET_JSTX , 1, new ParmType[] { ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_SET_JSTY, new FuncDef(METH_VOID        , KW_SET_JSTY , 1, new ParmType[] { ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_SET_M_UN, new FuncDef(METH_LOGICAL     , KW_SET_M_UN , 1, new ParmType[] { ParmType.LOG }));
      map_meth.put(KW_SET_MSEL, new FuncDef(METH_VOID        , KW_SET_MSEL , 2, new ParmType[] { ParmType.LOG, ParmType.LOG }));
      map_meth.put(KW_SET_N_BG, new FuncDef(METH_VOID        , KW_SET_N_BG , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_SET_N_FG, new FuncDef(METH_VOID        , KW_SET_N_FG , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_SET_N_F,  new FuncDef(METH_LOGICAL     , KW_SET_N_F  , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_SET_N_HC, new FuncDef(METH_VOID        , KW_SET_N_HC , 2, new ParmType[] { ParmType.INT, ParmType.LOG }));
      map_meth.put(KW_SET_NODE, new FuncDef(METH_LOGICAL     , KW_SET_NODE , 1, new ParmType[] { ParmType.HANDLE }));
      map_meth.put(KW_SET_ODST, new FuncDef(METH_LOGICAL     , KW_SET_ODST , 2, new ParmType[] { ParmType.CHAR, ParmType.BDT }));
      map_meth.put(KW_SET_PARM, new FuncDef(METH_LOGICAL     , KW_SET_PARM , 4, new ParmType[] { ParmType.INT, ParmType.CHAR, ParmType.CHAR, ParmType.BDT }));
      map_meth.put(KW_SET_PENW, new FuncDef(METH_VOID        , KW_SET_PENW , 1, new ParmType[] { ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_SET_PROP, new FuncDef(METH_LOGICAL     , KW_SET_PROP , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_SET_RED,  new FuncDef(METH_LOGICAL     , KW_SET_RED  , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_SET_RGB,  new FuncDef(METH_LOGICAL     , KW_SET_RGB  , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_SET_ROLL, new FuncDef(METH_LOGICAL     , KW_SET_ROLL , 0, null));
      map_meth.put(KW_SET_RPOS, new FuncDef(METH_LOGICAL     , KW_SET_RPOS , 2, new ParmType[] { ParmType.INT, ParmType.CHAR }));
      map_meth.put(KW_SET_RRP,  new FuncDef(METH_LOGICAL     , KW_SET_RRP  , 1, new ParmType[] { ParmType.CHAR, ParmType.HANDLE }));
      map_meth.put(KW_SET_S_AR, new FuncDef(METH_LOGICAL     , KW_SET_S_AR , 2, new ParmType[] { ParmType.INT, ParmType.LOG, ParmType.INT }));
      map_meth.put(KW_SET_S_O,  new FuncDef(METH_LOGICAL     , KW_SET_S_O  , 2, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_SET_SEL,  new FuncDef(METH_LOGICAL     , KW_SET_SEL  , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_SET_SERD, new FuncDef(METH_LOGICAL     , KW_SET_SERD , 1, new ParmType[] { ParmType.LC }));
      map_meth.put(KW_SET_SNC,  new FuncDef(METH_VOID        , KW_SET_SNC  , 2, new ParmType[] { ParmType.INT, ParmType.INT }));
      map_meth.put(KW_SET_SWIN, new FuncDef(METH_VOID        , KW_SET_SWIN , 5, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT, ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_SET_TBME, new FuncDef(METH_VOID        , KW_SET_TBME , 1, new ParmType[] { ParmType.LOG })); // FWD-extension, not real 4GL!
      map_meth.put(KW_SET_TN_I, new FuncDef(METH_VOID        , KW_SET_TN_I , 3, new ParmType[] { ParmType.INT, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_SET_TSTA, new FuncDef(METH_VOID        , KW_SET_TSTA , 1, new ParmType[] { ParmType.INT })); // FWD-extension, not real 4GL!
      map_meth.put(KW_SET_WAIT, new FuncDef(METH_LOGICAL     , KW_SET_WAIT , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_START_DC, new FuncDef(METH_LOGICAL     , KW_START_DC , 0, null));
      map_meth.put(KW_START_EL, new FuncDef(METH_LOGICAL     , KW_START_EL , 1, new ParmType[] { ParmType.TEXT, ParmType.TEXT, ParmType.HANDLE }));
      map_meth.put(KW_STOP_PRS, new FuncDef(METH_LOGICAL     , KW_STOP_PRS , 0, null));
      map_meth.put(KW_STR_VAL,  new FuncDef(METH_CHAR        , KW_STR_VAL  , 1, new ParmType[] { ParmType.INT })); // Not defined in progress.g
      map_meth.put(KW_SYNCHRON, new FuncDef(METH_LOGICAL     , KW_SYNCHRON , 0, null));
      map_meth.put(KW_TT_PREP,  new FuncDef(METH_LOGICAL     , KW_TT_PREP  , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_TEN_ID,   new FuncDef(METH_INT         , KW_TEN_ID   , 0, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_TENNAME,  new FuncDef(METH_CHAR        , KW_TENNAME  , 0, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_UPD_ATTR, new FuncDef(METH_LOGICAL     , KW_UPD_ATTR , 2, new ParmType[] { ParmType.BDT, ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_URL_DECO, new FuncDef(METH_CHAR        , KW_URL_DECO , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_URL_ENCO, new FuncDef(METH_CHAR        , KW_URL_ENCO , 0, null));  // TODO: find the number of arguments
      map_meth.put(KW_USR_DATA, new FuncDef(METH_LOGICAL     , KW_USR_DATA , 1, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_V_N_CNT , new FuncDef(METH_INT         , KW_V_N_CNT  , 0, null));
      map_meth.put(KW_VAL_SEAL, new FuncDef(METH_LOGICAL     , KW_VAL_SEAL , 0, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_VALIDATE, new FuncDef(METH_LOGICAL     , KW_VALIDATE , 0, new ParmType[] { ParmType.CHAR }));
      map_meth.put(KW_WR_CDATA, new FuncDef(METH_LOGICAL     , KW_WR_CDATA , 1, new ParmType[] { ParmType.TEXT }));
      map_meth.put(KW_WR_CHARS, new FuncDef(METH_LOGICAL     , KW_WR_CHARS , 1, new ParmType[] { ParmType.TEXT }));
      map_meth.put(KW_WR_CMNT,  new FuncDef(METH_LOGICAL     , KW_WR_CMNT  , 1, new ParmType[] { ParmType.TEXT }));
      map_meth.put(KW_WR_D_ELM, new FuncDef(METH_LOGICAL     , KW_WR_D_ELM , 2, new ParmType[] { ParmType.TEXT, ParmType.TEXT, ParmType.TEXT, ParmType.HANDLE }));
      map_meth.put(KW_WR_E_ELM, new FuncDef(METH_LOGICAL     , KW_WR_E_ELM , 1, new ParmType[] { ParmType.TEXT, ParmType.TEXT, ParmType.HANDLE }));
      map_meth.put(KW_WR_ENT_R, new FuncDef(METH_LOGICAL     , KW_WR_ENT_R , 1, new ParmType[] { ParmType.TEXT }));
      map_meth.put(KW_WR_EXDTD, new FuncDef(METH_LOGICAL     , KW_WR_EXDTD , 2, new ParmType[] { ParmType.TEXT, ParmType.TEXT, ParmType.TEXT }));
      map_meth.put(KW_WR_FRAGM, new FuncDef(METH_LOGICAL     , KW_WR_FRAGM , 1, new ParmType[] { ParmType.BDT }));
      map_meth.put(KW_WR_JSON,  new FuncDef(METH_LOGICAL     , KW_WR_JSON  , 2, new ParmType[] { ParmType.CHAR, ParmType.BDT, ParmType.LOG, ParmType.CHAR, ParmType.LOG, ParmType.LOG, ParmType.LOG }));
      map_meth.put(KW_WR_MSG,   new FuncDef(METH_LOGICAL     , KW_WR_MSG   , 1, new ParmType[] { ParmType.CHAR, ParmType.CHAR }));
      map_meth.put(KW_WR_PRINS, new FuncDef(METH_LOGICAL     , KW_WR_PRINS , 2, new ParmType[] { ParmType.TEXT, ParmType.TEXT }));
      map_meth.put(KW_WR_XML,   new FuncDef(METH_LOGICAL     , KW_WR_XML   , 2, new ParmType[] { ParmType.CHAR, ParmType.BDT, ParmType.LOG, ParmType.CHAR, ParmType.CHAR, ParmType.LOG, ParmType.LOG, ParmType.LOG, ParmType.LOG }));
      map_meth.put(KW_WR_XMLSC, new FuncDef(METH_LOGICAL     , KW_WR_XMLSC , 2, new ParmType[] { ParmType.CHAR, ParmType.BDT, ParmType.LOG, ParmType.CHAR, ParmType.LOG, ParmType.LOG }));
      map_meth.put(KW_WRITE,    new FuncDef(METH_LOGICAL     , KW_WRITE    , 3, new ParmType[] { ParmType.MEM, ParmType.INT, ParmType.INT }));
      map_meth.put(KW_WR_DATA,  new FuncDef(METH_LOGICAL     , KW_WR_DATA  , 0, null));
      
      // add all attributes and methods from the ProgressParser, no need to maintain a separate map
      Map<Integer, Integer> attrsAndMeths = ProgressParser.getAttributesAndMethods();
      for (Integer key : attrsAndMeths.keySet())
      {
         int type = attrsAndMeths.get(key);
         if (type >= ProgressParser.BEGIN_ATTR && type <= ProgressParser.END_ATTR)
         {
            map_attr.put(key, type);
         }
      }
   }

   /**
    * Lookup the parameter at the specified index position for the function or method
    * specified by keyword.
    *
    * @param    kw
    *           The keyword (oldtype annotation) for this function or method.
    * @param    type
    *           The type of the return value for function of method requested.
    * @param    mand
    *           The numbers of mandatory parameters to search.
    * @param    idx
    *           The zero-based index position of the parameter to lookup.
    *
    * @return   The Java class name of the wrapper class for that parameter or
    *           null if there is no match found for any reason.
    */
   public static String parameterTypeName(int kw, int type, int mand, int idx)
   {
      String cls = null;
      ParmType[] signature = getSignature(kw, type, mand);
      
      if (idx >= 0 && idx < signature.length)
      {
         cls = signature[idx].toString();
      }

      return cls;
   }

   /**
    * Check if the function/method has multiple signatures.
    * 
    * @param    kw
    *           The keyword (oldtype annotation) for this function or method.
    * @param    type
    *           The type of the return value for function of method requested.
    *           
    * @return   <code>true</code> if this function/method accepts multiple signatures.
    */
   public static boolean isMultiSignature(int kw, int type)
   {
      FuncDef function = getDefinition(kw, type);
      
      return function != null && function.signatures.length > 1;
   }

   /**
    * Resolve the signature of the specified function or method.
    * 
    * @param    kw
    *           The keyword (oldtype annotation) for this function or method.
    * @param    type
    *           The type of the return value for function of method requested.
    *           
    * @return   The signature.
    */
   public static ParmType[] getSignature(int kw, int type)
   {
      ParmType[] signature = null;
      FuncDef function = getDefinition(kw, type);
   
      if (function != null)
      {
         if (function.signatures.length != 1)
         {
            // TODO: only one signature expected - throw exception
         }

         signature = function.signatures[0].parms;
         if (signature == null)
         {
            signature = new ParmType[0];
         }
      }
      
      return signature;
   }

   /**
    * Resolve the signature of the specified function or method.
    * 
    * @param    kw
    *           The keyword (oldtype annotation) for this function or method.
    * @param    type
    *           The type of the return value for function of method requested.
    * @param    mand
    *           The numbers of mandatory parameters to search.
    *           
    * @return   The signature.
    */
   public static ParmType[] getSignature(int kw, int type, int mand)
   {
      ParmType[] signature = null;
      FuncDef function = getDefinition(kw, type);
      if (function != null)
      {
         for (int i = 0; i < function.signatures.length; i++)
         {
            SignDef def = function.signatures[i];

            // Scan inside functions with same name but different kind of parameters. The last
            // resort is the mandatory number should identify required function exactly.
            if (def.mand == mand)
            {
               signature = def.parms;
               break;
            }
         }
      }
      
      return signature;
   }

   /**
    * Get the signature of the specified function or method, using the number of passed parameters
    * and the parameter list as a match.
    *
    * @param    kw
    *           The keyword (oldtype annotation) for this function or method.
    * @param    type
    *           The type of the return value for function of method requested.
    * @param    ptypes
    *           String representation of the passed parameters.
    *
    * @return   The signature.
    */
   public static ParmType[] getSignature(int kw, int type, String[] ptypes)
   {
      return getSignature(kw, type, ptypes, false);
   }

   /**
    * Get the signature of the specified function or method, using the number of passed parameters
    * and the parameter list as a match.
    * 
    * @param    kw
    *           The keyword (oldtype annotation) for this function or method.
    * @param    type
    *           The type of the return value for function of method requested.
    * @param    ptypes
    *           String representation of the passed parameters.
    * @param    fuzzyMatch
    *           If it is <code>true</code> and there are no matching signatures, return the first
    *           signature which has an appropriate number of parameters regardless of the
    *           parameter types.
    *
    * @return   The signature.
    */
   public static ParmType[] getSignature(int kw, int type, String[] ptypes, boolean fuzzyMatch)
   {
      ParmType[] signature = null;
      FuncDef function = getDefinition(kw, type);
      
      if (function != null)
      {
         // first pass - match against the definition with the same number of parameters
         signature = lookupSignature(function.signatures, ptypes, true);
         if (signature == null)
         {
            // second pass - match against the definition with more parameters than provided
            signature = lookupSignature(function.signatures, ptypes, false);
         }

         // third pass - try to find "fuzzy" match
         if (fuzzyMatch && signature == null)
         {
            for (SignDef def : function.signatures)
            {
               if (ptypes.length >= def.mand && ptypes.length <= def.parms.length)
               {
                  signature = def.parms;
                  break;
               }
            }
         }
      }

      return signature;
   }
   
   /**
    * Get the type of an attribute.
    * 
    * @param   attr
    *          The attribute id.
    * 
    * @return  the type of the attribute. If argument is not a known attribute {@code null} is 
    *          returned.
    */
   public static Integer getAttributeType(int attr)
   {
      return map_attr.get(attr);
   }
   
   /**
    * Get the {@link FuncDef} instance associated with the specified function or method.
    * 
    * @param    kw
    *           The keyword (oldtype annotation) for this function or method.
    * @param    type
    *           The type of the return value for function of method requested.
    * 
    * @return   The {@link FuncDef} instance.
    */
   private static FuncDef getDefinition(int kw, int type)
   {
      FuncDef function = null;
      
      if (type > BEGIN_FUNCTYPES && type < END_FUNCTYPES)
      {
         function = map_func.get(kw);
      }
      else if (type > BEGIN_METH && type < END_METH)
      {
         function = map_meth.get(kw);
      }
      else
      {
         // Action for unknown type value provided
      }
      
      return function;
   }
   
   /**
    * Search through the given definitions and lookup the one which matches the candidate 
    * parameter types.
    * 
    * @param    signatures
    *           The list of signatures to search.
    * @param    ptypes
    *           The candidate parameter list, with its type specified using the string 
    *           representation of the P2J wrapper type.
    * @param    exact
    *           <code>true</code> to search only the definitions with the same number of 
    *           parameters as the candidate list. Else, it will search all the definitions with
    *           more parameters than the candidate list.
    *           
    * @return   The found signature or <code>null</code> if not found.
    */
   private static ParmType[] lookupSignature(SignDef[] signatures, String[] ptypes, boolean exact)
   {
      ParmType[] signature = null;
      
      // first pass - match against the definition with the same number of parameters
      for (int i = 0; i < signatures.length; i++)
      {
         SignDef def = signatures[i];
         
         // TODO: check if varargs

         if ((ptypes.length == def.parms.length && exact) ||
             (ptypes.length < def.parms.length && !exact && def.mand < def.parms.length))
         {
            boolean ok = true;
            for (int j = 0; j < ptypes.length; j++)
            {
               boolean unknownCandidate = ptypes[j].equals("unknown");
               if (unknownCandidate)
               {
                  // unknown matches with everything
                  continue;
               }
               
               // match the types
               ParmType candidate = ParmType.fromString(ptypes[j]);
               ParmType expected = def.parms[j];
               
               if (!expected.equals(candidate) && !ParmType.typesMatch(candidate, expected))
               {
                  ok = false;
                  break;
               }
            }
            
            if (ok)
            {
               if (signature == null)
               {
                  signature = def.parms;
               }
               else
               {
                  // TODO: more than one signature found, ambiguous case, throw exception
               }
            }
         }
      }
      
      return signature;
   }

   /**
    * A simple structure to contain each function or method definition.
    */
   private static class FuncDef
   {
      /** Return type (one of the FUNC_* or METH_* constants). */
      int ret = -1;

      /** Type of the original keyword, stored in the tree as the "oldtype" annotation. */
      int kw = -1;
      
      /** All possible signatures for this entity. */
      SignDef[] signatures = null;
      
      /**
       * Construct an instance (convenience version).  This form can only be used
       * for functions or methods that don't have multiple conflicting signatures.
       *
       * @param    ret
       *           The return type.
       * @param    kw
       *           The keyword type (from the "oldtype" annotation).
       * @param    mand
       *           Number of parameters that are mandatory (e.g. if there are 5
       *           possible parms and the last 2 are optional, then this will be
       *           3).
       * @param    parms
       *           The specific parameter signature for this function or method.
       */
      public FuncDef(int ret, int kw, int mand, ParmType[] parms)
      {
         this(ret, kw, new SignDef[] { new SignDef(mand, parms) });
      }

      /**
       * Construct an instance.
       *
       * @param    ret
       *           The return type.
       * @param    kw
       *           The keyword type (from the "oldtype" annotation).
       * @param    signatures
       *           An array of signature definitions.
       */
      public FuncDef(int ret, int kw, SignDef[] signatures)
      {
         this.ret        = ret;
         this.kw         = kw;
         this.signatures = signatures;
      }
   }

   /**
    * A simple structure to contain a function or methods parameter signature.
    */
   private static class SignDef
   {
      /** Parameter list codes from leftmost (0 index) to rightmost (highest index). */
      ParmType[] parms = null;

      /**
       * Number of parameters that are mandatory (e.g. if there are 5 possible parms and the
       * last 2 are optional, then this will be 3).
       */
      int mand = -1;

      /**
       * Construct an instance.
       */
      public SignDef(int mand, ParmType[] parms)
      {
         this.mand  = mand;
         this.parms = parms;
      }
   }
}