addInternalFunctions method

void addInternalFunctions()

Registers the built-in function library.

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", fnCODE);
  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) => varToStr(v1) * varToInt(v2));
  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);
  addFunction3Param("DateSerialValue", fnDateSerialValue);
  addFunction3Param("TimeSerialValue", fnTimeSerialValue);
  addFunction1Param("StrToHex", fnStrToHex);
  addFunction1Param("HexToStr", fnHexToStr);
  addFunction2Param("IntToHex", fnIntToHex);
  addFunction1Param("HexToInt", fnHexToInt);
  addFunction1Param("ColorToHex", fnColorToHex);
  addFunction1Param("HexToColor", fnHexToColor);
  addFunction1Param("HTML", fnHTML);
  addFunction2Param("LEADBYTE", fnLeadByte);
  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", extTYPENAME);

  // ── Logic ────────────────────────────────────────────────────
  addFunction0Param("TRUE", fnTRUE);
  addFunction0Param("FALSE", fnFALSE);
  addFunction0Param("NULL", fnNULL);
  addFunction0Param("NBSP", fnNBSP);
  addFunction0Param("DBX", fnDBX);
  addFunction0Param("NTIER", 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", extISWEEKEND);
  addFunction1Param("ISWEEKDAY", extISWEEKDAY);

  // ── 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);

  // ============================================================
  // Extended function library V1.3
  // ============================================================

  // String — advanced
  addFunction2Param("PADL", extPADL);
  addFunction2Param("PADR", extPADR);
  addFunction2Param("PADC", extPADC);
  addFunction3Param("LPAD", extLPAD);
  addFunction3Param("RPAD", extRPAD);
  addFunction2Param("REPEAT", extREPEAT);
  addFunction2Param("COUNTSTR", extCOUNTSTR);
  addFunction2Param("STARTSWITH", extSTARTSWITH);
  addFunction2Param("ENDSWITH", extENDSWITH);
  addFunction2Param("CONTAINS", extCONTAINS);
  addFunction2Param("WRAP", extWRAP);

  // String — numeric formatting
  addFunction2Param("ZFILL", extZFILL);
  addFunction2Param("NUMFMT", extNUMFMT);
  addFunction1Param("COMMAFMT", extCOMMAFMT);

  // Math — advanced
  addFunction2Param("GCD", extGCD);
  addFunction2Param("LCM", extLCM);
  addFunction3Param("CLAMP", extCLAMP);
  addFunction3Param("LERP", extLERP);
  addFunction3Param("BETWEEN", extBETWEEN);
  addFunction2Param("PERCENT", extPERCENT);
  addFunction2Param("ROUNDBANK", extROUNDBANK);

  // Date — advanced
  addFunction3Param("DATEADD", extDATEADD);
  addFunction3Param("DATEDIFF", extDATEDIFF);
  addFunction2Param("DATESTART", extDATESTART);
  addFunction2Param("DATEEND", extDATEEND);
  addFunction2Param("WORKDAYS", extWORKDAYS);
  addFunction1Param("QUARTER", extQUARTER);
  addFunction1Param("RDATE", extRDATE);
  addFunction1Param("RDATETIME", extRDATETIME);

  // Type checking / safe conversion
  addFunction2Param("NVL", extNVL);
  addFunction3Param("NVL2", extNVL2);
  addFunctionAParam("COALESCE", extCOALESCE);
  addFunction1Param("TOINT", extTOINT);
  addFunction1Param("TOFLOAT", extTOFLOAT);
  addFunction1Param("TODATE", extTODATE);

  // Logic / control flow
  addFunctionAParam("SWITCH", extSWITCH);
  addFunctionAParam("DECODE", extDECODE);

  // ============================================================
  // Extended function library V1.4
  // ============================================================

  // String, advanced
  addFunction3Param("SPLIT", extSPLIT);
  addFunction2Param("JOIN", extJOIN);
  addFunction2Param("ELLIPSIS", extELLIPSIS);
  addFunction3Param("INDEXOF", extINDEXOF);
  addFunction2Param("LASTINDEXOF", extLASTINDEXOF);
  addFunction3Param("MASK", extMASK);
  addFunction3Param("UNMASK", extUNMASK);
  addFunction1Param("SLUGIFY", extSLUGIFY);
  addFunction1Param("CRLF2BR", extCRLF2BR);
  addFunction1Param("BR2CRLF", extBR2CRLF);
  addFunction1Param("HTMLENCODE", extHTMLENCODE);
  addFunction1Param("HTMLDECODE", extHTMLDECODE);
  addFunction1Param("URLENCODE", extURLENCODE);

  // Math, advanced
  addFunction1Param("ISPRIME", extISPRIME);
  addFunction1Param("FIB", extFIB);
  addFunction1Param("LOG2", extLOG2);
  addFunction2Param("LOGN", extLOGN);
  addFunction2Param("HYPOT", extHYPOT);
  addFunction1Param("DEG2RAD", extDEG2RAD);
  addFunction1Param("RAD2DEG", extRAD2DEG);
  addFunction1Param("CBRT", extCBRT);
  addFunction1Param("EVEN", extEVEN);
  addFunctionAParam("SUMSQ", extSUMSQ);
  addFunctionAParam("PRODUCT", extPRODUCT);
  addFunctionAParam("HARMEAN", extHARMEAN);
  addFunctionAParam("GEOMEAN", extGEOMEAN);
  addFunctionAParam("QUARTILE", extQUARTILE);
  addFunctionAParam("NPV", extNPV);
  addFunctionAParam("IRR", extIRR);

  // Date, advanced
  addFunction2Param("NEXTWDAY", extNEXTWDAY);
  addFunction2Param("PREVWDAY", extPREVWDAY);
  addFunction2Param("YEARFRAC", extYEARFRAC);
  addFunction2Param("AGE", extAGE);
  addFunction1Param("MONTHNAME", extMONTHNAME);
  addFunction3Param("DATESERIAL", extDATESERIAL);
  addFunction3Param("TIMESERIAL", extTIMESERIAL);

  // Array / collection
  addFunctionAParam("ARRJOIN", extARRJOIN);
  addFunctionAParam("ARRMAX", extARRMAX);
  addFunctionAParam("ARRMIN", extARRMIN);
  addFunctionAParam("ARRSUM", extARRSUM);
  addFunctionAParam("ARRAVG", extARRAVG);
  addFunctionAParam("ARRCONTAINS", extARRCONTAINS);
  addFunctionAParam("ARRUNIQ", extARRUNIQ);
  addFunctionAParam("CHOOSE", extCHOOSE);

  // System / misc
  addFunction0Param("GUID", extGUID);
  addFunction2Param("RANDOMSTR", extRANDOMSTR);
  addFunction1Param("TOHEX", extTOHEX);
  addFunction2Param("TOBIN", extTOBIN);
  addFunction1Param("FROMBIN", extFROMBIN);
  addFunction2Param("BITOR", extBITOR);
  addFunction2Param("BITAND", extBITAND);
  addFunction2Param("BITXOR", extBITXOR);
  addFunction1Param("BITNOT", extBITNOT);
  addFunction2Param("BITSHL", extBITSHL);
  addFunction2Param("BITSHR", extBITSHR);
  addFunction1Param("BYTESIZE", extBYTESIZE);
  addFunction1Param("HASH", extHASH);
  addFunction1Param("CHECKSUM", extCHECKSUM);

  // Finance, advanced
  addFunction3Param("PMT", extPMT);
  addFunction3Param("PV", extPV);
  addFunction4Param("FV", extFV);
  addFunction3Param("NPER", extNPER);
  addFunction3Param("RATE", extRATE);
  addFunction4Param("IPMT", extIPMT);
  addFunction4Param("PPMT", extPPMT);
  addFunctionAParam("CUMIPMT", extCUMIPMT);

  // AsXxx series
  addFunction1Param("AsString", extAsString);
  addFunction1Param("AsDate", extAsDate);
  addFunction1Param("AsTime", extAsTime);
  addFunction1Param("AsDateTime", extAsDateTime);
  addFunction2Param("AsPct", extAsPct);
  addFunction2Param("AsSci", extAsSci);
  addFunction1Param("AsYN", extAsYN);
  addFunction1Param("AsTF", extAsTF);
  addFunction1Param("As10", extAs10);
  addFunction1Param("AsOct", extAsOct);
  addFunction1Param("AsISO", extAsISO);
  addFunction1Param("AsRDate", extAsRDate);
  addFunction1Param("AsRDateTime", extAsRDateTime);

  // ============================================================
  // Standard intrinsic functions
  // ============================================================

  addFunction1Param("EXP10", stdEXP10);
  addFunction1Param("LOG10", stdLOG10);
  addFunction2Param("MOD", stdMOD);
  addFunction2Param("REM", stdREM);
  addFunction1Param("INTEGER", stdINTEGER);
  addFunction1Param("INTEGER_PART", stdINTEGER_PART);
  addFunction1Param("FRACTION_PART", stdFRACTION_PART);
  addFunction0Param("E", stdE);
  addFunction1Param("SIGN", stdSIGN);
  addFunctionAParam("PRESENT_VALUE", stdPRESENT_VALUE);
  addFunctionAParam("MEAN", stdMEAN);
  addFunctionAParam("MEDIAN", stdMEDIAN);
  addFunctionAParam("MIDRANGE", stdMIDRANGE);
  addFunctionAParam("RANGE", stdRANGE);
  addFunctionAParam("SUM", stdSUM);
  addFunctionAParam("VARIANCE", stdVARIANCE);
  addFunctionAParam("STANDARD_DEVIATION", stdSTANDARD_DEVIATION);
  addFunctionAParam("ORD_MAX", stdORD_MAX);
  addFunctionAParam("ORD_MIN", stdORD_MIN);
  addFunction1Param("HIGHEST_ALGEBRAIC", stdHIGHEST_ALGEBRAIC);
  addFunction1Param("LOWEST_ALGEBRAIC", stdLOWEST_ALGEBRAIC);
  addFunctionAParam("CONCATENATE", stdCONCATENATE);
  addFunction1Param("BYTE_LENGTH", stdBYTE_LENGTH);
  addFunction1Param("STORED_CHAR_LENGTH", stdSTORED_CHAR_LENGTH);
  addFunction1Param("LOWER_CASE", stdLOWER_CASE);
  addFunction1Param("UPPER_CASE", stdUPPER_CASE);
  addFunction1Param("REVERSE", stdREVERSE);
  addFunctionAParam("SUBSTITUTE", stdSUBSTITUTE);
  addFunctionAParam("SUBSTITUTE_CASE", stdSUBSTITUTE_CASE);
  addFunction2Param("NUMVAL_C", stdNUMVAL_C);
  addFunction1Param("NUMVAL_F", stdNUMVAL_F);
  addFunction1Param("TEST_NUMVAL", stdTEST_NUMVAL);
  addFunction2Param("TEST_NUMVAL_C", stdTEST_NUMVAL_C);
  addFunction1Param("TEST_NUMVAL_F", stdTEST_NUMVAL_F);
  addFunction0Param("CURRENT_DATE", stdCURRENT_DATE);
  addFunction0Param("WHEN_COMPILED", stdWHEN_COMPILED);
  addFunction1Param("DATE_OF_INTEGER", stdDATE_OF_INTEGER);
  addFunction1Param("INTEGER_OF_DATE", stdINTEGER_OF_DATE);
  addFunction1Param("DAY_OF_INTEGER", stdDAY_OF_INTEGER);
  addFunction1Param("INTEGER_OF_DAY", stdINTEGER_OF_DAY);
  addFunction0Param("SECONDS_PAST_MIDNIGHT", stdSECONDS_PAST_MIDNIGHT);
  addFunction2Param("COMBINED_DATETIME", stdCOMBINED_DATETIME);
  addFunction2Param("DATE_TO_YYYYMMDD", stdDATE_TO_YYYYMMDD);
  addFunction2Param("YEAR_TO_YYYY", stdYEAR_TO_YYYY);
  addFunction1Param("TEST_DATE_YYYYMMDD", stdTEST_DATE_YYYYMMDD);
  addFunction1Param("TEST_DAY_YYYYDDD", stdTEST_DAY_YYYYDDD);
  addFunction1Param("LOCALE_DATE", stdLOCALE_DATE);
  addFunction1Param("LOCALE_TIME", stdLOCALE_TIME);
  addFunction2Param("LOCALE_COMPARE", stdLOCALE_COMPARE);
  addFunction0Param("CURRENCY_SYMBOL", stdCURRENCY_SYMBOL);
  addFunction0Param("MONETARY_DECIMAL_POINT", stdMONETARY_DECIMAL_POINT);
  addFunction0Param(
      "MONETARY_THOUSANDS_SEPARATOR", stdMONETARY_THOUSANDS_SEPARATOR);
  addFunction0Param("NUMERIC_DECIMAL_POINT", stdNUMERIC_DECIMAL_POINT);
  addFunction0Param(
      "NUMERIC_THOUSANDS_SEPARATOR", stdNUMERIC_THOUSANDS_SEPARATOR);
  addFunction2Param("BOOLEAN_OF_INTEGER", stdBOOLEAN_OF_INTEGER);
  addFunction1Param("INTEGER_OF_BOOLEAN", stdINTEGER_OF_BOOLEAN);
  addFunction2Param("STANDARD_COMPARE", stdSTANDARD_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", extDAYNAME);
  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);

  // ══════════════════════════════════════════════════════════════
  // Adds functions that were never registered before (gaps found by
  // cross-referencing the self-test report). Most of the underlying
  // logic already exists among the extended functions -- this just adds the
  // official names the test cases expect; a few extended versions return a
  // DateTime instead of a Delphi numeric serial, so those use the new
  // wrapper functions above instead; logic that was genuinely entirely
  // missing was written fresh.
  // ══════════════════════════════════════════════════════════════

  // -- String functions --
  addFunction2Param("LeftPad2", extPADL);
  // 1.6.x compatibility: prefixed names (removed in 2.0.0)
  addFunction1Param("COB_ABS", COB_ABS);
  addFunction1Param("COB_ACOS", COB_ACOS);
  addFunction2Param("COB_ANNUITY", COB_ANNUITY);
  addFunction1Param("COB_ASIN", COB_ASIN);
  addFunction1Param("COB_ATAN", COB_ATAN);
  addFunction2Param("COB_BOOLEAN_OF_INTEGER", COB_BOOLEAN_OF_INTEGER);
  addFunction1Param("COB_BYTE_LENGTH", COB_BYTE_LENGTH);
  addFunction1Param("COB_CHAR", COB_CHAR);
  addFunction2Param("COB_COMBINED_DATETIME", COB_COMBINED_DATETIME);
  addFunctionAParam("COB_CONCATENATE", COB_CONCATENATE);
  addFunction1Param("COB_COS", COB_COS);
  addFunction0Param("COB_CURRENCY_SYMBOL", COB_CURRENCY_SYMBOL);
  addFunction0Param("COB_CURRENT_DATE", COB_CURRENT_DATE);
  addFunction1Param("COB_DATE_OF_INTEGER", COB_DATE_OF_INTEGER);
  addFunction2Param("COB_DATE_TO_YYYYMMDD", COB_DATE_TO_YYYYMMDD);
  addFunction1Param("COB_DAY_OF_INTEGER", COB_DAY_OF_INTEGER);
  addFunction0Param("COB_E", COB_E);
  addFunction1Param("COB_EXP", COB_EXP);
  addFunction1Param("COB_EXP10", COB_EXP10);
  addFunction1Param("COB_FACTORIAL", COB_FACTORIAL);
  addFunction1Param("COB_FRACTION_PART", COB_FRACTION_PART);
  addFunction1Param("COB_HIGHEST_ALGEBRAIC", COB_HIGHEST_ALGEBRAIC);
  addFunction1Param("COB_INTEGER", COB_INTEGER);
  addFunction1Param("COB_INTEGER_OF_BOOLEAN", COB_INTEGER_OF_BOOLEAN);
  addFunction1Param("COB_INTEGER_OF_DATE", COB_INTEGER_OF_DATE);
  addFunction1Param("COB_INTEGER_OF_DAY", COB_INTEGER_OF_DAY);
  addFunction1Param("COB_INTEGER_PART", COB_INTEGER_PART);
  addFunction1Param("COB_LENGTH", COB_LENGTH);
  addFunction2Param("COB_LOCALE_COMPARE", COB_LOCALE_COMPARE);
  addFunction1Param("COB_LOCALE_DATE", COB_LOCALE_DATE);
  addFunction1Param("COB_LOCALE_TIME", COB_LOCALE_TIME);
  addFunction1Param("COB_LOG", COB_LOG);
  addFunction1Param("COB_LOG10", COB_LOG10);
  addFunction1Param("COB_LOWER_CASE", COB_LOWER_CASE);
  addFunction1Param("COB_LOWEST_ALGEBRAIC", COB_LOWEST_ALGEBRAIC);
  addFunctionAParam("COB_MAX", COB_MAX);
  addFunctionAParam("COB_MEAN", COB_MEAN);
  addFunctionAParam("COB_MEDIAN", COB_MEDIAN);
  addFunctionAParam("COB_MIDRANGE", COB_MIDRANGE);
  addFunctionAParam("COB_MIN", COB_MIN);
  addFunction2Param("COB_MOD", COB_MOD);
  addFunction0Param("COB_MONETARY_DECIMAL_POINT", COB_MONETARY_DECIMAL_POINT);
  addFunction0Param("COB_NUMERIC_DECIMAL_POINT", COB_NUMERIC_DECIMAL_POINT);
  addFunction1Param("COB_NUMVAL", COB_NUMVAL);
  addFunction2Param("COB_NUMVAL_C", COB_NUMVAL_C);
  addFunction1Param("COB_NUMVAL_F", COB_NUMVAL_F);
  addFunction1Param("COB_ORD", COB_ORD);
  addFunctionAParam("COB_ORD_MAX", COB_ORD_MAX);
  addFunctionAParam("COB_ORD_MIN", COB_ORD_MIN);
  addFunction0Param("COB_PI", COB_PI);
  addFunctionAParam("COB_PRESENT_VALUE", COB_PRESENT_VALUE);
  addFunction1Param("COB_RANDOM", COB_RANDOM);
  addFunctionAParam("COB_RANGE", COB_RANGE);
  addFunction2Param("COB_REM", COB_REM);
  addFunction1Param("COB_REVERSE", COB_REVERSE);
  addFunction0Param("COB_SECONDS_PAST_MIDNIGHT", COB_SECONDS_PAST_MIDNIGHT);
  addFunction1Param("COB_SIGN", COB_SIGN);
  addFunction1Param("COB_SIN", COB_SIN);
  addFunction1Param("COB_SQRT", COB_SQRT);
  addFunction2Param("COB_STANDARD_COMPARE", COB_STANDARD_COMPARE);
  addFunctionAParam("COB_STANDARD_DEVIATION", COB_STANDARD_DEVIATION);
  addFunction1Param("COB_STORED_CHAR_LENGTH", COB_STORED_CHAR_LENGTH);
  addFunctionAParam("COB_SUBSTITUTE", COB_SUBSTITUTE);
  addFunctionAParam("COB_SUBSTITUTE_CASE", COB_SUBSTITUTE_CASE);
  addFunctionAParam("COB_SUM", COB_SUM);
  addFunction1Param("COB_TAN", COB_TAN);
  addFunction1Param("COB_TEST_DATE_YYYYMMDD", COB_TEST_DATE_YYYYMMDD);
  addFunction1Param("COB_TEST_DAY_YYYYDDD", COB_TEST_DAY_YYYYDDD);
  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);
  addFunction2Param("COB_TRIM", COB_TRIM);
  addFunction1Param("COB_UPPER_CASE", COB_UPPER_CASE);
  addFunctionAParam("COB_VARIANCE", COB_VARIANCE);
  addFunction0Param("COB_WHEN_COMPILED", COB_WHEN_COMPILED);
  addFunction2Param("COB_YEAR_TO_YYYY", COB_YEAR_TO_YYYY);
  addFunction2Param("tt_ADDWORKDAYS", tt_ADDWORKDAYS);
  addFunction2Param("tt_AGE", tt_AGE);
  addFunctionAParam("tt_ARRAVG", tt_ARRAVG);
  addFunctionAParam("tt_ARRCONTAINS", tt_ARRCONTAINS);
  addFunctionAParam("tt_ARRJOIN", tt_ARRJOIN);
  addFunctionAParam("tt_ARRMAX", tt_ARRMAX);
  addFunctionAParam("tt_ARRMIN", tt_ARRMIN);
  addFunctionAParam("tt_ARRSUM", tt_ARRSUM);
  addFunctionAParam("tt_ARRUNIQ", tt_ARRUNIQ);
  addFunction1Param("tt_As10", tt_As10);
  addFunction1Param("tt_AsBit", tt_AsBit);
  addFunction1Param("tt_AsBool", tt_AsBool);
  addFunctionAParam("tt_AsCsv", tt_AsCsv);
  addFunction2Param("tt_AsCurr", tt_AsCurr);
  addFunction1Param("tt_AsDQuoted", tt_AsDQuoted);
  addFunction1Param("tt_AsDate", tt_AsDate);
  addFunction1Param("tt_AsDateTime", tt_AsDateTime);
  addFunction2Param("tt_AsDefault", tt_AsDefault);
  addFunction2Param("tt_AsFixed", tt_AsFixed);
  addFunction1Param("tt_AsFloat", tt_AsFloat);
  addFunction2Param("tt_AsHex", tt_AsHex);
  addFunction1Param("tt_AsISO", tt_AsISO);
  addFunction1Param("tt_AsInt", tt_AsInt);
  addFunction1Param("tt_AsJson", tt_AsJson);
  addFunction1Param("tt_AsLower", tt_AsLower);
  addFunction1Param("tt_AsNullable", tt_AsNullable);
  addFunction1Param("tt_AsOct", tt_AsOct);
  addFunction2Param("tt_AsPct", tt_AsPct);
  addFunction1Param("tt_AsQuoted", tt_AsQuoted);
  addFunction1Param("tt_AsRDate", tt_AsRDate);
  addFunction1Param("tt_AsRDateTime", tt_AsRDateTime);
  addFunction1Param("tt_AsSQLStr", tt_AsSQLStr);
  addFunction2Param("tt_AsSci", tt_AsSci);
  addFunction1Param("tt_AsSlug", tt_AsSlug);
  addFunction1Param("tt_AsString", tt_AsString);
  addFunction1Param("tt_AsTF", tt_AsTF);
  addFunction1Param("tt_AsTime", tt_AsTime);
  addFunction1Param("tt_AsTrimmed", tt_AsTrimmed);
  addFunction1Param("tt_AsUpper", tt_AsUpper);
  addFunction1Param("tt_AsYN", tt_AsYN);
  addFunction3Param("tt_BETWEEN", tt_BETWEEN);
  addFunction2Param("tt_BITAND", tt_BITAND);
  addFunction1Param("tt_BITNOT", tt_BITNOT);
  addFunction2Param("tt_BITOR", tt_BITOR);
  addFunction2Param("tt_BITSHL", tt_BITSHL);
  addFunction2Param("tt_BITSHR", tt_BITSHR);
  addFunction2Param("tt_BITXOR", tt_BITXOR);
  addFunction2Param("tt_BOMDATE", tt_BOMDATE);
  addFunction1Param("tt_BR2CRLF", tt_BR2CRLF);
  addFunction1Param("tt_BYTESIZE", tt_BYTESIZE);
  addFunction1Param("tt_CAPWORDS", tt_CAPWORDS);
  addFunction1Param("tt_CBRT", tt_CBRT);
  addFunction2Param("tt_CHARAT", tt_CHARAT);
  addFunction1Param("tt_CHECKSUM", tt_CHECKSUM);
  addFunctionAParam("tt_CHOOSE", tt_CHOOSE);
  addFunction3Param("tt_CLAMP", tt_CLAMP);
  addFunctionAParam("tt_COALESCE", tt_COALESCE);
  addFunction1Param("tt_COMMAFMT", tt_COMMAFMT);
  addFunction2Param("tt_CONTAINS", tt_CONTAINS);
  addFunction2Param("tt_COUNTSTR", tt_COUNTSTR);
  addFunction1Param("tt_CRLF2BR", tt_CRLF2BR);
  addFunctionAParam("tt_CUMIPMT", tt_CUMIPMT);
  addFunction3Param("tt_DATEADD", tt_DATEADD);
  addFunction3Param("tt_DATEDIFF", tt_DATEDIFF);
  addFunction2Param("tt_DATEEND", tt_DATEEND);
  addFunction3Param("tt_DATESERIAL", tt_DATESERIAL);
  addFunction2Param("tt_DATESTART", tt_DATESTART);
  addFunction1Param("tt_DAYNAME", tt_DAYNAME);
  addFunctionAParam("tt_DECODE", tt_DECODE);
  addFunction1Param("tt_DEG2RAD", tt_DEG2RAD);
  addFunction2Param("tt_ELLIPSIS", tt_ELLIPSIS);
  addFunction2Param("tt_ENDSWITH", tt_ENDSWITH);
  addFunction2Param("tt_EOMDATE", tt_EOMDATE);
  addFunction1Param("tt_EVEN", tt_EVEN);
  addFunction1Param("tt_FIB", tt_FIB);
  addFunction2Param("tt_FISCALQUARTER", tt_FISCALQUARTER);
  addFunction2Param("tt_FISCALYEAR", tt_FISCALYEAR);
  addFunction1Param("tt_FROMBIN", tt_FROMBIN);
  addFunction1Param("tt_FROMHEX", tt_FROMHEX);
  addFunction4Param("tt_FV", tt_FV);
  addFunction2Param("tt_GCD", tt_GCD);
  addFunctionAParam("tt_GEOMEAN", tt_GEOMEAN);
  addFunction0Param("tt_GUID", tt_GUID);
  addFunctionAParam("tt_HARMEAN", tt_HARMEAN);
  addFunction1Param("tt_HASH", tt_HASH);
  addFunction1Param("tt_HTMLDECODE", tt_HTMLDECODE);
  addFunction1Param("tt_HTMLENCODE", tt_HTMLENCODE);
  addFunction2Param("tt_HYPOT", tt_HYPOT);
  addFunction3Param("tt_INDEXOF", tt_INDEXOF);
  addFunction4Param("tt_IPMT", tt_IPMT);
  addFunctionAParam("tt_IRR", tt_IRR);
  addFunction1Param("tt_ISPRIME", tt_ISPRIME);
  addFunction1Param("tt_ISWEEKDAY", tt_ISWEEKDAY);
  addFunction1Param("tt_ISWEEKEND", tt_ISWEEKEND);
  addFunction2Param("tt_JOIN", tt_JOIN);
  addFunction2Param("tt_KEEPCHARS", tt_KEEPCHARS);
  addFunction2Param("tt_LASTINDEXOF", tt_LASTINDEXOF);
  addFunction2Param("tt_LCM", tt_LCM);
  addFunction3Param("tt_LERP", tt_LERP);
  addFunction1Param("tt_LOG2", tt_LOG2);
  addFunction2Param("tt_LOGN", tt_LOGN);
  addFunction3Param("tt_LPAD", tt_LPAD);
  addFunction3Param("tt_MASK", tt_MASK);
  addFunction1Param("tt_MONTHNAME", tt_MONTHNAME);
  addFunction2Param("tt_NEXTWDAY", tt_NEXTWDAY);
  addFunction3Param("tt_NPER", tt_NPER);
  addFunctionAParam("tt_NPV", tt_NPV);
  addFunction2Param("tt_NUMFMT", tt_NUMFMT);
  addFunction2Param("tt_NVL", tt_NVL);
  addFunction3Param("tt_NVL2", tt_NVL2);
  addFunction1Param("tt_ODD", tt_ODD);
  addFunction1Param("tt_ONLYALPHA", tt_ONLYALPHA);
  addFunction1Param("tt_ONLYDIGITS", tt_ONLYDIGITS);
  addFunction2Param("tt_PADC", tt_PADC);
  addFunction2Param("tt_PADL", tt_PADL);
  addFunction2Param("tt_PADR", tt_PADR);
  addFunction2Param("tt_PERCENT", tt_PERCENT);
  addFunction3Param("tt_PMT", tt_PMT);
  addFunction4Param("tt_PPMT", tt_PPMT);
  addFunction2Param("tt_PREVWDAY", tt_PREVWDAY);
  addFunctionAParam("tt_PRODUCT", tt_PRODUCT);
  addFunction3Param("tt_PV", tt_PV);
  addFunction1Param("tt_QUARTER", tt_QUARTER);
  addFunctionAParam("tt_QUARTILE", tt_QUARTILE);
  addFunction1Param("tt_RAD2DEG", tt_RAD2DEG);
  addFunction2Param("tt_RANDOMSTR", tt_RANDOMSTR);
  addFunction3Param("tt_RATE", tt_RATE);
  addFunction1Param("tt_RDATE", tt_RDATE);
  addFunction1Param("tt_RDATETIME", tt_RDATETIME);
  addFunction2Param("tt_REMOVECHARS", tt_REMOVECHARS);
  addFunction2Param("tt_REPEAT", tt_REPEAT);
  addFunction2Param("tt_ROUNDBANK", tt_ROUNDBANK);
  addFunction3Param("tt_RPAD", tt_RPAD);
  addFunction1Param("tt_SLUGIFY", tt_SLUGIFY);
  addFunction3Param("tt_SPLIT", tt_SPLIT);
  addFunction2Param("tt_SPLITCOUNT", tt_SPLITCOUNT);
  addFunction2Param("tt_STARTSWITH", tt_STARTSWITH);
  addFunctionAParam("tt_SUMSQ", tt_SUMSQ);
  addFunctionAParam("tt_SWITCH", tt_SWITCH);
  addFunction3Param("tt_TIMESERIAL", tt_TIMESERIAL);
  addFunction2Param("tt_TOBIN", tt_TOBIN);
  addFunction1Param("tt_TODATE", tt_TODATE);
  addFunction1Param("tt_TOFLOAT", tt_TOFLOAT);
  addFunction1Param("tt_TOHEX", tt_TOHEX);
  addFunction1Param("tt_TOINT", tt_TOINT);
  addFunction3Param("tt_TOKENAT", tt_TOKENAT);
  addFunction2Param("tt_TRUNCWORDS", tt_TRUNCWORDS);
  addFunction1Param("tt_TYPENAME", tt_TYPENAME);
  addFunction3Param("tt_UNMASK", tt_UNMASK);
  addFunction1Param("tt_URLENCODE", tt_URLENCODE);
  addFunction2Param("tt_WORKDAYS", tt_WORKDAYS);
  addFunction2Param("tt_WRAP", tt_WRAP);
  addFunction2Param("tt_YEARFRAC", tt_YEARFRAC);
  addFunction2Param("tt_ZFILL", tt_ZFILL);
  addFunction2Param("RightPad2", extPADR);
  addFunction2Param("CenterPad", extPADC);
  addFunction3Param("LeftPad", extLPAD);
  addFunction3Param("RightPad", extRPAD);
  addFunction2Param("RepeatStr", extREPEAT);
  addFunction2Param("CountStrOccur", extCOUNTSTR);
  addFunction2Param("StartsWithStr", extSTARTSWITH);
  addFunction2Param("EndsWithStr", extENDSWITH);
  addFunction2Param("ContainsStr2", extCONTAINS);
  addFunction3Param("SplitStr", extSPLIT);
  addFunction2Param("SplitCount", extSPLITCOUNT);
  addFunction2Param("JoinStr", extJOIN);
  addFunction3Param("TokenAt", extTOKENAT);
  addFunction1Param("CapWords", extCAPWORDS);
  addFunction2Param("CharAt", extCHARAT);
  addFunction3Param("IndexOfStr", (v1, v2, v3) => extINDEXOF(v2, v1, v3));
  addFunction2Param("LastIndexOfStr", (v1, v2) => extLASTINDEXOF(v2, v1));
  addFunction2Param("RemoveChars", extREMOVECHARS);
  addFunction2Param("KeepChars", extKEEPCHARS);
  addFunction1Param("OnlyDigits", extONLYDIGITS);
  addFunction1Param("OnlyAlpha", extONLYALPHA);
  addFunction3Param("MaskStr", extMASK);
  addFunction3Param("UnmaskStr", extUNMASK);
  addFunction1Param("SlugifyStr", extSLUGIFY);
  addFunction1Param("HtmlEncodeStr", extHTMLENCODE);
  addFunction1Param("HtmlDecodeStr", extHTMLDECODE);
  addFunction1Param("UrlEncodeStr", extURLENCODE);
  addFunctionAParam("ConcatenateStr", fnConcatenateStr);
  addFunction1Param("StoredCharLength", fnStoredCharLength);
  addFunction1Param("LowerCaseValue", extAsLower);
  addFunction1Param("UpperCaseValue", extAsUpper);
  addFunction1Param("ReverseStr", fnReverseStr);
  addFunctionAParam("SubstituteStr", fnSubstituteStr);
  addFunctionAParam("SubstituteCaseStr", fnSubstituteCaseStr);
  addFunction1Param("AsQuoted", extAsQuoted);
  addFunction1Param("AsSqlStr", fnAsSqlStr);
  addFunction2Param("FillChar", fnFillChar);
  addFunction2Param("EllipsisStr", extELLIPSIS);
  addFunction2Param("TruncWords", extTRUNCWORDS);
  addFunction1Param("INT2STR", fnIntToStr);
  addFunction1Param("STR2FLOAT", fnStrToFloat);
  addFunction1Param("STR2INT", fnStrToInt);
  addFunction1Param("FLOAT2STR", fnFloatToStr);
  addFunction1Param("ByteLength", fnByteLength);

  // -- Math functions --
  addFunction1Param("FIX", fnFloor);
  addFunction2Param("GreatestCommonDivisor", extGCD);
  addFunction3Param("ClampValue", extCLAMP);
  addFunction3Param("LerpValue", extLERP);
  addFunction3Param("IsBetween", extBETWEEN);
  addFunction2Param("PercentOf", extPERCENT);
  addFunction2Param("RoundBankers", extROUNDBANK);
  addFunction1Param("IsPrimeNumber", extISPRIME);
  addFunction1Param("Fibonacci", extFIB);
  addFunction1Param("Log2Value", extLOG2);
  addFunction2Param("LogNValue", extLOGN);
  addFunction2Param("HypotOf", extHYPOT);
  addFunction1Param("DegreeToRad", extDEG2RAD);
  addFunction1Param("RadToDegree", extRAD2DEG);
  addFunction1Param("CubeRoot", extCBRT);
  addFunction1Param("EvenCeil", extEVEN);
  addFunctionAParam("SumOfSquares", extSUMSQ);
  addFunctionAParam("ProductOf", extPRODUCT);
  addFunctionAParam("HarmMeanValue", extHARMEAN);
  addFunctionAParam("GeoMeanValue", extGEOMEAN);
  addFunctionAParam("QuartileOf", extQUARTILE);
  addFunction1Param("Exp10Value", fnExp10Value);
  addFunction1Param("Log10Value", fnLog10Value);
  addFunction1Param("LOG", fnLog10Value);
  addFunction2Param("RemainderValue", fnRemainderValue);
  addFunction1Param("ToIntegerValue", fnToIntegerValue);
  addFunction1Param("IntegerPart", fnTrunc);
  addFunction1Param("FractionPart", fnFrac);
  addFunction1Param("Factorial", fnFactorial);
  addFunction0Param("EulerNumber", fnEulerNumber);
  addFunction1Param("SignOf", fnSignOf);
  addFunction2Param("Annuity", fnAnnuity);
  addFunctionAParam("PresentValue", extNPV);
  addFunctionAParam("MeanValue", fnMeanValue);
  addFunctionAParam("MedianValue", fnMedianValue);
  addFunctionAParam("MidRangeValue", fnMidRangeValue);
  addFunctionAParam("RangeValue", fnRangeValue);
  addFunctionAParam("SumOfValues", extARRSUM);
  addFunctionAParam("VarianceValue", fnVarianceValue);
  addFunctionAParam("StandardDeviation", fnStandardDeviation);
  addFunctionAParam("OrdMax", fnOrdMax);
  addFunctionAParam("OrdMin", fnOrdMin);
  addFunction1Param("HighestAlgebraic", fnHighestAlgebraic);
  addFunction1Param("LowestAlgebraic", fnLowestAlgebraic);
  addFunction1Param("Ord", fnOrd);

  // -- Date and time functions --
  addFunction3Param("DateDiffValue", extDATEDIFF);
  addFunction2Param("WorkDaysBetween", extWORKDAYS);
  addFunction1Param("QuarterOf", extQUARTER);
  addFunction1Param("RocDateOf", extRDATE);
  addFunction1Param("RocDateTimeOf", extRDATETIME);
  addFunction2Param("YearFraction", extYEARFRAC);
  addFunction2Param("CalcAge", extAGE);
  addFunction2Param("FiscalQuarter", extFISCALQUARTER);
  addFunction2Param("FiscalYear", extFISCALYEAR);
  addFunction2Param("DateToYyyymmdd", fnDateToYyyymmdd);
  addFunction2Param("YearToYyyy", fnYearToYyyy);
  addFunction1Param("TestDateYyyymmdd", fnTestDateYyyymmdd);
  addFunction1Param("TestDayYyyyddd", fnTestDayYyyyddd);
  addFunction2Param("AddWorkDays", fnAddWorkDaysSerial);
  addFunction2Param("BomDate", fnBomDateSerial);
  addFunction2Param("CombinedDateTime", fnCombinedDateTime);
  addFunction3Param("DateAddValue", fnDateAddValueSerial);
  addFunction1Param("DateOfInteger", fnDateOfInteger);
  addFunction2Param("DatePeriodEnd", fnDatePeriodEndSerial);
  addFunction2Param("DatePeriodStart", fnDatePeriodStartSerial);
  addFunction1Param("DayNameOf", extDAYNAME);
  addFunction1Param("DayOfInteger", fnDayOfInteger);
  addFunction2Param("EomDate", fnEomDateSerial);
  addFunction1Param("IntegerOfDate", fnIntegerOfDate);
  addFunction1Param("IntegerOfDay", fnIntegerOfDay);
  addFunction1Param("MonthNameOf", extMONTHNAME);
  addFunction2Param("NextWeekDay", fnNextWeekDaySerial);
  addFunction2Param("PrevWeekDay", fnPrevWeekDaySerial);

  // -- Conditional functions --
  addFunction2Param("NvlValue", extNVL);
  addFunctionAParam("CoalesceValue", extCOALESCE);
  addFunction1Param("ToIntSafe", fnToIntSafe);
  addFunction1Param("ToFloatSafe", fnToFloatSafe);
  addFunction1Param("TypeNameOf", extTYPENAME);
  addFunctionAParam("SwitchValue", extSWITCH);
  addFunctionAParam("DecodeValue", extDECODE);
  addFunction1Param("TYPE", fnVarType);
  addFunction3Param("Nvl2Value", extNVL2);

  // -- Encoding and conversion functions --
  addFunction2Param("ZeroFill", extZFILL);
  addFunction2Param("NumberFormat", extNUMFMT);
  addFunction1Param("CommaFormat", extCOMMAFMT);
  addFunction1Param("AsStringValue", extAsString);
  addFunction1Param("AsInt", extAsInt);
  addFunction1Param("AsFloat", extAsFloat);
  addFunction1Param("AsBool", extAsBool);
  addFunction2Param("AsFixed", extAsFixed);
  addFunction2Param("AsCurr", extAsCurr);
  addFunction2Param("AsPercent", extAsPct);
  addFunction2Param("AsScientific", extAsSci);
  addFunction1Param("AsYesNo", extAsYN);
  addFunction1Param("AsTrueFalse", extAsTF);
  addFunction1Param("AsZeroOne", extAs10);
  addFunction1Param("AsBit", extAsBit);
  addFunction2Param("AsHex", extAsHex);
  addFunction1Param("AsOctal", extAsOct);
  addFunction1Param("AsISO8601", extAsISO);
  addFunction1Param("AsRocDate", extAsRDate);
  addFunction1Param("AsRocDateTime", extAsRDateTime);
  addFunction1Param("AsSlug", extAsSlug);
  addFunction1Param("AsUpper", extAsUpper);
  addFunction1Param("AsLower", extAsLower);
  addFunction1Param("AsTrimmed", extAsTrimmed);
  addFunction1Param("AsDQuoted", extAsDQuoted);
  addFunction1Param("AsNullable", extAsNullable);
  addFunction2Param("AsDefault", extAsDefault);
  addFunction1Param("AsJson", extAsJson);
  addFunctionAParam("AsCsv", extAsCsv);
  addFunction1Param("NumVal", fnStrToFloat);
  addFunction2Param("NumValC", fnNumValC);
  addFunction1Param("NumValF", fnNumValF);
  addFunction1Param("TestNumVal", fnTestNumVal);
  addFunction2Param("TestNumValC", fnTestNumValC);
  addFunction1Param("TestNumValF", fnTestNumVal);

  // -- Other functions --
  addFunctionAParam("ArrayJoin", extARRJOIN);
  addFunctionAParam("ArrayMax", extARRMAX);
  addFunctionAParam("ArrayMin", extARRMIN);
  addFunctionAParam("ArraySum", extARRSUM);
  addFunctionAParam("ArrayAverage", extARRAVG);
  addFunctionAParam("ArrayContains", extARRCONTAINS);
  addFunctionAParam("ArrayUnique", extARRUNIQ);
  addFunctionAParam("ChooseValue", extCHOOSE);
  addFunction1Param("ToHexStr", extTOHEX);
  addFunction1Param("FromHex", extFROMHEX);
  addFunction2Param("ToBinary", extTOBIN);
  addFunction1Param("FromBinary", extFROMBIN);
  addFunction2Param("BitOrValue", extBITOR);
  addFunction2Param("BitAndValue", extBITAND);
  addFunction2Param("BitXorValue", extBITXOR);
  addFunction1Param("BitNotValue", extBITNOT);
  addFunction2Param("BitShiftLeft", extBITSHL);
  addFunction2Param("BitShiftRight", extBITSHR);
  addFunction1Param("ByteSizeOf", extBYTESIZE);
  addFunction1Param("CheckSumOf", extCHECKSUM);
  addFunction3Param("PaymentValue", extPMT);
  addFunction3Param("PresentValueOf", extPV);
  addFunction4Param("FutureValue", extFV);
  addFunction3Param("NumOfPeriods", extNPER);
  addFunction3Param("RateOf", extRATE);
  addFunction4Param("InterestPmt", extIPMT);
  addFunction4Param("PrincipalPmt", extPPMT);
  addFunction2Param("LocaleCompare", fnStandardCompare);
  addFunction0Param("CurrencySymbol", () => 'NT\$');
  addFunction0Param("MonetaryDecimalPoint", () => '.');
  addFunction0Param("MonetaryThousandsSeparator", () => ',');
  addFunction0Param("NumericDecimalPoint", () => '.');
  addFunction0Param("NumericThousandsSeparator", () => ',');
  addFunction2Param("BooleanOfInteger", extTOBIN);
  addFunction1Param("IntegerOfBoolean", extFROMBIN);
  addFunction2Param("StandardCompare", fnStandardCompare);
  addFunction1Param("HashOf", extHASH);
  addFunctionAParam("COUNT", fnCOUNT);
  addFunctionAParam("HIGH", fnHIGH);
  addFunctionAParam("LOW", fnLOW);
}