Date: 10-05-2026 Subject: RELEASE 10.9 Runtime Files These RELEASE notes pertain to the following programs or files: EMBEDINI 10.9 05 Oct 2026 10.9.0.500 EMBEDINI64 10.9 05 Oct 2026 10.9.0.500 HEXDUMP 10.9 05 Oct 2026 10.9.0.500 HEXDUMP64 10.9 05 Oct 2026 10.9.0.500 MAKECLI 10.9 05 Oct 2026 10.9.0.500 MAKECON 10.9 05 Oct 2026 10.9.0.500 MAKECONET 10.9 05 Oct 2026 10.9.0.500 MAKEDEF 10.9 05 Oct 2026 10.9.0.500 MAKEMFD 10.9 05 Oct 2026 10.9.0.500 MANAGECE 10.9 05 Oct 2026 10.9.0.500 OBJMATCH 10.9 05 Oct 2026 10.9.0.500 OBJMATCH64 10.9 05 Oct 2026 10.9.0.500 ODBCINST64 10.9 05 Oct 2026 10.9.0.500 PLBCGI 10.9 05 Oct 2026 10.9.0.500 PLBCLICON 10.9 05 Oct 2026 10.9.0.500 (ComCtl 6) PLBCLIENT 10.9 05 Oct 2026 10.9.0.500 (ComCtl 6) PLBCLINET 10.9 05 Oct 2026 10.9.0.500 (ComCtl 6) PLBCON 10.9 05 Oct 2026 10.9.0.500 (ComCtl 6) PLBCONET 10.9 05 Oct 2026 10.9.0.500 (ComCtl 6) PLBNET 10.9 05 Oct 2026 10.9.0.500 (ComCtl 6) PLBREST 10.9 05 Oct 2026 10.9.0.500 (ComCtl 6) PLBSERVE 10.9 05 Oct 2026 10.9.0.500 (Processed Server) PLBSERVEA 10.9 05 Oct 2026 10.9.0.500 (Processed Server) PLBSERVET 10.9 05 Oct 2026 10.9.0.500 (Threaded Server) PLBWEBSRV 10.9 05 Oct 2026 10.9.0.500 (Processed Server) PLBWEBSRVA 10.9 05 Oct 2026 10.9.0.500 (Processed Server) PLBWEBSRVT 10.9 05 Oct 2026 10.9.0.500 (Threaded Server) PLBWIN 10.9 05 Oct 2026 10.9.0.500 (ComCtl 6) SUNAAMDX 10.9 05 Oct 2026 10.9.0.500 SUNAAMDX64 10.9 05 Oct 2026 10.9.0.500 SETGUID 10.9 05 Oct 2026 10.9.0.500 SUNINDEX 10.9 05 Oct 2026 10.9.0.500 SUNINDEX64 10.9 05 Oct 2026 10.9.0.500 SUNLS 10.9 05 Oct 2026 10.9.0.500 SUNMOD 10.9 05 Oct 2026 10.9.0.500 SUNMOD64 10.9 05 Oct 2026 10.9.0.500 SUNSORT 10.9 05 Oct 2026 10.9.0.500 SUNSORT64 10.9 05 Oct 2026 10.9.0.500 WININST 10.9 05 Oct 2026 10.9.0.500 PLBNLD.DLL 10.9 05 Oct 2026 10.9.0.500 PLBNETSUP.DLL 10.9 05 Oct 2026 10.9.0.500 Required for PLBNET PLBWSEC.DLL 10.9 05 Oct 2026 10.9.0.500 Req'd PLBWIN/PLBNET ODSBAC32.DLL 10.9 05 Oct 2026 ODSBAC64.DLL 10.9 05 Oct 2026 SA_DLL32.DLL 10.9 05 Oct 2026 10.9.0.500 SUNWADO.DLL 10.9 05 Oct 2026 10.9.0.500 SUNWADO25.DLL 10.9 05 Oct 2026 10.9.0.500 SUNWADO28.DLL 10.9 05 Oct 2026 10.9.0.500 SUNWMSQL.DLL 10.9 05 Oct 2026 10.9.0.500 SUNWODBC.DLL 10.9 05 Oct 2026 10.9.0.500 SUNWSRV.DLL 10.9 05 Oct 2026 10.9.0.500 SUNWSRV64.DLL 10.9 05 Oct 2026 10.9.0.500 Required for Sundm64 DBGIFACE 10.9 05 Oct 2026 PLBCMP 10.9 05 Oct 2026 PLBDBUG 10.9 05 Oct 2026 SUNDEBUG 10.9 05 Oct 2026 SUNIDE 10.9 05 Oct 2026 ADMEQU.INC 10.9 05 Oct 2026 PLBEQU.INC 10.9 05 Oct 2026 PLBMETH.INC 10.9 05 Oct 2026 PLBRUN.ZIP 10.9 05 Oct 2026 10.9.0.600 (ComCtl 6) *============================================================================== Notes for some NEW Items: - REGEX object and methods. - Plbrest.exe command used in place of plbwin.exe for REST services implemented by the PL/B Web Server ( plbwebsrv.exe ). The plbrest.exe command uses the plbwebsrv.exe licenses when processing a REST request. The plbrest.exe command has all of the same PL/B Language capabilities as the plbwin.exe runtime command except it can ONLY be used, executed and invoked by the plbwebsrv.exe server. - SWAP instruction. ( See Documentation Section ) - MATCHLIST instruction. ( See Documentation Section ) - MAILSEND supports new *CLIENTID keyword. - The string expression includes a '+' operator used to perform string concatenation operations. *============================================================================== Notes for DOCUMENTATION: - In the 'PL/B Language Reference' manual, change the PL/B 'pdf:' version from 1.4 to 1.7 in the following sections: PDF Support Overview PDF PRTOPEN Notes PDF PRTPLAY Notes - In the 'PL/B Language Reference' manual, add the following description to the HTTP instruction. Modify the Note (3.) *FLAGS bit value descriptions to include the following: $HTTP_FLAG_USE_CERT_KEY_FILE ( 0x8000 ) This flag bit value enables use of the current 'PLB_SSL_CERTFILE' and 'PLB_SSL_KEYFILE' keyword settings for TLS client authentication during the TLS handshake. If this flag bit is not specified, these keyword settings are ignored for the HTTP operation. - In the 'PL/B Runtime Reference' manual, add the following keyword descriptions to the PLBWIN Keywords: PLB_SSL_CERTFILE Keyword PLB_SSL_CERTFILE={path\certfile.pem} This keyword specifies the fully qualified path to the PEM client certificate file used for TLS client authentication. The certificate is presented during the TLS handshake only if the server requests a client certificate and is configured to verify it. PLB_SSL_KEYFILE Keyword PLB_SSL_KEYFILE={path\keyfile.pem} This keyword specifies the fully qualified path to the PEM private key file associated with the client certificate. The private key is used during the TLS handshake to prove ownership of the client certificate when the server requests client authentication. This file must correspond to the certificate specified by the PLB_SSL_CERTFILE keyword. - In the 'PL/B Language Reference' manual, modify the 'Expressions' section as follows: 1. Change the basic/opening paragraph for 'Expressions' to include a descriptions for the following: Expressions for the PL/B language are implemented and used in three categories which are described as follows: Arithmetic (Numeric) Expressions Arithmetic expressions, also referred to as numeric expressions, are combinations of numeric variables, numeric literals, arithmetic operators, and parentheses that evaluate to a single numeric result. These expressions are used in calculations, assignments, comparisons, and conditional logic within PL/B programs. Logical Expressions Logical expressions are combinations of comparison operations, logical operators, variables, literals, and parentheses that evaluate to a logical TRUE or FALSE result. Logical expressions are primarily used in conditional processing instructions such as IF, WHILE, and other program control operations. String Expressions String expressions are combinations of comparison operations, logical operators, DIM variables, literals, and parentheses. String expressions involving DIM strings use the logical contents of the variable from the Form Pointer to the Logical Length. When using string expressions, the characters of '_', '%' and '\' are treated as normal characters for all string operators except as described for the Operand2 of the LIKE operator. In addition, a string expression includes a '+' operator used to perform a string concatenation operation. 2. Change the logical Expressions table headings to be as follows: Operator Meaning 3. Add this description for 'String expressions' to include the following: When using a string expression, the '+' operator is supported to perform a string concatenation operation. Example: A INIT "a" B INIT "b" AB INIT "ab" . IF ( ( A + B ) == AB ) ....expected result is TRUE ENDIF In this case, the ( A + B ) string expression causes the B DIM variable contents to be concatenated to the A DIM variable contents making a temporary string variable which is then matched to the AB DIM variable contents. . - In the 'PL/B Language Reference' manual, modify the 'DEFAULT Property' description to be defined for a BUTTON and a separate description for a MENUITEM as follows: *-------------------------------------------------------------------- DEFAULT (BUTTON) Property The DEFAULT property specifies that the BUTTON is to gain control when the enter key is pressed. The property uses the following format: DEFAULT[={value}] Note the following: 1. The DEFAULT property may be used in CREATE, SETPROP, or GETPROP statements of a BUTTON object. 2. This property does not override any DIALOG operations. 3. If a BUTTON object other than the DEFAULT BUTTON object has the focus when the enter key is pressed, the activation routine of the BUTTON object with the focus gains the program control. 4. If the DEFAULT property is specified without an assigned {value}, the action is the same as if DEFAULT=1 were given. 5. {value} is a decimal number, a Numeric Variable, an Expression, or a keyword as defined in PLBEQU.INC. The supported values and keywords are: Value Keyword Enter key trapping is ... 0 $OFF disabled. (default) 1 $ON enabled. 6. When a DEFAULT key action generates the click event for a BUTTON object, the 'eventMod' value of 0x100 indicates that a DEFAULT key action generated the click event. *-------------------------------------------------------------------- DEFAULT (MENUITEM) Property The DEFAULT property marks a MENUITEM as the default command item within a MENU, SUBMENU, or FLOATMENU object. The property uses the following format: DEFAULT[={value}] Note the following: 1. The DEFAULT property may be used in the SETPROP or GETPROP statements for a MENUITEM object. 2. If the DEFAULT property is specified without an assigned {value}, the action is the same as if DEFAULT=1 were specified. 3. {value} is a decimal number, a Numeric Variable, an Expression, or a keyword as defined in PLBEQU.INC. The supported values and keywords are: Value Keyword Default command state is ... 0 $OFF disabled. (default) 1 $ON enabled. 4. When the DEFAULT property is used for a MENUITEM in a normal MENU/SUBMENU object, double-clicking the MENU object to open the SUBMENU causes the default command item to be chosen automatically, and the appropriate events are generated. If no default command item is defined, the drop-down submenu remains open. 5. When the DEFAULT property is used for a MENUITEM in a popup FLOATMENU object, no automatic selection or automatic event generation occurs for the default command item when the popup menu is displayed. 6. For an active MENU or FLOATMENU popup, the current selection may be changed by either the mouse pointer or the keyboard arrow keys. The Enter key acts on the currently highlighted item, not merely on the MENUITEM marked with the DEFAULT property. - In the 'PL/B Language Reference' manual, add the new 'MATCHLIST' instruction description as follows: *-------------------------------------------------------------------- MATCHLIST The MATCHLIST instruction matches or compares each variable in the source operand to the corresponding variable in the destination operand using a single instruction. The source and destination operands must be RECORD or VARLIST types. The instruction uses the following format: [label] MATCHLIST {source}{sep}{dest} Where: label Optional. A Program Execution Label. source Required. A RECORD or VARLIST variable that serves as the source operand and contains the individual variables to be matched or compared. sep Required. A comma or one of the following prepositions: BY, TO, OF, FROM, USING, WITH, IN, or INTO. dest Required. A RECORD or VARLIST variable that serves as the destination operand and contains the individual variables to be matched or compared. Flags Affected: EOS, LESS, OVER, ZERO Note the following: 1. The {source} and {dest} RECORDs or VARLISTs do not have to be identical when using MATCHLIST. 2. RECORD variables are processed recursively. All variables contained within nested RECORD definitions are included in the MATCHLIST processing operation. 3. Array elements contained within RECORDs or VARLISTs are processed individually as part of the variable list. 4. When the RECORD or VARLIST source variable is a DIM or NCHAR type and the corresponding destination variable is also a DIM or NCHAR type, these variables are matched as follows: 4a. If both the source and destination variables are NULL, then the variables are equal. 4b. If both the source and destination variables are not NULL, the variables are equal only when they have the same logical length and their data contents are equal. Otherwise, MATCHLIST quits with the ZERO flag cleared. 4c. DIM and NCHAR comparisons are case-sensitive. 4d. If one variable is a DIM or NCHAR type and the other variable is not a DIM or NCHAR type, the variables are not equal and MATCHLIST quits with the ZERO flag cleared. 5. When the RECORD or VARLIST source variable is a FORM or INTEGER type and the corresponding destination variable is also a FORM or INTEGER type, these numeric variables are compared as follows: 5a. If the actual content values of the source and destination variables are equal, MATCHLIST continues executing with the ZERO flag set TRUE. Otherwise, MATCHLIST quits with the ZERO flag cleared. 5b. If the source variable is a FORM or INTEGER type and the destination variable is not a FORM or INTEGER type, the variables are not equal and MATCHLIST quits with the ZERO flag cleared. 6. When the RECORD or VARLIST source variable is a GUI object type and the corresponding destination variable is also a GUI object type, these variables are matched as follows: 6a. If both the source and destination variables are GUI objects and the object types are the same, MATCHLIST continues executing with the ZERO flag set TRUE. Otherwise, MATCHLIST quits with the ZERO flag cleared. 6b. GUI object created and not created states are not included in the MATCHLIST comparison operation. 6c. GUI object variables may exist in RECORD variables and LIST variables. However, GUI object variables are not allowed in VARLIST declarations. 7. If the number of variables is different in the source and destination operands, MATCHLIST processes the match and comparison operations until the smallest variable list is exhausted or until the ZERO flag is cleared. 8. The EOS and LESS flags are always cleared. 9. The OVER flag is set TRUE if an unknown variable type is encountered in the source or destination variable lists. Otherwise, the OVER flag is cleared. 10. The ZERO flag is set TRUE if all tested variables in the source and destination operands match or compare equal. Otherwise, MATCHLIST quits when a match or comparison operation results in a not equal condition and the ZERO flag is cleared. 11. The following example demonstrates MATCHLIST processing for RECORD, LIST, nested RECORD, GUI object, and unequal variable count comparisons: . LIST1 LIST Rec1 RECORD (3) A DIM 5 B BUTTON Recx RECORD X INIT "X" RECORDEND RECORDEND LISTEND . LIST2 LIST Rec2 RECORD (3) A1 DIM 10 B1 BUTTON Recxx RECORD X1 INIT "X" RECORDEND RECORDEND LISTEND . arr DIM 5(3) . ListX LIST A INIT "A" B INIT "B" LISTEND . ListX1 LIST A1 INIT "A" B1 INIT "B" C1 INIT "C" LISTEND . *............................................................... . ..... MOVE "XY", Rec1(1).A, Rec2(1).A1 . MATCHLIST Rec1(1), Rec2(1) IF EQUAL DISPLAY "EQUAL...: MATCHLIST Rec1(1), ": "Rec2(1) --> Expected" ELSE DISPLAY "NOT EQUAL...: MATCHLIST Rec1(1), "": "Rec2(1) --> NOT Expected" ENDIF ..... MATCHLIST List1, List2 IF EQUAL DISPLAY "EQUAL...: MATCHLIST List1, List2 ": "--> Expected" ELSE DISPLAY "NOT EQUAL...: MATCHLIST List1, List2 ": "--> NOT Expected" ENDIF ..... MOVE "XYZ", Rec2(1).A1 . MATCHLIST Rec1(1), Rec2(1) IF EQUAL DISPLAY "EQUAL...: MATCHLIST Rec1(1), Rec2(1) ": "--> NOT Expected" ELSE DISPLAY "NOT EQUAL...: MATCHLIST Rec1(1), Rec2(1) ": "--> Expected" ENDIF ..... MATCHLIST ListX, ListX1 IF EQUAL DISPLAY "EQUAL...: MATCHLIST ListX, ListX1 ": "--> Expected" ELSE DISPLAY "NOT EQUAL...: MATCHLIST ListX, ListX1 ": "--> NOT Expected" ENDIF ..... MATCHLIST ListX1, ListX IF EQUAL DISPLAY "EQUAL...: MATCHLIST ListX1, ListX ": "--> Expected" ELSE DISPLAY "NOT EQUAL...: MATCHLIST ListX1, ListX ": "--> NOT Expected" ENDIF ..... KEYIN "Hit enter to exit: ", S$CMDLIN . STOP . - In the 'PL/B Language Reference' manual, add the new 'SWAP' instruction description as follows: *-------------------------------------------------------------------- SWAP The SWAP instruction exchanges the contents of the source operand with the contents of the destination operand. The operands must be compatible for a swap operation. In general, this means that the operands must have the same variable type, physical size, and any required format or state attributes. The instruction uses the following format: [label] SWAP {source}{sep}{dest} Where: label Optional. A Program Execution Label. source Required. A previously defined Character String Variable, National Character String Variable, or Numeric Variable. In addition, the source operand can be a RECORD or VARLIST that contains multiple variables to be used for multiple swap operations. sep Required. A comma or one of the following prepositions: BY, TO, OF, FROM, USING, WITH, IN, or INTO. dest Required. A previously defined Character String Variable, National Character String Variable, or Numeric Variable. In addition, the destination operand can be a RECORD or VARLIST that contains multiple variables to be used for multiple swap operations. Flags Affected: OVER Note the following: 1. By default, the OVER flag is cleared. The OVER flag is set TRUE if a GUI object is encountered and skipped in a RECORD to RECORD swap operation. When this occurs, the GUI object member is not swapped, the operation continues with the next variable, and the OVER flag is set. 2. If the source and destination RECORD/VARLIST operands contain a different number of variables, SWAP processes matching variables in order until the shorter variable list is exhausted or until an error is encountered. 3. When the SWAP operation detects an error, n F18 error is generated and the subcode identifies the specific type of error encountered as follows: F18 Error Sub Code Values Source/destination variable mismatch because: 1 - The types are not the same. 2 - An operand variable with an unknown type is encountered. 3 - The variable behavior/state attributes required for the swap are not the same. 5 - The physical sizes are not the same. 6 - A DIM NULL variable is not allowed. 7 - Unable to allocate memory when creating a buffer for a variable larger than 8192 bytes. 8 - The form formats are not the same. 9 - The GUI object types are not the same. 4. The following example demonstrates SWAP processing for individual variables, RECORD variables, and VARLIST variables. . ************************************************************ . Individual DIM SWAP operation . A DIM 10 B DIM 10 . MOVE "abcdef", A MOVE "rst", B DISPLAY A, "...", B, " (Before SWAP )" . DISPLAY "SWAP A with B" SWAP A with B . DISPLAY A, "...", B, " (After SWAP )",*N . ************************************************************ . Individual DIM pointer SWAP operation . pA DIM ^ pB DIM ^ . DMAKE pA, 15 DMAKE pB, 15 MOVE "1234", pA MOVE "567890", pB DISPLAY pA, "...", pB, " (Before SWAP )" . DISPLAY "SWAP pA, pB" SWAP pA, pB . DISPLAY pA, "...", pB, " (After SWAP )",*N . ************************************************************ . Individual FORM SWAP operation . F5p4 FORM 5.4 F5p4a FORM 5.4 . MOVE "12.34", F5p4 MOVE "98765.4321", F5p4a DISPLAY F5p4, "...", F5p4a, " (Before SWAP )" . DISPLAY "SWAP F5p4, F5p4a" SWAP F5p4, F5p4a . DISPLAY F5p4, "...", F5p4a, " (After SWAP )",*N . ************************************************************ . SWAP operation using RECORDs . RecDef RECORD DEFINITION A DIM 15 B FORM 2.5 C INTEGER 4 RECORDEND . Rec1 RECORD LIKE RecDef Rec2 RECORD LIKE RecDef . Data1 INIT "abcdefg;3.456" Data2 INIT "ABCDEFGHIJKLMN;12.34567" . EXPLODE Data1, ";", Rec1 EXPLODE Data2, ";", Rec2 MOVE 8192, Rec1.C MOVE 16384, Rec2.C . DISPLAY "Rec1 '", Rec1, "' (Before SWAP)", *N: "Rec2 '", Rec2, "' (Before SWAP)" . DISPLAY "SWAP Rec1, Rec2" SWAP Rec1, Rec2 . DISPLAY "Rec1 '", Rec1, "' (After SWAP)", *N: "Rec2 '", Rec2, "' (After SWAP)", *N . ********************************************************** . SWAP operation using RECORD and Object . RecDefx RECORD DEFINITION A DIM 15 B FORM 2.5 Combo COMBOBOX C INTEGER 4 RECORDEND . List3 LIST Rec3 RECORD LIKE RecDef LISTEND . List4 LIST Rec4 RECORD LIKE RecDef LISTEND . Data3 INIT "Welcome;3.456" Data4 INIT "To my home!;12.34567" . EXPLODE Data3, ";", Rec3 EXPLODE Data4, ";", Rec4 MOVE 4096, Rec3.C MOVE 8192, Rec4.C . DISPLAY "Rec3 '", Rec3, "' (Before SWAP)",*N: "Rec4 '", Rec4, "' (Before SWAP)" . DISPLAY "----->SWAP List3, List4" SWAP List3, List4 IF OVER DISPLAY "OVER is TRUE --> Object skipped!!" ENDIF . DISPLAY "Rec3 '", Rec3, "' (After SWAP)", *N: "Rec4 '", Rec4, "' (After SWAP)", *N . ************************************************************ . KEYIN "Hit enter to exit: ", S$CMDLIN . - In the PL/B Language Reference manual, change the MAILSEND Note (3.) to include a new 'Option' named "*CLIENTID={domain}". The 'Meaning' description is as follows: *------------------------------------------------------------------------ The *CLIENTID keyword {domain} is a PL/B {svarslit} string. This keyword allows the PL/B program to provide the value used as the SMTP EHLO argument. The value may be used by the receiving SMTP email server to identify the SMTP client. It may also be used by the server for logging, tracing, policy checks, or client verification. The The MAILSEND instruction does not validate or restrict the {domain} string, except that it is limited to a maximum of 300 bytes. The PL/B program is responsible for specifying a valid {domain} value. RFC 5321 defines the EHLO command argument as one of the following: 1. A primary host name A primary host name is a fully qualified domain name (FQDN) that successfully resolves to an address resource record (RR), such as an A or AAAA DNS record. Examples of valid primary host names for the CLIENTID value: *CLIENTID="mail.example.com" *CLIENTID="smtp1.company.net" *CLIENTID="outbound.mailhost.org" Requirements: a) The value must be a fully qualified domain name (FQDN). b) The value must resolve in DNS to at least one address resource record: ``` A record -> IPv4 address AAAA record -> IPv6 address ``` c) The value should identify the actual host name of the sending SMTP client. 2. An address literal An address literal should be used only when the SMTP client does not have a meaningful domain name. It must be written using one of the bracketed forms defined by RFC 5321. Examples of address literals for the CLIENTID value: *CLIENTID="[192.0.2.10]" *CLIENTID="[IPv6:2001:db8::1]" Requirements: a) The value must be enclosed in square brackets. b) The value must follow the literal address formats defined by RFC 5321. c) The value should be used only when the SMTP client genuinely lacks a usable DNS host name. Note: RFC 5321 allows a receiving SMTP server to check whether the EHLO value corresponds to the IP address of the connecting SMTP client. However, the EHLO value alone should not be treated as SMTP authentication. A receiving SMTP server may still apply its own security, authorization, anti-abuse, or mail relay policies. - In the 'PL/B Runtime Reference' manual, add the following Fxx error descriptions to the 'F (Format) Errros section: F18 - A SWAP instruction error. The following error subcodes identify the reason for the error: Sub Code Values Source/destination variable mismatch because: 1 - The types are not the same. 2 - An operand variable with an unknown type is encountered. 3 - The variable behavior/state attributes required for the swap are not the same. 5 - The physical sizes are not the same. 6 - A DIM NULL variable is not allowed. 7 - Unable to allocate memory when creating a buffer for a variable larger than 8192 bytes. 8 - The form formats are not the same. 9 - The GUI object types are not the same. F19 - An enhanced mathematical instruction error has occurred. Sub Code Values Source/destination variable mismatch because: 101 - POWER or '**' operation 'NaN' error. Negative base with a non-integer exponent where the result is mathematically undefined. 102 - POWER or '**' operation infinity error. In this case, the computation true value exceeded the maximum representable double. 103 - POWER or '**' result contains more than 32 whole number digits which causes the result value to be truncated/lost. 133 - POWER or '**' operation doman error. The input arguments are invalid and outside the mathematical domain. 134 - POWER or '**' operation ERANGE error. The result is out of range for a double. This is caused by either an overflow to infinity or an underflow to 0. - In the PL/B Language Reference manual, change the APPEND description as follows: 1. Add the new APPEND 3 operand syntax: (1) [label] APPEND {source} {sep} {dest} (2) [label] APPEND {source} {sep} {source1} {sep} {dest} 2. Change the 'source' description to read as follows: Source A previously defined Character String Variable, National Character String Variable, Literal, National Character String Literal, Numeric Variable, or String Expression that is appended to the {dest} variable when using syntax format 1. When using syntax format 2, the source data is appended to source1 and the resulting string is moved to the {dest}. 3. Add the format 2 'source1' description as follows: Source1 A previously defined Character String Variable, National Character String Variable, Literal, National Character String Literal, Numeric Variable, or String Expression which contains the initial data that is being appended to when using the syntax format 2. In this case, the source data is appended to the source1 data and the resulting string is moved to the {dest}. 4. Change the Note (1.) description to read as follows: When using syntax format 1, the source is appended to {dest} immediately after the Length Pointed character. The Form Pointer of {dest} remains unchanged and the Length Pointer is set to the last character appended. If the Physical Length of {dest} is exhausted before the APPEND operation is complete, the EOS Condition Flag is set. 5. Insert Note (2.) description that reads as follows: When using syntax format 2, the source data is appended to the source1 data and the resulting string is moved to {dest}. Transfer of the resulting string begins at the first Physical character of {dest}. The Form Pointer of {dest} is set to one (1), and the Length Pointer is set to the last character transferred. If the Physical Length of {dest} is exhausted before the complete resulting string is transferred, the EOS Condition Flag is set. - In the PL/B Language Reference manual, change the PACK instruction to allow a String Expression as a {source} parameter. 1. Change the Where: 'source' description to read as follows: Required. A previously defined Character String Variable, National Character String Variable, Numeric Variable, a list of string and/or numeric variables, String Expression, or a VARLIST, or a String of string and/or numeric variables that are appended together and placed in the {dest} operand. - In the PL/B Language Reference manual, change the ERASE description as follows: 1. Change the 'filenames' description to read as follows: filename Required. A previously defined Character String Variable, Literal, or String Expression indicating the name of the file that is deleted. - In the PL/B Runtime Reference manual, change the 'PLB_CHECKFILE2GB Keyword' description as follows: 1. Change the last sentence to read as follows: "By default, this keyword action is set to be OFF. If this keyword is set to ON, the runtime will perform the 2GB file size checking." - The PL/B Web Server and the PL/B Runtime Reference manual are modified to include the description and keywords for using the 'PLBREST' runtime. *============================================================================== The following files have been changed as noted: ------------------------------------------------------------------------------- All Sunbelt Products - Removed the product serial number ( Nxxxxxx ) from all PL/B ( .plc ) utilities. ------------------------------------------------------------------------------- Sunbelt GitHub Updates - This GitHub link has 'sunbelt-plb-samples' as follows: https://github.com/KcsDev1982/sunbelt-plb-samples - Updated the 'sunbelt-plb-samples' to include the following: Google Calendar Samples Added new basic samples PowerShell Scripts to remake Shortcuts Updated the AI and basic samples Samples for the DATASET video Added new Gemini Example Added new AI sample using Responses API Added Linux support script to check Linus 'shared library' support ------------------------------------------------------------------------------- PLBWEBSRV (HTML\JS\CSS) - Modified to support 10.9 changes. plbwebbasic.css 10.7A 250120 plbwebipad.css 10.6B 240409 plbwebbasic.js 10.9 260904 plbwebctls.js 10.7A 250122 plbwebmob.js 10.0A 180402 Support jQuery Mobile plbwebboot.html 10.2A 191210 plbwebtvcssinfo.html 9.9 161028 plbmobstart.html 10.0A 180402 Support jQuery Mobile plbwebstart.html 10.0A 180402 plbwebstartwv.html 10.5 220524 Support Bootstrap 5 plbwebstart99a.html 9.9A 170428 ------------------------------------------------------------------------------- PLBWEBSRV (Linux\Unix) - Modified to support the LISTVIEW methods as follows: LoadCSVFile SaveCSVFile - Modified to support the DATATABLE methods as follows: LoadCSVFile SaveCSVFile ------------------------------------------------------------------------------- PLBWEBSRV (Windows) - Modified plbwebsrv.exe to allow the 'plbrest.exe' runtime to be used for the PWS REST services. The plbrest.exe command uses the plbwebsrv.exe licenses when processing a REST request. The plbrest.exe command has all of the same PL/B Language capabilities as the plbwin.exe command except it can ONLY be used, executed and invoked by the plbwebsrv.exe server. ------------------------------------------------------------------------------- plbai_html - Add to 10.9. plbwvbasic.css 10.7A 250120 plbwebai.js 10.9 260910 plbwebctls.js 10.7A 250122 plbwvbasic.js 10.9 260904 ------------------------------------------------------------------------------- plbwv_html - Modified to support 10.9 changes. plbwvbasic.css 10.7A 250120 plbwebctls.js 10.7A 250122 plbwvbasic.js 10.9 260904 plbwvmstart.html 10.7A 250123 plbwvstart.html 10.7A 250123 ------------------------------------------------------------------------------- PLBWIN, PLBSERVE, PLBSERVEA, PLBWEBSRV, PLBWEBSRVA (Windows) - Fixed a bug that caused all of the following RUNTIME objects to be destroyed when the EXECUTE operation was executed. With this correction the RUNTIME objects are not destroyed after an EXECUTE instruction is executed. PLBOBJECT, DATASET, XDATA, DATETIME, FTP, DATATABLE, JSONDATA, and AIOBJECT. ------------------------------------------------------------------------------- PLBSERVE(Windows), PLBWEBSRV(Windows), PLBSERVE(UNIX), PLBWEBSRV(UNIX) - Modified the PDF version output to the PL/B 'pdf:' file to be version 1.7. With this change, a PDF reader must support version 1.7 or later. ------------------------------------------------------------------------------- PLBWIN, PLBNET, PLBSERVE, PLB(UNIX), PLBWEBSRV - Modified to support OpenSSL client certificate and private key PEM files. This support is implemented as follows: 1. Added new runtime keywords specified as follows: PLB_SSL_CERTFILE={path\certfile.pem} This keyword specifies the fully qualified path to the PEM client certificate file used for TLS client authentication. The certificate is presented during the TLS handshake only if the server requests a client certificate and is configured to verify it. PLB_SSL_KEYFILE={path\keyfile.pem} This keyword specifies the fully qualified path to the PEM private key file associated with the client certificate. The private key is used during the TLS handshake to prove ownership of the client certificate when the server requests client authentication. This file must correspond to the certificate specified by the PLB_SSL_CERTFILE keyword. 2. Modified the HTTP instruction to support a new flag bit mask value required to allow the HTTP instruction to use the runtime keywords 'PLB_SSL_CERTFILE' and 'PLB_SSL_KEYFILE'. The new flag bit value is described as follows: $HTTP_FLAG_USE_CERT_KEY_FILE ( 0x8000 ) This flag bit value enables use of the current 'PLB_SSL_CERTFILE' and 'PLB_SSL_KEYFILE' keyword settings for TLS client authentication during the TLS handshake. If this flag bit is not specified, these keyword settings are ignored for the HTTP operation. - Added a new MAILSEND keyword name "*CLIENTID={domain}". The {domain} may be used by the receiving SMTP email server to identify the SMTP client. See the full description in the documentation section. - Fixed the DISPLAY/KEYIN controls *ES, *EL, and *EF to allow the BOLD attribute flag to be stored into the display image buffer. This corrects a problem where the BOLD attribute flag was being prematurely cleared. This change allows the KEYIN *CRTON control to work properly when retrieving the display image attribute flags. - Added support for string expression '+' operator used to perform string concatenation operations. This '+' operator can be used in a string expression in the following instructions. See 'PL/B Language Reference' Manual APPEND ERASE Expressions IF, ELSE, ELSE IF, ENDIF ( Expression ) MOVE OPEN (AFILE), (FILE), (IFILE), (XFILE) PACK PREPARE (AFILE), (FILE), (IFILE), (XFILE) READ, READTAB, READLK (AFILE), (FILE), (XFILE) READ (XFILE) UPDATE (XFILE) UPDATE, UPDATAB (AFILE), (FILE), (IFILE) WRITE (AFILE), (FILE), (IFILE), (XFILE), (FILELIST) WRITAB (FILE) - Added support for new HTMLCONTROL methods: GetChecked GIVING {nvar} USING *Id={svarslit}: *Flags={dnumnvar} Optional GetClass GIVING {nvar} USING *Id={svarslit}: *Flags={dnumnvar} Optional GetDisabled GIVING {nvar} USING *Id={svarslit}: *Flags={dnumnvar} Optional GetEnable GIVING {nvar} USING *Id={svarslit}: *Flags={dnumnvar} Optional GetEvents GIVING {nvar} USING *Id={svarslit}: *Flags={dnumnvar} Optional GetHTML GIVING {nvar} USING *Id={svarslit}: *Flags={dnumnvar} Optional GetTabId GIVING {nvar} USING *Id={svarslit}: *Flags={dnumnvar} Optional GetText GIVING {nvar} USING *Id={svarslit}: *Flags={dnumnvar} Optional GetValue GIVING {nvar} USING *Id={svarslit}: *Flags={dnumnvar} Optional LoadHTML GIVING {nvar} USING *HtmlFile={svarlit}: *Flags={dnumnvar} Optional SetAsClient GIVING {nvar} SetChecked GIVING {nvar} USING *Id={svarslit}: *Value={svarslit}: *Flags={dnumnvar} Optional SetClass GIVING {nvar} USING *Id={svarslit}: *Class={svarslit}: *Flags={dnumnvar} Optional SetDisabled GIVING {nvar} USING *Id={svarslit}: *Value={svarslit}: *Flags={dnumnvar} Optional SetEnable GIVING {nvar} USING *Id={svarslit}: *Enable={svarslit}: *Flags={dnumnvar} Optional SetEvents GIVING {nvar} USING *Id={svarslit}: *Event={svarslit}: *Flags={dnumnvar} Optional SetHTML GIVING {nvar} USING *Id={svarslit}: *Html={svarslit}: *Flags={dnumnvar} Optional SetTabId GIVING {nvar} USING *Id={svarslit}: *TabId={svarslit}: *Flags={dnumnvar} Optional SetText GIVING {nvar} USING *Id={svarslit}: *Text={svarslit}: *Flags={dnumnvar} Optional SetValue GIVING {nvar} USING *Id={svarslit}: *Value={svarslit}: *Flags={dnumnvar} Optional - Added support for the REGEX object and methods: The REGEX object provides compiled regular-expression support for matching, searching, counting, replacing, splitting text, and diagnostic inspection. The REGEX object methods: Compile GIVING {nvar} USING *Pattern={svarslit}: *Options={dnumnvar} Optional Count GIVING {nvar} USING *Text={svarslit}: *Options={dnumnvar} Optional GetMatch GIVING {svar} GetMaxCaptures GIVING {nvar} IsCompiled GIVING {nvar} IsMatch GIVING {nvar} USING *Text={svarslit}: *Options={dnumnvar} Optional Match GIVING {svar} USING *Text={svarslit}: *Options={dnumnvar} Optional MatchAll GIVING {svar} USING *Text={svarslit}: *Delimiter={svarslit}: Optional *Options={dnumnvar} Optional Replace GIVING {svar} USING *Text={svarslit}: *Value={svarslit}: *Options={dnumnvar} Optional ReplaceAll GIVING {svar} USING *Text={svarslit}: *Value={svarslit}: *Options={dnumnvar} Optional ReplaceEx GIVING {svar} USING *Text={svarslit}: *Value={svarslit}: *Options={dnumnvar}: Optional *Start={dnumnvar}: Optional *Occurrence={dnumnvar}: Optional *Flags={svarslit} Optional Reset GIVING {nvar} Search GIVING {nvar} USING *Text={svarslit}: *Options={dnumnvar} Optional Split GIVING {svar} USING *Text={svarslit}: *Delimiter={svarslit}: Optional *Options={dnumnvar} Optional Test GIVING {nvar} USING *Pattern={svarslit}: *Text={svarslit}: *Options={dnumnvar} Optional - Added support for new RUNTIME method: SetWebStartUrl GIVING {nvar} USING *Url={svarslit}: *Options={dnumnvar} Optional - Modified the POWER instruction to return F19 errors when the mathematical operation fails. See Documentation section for information. ------------------------------------------------------------------------------- PLBWIN, PLBNET, ALL GUI CLIENTS - Corrected a problem in the 'ChooseFont' method where an unexpected initial fontsize was shown when the Windows OS screen/display high scaling was being used. - Modified PL/B Windows runtimes to verify that the container is a WINDOW or PANEL object to prevent a GPF when processing a Windows system color change message. ------------------------------------------------------------------------------- PLBREST - Plbrest.exe command used in place of plbwin.exe for REST services implemented by the PL/B Web Server ( plbwebsrv.exe ). The plbrest.exe command uses the plbwebsrv.exe licenses when processing a REST request. Requirements 1) Plbwebsrv.exe version 10.9 2) Plbrest.exe version 10.9 (in same folder as plbwebsrv.exe) 3) PLBWEB_REST_CMDLINEnn must start with plbrest only (no pathing) Configuration in plbwebsrv.ini #==================================================================== # # REST Configuration # #==================================================================== PLBWEB_REST_BASEURL01=MyServices/ PLBWEB_REST_CMDLINE01=plbrest %s %s PLBWEB_REST_MAX_COUNT01=2 PLBWEB_REST_SSL01=BOTH PLBWEB_REST_USE_ENV01=ON PLBWEB_REST_USE_FCGI01=OFF #==================================================================== # # REST Configuration for FASTCGI # #==================================================================== PLBWEB_REST_BASEURL02=MyFastSrv/ PLBWEB_REST_CMDLINE02=plbrest %s phonefcgi PLBWEB_REST_MAX_COUNT02=2 PLBWEB_REST_SSL02=OFF PLBWEB_REST_USE_FCGI02=ON PLBWEB_REST_PORTNUM02=9000 Sample plbrest.ini [version] PRODUCT=PLBREST VERSION=10.9 [environment] PLB_TERM=ansi PLB_SYSTEM=C:\Sunbelt\plbwebsrv.109\code PLB_PATH=C:\Sunbelt\plbwebsrv.109\code;... C:\Sunbelt\plbwebsrv.109\demo\programs PLB_CGI_DIR=C:\Sunbelt\plbwebsrv.109\cgitemp\Z ------------------------------------------------------------------------------- PLBCMP - Modified the compiler to output PLB label reference counts to the PLBM reflection output. The PLBM label reference counts are retrieved and shown in the Sunbelt IDE. - Modified the compiler to support the command line option 'ZK'. When this option is specified on the command line, the compiler disables program label reference counting. This option is added to allow the SunIDE to disable the label reference counting for Data and Execution labels. - Modified to output ROUTINE\LROUTINE type information to the PLBM reflection data. This is needed by the Sunbelt IDE. - Modified the compiler to support the REGEX object. - Added the SWAP and MATCHLIST instructions. - Modified the MAILSEND to support the *CLIENTID keyword. - Modified the compiler to implement String Expression '+' operator used to allow string concatenation. ------------------------------------------------------------------------------- PLBDBUG - Corrected a GPF error that could occur when using a 'DV' command to an AIOBJECT GUI object. ------------------------------------------------------------------------------- PLBEQU.INC - Added OPEN/PREP File Access Mode bit mask integers. ------------------------------------------------------------------------------- PLBMETH.INC - Added REGEX object methods. - Added new HTMLCONTROL methods. - Added new RUNTIME method. ------------------------------------------------------------------------------- PLBREGEX.INC - Newly added REGEX object filtering patterns that can be used in REGEX operations. ------------------------------------------------------------------------------- SUNIDE.PLC - The slash character (/) in the first column is now recognized as a line comment indicator. - Corrected an issue with files tabcontrol when opening a file after a "Close All Except" function. - The editor's "Mark All" function in the Find dialog now updates the IDE bookmarks window. - Find in Files now recognizes lines beginning with "//" as a comment line and excludes them if requested. - Find in Files now allows searching the current file only. - Error bookmarks are now set with a red color and listed before any other bookmarks in the bookmarks window. - Error bookmark now show the error message. - Bookmark deletion now allows selection between "Selected", "Errors Only", and "All". - The bookmarks windows now allows sorting by column. - When running as a LOADMOD, the Designer bookmarks are now maintained by the IDE. - Added logic to interface with the Designer when running as a loadmod. - Modified labels and bookmark listviews to support ascending and descending sorting. - Modified bookmark deletion to use a new BOOKMARKCLEAR editor routine to remove the icon. - Verified that the HasBookmark editor function now includes error bookmarks when making its determination. - Made appearance improvements to support 14 point fonts. - Modified the No Reflections file detection to alert the user and allow building of the program to create the file. - Corrected a starting point issue in the BookmarkItems function. - Removed spurious ")" from Remove Folder and Archive Folder project menu items. - Adjusted dialogs to support 14 point fonts. - Improved breakpoint tracking when changes are made to a form's code section. - The Breakpoint Skip and Reset fields are now hidden. - Handles setting editor properties when no project is open. - Corrects some visual issues with the main and files forms. - Corrects an issue regarding the listview parameter in the GetExecutableLabels routine. - Corrects issues when editing files and no project is open. - Updates the recent files menu when a new source or inclusion file is created. - Removed hard-coded Designer file name in the toggle breakpoint routines. - The References window will now allow viewing the execution and data labels and includes the reference count. - Corrected an issue in the Add Files to the project routine that prevents adding if the file is already present. - Allow skipping the prompts regarding existing file names when adding files to the project. - Modified the column order in the label lookup routine. - Modified the breakpoint label lookup to use a listview rather than a datalist. - The PL/B AI Assistant tab may now be promoted to a independent window or vice versa. - Include, execution, and data label references are now reset during the Build All function. - Corrected an issue that would cause breakpints, tracepoints, watches, and bookmarks to be doubled following a specific set of events. - No longer starts the PL/B AI Language Assistant automatically during initialization. - Corrected handling of the Assist window visible and independent states. - Modified the GetExecutableLabels routine to work with the New Breakpoint dialog - Modified the New Breakpoint label selection listview to provide alternating row colors. - Changed the New Breakpoint form to be modal. - Limited screen flicker when entering and exiting the integrated debugger. - Corrected the data and execution label logic to handle files in the selected path properly. - Corrected the ShowSelectedLine function to use the selected program when the listview field is blank. - Modified the IDE to remember and restore the AI Assistant independent window state when starting. - Added Help menu item that links to PL/B Videos on YouTube. - Add compiler option (ZK) checkbox to disable the compiler reference counting. - Corrected a looping issue in the DbgWatchRefresh routine. - Modified version number to "10.9 October 5, 2026". - Removed the mysterious "??????" entry from the project window shortcut menu. - Corrected an issue with creating a new inclusion file. - Corrected an issue in the DbgBreakpointsUpdate routine. - Corrected enabling of Find in Files modes when selecting noncompilable files. - Changed several output windows shortcut menus to read "Clear All Selections" rather than "Clear all " to prevent confusion as to the action. - Add a prompt to allow "Yes to All" and "No to All" selection when missing reflection files are found during the project open. - Corrected an error that occurred when a breakpoint was set in a form's code section and a line was added above the breakpoint. - Corrected Find in Files double-click positioning action for lines before and after the found line. ------------------------------------------------------------------------------- DESIGNER.PLC - Corrected an 0123 error when selecting the active form. - Corrected the removal of empty code routine. - The slash character (/) in the first position of a line is now recognized as a line comment indicator. - When running as a LOADMOD, bookmarks are maintained in the IDE's output window. - Added logic to interface with the IDE when running as a loadmod. - Code changes affecting breakpoints are now reflected in the IDE when running as a loadmod. - Added a function to determine whether running as a loadmod if so whether the integrated debugger is selected. - Removed hard code of the IDE file name in the breakpoint routines. ------------------------------------------------------------------------------- SUNCS21.OCX - Updated version to 10.9. - Added AIOBJECT, and JSONDATA syntax and methods. ------------------------------------------------------------------------------- PROFILER.PLC - Modified the processing of the PL/B instructions to accumulate the total time in milliseconds for each opCode executed in a program. For the 'Instructions' tab, a new column named 'OpTime (ms)' has been added to show the total accumulated time for each instruction executed in the program. -------------------------------------------------------------------------------