addInternalFunctions method

void addInternalFunctions()

Implementation

void addInternalFunctions() {
  // encryption / decryption
  addFunction2Param("ENCRYPT", encrypt);
  addFunction2Param("DECRYPT", decrypt);

  // ── Date/time ────────────────────────────────────────────────
  addFunction0Param("NOW", fnNOW);
  addFunction0Param("yesterday", fnYesterday);
  addFunction0Param("last-night", fnLastNight);
  addFunction0Param("last-month", fnLastMonth);
  addFunction0Param("last-week", fnLastWeek);
  addFunction0Param("last-year", fnLastYear);
  addFunction0Param("DATE", fnDATE);
  addFunction1Param("DAY", fnDAY);
  addFunction1Param("DAYOFMONTH", fnDAYOFMONTH);
  addFunction1Param("DAYOFWEEK", fnDAYOFWEEK);
  addFunction1Param("DAYOFYEAR", fnDAYOFYEAR);
  addFunction2Param("DaysInAMonth", fnDaysInAMonth);
  addFunction1Param("HOUR", fnHOUR);
  addFunction1Param("MINUTE", fnMINUTE);
  addFunction1Param("MONTH", fnMONTH);
  addFunction1Param("SECOND", fnSECOND);
  addFunction0Param("TIME", fnTIME);
  addFunction0Param("TODAY", fnTODAY);
  addFunction1Param("WEEK", fnWEEK);
  addFunction1Param("YEAR", fnYEAR);

  // ── String processing ────────────────────────────────────────────────
  addFunction1Param("ASC", fnAsc);
  addFunction1Param("ANSI", fnANSI);
  addFunction1Param("UTF8", fnUTF8);
  addFunction3Param("AnsiDelete", fnAnsiDelete);
  addFunction3Param("AnsiInsert", fnAnsiInsert);
  addFunction1Param("AnsiLength", fnAnsiLength);
  addFunction3Param("AnsiMid", fnAnsiMid);
  addFunction2Param("AnsiPos", fnAnsiPos);
  addFunction1Param("CHR", fnCHR);
  addFunction1Param("CHAR", fnCHR);
  addFunction1Param("CODE", (_) => null);
  addFunction3Param("DELETE", fnDELETE);
  addFunction3Param("DEL", fnDELETE);
  addFunction3Param("DELA", fnAnsiDelete);
  addFunction3Param("DELB", fnAnsiDelete);
  addFunction2Param("FIND", fnPOS);
  addFunction2Param("FINDA", fnAnsiPos);
  addFunction2Param("FINDB", fnAnsiPos);
  addFunction2Param("FORMAT", fnFORMAT);
  addFunction2Param("FormatDateTime", fnFormatDateTime);
  addFunction2Param("FormatFloat", fnFormatFloat);
  addFunction2Param("HEX", fnHex);
  addFunction3Param("INSERT", fnINSERT);
  addFunction3Param("INS", fnINSERT);
  addFunction3Param("INSA", fnAnsiInsert);
  addFunction3Param("INSB", fnAnsiInsert);
  addFunction1Param("LEN", fnLENGTH);
  addFunction1Param("LENA", fnAnsiLength);
  addFunction1Param("LENB", fnAnsiLength);
  addFunction1Param("LENGTH", fnLENGTH);
  addFunction1Param("LOWER", fnLOWER);
  addFunction1Param("LTRIM", fnLTRIM);
  addFunction3Param("MID", fnMID);
  addFunction3Param("MIDA", fnAnsiMid);
  addFunction3Param("MIDB", fnAnsiMid);
  addFunction2Param("POS", fnPOS);
  addFunction3Param("REPLACE", fnREPLACE);
  addFunction3Param("REPLACEA", fnREPLACE);
  addFunction3Param("REPLACEB", fnREPLACE);
  addFunction3Param("REPLACEAT", fnReplaceAt);
  addFunction2Param("REPT", (v1, v2) => null);
  addFunction1Param("RTRIM", fnRTRIM);
  addFunction1Param("TRIM", fnTRIM);
  addFunction1Param("TrimLeft", fnTrimLeft);
  addFunction1Param("TrimRight", fnTrimRight);
  addFunction1Param("UPPER", fnUPPER);
  addFunction1Param("UPPERA", fnUPPERA);
  addFunction2Param("AnsiCompareStr", fnAnsiCompareStr);
  addFunction2Param("AnsiCompareText", fnAnsiCompareText);
  addFunction1Param("AnsiLowerCase", fnAnsiLowerCase);
  addFunction1Param("AnsiUpperCase", fnAnsiUpperCase);
  addFunction2Param("CompareStr", fnCompareStr);
  addFunction2Param("CompareText", fnCompareText);
  addFunction3Param("COPY", fnCOPY);
  addFunction3Param("COPYB", fnCOPY);
  addFunction2Param("INSTR", fnINSTR);
  addFunction2Param("LOCATE", fnLOCATE);
  addFunction2Param("LIKE", fnLIKE);
  addFunction1Param("STR", fnSTR);
  addFunction1Param("VarToStr", fnVarToStr);
  addFunction1Param("IntToStr", fnIntToStr);
  addFunction1Param("FloatToStr", fnFloatToStr);
  addFunction1Param("StrToInt", fnStrToInt);
  addFunction1Param("StrToFloat", fnStrToFloat);
  addFunction1Param("StrToDate", fnStrToDate);
  addFunction1Param("StrToDateTime", fnStrToDateTime);
  addFunction1Param("StrToTime", fnStrToTime);
  addFunction1Param("StrToHex", fnStrToHex);
  addFunction1Param("HexToStr", fnHexToStr);
  addFunction2Param("IntToHex", fnIntToHex);
  addFunction1Param("HexToInt", fnHexToInt);
  addFunction1Param("ColorToHex", fnColorToHex);
  addFunction1Param("HexToColor", fnHexToColor);
  addFunction1Param("HTML", fnHTML);
  addFunction1Param("LEADBYTE", (v) => false);
  addFunction2Param("LEADBYTEB", fnLeadByte);

  // ── Numeric ────────────────────────────────────────────────────
  addFunction1Param("ABS", fnAbs);
  addFunction1Param("CEIL", fnCeil);
  addFunction1Param("FLOOR", fnFloor);
  addFunction1Param("FRAC", fnFrac);
  addFunction1Param("TRUNC", fnTrunc);
  addFunction1Param("INT", fnInt);
  addFunction1Param("float", fnFloat);
  addFunction1Param("SQR", fnSqr);
  addFunction1Param("SQRT", fnSqrt);
  addFunction1Param("EXP", fnExp);
  addFunction1Param("LN", fnLn);
  addFunction2Param("POWER", fnPower);
  addFunction1Param("SIN", fnSin);
  addFunction1Param("COS", fnCos);
  addFunction1Param("TAN", fnTan);
  addFunction1Param("ArcSin", fnArcSin);
  addFunction1Param("ArcCos", fnArcCos);
  addFunction1Param("ArcTan", fnArcTan);
  addFunction0Param("Pi", fnPi);
  addFunctionAParam("Round",        (args) => args.length >= 2
      ? fnRoundTo(args[0], args[1])
      : fnRound(args.isNotEmpty ? args[0] : 0));
  addFunction2Param("RoundTo", fnRoundTo);
  addFunction1Param("Odd", fnOdd);
  addFunction2Param("MAX", fnMax);
  addFunction2Param("MIN", fnMin);
  addFunction1Param("Random", fnRandom);
  addFunction2Param("RandomRange", fnRandomRange);

  // ── Type ────────────────────────────────────────────────────
  addFunction1Param("Assigned", fnAssigned);
  addFunction1Param("ISEVEN", fnISSEVEN);
  addFunction1Param("ISODD", fnISODD);
  addFunction1Param("ISNULL", fnISNULL);
  addFunction1Param("ISNUMBER", fnISNUMBER);
  addFunction1Param("ISTEXT", (v) => v is String);
  addFunction1Param("DEFINE", fnDEFINE);
  addFunction1Param("VarIsNull", fnVarIsNull);
  addFunction1Param("VarType", fnVarType);
  addFunction1Param("TYPENAME", tt_TYPENAME);

  // ── Logic ────────────────────────────────────────────────────
  addFunction0Param("TRUE", fnTRUE);
  addFunction0Param("FALSE", fnFALSE);
  addFunction0Param("NULL", fnNULL);
  addFunction0Param("NBSP", fnNBSP);
  addFunction0Param("DBX", fnDBX);

  // ── Date helpers ────────────────────────────────────────────────
  addFunction1Param("DateTimeToStr", fnDateTimeToStr);
  addFunction1Param("DateToStr", fnDateToStr);
  addFunction1Param("TimeToStr", fnTimeToStr);
  addFunction1Param("MyDate", fnMyDate);
  addFunction1Param("MyDateTime", fnMyDateTime);
  addFunction0Param("TDATE", fnTDATE);
  addFunction1Param("BDATE", fnBDATE);
  addFunction1Param("IsLeapYear", fnIsLeapYear);
  addFunction1Param("ISWEEKEND", tt_ISWEEKEND);
  addFunction1Param("ISWEEKDAY", tt_ISWEEKDAY);

  // ── Misc ────────────────────────────────────────────────────
  addFunction1Param("MD5", fnMD5);
  addFunction1Param("GetUrlContent", fnGetUrlContent);
  addFunction0Param("GetFreeRes", fnGetFreeRes);
  addFunction0Param("GetPhysMem", fnGetPhysMem);
  addFunction0Param("GetMacPhysicalAddress", fnGetMacPhysicalAddress);
  addFunction0Param("CPU", fnCPU);
  addFunction0Param("loCaseInsensitive", fnLoCaseInsensitive);
  addFunction0Param("loPartialKey", fnLoPartialKey);
  addFunction1Param("NAME", fnNAME);
  addFunction1Param("VALUE", fnVALUE);
  addFunction1Param("ARRAY", fnARRAY);
  addFunction2Param("CELL", fnCELL);
  addFunction2Param("img", fnImg);
  addFunction1Param("ExtractFilePath", fnExtractFilePath);
  addFunction1Param("ExtractFileDir", fnExtractFileDir);
  addFunction1Param("ExtractFileDrive", fnExtractFileDrive);
  addFunction1Param("ExtractFileName", fnExtractFileName);
  addFunction1Param("ExtractFileNameNoExt", fnExtractFileNameNoExt);
  addFunction1Param("ExtractFileExt", fnExtractFileExt);
  addFunction2Param("INC", fnINCVal);
  addFunction2Param("dec", fnDECVal);

  // ── IIF ─────────────────────────────────────────────────────
  addFunction3Param("IIF", iif);
  addFunction3Param("IF", iif);

  // ============================================================
  // tt_ custom function library V1.3
  // ============================================================

  // String — advanced
  addFunction2Param("tt_PADL",       tt_PADL);
  addFunction2Param("tt_PADR",       tt_PADR);
  addFunction2Param("tt_PADC",       tt_PADC);
  addFunction3Param("tt_LPAD",       tt_LPAD);
  addFunction3Param("tt_RPAD",       tt_RPAD);
  addFunction2Param("tt_REPEAT",     tt_REPEAT);
  addFunction2Param("tt_COUNTSTR",   tt_COUNTSTR);
  addFunction2Param("tt_STARTSWITH", tt_STARTSWITH);
  addFunction2Param("tt_ENDSWITH",   tt_ENDSWITH);
  addFunction2Param("tt_CONTAINS",   tt_CONTAINS);
  addFunction2Param("tt_WRAP",       tt_WRAP);

  // String — numeric formatting
  addFunction2Param("tt_ZFILL",    tt_ZFILL);
  addFunction2Param("tt_NUMFMT",   tt_NUMFMT);
  addFunction1Param("tt_COMMAFMT", tt_COMMAFMT);

  // Math — advanced
  addFunction2Param("tt_GCD",       tt_GCD);
  addFunction2Param("tt_LCM",       tt_LCM);
  addFunction3Param("tt_CLAMP",     tt_CLAMP);
  addFunction3Param("tt_LERP",      tt_LERP);
  addFunction3Param("tt_BETWEEN",   tt_BETWEEN);
  addFunction2Param("tt_PERCENT",   tt_PERCENT);
  addFunction2Param("tt_ROUNDBANK", tt_ROUNDBANK);

  // Date — advanced
  addFunction3Param("tt_DATEADD",   tt_DATEADD);
  addFunction3Param("tt_DATEDIFF",  tt_DATEDIFF);
  addFunction2Param("tt_DATESTART", tt_DATESTART);
  addFunction2Param("tt_DATEEND",   tt_DATEEND);
  addFunction2Param("tt_WORKDAYS",  tt_WORKDAYS);
  addFunction1Param("tt_QUARTER",   tt_QUARTER);
  addFunction1Param("tt_RDATE",     tt_RDATE);
  addFunction1Param("tt_RDATETIME", tt_RDATETIME);

  // Type checking / safe conversion
  addFunction2Param("tt_NVL",      tt_NVL);
  addFunction3Param("tt_NVL2",     tt_NVL2);
  addFunctionAParam("tt_COALESCE", tt_COALESCE);
  addFunction1Param("tt_TOINT",    tt_TOINT);
  addFunction1Param("tt_TOFLOAT",  tt_TOFLOAT);
  addFunction1Param("tt_TODATE",   tt_TODATE);
  addFunction1Param("tt_TYPENAME", tt_TYPENAME);

  // Logic / control flow
  addFunctionAParam("tt_SWITCH", tt_SWITCH);
  addFunctionAParam("tt_DECODE", tt_DECODE);

  // ============================================================
  // tt_ extension function library V1.4
  // ============================================================

  // String, advanced
  addFunction3Param("tt_SPLIT",        tt_SPLIT);
  addFunction2Param("tt_SPLITCOUNT",   tt_SPLITCOUNT);
  addFunction2Param("tt_JOIN",         tt_JOIN);
  addFunction3Param("tt_TOKENAT",      tt_TOKENAT);
  addFunction2Param("tt_ELLIPSIS",     tt_ELLIPSIS);
  addFunction1Param("tt_CAPWORDS",     tt_CAPWORDS);
  addFunction2Param("tt_CHARAT",       tt_CHARAT);
  addFunction3Param("tt_INDEXOF",      tt_INDEXOF);
  addFunction2Param("tt_LASTINDEXOF",  tt_LASTINDEXOF);
  addFunction2Param("tt_REMOVECHARS",  tt_REMOVECHARS);
  addFunction2Param("tt_KEEPCHARS",    tt_KEEPCHARS);
  addFunction1Param("tt_ONLYDIGITS",   tt_ONLYDIGITS);
  addFunction1Param("tt_ONLYALPHA",    tt_ONLYALPHA);
  addFunction3Param("tt_MASK",         tt_MASK);
  addFunction2Param("tt_UNMASK",       tt_UNMASK);
  addFunction1Param("tt_SLUGIFY",      tt_SLUGIFY);
  addFunction2Param("tt_TRUNCWORDS",   tt_TRUNCWORDS);
  addFunction1Param("tt_CRLF2BR",      tt_CRLF2BR);
  addFunction1Param("tt_BR2CRLF",      tt_BR2CRLF);
  addFunction1Param("tt_HTMLENCODE",   tt_HTMLENCODE);
  addFunction1Param("tt_HTMLDECODE",   tt_HTMLDECODE);
  addFunction1Param("tt_URLENCODE",    tt_URLENCODE);

  // Math, advanced
  addFunction1Param("tt_ISPRIME",      tt_ISPRIME);
  addFunction1Param("tt_FIB",          tt_FIB);
  addFunction1Param("tt_LOG2",         tt_LOG2);
  addFunction2Param("tt_LOGN",         tt_LOGN);
  addFunction2Param("tt_HYPOT",        tt_HYPOT);
  addFunction1Param("tt_DEG2RAD",      tt_DEG2RAD);
  addFunction1Param("tt_RAD2DEG",      tt_RAD2DEG);
  addFunction1Param("tt_CBRT",         tt_CBRT);
  addFunction1Param("tt_EVEN",         tt_EVEN);
  addFunction1Param("tt_ODD",          tt_ODD);
  addFunctionAParam("tt_SUMSQ",        tt_SUMSQ);
  addFunctionAParam("tt_PRODUCT",      tt_PRODUCT);
  addFunctionAParam("tt_HARMEAN",      tt_HARMEAN);
  addFunctionAParam("tt_GEOMEAN",      tt_GEOMEAN);
  addFunctionAParam("tt_QUARTILE",     tt_QUARTILE);
  addFunctionAParam("tt_NPV",          tt_NPV);
  addFunctionAParam("tt_IRR",          tt_IRR);

  // Date, advanced
  addFunction1Param("tt_ISWEEKEND",     tt_ISWEEKEND);
  addFunction1Param("tt_ISWEEKDAY",     tt_ISWEEKDAY);
  addFunction2Param("tt_NEXTWDAY",      tt_NEXTWDAY);
  addFunction2Param("tt_PREVWDAY",      tt_PREVWDAY);
  addFunction2Param("tt_EOMDATE",       tt_EOMDATE);
  addFunction2Param("tt_BOMDATE",       tt_BOMDATE);
  addFunction2Param("tt_ADDWORKDAYS",   tt_ADDWORKDAYS);
  addFunction2Param("tt_YEARFRAC",      tt_YEARFRAC);
  addFunction2Param("tt_AGE",           tt_AGE);
  addFunction2Param("tt_FISCALQUARTER", tt_FISCALQUARTER);
  addFunction2Param("tt_FISCALYEAR",    tt_FISCALYEAR);
  addFunction1Param("tt_DAYNAME",       tt_DAYNAME);
  addFunction1Param("tt_MONTHNAME",     tt_MONTHNAME);
  addFunction3Param("tt_DATESERIAL",    tt_DATESERIAL);
  addFunction3Param("tt_TIMESERIAL",    tt_TIMESERIAL);

  // Array / collection
  addFunctionAParam("tt_ARRJOIN",      tt_ARRJOIN);
  addFunctionAParam("tt_ARRMAX",       tt_ARRMAX);
  addFunctionAParam("tt_ARRMIN",       tt_ARRMIN);
  addFunctionAParam("tt_ARRSUM",       tt_ARRSUM);
  addFunctionAParam("tt_ARRAVG",       tt_ARRAVG);
  addFunctionAParam("tt_ARRCONTAINS",  tt_ARRCONTAINS);
  addFunctionAParam("tt_ARRUNIQ",      tt_ARRUNIQ);
  addFunctionAParam("tt_CHOOSE",       tt_CHOOSE);

  // System / misc
  addFunction0Param("tt_GUID",         tt_GUID);
  addFunction2Param("tt_RANDOMSTR",    tt_RANDOMSTR);
  addFunction1Param("tt_TOHEX",        tt_TOHEX);
  addFunction1Param("tt_FROMHEX",      tt_FROMHEX);
  addFunction2Param("tt_TOBIN",        tt_TOBIN);
  addFunction1Param("tt_FROMBIN",      tt_FROMBIN);
  addFunction2Param("tt_BITOR",        tt_BITOR);
  addFunction2Param("tt_BITAND",       tt_BITAND);
  addFunction2Param("tt_BITXOR",       tt_BITXOR);
  addFunction1Param("tt_BITNOT",       tt_BITNOT);
  addFunction2Param("tt_BITSHL",       tt_BITSHL);
  addFunction2Param("tt_BITSHR",       tt_BITSHR);
  addFunction1Param("tt_BYTESIZE",     tt_BYTESIZE);
  addFunction1Param("tt_HASH",         tt_HASH);
  addFunction1Param("tt_CHECKSUM",     tt_CHECKSUM);

  // Finance, advanced
  addFunction3Param("tt_PMT",          tt_PMT);
  addFunction3Param("tt_PV",           tt_PV);
  addFunction4Param("tt_FV",           tt_FV);
  addFunction3Param("tt_NPER",         tt_NPER);
  addFunction3Param("tt_RATE",         tt_RATE);
  addFunction4Param("tt_IPMT",         tt_IPMT);
  addFunction4Param("tt_PPMT",         tt_PPMT);
  addFunctionAParam("tt_CUMIPMT",      tt_CUMIPMT);

  // AsXxx series
  addFunction1Param("tt_AsString",    tt_AsString);
  addFunction1Param("tt_AsInt",       tt_AsInt);
  addFunction1Param("tt_AsFloat",     tt_AsFloat);
  addFunction1Param("tt_AsBool",      tt_AsBool);
  addFunction1Param("tt_AsDate",      tt_AsDate);
  addFunction1Param("tt_AsTime",      tt_AsTime);
  addFunction1Param("tt_AsDateTime",  tt_AsDateTime);
  addFunction2Param("tt_AsFixed",     tt_AsFixed);
  addFunction2Param("tt_AsCurr",      tt_AsCurr);
  addFunction2Param("tt_AsPct",       tt_AsPct);
  addFunction2Param("tt_AsSci",       tt_AsSci);
  addFunction1Param("tt_AsYN",        tt_AsYN);
  addFunction1Param("tt_AsTF",        tt_AsTF);
  addFunction1Param("tt_As10",        tt_As10);
  addFunction1Param("tt_AsBit",       tt_AsBit);
  addFunction2Param("tt_AsHex",       tt_AsHex);
  addFunction1Param("tt_AsOct",       tt_AsOct);
  addFunction1Param("tt_AsISO",       tt_AsISO);
  addFunction1Param("tt_AsRDate",     tt_AsRDate);
  addFunction1Param("tt_AsRDateTime", tt_AsRDateTime);
  addFunction1Param("tt_AsSlug",      tt_AsSlug);
  addFunction1Param("tt_AsUpper",     tt_AsUpper);
  addFunction1Param("tt_AsLower",     tt_AsLower);
  addFunction1Param("tt_AsTrimmed",   tt_AsTrimmed);
  addFunction1Param("tt_AsQuoted",    tt_AsQuoted);
  addFunction1Param("tt_AsDQuoted",   tt_AsDQuoted);
  addFunction1Param("tt_AsSQLStr",    tt_AsSQLStr);
  addFunction1Param("tt_AsNullable",  tt_AsNullable);
  addFunction2Param("tt_AsDefault",   tt_AsDefault);
  addFunction1Param("tt_AsJson",      tt_AsJson);
  addFunctionAParam("tt_AsCsv",       tt_AsCsv);

  // ============================================================
  // COB_ GnuCOBOL Intrinsic Functions
  // ============================================================

  addFunction1Param("COB_ABS",        COB_ABS);
  addFunction1Param("COB_ACOS",       COB_ACOS);
  addFunction1Param("COB_ASIN",       COB_ASIN);
  addFunction1Param("COB_ATAN",       COB_ATAN);
  addFunction1Param("COB_COS",        COB_COS);
  addFunction1Param("COB_SIN",        COB_SIN);
  addFunction1Param("COB_TAN",        COB_TAN);
  addFunction1Param("COB_SQRT",       COB_SQRT);
  addFunction1Param("COB_EXP",        COB_EXP);
  addFunction1Param("COB_EXP10",      COB_EXP10);
  addFunction1Param("COB_LOG",        COB_LOG);
  addFunction1Param("COB_LOG10",      COB_LOG10);
  addFunction2Param("COB_MOD",        COB_MOD);
  addFunction2Param("COB_REM",        COB_REM);
  addFunction1Param("COB_INTEGER",    COB_INTEGER);
  addFunction1Param("COB_INTEGER_PART", COB_INTEGER_PART);
  addFunction1Param("COB_FRACTION_PART", COB_FRACTION_PART);
  addFunction1Param("COB_FACTORIAL",  COB_FACTORIAL);
  addFunction0Param("COB_E",          COB_E);
  addFunction0Param("COB_PI",         COB_PI);
  addFunction1Param("COB_SIGN",       COB_SIGN);
  addFunction2Param("COB_ANNUITY",    COB_ANNUITY);
  addFunctionAParam("COB_PRESENT_VALUE", COB_PRESENT_VALUE);
  addFunctionAParam("COB_MAX",        COB_MAX);
  addFunctionAParam("COB_MIN",        COB_MIN);
  addFunctionAParam("COB_MEAN",       COB_MEAN);
  addFunctionAParam("COB_MEDIAN",     COB_MEDIAN);
  addFunctionAParam("COB_MIDRANGE",   COB_MIDRANGE);
  addFunctionAParam("COB_RANGE",      COB_RANGE);
  addFunctionAParam("COB_SUM",        COB_SUM);
  addFunctionAParam("COB_VARIANCE",   COB_VARIANCE);
  addFunctionAParam("COB_STANDARD_DEVIATION", COB_STANDARD_DEVIATION);
  addFunctionAParam("COB_ORD_MAX",    COB_ORD_MAX);
  addFunctionAParam("COB_ORD_MIN",    COB_ORD_MIN);
  addFunction1Param("COB_HIGHEST_ALGEBRAIC", COB_HIGHEST_ALGEBRAIC);
  addFunction1Param("COB_LOWEST_ALGEBRAIC",  COB_LOWEST_ALGEBRAIC);
  addFunctionAParam("COB_CONCATENATE", COB_CONCATENATE);
  addFunction1Param("COB_LENGTH",     COB_LENGTH);
  addFunction1Param("COB_BYTE_LENGTH", COB_BYTE_LENGTH);
  addFunction1Param("COB_STORED_CHAR_LENGTH", COB_STORED_CHAR_LENGTH);
  addFunction1Param("COB_LOWER_CASE", COB_LOWER_CASE);
  addFunction1Param("COB_UPPER_CASE", COB_UPPER_CASE);
  addFunction1Param("COB_REVERSE",    COB_REVERSE);
  addFunction2Param("COB_TRIM",       COB_TRIM);
  addFunctionAParam("COB_SUBSTITUTE", COB_SUBSTITUTE);
  addFunctionAParam("COB_SUBSTITUTE_CASE", COB_SUBSTITUTE_CASE);
  addFunction1Param("COB_CHAR",       COB_CHAR);
  addFunction1Param("COB_ORD",        COB_ORD);
  addFunction1Param("COB_NUMVAL",     COB_NUMVAL);
  addFunction2Param("COB_NUMVAL_C",   COB_NUMVAL_C);
  addFunction1Param("COB_NUMVAL_F",   COB_NUMVAL_F);
  addFunction1Param("COB_TEST_NUMVAL", COB_TEST_NUMVAL);
  addFunction2Param("COB_TEST_NUMVAL_C", COB_TEST_NUMVAL_C);
  addFunction1Param("COB_TEST_NUMVAL_F", COB_TEST_NUMVAL_F);
  addFunction0Param("COB_CURRENT_DATE", COB_CURRENT_DATE);
  addFunction0Param("COB_WHEN_COMPILED", COB_WHEN_COMPILED);
  addFunction1Param("COB_DATE_OF_INTEGER", COB_DATE_OF_INTEGER);
  addFunction1Param("COB_INTEGER_OF_DATE", COB_INTEGER_OF_DATE);
  addFunction1Param("COB_DAY_OF_INTEGER",  COB_DAY_OF_INTEGER);
  addFunction1Param("COB_INTEGER_OF_DAY",  COB_INTEGER_OF_DAY);
  addFunction0Param("COB_SECONDS_PAST_MIDNIGHT", COB_SECONDS_PAST_MIDNIGHT);
  addFunction2Param("COB_COMBINED_DATETIME", COB_COMBINED_DATETIME);
  addFunction2Param("COB_DATE_TO_YYYYMMDD", COB_DATE_TO_YYYYMMDD);
  addFunction2Param("COB_YEAR_TO_YYYY",     COB_YEAR_TO_YYYY);
  addFunction1Param("COB_TEST_DATE_YYYYMMDD", COB_TEST_DATE_YYYYMMDD);
  addFunction1Param("COB_TEST_DAY_YYYYDDD",   COB_TEST_DAY_YYYYDDD);
  addFunction1Param("COB_LOCALE_DATE",    COB_LOCALE_DATE);
  addFunction1Param("COB_LOCALE_TIME",    COB_LOCALE_TIME);
  addFunction2Param("COB_LOCALE_COMPARE", COB_LOCALE_COMPARE);
  addFunction0Param("COB_CURRENCY_SYMBOL", COB_CURRENCY_SYMBOL);
  addFunction0Param("COB_MONETARY_DECIMAL_POINT", COB_MONETARY_DECIMAL_POINT);
  addFunction0Param("COB_MONETARY_THOUSANDS_SEPARATOR", COB_MONETARY_THOUSANDS_SEPARATOR);
  addFunction0Param("COB_NUMERIC_DECIMAL_POINT", COB_NUMERIC_DECIMAL_POINT);
  addFunction0Param("COB_NUMERIC_THOUSANDS_SEPARATOR", COB_NUMERIC_THOUSANDS_SEPARATOR);
  addFunction1Param("COB_RANDOM", COB_RANDOM);
  addFunction2Param("COB_BOOLEAN_OF_INTEGER", COB_BOOLEAN_OF_INTEGER);
  addFunction1Param("COB_INTEGER_OF_BOOLEAN", COB_INTEGER_OF_BOOLEAN);
  addFunction2Param("COB_STANDARD_COMPARE", COB_STANDARD_COMPARE);

  // ── WML function aliases ────────────────────────────────
  // The function names WML uses differ from the registered names; aliases are filled in here
  addFunction1Param("ACOS",         fnArcCos);
  addFunction1Param("ASIN",         fnArcSin);
  addFunction1Param("ATAN",         fnArcTan);
  addFunction0Param("PI",           fnPi);
  addFunction2Param("RAND",         fnRandomRange);
  // ROUND and Round are case-insensitive; Round is registered as a FuncA, ROUND inherits it automatically
  addFunction1Param("VAL",          fnStrToFloat);
  addFunction1Param("COLOR2HEX",    fnColorToHex);
  addFunction1Param("HEX2COLOR",    fnHexToColor);
  addFunction1Param("DATE2STR",     fnDateToStr);
  addFunction1Param("DATETIME2STR", fnDateTimeToStr);
  addFunction1Param("TIME2STR",     fnTimeToStr);
  addFunction1Param("STR2DATE",     fnStrToDate);
  addFunction1Param("STR2DATETIME", fnStrToDateTime);
  addFunction1Param("STR2TIME",     fnStrToTime);
  addFunction2Param("INT2HEX",      fnIntToHex);
  addFunction1Param("HEX2INT",      fnHexToInt);
  addFunction1Param("HEX2STR",      fnHexToStr);
  addFunction1Param("STR2HEX",      fnStrToHex);
  addFunction1Param("DAYNAME",      tt_DAYNAME);
  addFunction1Param("LOWERA",       fnLOWER);
  addFunction1Param("UPPERA",       fnUPPER);
  addFunction1Param("LENA",         fnAnsiLength);
  addFunction3Param("MIDA",         fnAnsiMid);
  // VAR is handled specially in _callFunction; it needs a placeholder so findIdent can find it
  addFunction2Param("VAR",          (v1, v2) => v2);
}