Fri Mar 10 2000 dL4 for Windows 95/98/NT Runtime 4.1.1 Release All Rights Reserved. Copyright (c) 1997 - 2000 by: Dynamic Concepts, Inc. Aliso Viejo, CA 92656 USA Email address: techsupport@dynamic.com Information: www.dynamic.com Downloads: ftp.dynamic.com Pre-installation instructions ============================= o This release requires an SSN authorized for release 4 of dL4. o Before using dL4, Passport for Windows 95/98/NT must be installed and a valid license and SSN must be registered using the ssnmaint utility. The ssnmaint utility is part of Passport and can be found in the Passport program group. The dL4 installation program includes the Passport software and will offer to install it during the dL4 installation. Please contact the sales department at Dynamic Concepts (sales@dynamic.com) for information on obtaining a license and SSN. o Problem reports should be emailed to techsupport@dynamic.com. All problem reports should contain a description of the problem, the operating system type (Windows 95, Windows 98, or Windows NT), and, if at all possible, a reproducible sequence to duplicate the problem. o Please visit our web site at www.dynamic.com for additional dL4 documentation. Installation instructions ========================= To install dL4 for Windows 95/98/NT, perform the following steps: 1. Remove any previous dL4 for Windows 95/98/NT release. 2. Run the dL4 installation program 1B_dl4_4.1.exe (or whatever filename you have copied it to) and follow the displayed instructions. If the most current version of Passport for Windows 95/98/NT hasn't been installed on the system, press "Yes" when the program asks if Passport should be installed. 3. If you haven't registered your license and SSN using the Passport ssnmaint utility, run ssnmaint. dL4 cannot be used until Passport is installed and your license registered. 4. If you intend to use loadsave.exe, add the installation directory to your PATH variable. 5. If data files will be accessed over a network, run checksys.exe from the installation directory to detect out-of-date or misconfigured operating system modules. The checksys utility should be run on each Windows client system and each Windows NT file server in the network. See the "Networking" section below for details. File list ========= readme.txt This file license.txt Runtime license terms and conditions checksys.exe Utility to detect operating system configuration problems codebase.dll Runtime library dcictree.dll Runtime library dl4basic.dll Runtime library dl4chwin.dll Runtime library dl4fldrv.dll Runtime library dl4pipe.exe Internal utility used by the pipe driver dl4rt.dll Runtime library dl4sockt.dll Runtime library dl4stdrv.dll Runtime library loadsave.exe dL4 compile-and-save console program msvcrt.dll Runtime library msvcrt40.dll Runtime library ntwdblib.dll Runtime library pfilter.exe Printer character translation filter runc.exe Special version of BASIC interpreter for CGI programs and piped I/O runw.exe BASIC interpreter scopec.exe Special version of dL4 IRIS-style command interpreter for CGI programs and piped I/O scopew.exe dL4 IRIS-style command interpreter stubwa10.dll Runtime library dfltlp.bat Printer script for default Windows printer selectlp.bat Printer script for user selected Windows printer printer\ Directory of printer scripts term\ Directory of terminal definition files for use with scopec.exe and runc.exe Highlights of This Release ========================== o Graphical user interface programming of buttons, edit boxes, list boxes, and other GUI elements via new mnemonics. o Creation of dL4 windows with a graphical rather than character oriented appearance. o Support for mixing multiple fonts and sizes in windows. o Enhanced line, box, and ellipse drawing to windows. o A TCP/IP socket driver for network I/O. o Filename and paths can now contain spaces via a new quoted filename format. o Portable Formatted or Contiguous (but not Indexed) files larger than 2 gigabytes in size can be created on UnixWare 7 or AIX 4.3 systems. o The OPTION AUTO DIM OFF statement, CHECK -u command, and LOADSAVE -u option can be used to detect undeclared or misspelled variable names. o Two new commands, RETURN and "GO", have been added to the debugger. o The ERRSET, ERRSTM, ESCSET, ESCSTM, INTSET, and related statements can now be used in external procedures. New in This Release ================================================================= Mar 10 2000 (Release 4.1.1) o Release 4.1.1 is a maintenance release that corrects various problems and adds two new intrinsic CALLs to access the Windows registry. o Two new intrinsic CALLs, GetRegistry() and PutRegistry(), have been added to provide access to the Windows registry. BASIC syntax: Call GetRegistry(KeyValuePath$, Value) Call PutRegistry(KeyValuePath$, Value) where: "KeyValuePath$" is a string variable or expression that specifies the registry key and value name to be read or written. Backslashes must be used to separate each key name in the path and the value name. The first key name must be one of the following special keys: "HKLM" or "Hkey_Local_Machine" "HKCU" or "Hkey_Current_User" "Value" is a numeric, string, or binary variable into which a value will be read or from which the value will be written. The type of "Value" must match the registry value (numeric for DWORD values, string for REG_SZ values, and binary for binary values). Example: Declare Intrinsic Sub GetRegistry, PutRegistry ! Write a string value into the registry current user key Dim KeyVal$[100], NewId$[100], Id$[100] KeyVal$ = "HKCU\\Software\\CompanyName\\Application\\UserId" NewId$ = "John Parker" Call PutRegistry(KeyVal$, NewId$) ! Read the value that was just written Call GetRegistry(KeyVal$, Id$) Print Id$ o The 'MH' (Move Home) mnemonic is now supported in edit boxes to move the current position to the beginning of the text in the box. o Behavior change: the intrinsic CALLs DateToJulian(), FormatDate(), JulianToDate(), and VerifyDate() now ignore spaces preceding numeric values rather than requiring zero filled values. o Bug fixed: the input focus was not moved to the current window if binary or activate-on-control-character input mode was used. o Bug fixed: the ProgramDump() intrinsic CALL did not report the current position correctly. o Bug fixed: scroll bars weren't enabled or disabled at appropiate times in multiline edit boxes ('WCEDIT' and 'WCTEXT' mnemonics). o Bug fixed: line, rectangle, and ellipse drawing could cross window boundaries. o Bug fixed: a bad character error occured when a WINDOW OPEN statement was executed while using the character window driver rather than the standard GUI window driver. o Bug fixed: the MODIFY statement could apply, but not remove, read-only protection on files in Windows 95/98 systems. o Bug fixed: opening a directory path that ended with a backslash character failed on Windows 95/98 systems. Nov 17 1999 (Release 4.1) o A new Windows Terminal driver has been implemented to support graphical user interface programming. This driver will be the default window driver in dL4 4.1. The character oriented driver used in previous releases can be used by setting the runtime parameter WINDOWDEFAULTS to the string value "type=char". o The new Windows Terminal driver supports graphical user interface programming using the following new mnemonics: 'WCBUTTON' - Create button 'WCCHECK' - Create check box 'WCRADIO' - Create radio button 'WCNUMBER' - Create numeric input box 'WCSTRING' - Create character input box 'WCPRIVATE' - Create character hidden input box 'WCLABEL' - Create a label for an input box 'WCTEXT' - Create multi-line character display box 'WCMEMO' - Create multi-line character input box 'WCLIST' - Create selection list box 'WCEDITLIST' - Create editable selection list box 'WCLISTDROP' - Create drop down selection list 'WCEDITDROP' - Create drop down editable list box 'WCMENU' - Create menu 'WCMENUACTION' - Create menu action item 'WCMENUCHECK' - Create menu check box item 'WCMENURADIO' - Create menu radio button item 'WCMENUSEP' - Create menu separator 'WCENDMENU' - End menu or sub-menu definition 'WCGROUP' - Group graphical elements 'WCSELECT' - Select current graphical element 'WCENABLE' - Enable user input/selection to/of element 'WCDISABLE' - Disable user input/selection to/of element 'WCQUERY' - Request graphical element to send value 'WCDELETE' - Delete a graphical element 'WCACTION' - Change action performed by input element 'WCFOCUS' - Set current focus to selected element 'WCMARK' - Mark or select item 'WCUNMARK' - Unmark or unselect item 'WCSUBMENU' - Create submenu 'WCSETFONT' - Set font for controls Detailed documentation and example programs for these mnemonics can be found in the dL4 4.1 GUI Tutorial. The tutorial can be downloaded from www.dynamic.com. o The Windows Terminal driver improves the appearance of dL4 applications by creating all dL4 windows as separate operating system generated windows. Independent windows opened on separate channels (as in the statement , 'OPEN #1,{"Title","Style",w,h} As "Window"') have standard title bars and can be moved independently of the main window. Child windows, such as those created by the WINDOW OPEN statement, are created within the parent window and use optional dialog style borders. All dL4 windows support GUI programming mnemonics, mixing of multiple fonts or font sizes, and enhanced line drawing. o The new Windows Terminal driver implements an additional window style, "MODAL". A "MODAL" window disables the main window and any previously created modal window so that they can't be selected by the user. The user is thus required to work in the modal window until the window is closed by the application. When the modal window is closed, the previously active modal window is enabled or, if none, the main window is enabled. The "MODAL" style is ignored if applied to a child window (any window created with a parent channel specified or by the WINDOW OPEN statement). Example: OPEN #1,{"Help","TITL,SCRL,WRAP,MODAL",40,10} As "Window" o The new Windows Terminal driver implements an additional window style, "DIALOG". The "DIALOG" style creates a window that defaults to using the standard system dialog colors. A non-child window using the "DIALOG" style will also be modal. Example: OPEN #1,{"New Account","TITL,DIALOG",40,10} As "Window" o The 'FONTCOLOR', 'BACKCOLOR', and 'PENCOLOR' mnemonics have been enhanced to accept two special color codes in addition to RGB color values. Code -1 selects the standard system text color for dialogs. Code -2 selects the standard system background color for dialogs. For example, printing '-1FONTCOLOR' would select the system dialog text color as the current font color. These special color codes can be used to match the dialog color scheme selected by the user. o Two new mnemonics, 'BACTFN' and 'EACTFN', have been implemented to enable or disable activate-on-function-key input. When activate-on- function-key mode is enabled, an INPUT (or any read) from a terminal or window will be terminated by typing any function key or the normal "enter" keys. A function key is any keyboard sequence such as 'F4' or 'PAGE DOWN' that generates a mnemonic character as input data. Function keys such as 'INSERT' or "right arrow" that are used as edit control keys will not terminate input in this mode. The program can determine what character terminated an INPUT statement by using the KEY clause. Example: Print 'BACTFN'; Input Key TermChar$;"Prompt: "Response$ Print 'EACTFN'; If TermChar$ = 'F9' Goto DisplayHelp If TermChar$ = 'MU' Goto EditHistory o The coordinate grid in a window can now be changed from the default character grid to fractions of a character, inch, or millimeter. The 'GRIDFONT', 'GRIDENGLISH', and 'GRIDMETRIC' mnemonics are used to define the current coordinate grid. Please see the dL4 3.2 printer description below for a detailed description of these mnemonics. The current grid definition is used for column and row values returned by the MSC() function. Note that a screen inch or millimeter may not match an actual inch or millimeter. Each dL4 window has a separate coordinate grid definition. o Multiple fonts and font sizes can be mixed in a window using the 'FONTFACE' and 'FONTSIZE' mnemonics. Please see the dL4 3.2 printer description below for a detailed description of these mnemonics. Each dL4 window has a separate current font definition. o The LINE statement and related mnemonics can now be used to draw lines at any angle in a window. Previous versions of dL4 were restricted to horizontal or vertical lines. o The 'ELLIPSE' mnemonic can be used in a window to draw an ellipse bounded by a specified rectangle. For example, if the coordinate grid was defined in tenths of an inch ('100GRIDENGLISH'), the string '40,20,60,40 ELLIPSE' would draw a 2.0 inch circle centered at 5 inches from left and 3 inches down on the screen. o The 'PENWEIGHT' mnemonic can be used to set the thickness of lines drawn in a window. For example, using a one tenth character coordinate grid ('10GRIDFONT'), the string '2PENWEIGHT' would make the line width equal to one fifth of the character height. Each dL4 window has a separate current pen weight definition. o The 'PENSTYLE' mnemonic can be used to set the style of lines drawn in a window. A mnemonic argument of 0 (the default) selects solid lines, 1 selects dashed lines, and 2 selects dotted lines. As an example, printing '1PENSTYLE' selects dashed lines. Each dL4 window has a separate current pen style definition. o Spaces can now be used in filenames and directory paths. Such filenames and paths must be enclosed in quotes. Examples: save "program name with spaces" OPEN #1,"''Filename with Spaces''" Note that quotation marks in dL4 string constants are represented by two consecutive single quotes. Quoted filenames are supported by all statements, all commands, the LIBSTRING runtime parameter, and the LUMAP runtime parameter. o A new intrinsic function ENCFNM$() has been added to dL4 to add quotation marks to a filename if required. The function can be invoked with either one or two string arguments. With two arguments, the first argument will be treated as a directory prefix to be added to the second filename argument. o Portable Formatted or Portable Contiguous files larger than 2 gigabytes in size can now be created on Windows NT systems. Such files are built using the BUILD AS option to specify the "Portable Huge Formatted", "Portable Huge Contiguous", "Universal Huge Formatted", or "Universal Huge Contiguous" drivers. These are new file types using formatted or contiguous file behavior. "Huge" Indexed files will be supported in a future release of dL4. Example: Build #1,"[1:200]Filename" As "Portable Huge Contiguous" To share huge files across a network, both the file server and the client systems must support large files. Note: release 6 of UniBasic does not support "Universal Huge" files. o The "U" option letter ('BUILD #1,"[10:100]file"') can be used to select the "Universal" format when creating a Portable Formatted, Contiguous, or Indexed file. o A TCP/IP socket driver has been implemented. A connection can be created using an OPEN statement similar to: OPEN #c,"system:port" As "Socket" where "system" is a network system name or IP address (xx.xx.xx.xx) and "port" is a service name or port number. Character and binary data can be read or written. The following example program reads the current date and time from a Unix host system: 10 Dim L$[100] 20 Open #1,"unixhostname:daytime" As "Socket" 30 Read #1;L$ 40 Close #1 50 Print L$ o An OPTION DEFAULT statement has been added to dL4 to set options for all program units in a program module (file). o A new option, "DIALECT BITS", has been added to select the standard BITS options. The statement "OPTION DIALECT BITS" is equivalent to the following group of option statements: OPTION FILE ACCESS RAW,FILE UNIT IS BYTES,DISPLAY AUTO LF OFF OPTION CHAIN FAILURE IS ERROR,CLOSE FAILURE IS IGNORED OPTION IF BY STATEMENTS,INPUT TIMEOUT SIGNAL OFF,STRINGS RAW OPTION OPEN AUTO CLOSE ON,RETURN BY LINES Note that the arithmetic option, "BITS DECIMAL", is not set. Two additional options, "DIALECT IRIS" and "DIALECT STANDARD", have been added to select the "IRIS SUBSCRIPTS ON" or default options. o A new arithmetic option, "BITS DECIMAL", has been added to select BITS numeric types. Note that BITS numeric types are not portable. o A new option, "AUTO DIM OFF", has been added to aid in detecting misspelled variable names. When a program that uses "OPTION AUTO DIM OFF" is SAVEd, error messages will be generated for each variable that is not declared in a DIM statement, COM statement, CHAIN READ statement, or parameter list. A "-u" option has been added to the SCOPE CHECK command and LOADSAVE utility to detect undeclared variables in program that do not use the "AUTO DIM OFF" option. o The OPTION FLUSH AFTER STATEMENT ON option causes all write statements to flush the record buffer even if the statement does not unlock the current record. This option provides compatibility with programs that use ROPEN to read locked records and expect those records to contain updates that are currently in progress. This record flushing option is implemented for Formatted, Indexed Contiguous, and Full-ISAM files. Any driver that does not implement the DCC_SYNC operation will silently ignore this option. This option should only be used when necessary for compatibility with existing programs. o The OPTION RECORD LOCK TIMEOUT N option sets the default timeout period for file and database drivers. The number value N is the number of tenth seconds to wait before reporting a record lock error. The value of N must be between -1 (default, wait forever) and 36000 inclusive. This option should be used in converted programs that used the UniBasic LOCKRETRY feature. The option is supported by the Formatted, Indexed Contiguous, and Full-ISAM file drivers. Example: Option Record Lock Timeout 100 Dim S$[40] Open #1,"File" Read #1,3;S$ ! timeout not specified, will wait up to 10 seconds o The SYSTEM 28 statement has been extended to search a program defined application registry key for string values if those values are not in the environment. The application registry key is searched under HKEY_CURRENT_USER\Software and then HKEY_LOCAL_MACHINE\Software. The statement SYSTEM 29 is used to set the current application registry key. For example, the statements SYSTEM 29,"SupplierName\\AppName" V$ = "Parameter" SYSTEM 28,V$ would attempt to read the string value "Parameter" from the environment and then, if not found, the following registry locations: HKEY_CURRENT_USER\Software\SupplierName\AppName\Parameter HKEY_LOCAL_MACHINE\Software\SupplierName\AppName\Parameter Note that SYSTEM 28 does not access the registry unless SYSTEM 29 has been used to define a registry key. This mechanism provides a portable mechanism to access application parameters similar to that used for dL4 runtime parameters. o The command "RETURN" has been added to the debugger. This command causes execution to continue until the current procedure exits. o The command " GO" can now be used in the debugger to continue execution at a specific line. The line must be part of the current procedure. o A DCC_SYNC command has been implemented in the Portable Formatted driver to flush the record buffer without releasing the current record lock. A DCC_SYNC command can be issued by a user program via the CHANNEL statement ("Channel 20,#c;"). o The SAVE file revision has been changed from 2.8 to 2.11 in order to support new statements in dL4 4.1. Full upward compatibility is provided, so program files created by earlier versions of dL4 can still be used. Programs created by this release of dL4 cannot be used by earlier releases of dL4. o The maximize button of the main window now enlarges the window to the size of the canvas. o If installed from an administrator account of a Windows NT system, dL4 will be created as a common program group. o Behavior change: a CANCEL command is now automatically performed if required to perform an edit, RENUMBER, or LABEL command. A warning message is printed to inform the user that the program context has been deleted. Previous versions of dL4 simply displayed an error message and required the user to explicitly CANCEL the program. o Behavior change: the KILL statement and the SCOPE KILL command now delete unsupported file types as raw files rather than returning an error. o Behavior change: the background window created by a WINDOW ON or WINDOW OPEN statement is forced behind all other windows including those opened on channels (this is a change only for non-windowed terminals: dL4 for Windows, dL4Term, and "[Settings] StartupInWindow" terminals always followed this rule). o Three new drivers have been added to dL4 to create Universal Indexed Contiguous and Universal Formatted files. These drivers are variants of the Portable file drivers with character set, numeric maps, and other options set to match the format of Universal files. New driver names: "Universal Indexed-Contiguous" "Universal Formatted" "Universal Contiguous" o The ERRSET, ERRSTM, ESCSET, ESCSTM, INTSET, and related statements can now be used in external procedures. o Two new mnemonics 'LITNUL' and 'LITCR' have been defined. These mnemonics, if defined in a terminal or printer definition file, can be used to output 0x0000 and 0x000D characters without translation. o A new mnemonic, 'EUROSIGN', has been defined to represent the Unicode Euro currency character 0x20AC. o The Portable Indexed File and Universal Index File drivers now allow opening files created with an index block size of up to 2048 bytes (ISAMSECT equal to 16). A new runtime parameter, ISAMSECT, can be used to specify the index block size of newly created files as a multiple of 128 bytes. For example, an ISAMSECT value of 16 would cause new indexed files to use an index block size of 2048 bytes (16 times 128 bytes). The default index block size is unchanged and has a value of 1024 bytes (equivalent to an ISAMSECT value of 8). The new ISAMMAXSECT runtime parameter can be similarly used to change the maximum openable index block size of 2048 bytes to any multiple of 128. The default index block size should be adequate for all uses, but, if a different value is used, a power of 2 (4, 8, 16, 32, ...) is recommended. o Two new open options have been added to the Windows printer driver. The LANDSCAPE and PORTRAIT options, which accept a boolean value, are used to specify page orientation. The value will override the printer default or user selected orientation. The options are ignored if the Windows printer driver does not support selection of orientation. SELECTLP.BAT modified to request landscape orientation: rem dl4opts=openas=selected page printer,landscape=true rem rem dL4 selected by dialog printer script modified to request rem landscape orientation SELECTLP.BAT modified to request portrait orientation: rem dl4opts=openas=selected page printer,portrait=true rem rem dL4 selected by dialog printer script modified to request rem portrait orientation o The WIDTHI, WIDTHM, LENGTHI, LENGTHM, and FORMCODE options can now be used with all versions of the page printer driver. Note that the options will have no effect unless they are supported by the Windows operating system printer driver. o The "Page Printer" driver now supports the graphics characters ('Gn') when using standard Windows 95 fonts (the Windows NT fonts always supported graphics). o In the "Preferences->Font" dialog, the BOLD style can be selected as the standard font. Using the BOLD style as the default font may make bold characters ('BBOLD') identical to non-bold characters. o Behavior change: the READRECORD and WRITERECORD statements now obey the FILE ACCESS RAW option. o Beta behavior change: creating a graphical element (for example, using 'WCBUTTON') with the same element number as an existing element now overwrites the old element rather than returning an error code. Overwriting any part of a menu will cause the entire menu to be deleted. o Beta behavior change: the 'XX' mnemonic now deletes all graphical elements on a window including menus. o Fix bug: the Microsoft SQL Full-ISAM driver updated incorrect rows if a table had a clustered index and at least one non-unique index. o Fix bug: PCHR$() ignored any parameters preceding a string value. o Fix bug: the LOADSAVE "-l" OSN option ignored illegal OSN indices and, on some platforms, caused memory violations when valid OSN indices were specified. Note that the "-l" option uses an OSN index and not an actual OSN number. o Fix bug: the printer driver incorrectly printed graphic characters with repeat counts ('5GH'). o Beta bug fixed: the socket driver now translates numeric IP addresses without first attempting a name lookup. o Beta bug fixed: the socket driver reported some open errors incorrectly as BE_SYSERRNO. o Beta bug fixed: binary input ('IOBI') did not work on non-dL4Term terminals. o Beta bug fixed: output of a character with more parameters than the maximum number of supported parameters sometimes caused a memory fault. o Beta bug fixed: the root window was always sized to the canvas rather than window size. o Beta bug fixed: blinking text on a parent window was visible in any overlapping child window. o Beta bug fixed: repeat counts ('5GH') were ignored when used with printable characters. Jun 18 1999 (Maintenance release 3.2.1) o Release 3.2.1 is a maintenance release that corrects a problem in the Windows printer driver and adds some additional printer open options. o A bug in the Windows printer driver that caused the font size and other font characteristics to return to their default values after each new page has been fixed. o Five new open options have been added to the Windows printer driver. The WIDTHI, WIDTHM, LENGTHI, and LENGTHM options can be used to specify the page length in inches or millimeters. The FORMCODE option can be used to specify a numeric page size form code. The effects of these options vary depending on the Windows printer driver used for output. The options should not be used unless necessary and values should be chosen to match forms supported by the target printer or printers. These options can only be used with the Windows default or user selected printer driver. SELECTLP.BAT modified to request legal form paper: rem dl4opts=openas=selected page printer,widthi=8.5,lengthi=14 rem rem dL4 selected by dialog printer script modified to request rem use of 8.5 inch wide by 14 inch long legal forms. SELECTLP.BAT modified to request 14 7/8 by 11 paper: rem dl4opts=openas=selected page printer,formcode=39 rem rem dL4 selected by dialog printer script modified to request rem use of 14 7/8 inch wide by 11 inch long fanfold forms. Common page size codes for use with the FORMCODE option: 1 Letter 8 1/2 x 11 in 2 Letter Small 8 1/2 x 11 in 3 Tabloid 11 x 17 in 4 Ledger 17 x 11 in 5 Legal 8 1/2 x 14 in 6 Statement 5 1/2 x 8 1/2 in 7 Executive 7 1/4 x 10 1/2 in 39 US Std Fanfold 14 7/8 x 11 in Jan 26 1999 (Release 3.2) o The new page printer driver makes it possible to output to any Windows printer. The driver can be opened to a specific printer name, to the system default printer, or, via a dialog box, to a user selected printer. Because Windows is performing all low level formatting, the driver does not require any device specific configuration such as a printer definition file. The printer can even be a fax service if a Microsoft or third party fax driver has been installed as a printer. The page printer driver uses a page oriented rather than line oriented output model. Programs can use cursor positioning ("@x,y") to output anywhere on the current page. The page is not printed until a line scrolls off the bottom of the page, an 'FF' or 'CS' mnemonic is output, or the driver is closed. Both forms ("@x;" and "@x,y;") of absolute cursor positioning use grid units. The default grid is the traditional character row and column, but it can also be set to be in inches or millimeters. The grid definition is controlled by the 'GRIDENGLISH', 'GRIDMETRIC', and 'GRIDFONT' mnemonics. Each of these mnemonics take a single numeric parameter that determines the resolution of the grid. Column zero and row zero of the grid are always defined to be the upper left corner of the printable area of the page (the printable area does not include any unprintable margin space). 'GRIDENGLISH' Set the coordinate grid to thousandths of an inch times the parameter ('nGRIDENGLISH') from the upper left corner. The mnemonic string '100GRIDENGLISH' sets the grid to tenths of an inch and so the cursor position "@35,51" would position to a point 3.5 inches to the right and 5.1 inches down from the upper left corner. 'GRIDMETRIC' Set the coordinate grid to hundredths of a millimeter times the parameter ('nGRIDMETRIC') from the upper left corner. The mnemonic string '1000GRIDMETRIC' sets the grid to centimeters and so the cursor position "@6,10" would position to a point 6 centimeters to the right and 10 centimeters down from the upper left corner. 'GRIDFONT' Set the coordinate grid to the line height and average character width of the current font divided by the parameter ('nGRIDFONT') from the upper left corner. The mnemonic string "10GRIDFONT" sets the grid to tenths of the line height and character width. The cursor position "@105,75" would position to 10.5 columns to the right and 7.5 lines down from the upper left corner. Note that the grid is based on the current font and will not change if the font size is changed unless another 'GRIDFONT" mnemonic is output. When using variable width fonts, the column size is based on the average character width. The current font can be changed by using the 'FONTFACE' mnemonic. This mnemonic has a single string parameter which is the font name such as "Courier" or "Helvetica". A mnemonic string parameter is generated by using the PCHR$() function with a string argument. The font size is controlled by the 'FONTSIZE' mnemonic which has a numeric argument specifying the size in grid units. Assuming the grid is defined in characters (the default), then the statement: PRINT #1;PChr$("Helvetica");'Fontface 3Fontsize'; would select "Helvetica" as the current font sized at three times the row height for the printer on channel 1. If the printer does not support "Helvetica", an error may occur, but usually the Windows printer driver will choose a substitute font. Character sizing is approximate and determined by Windows algorithms. The font determines not only the appearance of characters, but also which characters can be printed and how they are positioned. Most Windows fonts are of variable pitch and so different characters will have different widths. If characters, particularly spaces, are used for exact positioning, then a fixed pitch font should be used. 'FONTFACE' Set the font to the specified font name. The font name must be specified as a string parameter using the PCHR$() function as in the following statement: PRINT #1;PCHR$("Times");'FONTFACE' 'FONTSIZE' Set the font size to the parameter ('nFONTSIZE') times the grid height unit. The printer driver supports drawing lines and rectangles. All drawing is performed using the current "pen" whose width and color is set by the 'PENWEIGHT' and 'PENCOLOR' mnemonics. The example below draws a three inch by four inch rectangle with a line drawn between the upper left and lower right corners: ! Select a tenth inch grid Print #1;'100GridEnglish'; ! Set the pen color to blue with a width of .2 inches Print #1;'255PenColor 2PenWeight'; ! Draw 3 by 4 inch rectangle Box #1;@10,10;To @50,40; ! or Print #1;'10,10,50,40Rect'; ! Draw a line between the corners Line #1;@10,10;To @50,40;! or Print #1;@10,10;'50,40LineTo'; 'PENCOLOR' Set the pen color to the parameter ('rPENCOLOR') where the parameter is an RGB color value. 'PENWEIGHT' Set the pen width to the parameter ('nPENWEIGHT') times the grid unit. 'LINETO' Draw a line using the current pen using the current position as one point and the specified coordinates ('x,yLINETO') as the ending point. 'RECTTO' Draw a rectangle using the current pen using the current position as one corner and the specified coordinates ('x,yRECTTO') as the opposite corner. 'RECT' Draw a rectangle using the current pen and the specified coordinates ('x1,y1,x2,y2RECT'). 'ELLIPSE' Draw an ellipse using the current pen to fit the rectangle defined by the specified coordinates ('x1,y1,x2,y2ELLIPSE'). The following mnemonics are used to change the current position on the page or print the current page: "@x;" Position to grid column x "@x,y;" Position to grid column x and grid row y 'MH' Move to upper left corner of page 'MR' Move right one average character width 'ML' Move left one average character width 'BS' Move left one average character width 'RI' Move up one line 'BK' Move to column zero 'CR' Move to column zero of the next line 'LF' Move to current column on the next line 'MD' Move to current column on the next line 'FF' Print current page and move to the upper left corner of the next page. 'CS' Print current page and move to the upper left corner of the next page. The following mnemonics are used to change attributes of the current font: 'BI' Print in italic mode 'EI' End italic mode 'BSO' Print in strike out mode 'ESO' End strike out mode 'BU' Print in underline mode 'EU' End underline mode 'BBOLD' Print in bold mode 'EBOLD' End bold mode 'BSUB' Print in subscript position relative to the current font height 'ESUB' End subscript mode 'BSUP' Print in superscript position relative to the current font height 'ESUP' End superscript mode 'BC' Print in compressed mode (.6 times default font size) 'EC' End compressed mode 'BX' Print in expanded print mode (twice default font size) 'EX' End expanded print mode The following mnemonics are used to change the current font and background colors: 'GN' Set font color to green 'RE' Set font color to red 'YE' Set font color to yellow 'BL' Set font color to blue 'MA' Set font color to magenta 'CY' Set font color to cyan 'WH' Set font color to white 'BLACK' Set font color to black 'FONTCOLOR' Set the font color to the parameter ('rFONTSIZE') where the parameter is an RGB color value. 'BACKCOLOR' Set the background color to the parameter ('rBACKCOLOR') where the parameter is an RGB color value. 'RESETCOLOR' Reset font, pen, and background color to default By default, the printer driver uses the "Courier New" font with a size of 1/6 inch. The default font and size can be changed by using the "FONT=name" and "FONTSIZE=size_in_points" open options. The following OPEN statement sets the default font to "Arial Narrow" with a size of 10/72 inches: OPEN #1,{"","FONT=Arial Narrow,FONTSIZE=10"} As "Default Page Printer" The printer driver can be opened to a specific Windows printer name, to the default Windows printer, or to a printer selected by the user in a dialog box. To open a specific printer, use the "Page Printer" driver: OPEN #1,{"Printer Name","options") As "Page Printer" To open the default Windows printer, use the "Default Page Printer" driver: OPEN #1,{"","options") As "Default Page Printer" To allow the user to select the printer in a dialog box, use the "Selected Page Printer" driver: OPEN #1,{"","options") As "Selected Page Printer" A standard Windows printer selection dialog box will displayed so that the user can select a printer. If the user cancels the dialog, a "File not found" will occur. In all three drivers, a "File not found" error will be generated if the printer does not exist. o The Page Printer driver provides three special GET statement commands to retrieve the current page size and margins. All three commands return a value of -1 for unknown values. The statement GET #c,-1399;Width,Height returns the width and height of the printable area of a page in the units of the current coordinate grid. The statement GET #c,-1398;Left,Right returns the left and right margins of the page in the units of the current coordinate grid. The statement GET #c,-1397;Top,Bottom returns the top and bottom margins of the page in the units of the current coordinate grid (see the GRIDENGLISH, GRIDMETRIC, and GRIDFONT mnemonics in the Page Printer driver description above). These commands can only be used on a channel open to a Page Printer driver. o Two new channel functions, CHF(1200+c) and CHF(1300+c), have been defined to return the current column and row positions. The values are returned in the units of the current coordinate grid (see the GRIDENGLISH, GRIDMETRIC, and GRIDFONT mnemonics in the Page Printer driver description above). o A new driver, "Serial Terminal", has been added to allow programs to open serial communication devices to a Window class driver. Using this driver, input and output to a serial device will follow the same rules as screen and keyboard I/O. By default, end of line characters will terminate input, input edit characters such as backspace will be processed, and data characters will be echoed. The standard 'IOxx' mnemonics can be used to control input characteristics. Similarly, cursor positioning can be used on output if mnemonics are defined in a terminal definition file. The "Serial Terminal" driver accepts the options listed below when opened: Option Argument Use TERM Filename or path Specify terminal definition file to be used with device SPEED Numeric ("9600") Set device dependent line speed DATA String ("8n1", "7e1") Set device dependent data format CTSFLOW Boolean ("T" or "F") Enable CTS output flow control DSRFLOW Boolean ("T" or "F") Enable DSR output flow control RTSFLOW Boolean ("T" or "F") Enable RTS input flow control XONFLOW Boolean ("T" or "F") Enable XOFF/XON output flow control If not specified, all options except TERM use the current system default value of the device. If the TERM option is not specified, the driver uses a simple default terminal definition in which carriage return is recognized as an input terminator. Example: F$ = "(speed=38400,data=8n1,term=c:\dl4\term\vt100)com1" Open #1,F$ As "Serial Terminal" o The pipe driver has been extended to allow redirection of I/O to a specified driver. "OPENAS=name" or "BUILDAS=name" options can be placed in the script "dl4opts" line to specify that an open of the script should cause an OPEN or BUILD using the driver "name". The options "PATH=string" and "OPTIONS=string" can be used to specify the path or options value to be used by the OPEN or BUILD. For example, the statement 'OPEN #2,"$printer"' opens the script "printer.bat" for output on channel 2. If "printer.bat" begins with the line: rem dl4opts=openas=default page printer then output to channel 2 would be directed to the default Windows printer. o Two printer scripts, dfltlp.bat and selectlp.bat, are now supplied and installed with dL4. The default Windows printer can be opened as "$dfltlp". A user selected Windows printer can be opened as "$selectlp" which will cause a printer dialog to be displayed. Examples: OPEN #2,"$dfltlp" OPEN #99,"$selectlp" o The new ForcePortDump() intrinsic CALL causes a target port to abort execution of the current dL4 program, produce a dump listing file, and then exit from dL4. For debugging purposes, it is also possible to trigger a dump listing without causing the program to exit. The dump output is identical to that of the ProgramDump() intrinsic CALL and lists the current execution location of the target program, the CALL stack, current variable values, the status of open channels, and various other values. Under Unix, the caller of ForcePortDump() must either be the same user as that of the target port or be a privileged user such as root. BASIC syntax: Call ForcePortDump(Mode, PortNumber, Status) where: "Mode" is a numeric variable or expression that controls the type of dump produced. If "Mode" is zero, the target port will be requested to produce a dump and then exit. If "Mode" is equal to one, the port will be requested to produce a dump and then continue (this should only be used for debugging because it will interrupt any I/O in progress). "PortNumber" is a numeric variable or expression containing the port number of the target dL4 program. "Status" is a numeric variable that receives the status of call. The value of "Status" will be set as follows by any call that doesn't generate an error 38: 0 Successful, the selected port exists and a dump command was sent to the port. This status does not guarantee that the port actually aborted or generated a dump file. 1 Error, the specified port does not exist. All parameters are required. Error 38, "Error detected by CALLed subroutine", will be generated if an incorrect number of parameters, parameter type, or parameter value is passed to ForcePortDump. To limit attacks on system security, the dump output is controlled by the DL4PORTDUMP runtime parameter. If DL4PORTDUMP is not defined for the target port, then ForcePortDump() will not generate a dump. On Unix, DL4PORTDUMP is an environment variable that must be set in each users environment (perhaps set by the .profile script). Under Windows, the DL4PORTDUMP value can be supplied either as an environment variable or as a string value in the registry: HKEY_CURRENT_USER\Software\DynamicConcepts\dL4\Environment\dL4PortDump HKEY_LOCAL_MACHINE\Software\DynamicConcepts\dL4\Environment\dL4PortDump In any form, DL4PORTDUMP is the filename to which the dump will be written. DL4PORTDUMP must be an absolute path; for example, under Windows, DL4PORTDUMP might be defined as "D:\Dumps\DumpFile.txt". The following macro values can be used in a DL4PORTDUMP path string: %PORT% Port number of target port %DATE% Current date ("YYMMDD") %TIME% Current time ("HHMMSS") %name% Value of environment variable "name" These macro values, if used in the DL4PORTDUMP path, will be replaced by their current values. For example, if DL4PORTDUMP was defined with the value "D:\Dumps\%PORT%.txt" and a dump was triggered on port 15, then the dump would be written to the file "D:\Dumps\15.txt". o The ProgramDump() intrinsic CALL has been enhanced to use the DL4PORTDUMP runtime parameter, as described above, if the filename parameter is not specified. o A new command has been added to the BASIC mode of SCOPE. The command "PDUMP filename" outputs a ProgramDump() style listing of the current program status to "filename". o A new mode has been added to the PORT statement. PORT mode 5 returns the current line number and library name executing on a specified port. For example, the statement: PORT P,5,S,L$ will return in L$ the current line number of the program running on port P. If the program is executing a line in a library, then L$ will have the format "library:line#" where "library" is the name of the library. As with PORT mode 3, a status is returned in S indicating success (zero) or failure (one, port not attached). o The following intrinsic calls have been added: Call AvPort(PORTNUM {,MINPORT {,MAXPORT}}) Call CheckDigits(STRING$) Call CheckNumber(STRING$) Call ConvertCase(MODE, STRING$ {,START}) Call DateToJulian({MODE,} DATE$ {,CONVERTED_DATE$ {,STATUS}}) Call DecToOct(NUMBER, OUTPUT_NUMBER_OR_STRING_VARIABLE) Call Echo(MODE) Call FindF(PATH$, STATUS) Call FormatDate(DATE$ {,CONVERTED_DATE$ {,STATUS {,MODE}}}) Call JulianToDate({MODE,} JULIAN$ {,CONVERTED_DATE$ {,STATUS}}) Call MiscStr({M,}S${,...}) Call ReadRef(CHAN, MODE) Call Rename(LU, OLDNAME$, NEWNAME$, CHANNEL, STATUS) Call String(MODE,...) Call StringSearch({F,}A${,S},T$,P{,N{,S1{,T1}}}) Call Time(T$) Call VerifyDate(DATE$ {,CONVERTED_DATE$ {,STATUS {,MODE}}}) These calls are UniBasic compatible and replace all of the functions in the oldcalls.bas and depcalls.bas libraries of dl4.samples except for CALL DYNWIND(). The date oriented CALLs, like all other dL4 date functions, use "OPTION DATE FORMAT NATIVE" and the native operating system locale configuration (such as the LANG environment variable) instead of the UniBasic "EUROPEAN" and "DATESEP" environment variables. In all programs that use oldcalls.lib or depcalls.lib, each occurrence of "DECLARE EXTERNAL SUB" must be changed to "DECLARE INTRINSIC SUB" for the new calls. In addition, any "EXTERNAL LIB" statement for oldcalls.lib or depcalls.lib should be removed, or, if CALL DYNWIND() is needed, all of the new intrinsic calls should be deleted in oldcalls.lib. For example, in a program that used the DATETOJULIAN and JULIANTODATE calls, the lines: Declare External Sub DateToJulian,JulianToDate External Lib "OLDCALLS.LIB" would be changed to: Declare Intrinsic Sub DateToJulian,JulianToDate Programs that are not changed will run, but they will continue to use the procedures in oldcalls.lib or depcalls.lib. Any conversion profile ("convert.prf") should be changed to use the new intrinsic calls. o The record number -4 has been defined in the text file driver to position to the end of the file. A program can append to a text file with a statement such as this: PRINT #1,-4;"message" o The SCOPE DUMP command has been extended to support output to the pipe driver. The command "DUMP $name" will list the current program to the pipe device "$name". o The 'IOCI' (clear typeahead buffer) mnemonic is now supported for dL4 sessions using serial devices as standard input or output. o A new window driver registry value "ProtectedNotDim" has been added to control whether protected characters are displayed with the "DIMmed" attribute. Disabling the "DIMmed" attribute makes it possible to fully control the color of protected characters using the normal color mnemonics such as 'BL' or 'FONTCOLOR'. This feature can be configured using the "Initial Values" dialog of the "Preferences" menu. o A new window driver registry value "TabBySpacing" has been added to control whether the PRINT TAB() function clears intermediate characters to spaces while moving to the specified position. This feature can be configured using the "Initial Values" dialog of the "Preferences" menu. o The 'IOTE' (toggle echo) mnemonic is now supported in dL4 windows. o Behavior change: when writing strings with the raw file driver, any 'ALIGN' or 'MOVETO' mnemonics are now expanded before performing the write. This supports the use of TAB and comma field separation in PRINT statements to the raw file driver. o Bug fixed: the LET command in the debugger ignored string subscripts if the first subscript was one. Thus, the command 'LET A$[1,1]="X"' was treated as 'LET A$="X"' replacing the string value rather than just the first character. o Bug fixed: if I/O was interrupted, the raw file driver entered a tight loop until the I/O completed. o Bug fixed: pfilter would fail if an OPEN and CLOSE of a pipe occurred without any output and a CLOSE string was defined in the printer definition file. o Beta bug fixed: the left and top margins used by the Page Printer driver were incorrect. o Beta bug fixed: the argument order of the intrinsic CALL READREF was reversed. o Beta bug fixed: PORT mode 5 sometimes returned a very large line number if the program on the selected port had exited. o Beta bug fixed: intrinsic CALL STRINGSEARCH would fail to find a match if the match occurred at the very end of the dimensioned size of the source string. Nov 9 1998 (Release 3.1.1) o Two new standard intrinsic functions, MD5? and AddMD5?, has been added to dL4. MD5?() returns the MD5 checksum code of the first argument which must be either a binary or a string variable. The MD5 checksum is returned as a 16 byte binary value. An optional second binary argument can be used to pass an intermediate value from AddMD5?(). This allows a combined checksum to be calculated. Checksums are calculated against the DIMed size of strings so that null (0) characters can be included in the checksum. To avoid this, simply pass the string with subscripts. So that string values will produce the same checksums on all platforms, each UNICODE character of a string is forced into a most-significant-byte first ordering for calculation. BASIC syntax: Dim chksum?[16], intermediate?[128] chksum? = MD5?(var) chksum? = MD5?(var,intermediate?) intermediate? = AddMD5?(var) intermediate? = AddMD5?(var,intermediate?) o Several open options have been added to the RAW driver for use with serial devices as shown below: Option Argument Use SPEED Numeric ("9600") Set device dependent line speed DATA String ("8n1", "7e1") Set device dependent data format CTSFLOW Boolean ("T" or "F") Enable CTS output flow control DSRFLOW Boolean ("T" or "F") Enable DSR output flow control RTSFLOW Boolean ("T" or "F") Enable RTS input flow control XONFLOW Boolean ("T" or "F") Enable XOFF/XON output flow control For example, the statement OPEN #1,"[1:1](speed=19200,data=8o1,xonflow=t)COM1" As "Raw" would open the COM1 serial port at 19200 baud with 8 bit characters, odd parity, 1 stop bit, and XON/XOFF output flow control. o MSC(43) has been defined and implemented as returning the current screen row. o SPC(19) now returns a license value as a 32-bit number instead of -1. In the current implementation, the license value is the license number. o Behavior change: if an OPEN fails because a file header is locked, the error "File is open elsewhere" will be returned instead of "Illegal driver operation". o Bug fixed: after a screen area was selected with the mouse, input into that area was truncated. o Bug fixed: the pipe driver would sometimes return a "Driver resource exhausted" error when a non-existent script or program was opened under Windows 95/98. o Bug fixed: dL4 sessions could not be evicted or interrupted if a read from a serial port was in progress. o Bug fixed: an error while evaluating a single line function would not trigger error handling and could cause an address violation. o Bug fixed: repeatedly CHAINing or CALLing to a program using a "./" or "../" in the program filename caused the filename to exceed the filename length limit and the CHAIN/CALL to fail because the program could not be found. All "./" and "../" strings are now removed from paths for all program and data file access after properly adjusting the paths. o Bug fixed: CLOSE/CLEAR statements using the RAW driver would sometimes pause for 5 seconds. o Bug fixed: OPENing a printer script immediately after CLOSEing it sometimes caused loss of output data. o Bug fixed: record zero in a Portable Indexed Contiguous file, once deallocated, could not be reallocated. o Bug fixed: deallocating non-existent records in a Portable Indexed Contiguous file sometimes caused the COUNTUSED option to be disabled. o Bug fixed: paths using ":" as a directory separator were not mapped correctly by LUMAP. o Bug fixed: opening a non-directory using the directory driver did not generate an error. Mar 20 1998 (Release 3.1) o This release requires an SSN authorized for release 3 of dL4. Without such an SSN, dL4 can only be used in single user demo mode. o The SAVE file revision has been changed to 2.8 in order to support new features of dL4 3.1. A new program file format also significantly lowers program load overhead. Full upward compatibility is provided, so program files created by earlier versions of dL4 can still be used (programs saved by dL4 2.3.1 and earlier will not, however, be placed in the local cache). Programs created by this release of dL4 cannot be used by earlier releases of dL4. o CALL-by-filename ('CALL "filename"'), CHAIN, and SWAP will reuse any library or program files that are shared with the parent program. For example, if a parent program uses "oldcalls.lib" and CALLs a subprogram that also uses "oldcalls.lib", then a single copy of "oldcalls.lib" will be shared between the parent program and the subprogram. Library and program files will NOT be shared unless the files have been SAVEd (or LOADSAVEd) in the new program file format. o An OSN (OEM Security Number) based form of program protection has been added to dL4. This protection mechanism is very similar to the PSAVE method in UniBasic. A program saved with the PSAVE command can be loaded only on systems that have been authorized with a developer supplied OSN. Any attempt to run protected programs on an unauthorized system will cause as error 265, "Not licensed to load or create this program". PSAVE protected programs can be modified and re-SAVED on any authorized system, but they can be listed only on systems which have been authorized with a master OSN. The ProgramDump intrinsic can be used in protected programs and any errors that occur while attempting to list a source line will be ignored (variables names can always be listed) The dl4 PSAVE mechanism differs from that of UniBasic in two ways: 1. There is no "-o" startup option to add new OSNs. Instead, use the standard REGEDIT or REGEDT32 utilities to add OSN string values to this registry key: HKEY_LOCAL_MACHINE\Software\DynamicConcepts\Passport\OSN If this key does not exist, it must be created. Each OSN value is a string (REG_SZ) value in which the value name is the company/product name and the value is the OSN key. 2. There is no "-t" startup option to add a temporary OSN. A temporary OSN is instead added by using the SCOPE "OEM TEMP" command which will prompt for an OSN that will be used only by the current SCOPE session. OSNs are created with the makeosn utility that is supplied as part of Passport version 1.4. This version of Passport is included in the dL4 installation program. A PDN (Product Description Number) is required to use makeosn. OSNs may also be created using the Unix version of makeosn. Please contact the DCI Sales department for information on how to obtain a PDN. To support this protection method, two new commands have been added to SCOPE: OEM and PSAVE. The OEM command lists the currently authorized OSNs. If the TEMP option is used ("OEM TEMP"), the OEM command will first prompt for a temporary OSN to be used only by the current SCOPE session. The OEM command can be used in the SCOPE command, BASIC, and debug modes. The PSAVE command is used to create OSN protected programs. The PSAVE command is identical to the SAVE command except for an optional OSN number that can precede the SAVE filename. For example, the command "PSAVE 2,menu" would save the current program as "menu" after protecting it to require the second OSN listed by the OEM command. Protected programs can be created only if the specified OSN is a master OSN. The PSAVE command is available in the SCOPE command and BASIC modes. A new option, "-l n", has been added to the SCOPE SAVE command and to the LOADSAVE utility to create OSN protected programs. The value "n" is the number of a master OSN as listed by the SCOPE OSN command. o This release includes two new executables: runc.exe and scopec.exe. These are console versions of scopew and runw for use in CGI programs and other special uses. The console versions differ from scopew and runw in that all "screen" I/O is performed via standard input and output, by supporting redirection of standard input and output, in the use of a console interface instead of an independent window, and in the names of the frontend programs (scopec and runc instead of scopew and runw). As in dL4 for Unix, the environment variables TERM and TERMDIR should be set to select the filename and directory of a dL4 terminal definition file. The TERM and TERMDIR values may also be specified in the registry under either of the following keys: HKEY_CURRENT_USER\Software\DynamicConcepts\dL4\Environment HKEY_LOCAL_MACHINE\Software\DynamicConcepts\dL4\Environment Sample terminal definition files can be found in the installation directory in the subdirectory TERM. While scopec and runc can be used directly from a DOS command prompt, very little screen control is possible because the Win32 console provides only minimal interpretation of control characters. o To add custom CALLs or drivers to scopec or runc, use the standard dL4 for Windows 95/98/NT development kit. The console and GUI versions of dL4 differ only in the front end programs and in their use of dL4 drivers. Both versions share the same runtime libraries (dl4rt.dll and dl4basic.dll). o The new runtime parameter LUMAP adds a mechanism to map relative file paths. The LUMAP value consists of one or more space separated value pairs. Each pair consists of a logical directory name, an equals sign ("=") character, and an absolute path. Whenever a relative filename is used, the LUMAP will be searched for a logical directory name that matches one or more leading directories names of the relative filename. Leading zeroes in an all numeric directory name are ignored. If a match is found, the matched portion of the relative filename will be replaced with the absolute path from LUMAP. For example, given an LUMAP value of: "5=M:\usr\accounting Mail=D:\Mail" the following filenames would be translated as shown: 5/filename -> M:\usr\accounting\filename 005/filename -> M:\usr\accounting\filename Mail/filename -> D:\Mail\filename x/5/filename -> x/5/filename ("x" isn't in LUMAP) Functions such as CHF$(800+c) reverse this mapping to return the logical filename. Using the LUMAP shown above, if "5/abc" was opened on channel 2, the actual file opened would be "M:\usr\accounting\abc", but CHF$(802) would return "5/abc". If more than one logical directory is mapped to the same actual directory ("5=T:\acct 6=T:\acct"), then the reverse mapping will map all occurrences of the actual directory to just one of the logical directories. CHF$(800+c) and similar functions perform reverse mapping on all filenames even if the original filename used an actual rather than a logical directory name. Filename mapping is applied to both data and program filenames. Mapping is applied to program filenames before the LIBSTRING directory list is searched. If a program filename contains a mapped logical directory, the filename will be converted to an absolute path and LIBSTRING will not be used. While the intended use of LUMAP is to support logical unit numbers and logical directory names, it is also possible to map multiple leading directories ("Mail/Fred=N:\Mail\Barney") or entire filenames. The only recommended use of such substitutions is to translate Windows reserved names such as LPT1 to usable, non-reserved filenames. For example, the map "LPT1=D:\dL4\Printers\Printer1.bat" would make it possible to use "$LPT1" as a printer name even though "LPT1" is a reserved filename under Windows. Translation of data or program filenames is not recommended, but it is legal and supported. o The ROPEN statement has been redefined to open files with locking disabled in addition to the previous read-only access. ROPEN is thus equivalent to 'OPEN "filename"'. This new feature permits an application to read records that are currently locked by other processes. This form of open is supported by the Portable Formatted, Portable Indexed Contiguous, and FoxPro Full-ISAM drivers. Note: reading records that are currently locked may return partially updated or inconsistent data. o The Portable Formatted and Portable Indexed Contiguous drivers have been modified to support reading through locked records on both Unix and Windows. The required changes to the locking protocol are incompatible with previous versions of dL4. Older versions of dL4 should not be used to access files at the same time as this or later releases of dL4. o The Portable Formatted, Portable Contiguous, and Portable Indexed Contiguous drivers now support exclusive opens via the "E" access mode ('OPEN #c,"file"') or the EOPEN statement. An exclusive open will succeed only if the file isn't currently open by another dL4 3.1 user. An error 76 will be returned if another user has the file open in either shared or exclusive mode. Once opened in exclusive mode, a file cannot be opened by other dL4 users. o The default value of ISAMFILES has been increased from 40 to 50. o A DCC_SYNC command has been implemented in the Portable Index Contiguous driver to flush the record buffer without releasing the current record lock. A DCC_SYNC command can be issued by a user program via the CHANNEL statement ("Channel 20,#c;"). o A new option, "NUMMAP", has been added to the Portable Contiguous and Portable Indexed Contiguous file drivers to support converting from UniBasic to Portable Contiguous files. The "NUMMAP" option has two possible values: "IEEE" (the default) and "IRIS" (to use IRIS BCD number formats). This option can be used as shown below with the "CHARSET" option to create a Portable Contiguous file that uses the IRIS BCD number formats and the IRIS character set: BUILD #c,"(nummap=Iris,charset=Iris)[n:l]filename" If a file is built this way, records can be copied directly from a UniBasic contiguous file by reading and then writing the entire record using a binary variable. The UniBasic file must contain only IRIS character and IRIS BCD numeric data. This conversion does NOT support copying packed fields because they contain inherently untranslatable binary data. o The pipe driver has been extended to support printing directly to a device without running a separate "pfilter" process. This feature makes it easier to debug printer scripts because most configuration errors are reported immediately to the OPEN statement. To use direct printing, the printer script must specify an "output" option to select the output device and a "translate" option to select a printer definition file path. For example, the following script outputs to the device LPT1 after translating output using the printer definition file "c:\dl4\printers\hplj": rem dL4opts=output=LPT1,translate=c:\dl4\printers\hplj,lock=true A printer script using direct output should consist of a single options line; all subsequent lines will be ignored. A direct output script always uses the Unicode character set and ignores any "charset" options. o The MSC$() function has been extended to provide a MSC$(7) value which is the hot-key character, if any, that invoked execution of the current SWAP level. The value of MSC$(7) is an empty string ("") if the current program isn't in a hot-key initiated SWAP level. This new value can be used to perform different functions in a hot-key SWAP program based on which hot-key character was entered. o The 'IOBI' and 'IOEI' binary input mnemonics can now be used in dL4 windows. The meaning of binary input is dependent on the operating system environment and so the use of 'IOBI' should be avoided in portable programs ('IOBC' and activate-on-control-character mode may be a suitable replacement). In all environments, binary input disables special treatment of editing keys such as backspace. In the Windows environment, binary input disables special character handling by dL4 and treats all characters as data. Special characters like Control-Alt-Del, which are handled by Windows itself, are not effected. Echo should be disabled when using binary input to avoid echoing illegal characters. o The BASIC/Debug command SIZE has been extended to accept a "-l" option which causes the sizes and names of all linked libraries to be displayed. o Two new commands, "WB" and "WT", have been added to the SCOPE debugger to move the debugger window to the bottom ("WB") or the top ("WT") of the screen. Note that a debugger window is only used if dL4 windows are open. o Three new commands, "WF", "WH", and "WS", have been added to the SCOPE debugger to resize the height of the debugger window. The commands set the debugger window to the full ("WF") height, one half ("WH") height, or a quarter ("WS") height of the full screen, The debugger WINDOW command has been extended to accept a single numeric parameter to set the number of lines in the window (the command "WINDOW 6" or "W6" would select a height of 6 lines). o The SCOPE DISPLAY command and the ProgramDump intrinsic CALL have been modified to print repeated array values in a single line using an array slice notation. For example, if the array V had 10 elements and all of the elements were zero except for V[4]=7 and V[8]=9, then the command "DISPLAY V" would produce the following output: * V[0;3],%13 = 0 V[4],%13 = 7 * V[5;7],%13 = 0 V[8],%13 = 9 V[9],%13 = 0 Note that all lines with repeated data are prefixed with an asterisk. o The size and position of the debugger window is retained between debugging sessions until SCOPE exits. o The EXIT command has been added to the debugger so that the user can exit directly to SCOPE command mode. o The SCOPE DRIVERS command now accepts a search string to select which drivers are displayed. Example: "drivers isam". o The maximum port number has been increased from 255 to 4095. o A new optional section, "[Header]", is supported by the conversion profile files used by the CONVERT command and the LOADSAVE "-c" option. This section can be used as shown below to add standard OPTION statements to programs as they are converted: [Header] Line=OPTION STRING SUBSCRIPTS IRIS Line=OPTION BASE YEAR 1988 Lines from the header section are added using the first unused line number and so they may be inserted after the first converted line. o A new standard intrinsic CALL, DupChannel, has been added to dL4. This call allows dL4 programs to duplicate existing open channels onto closed user channel numbers. These duplicate channels can be used to perform I/O in the same way as the original channels. The primary use of DupChannel is to duplicate the standard input and output channels that are used by INPUT and PRINT when a channel isn't specified. By duplicating the standard input or output channel onto a user channel number, a program can apply channel oriented statements such as SET to a standard channel. Because DupChannel duplicates the base standard input and output channels, it can also be used to avoid window tracking when Dynamic Windows are active. Closing the duplicate or original channel has no effect other than freeing the channel number unless all copies of the original channel are closed. BASIC syntax: Call DupChannel(newchannel, oldchannel) Where: newchannel - a numeric variable or expression specifying the closed user channel (0 - 99) onto which the standard channel will be duplicated. An error will be generated if newchannel specifies a channel that is already open. oldchannel - a numeric variable or expression with a value of an open user channel (0 - 99), standard input channel (-1) or standard output channel (-2) to duplicate. The standard input and output channels are the original base channels and not the window channels used by Dynamic Windows. An error will be generated if oldchannel specifies a channel that is not open. o A new standard intrinsic function, CRC32, has been added to dL4. CRC32() returns a 32-bit CRC checksum code of the first argument which must be either a binary or string variable. An optional second numeric argument can be used to pass the CRC value from a previous call and calculate a combined CRC of several variables. CRCs are calculated against the DIMed size of strings so that zero characters can be included in the CRC. Subscripts can be used to limit the number of characters included in the CRC. So that string values will produce the same CRC values on all platforms, each UNICODE character of a string is forced into a most-significant-byte -first ordering for CRC calculation. An error will be generated if an illegal number of parameters, parameter type, or parameter value is used. BASIC syntax: x = CRC32(var) x = CRC32(var, oldcrc) o A new standard intrinsic function, FindChannel, has been added. FindChannel() returns the first closed channel number in a range. If no range is specified, the first channel between 99 and 0 (note descending order) is returned. An error will be generated if an illegal number of parameters, parameter type, or parameter value is used. BASIC syntax: x = FindChannel() x = FindChannel(startchan,endchan) o The Env and SortInString (CALL 65) intrinsic CALLs are now standard intrinsic CALLs. In previous releases, the sources for these CALLs were included in the development kit, but they were not linked into SCOPE or RUN. The effect of using Env to change the value of dL4 runtime parameters is undefined for the running process: the change may or may not effect the value used by the running process. Applications must not depend on the current treatment of environment variables by dL4 because that behavior may change in future releases. Applications should only change environment variables defined by the application itself. o A new mode has been added to the PORT statement. PORT mode 4 returns the name of the current program of a specified port. For example, the statement: PORT P,4,S,F$ will return in F$ the name of the program running on port P. As with PORT mode 3, a status is returned in S indicating success (zero) or failure (one, port not attached). o The SCOPE command line now uses LIBSTRING to find BASIC program files. o The SPAWN statement now uses LIBSTRING to find BASIC program files unless an OPTION statement with "CHAIN ALTERNATE DIRECTORIES OFF" is used. An error 206 ("subprogram file not found") will be returned if the specified program cannot be located. o The EXAMINE, BREAK, and NOBREAK debugger commands now recognize the filename of the main program in addition to its path (as displayed by the STATUS command). o The FoxPro Full-ISAM driver now supports the memo (.fpt) portion of a FoxPro file when deleting, MODIFYing, or DUPLICATEing FoxPro Full-ISAM files. o The FoxPro Full-ISAM driver now tries both the normalized and literal names when mapping fields and indices. This allows the MAP statement to support a wider range of field or index names. o Input timeout ("INPUT TIM") is now supported on phantom ports. o Input characters following a "hot key" (SWAP input action) character are now always left in the input queue and can be read by the SWAPped to program. o When native locale date format is enabled by the statement "OPTION DATE FORMAT NATIVE", string to date conversion now uses the short date style of the regional locale information to select the preferred ordering of numeric dates. For example, if the short date format is "yy/MM/dd", the statement 'D# = "01/02/03"' would store the date "February 3, 2001" in D#. Please note that string to date conversion tries several formats, both numeric and non-numeric, to parse the date and time. o Input handling by the RAW driver for serial communication devices such as COM1 has been improved to support input timeout. Note that serial device characteristics such as speed and flow control must be setup externally using the Windows 95/NT MODE command. o The maximum parameter value for the PRINT TAB function and the COMMA SPACING option has been increased from 255 to 65535. o The following new TIM functions have been added to return 4-digit years: TIM(14) Current date in the from MMDDYYYY, MM = 1-12, DD = 1-31 TIM(15) Current date in the form YYYYDDD, DDD = 1 to 366 TIM(16) Current year in the form YYYY These functions correspond to the two digit year functions TIM(4), TIM(5), and TIM(8). o A new channel function, CHF#(), has been added to return the creation, last access, or last modification date/time of a file. The creation date/time is returned by CHF#(100+c) where 'c' is a channel number. Similarly, the last access and modification date/times are returned by CHF$(200+c) and CHF#(300+c). Note that opening a file will change the last access date/time unless the "Raw" file driver is used. o Linker speed has been improved for programs that use an extremely large number of libraries (> 50). o Behavior change: The first record number of a Portable Indexed Contiguous file can now be set to zero using a mode 1, index 0 SEARCH statement with a status value of 6. The statement must be executed prior to freezing the index definitions. In previous versions of dL4, an attempt to set a first record number of zero was ignored. o Behavior change: the linker has been modified to allow user defined procedures to overload intrinsic procedures. For example, a user program that defines a function called FindChannel will use that function rather than the new intrinsic FindChannel function. o Behavior change: Portable Indexed Contiguous and UniBasic Indexed Contiguous files now flush the data record buffer whenever a key is inserted or deleted. This avoids a situation in which, when a new record was inserted, a separate program reading the file and ignoring record locks would receive a "Record not found" error when accessing the new record. Note that a "Record not found" error can still occur if the new record is not written until after the key is inserted. Writing the new record after inserting the key is an application error which must be corrected in the application program (otherwise there is an unavoidable period between the SEARCH and the WRITE in which the key exists, but the data record does not). o Behavior change: the file autoselection mechanism now recognizes UniBasic formatted, contiguous, and indexed-contiguous files. The drivers for these files are not included in dL4 for Windows 95/NT because these files are not portable and, hence, no existing Unix UniBasic file could be accessed. New files should be created in the Portable Formatted, Contiguous, and Indexed-Contiguous formats. A "No such driver" error will be reported by any attempt to open a UniBasic file. o File locking in Indexed Contiguous files has been modified to increase compatibility with NFS client software. o The runtime parameter, "WarnOnClose", has been extended to support multiline messages by treating "\n" as a line separator. A backslash must now be entered as "\\". o The appearance of full screen scrolling has been improved for many display cards. o Behavior change: if a network connection on standard input or standard output is lost by scopec.exe or runc.exe, it will be assumed that a telnet-style connection has been terminated and that dL4 should exit. o Behavior change: an attempt to delete an open file will wait for up to one minute for the file to close rather than immediately reporting a "File is busy" error. o Bug fixed: an "Internal error in driver" error was reported when searching a FoxPro Full-ISAM file that had been opened in read/write mode if the file permissions allowed only read-only access. o Bug fixed: a FoxPro Full-ISAM key size of more than 127 characters caused the index to become corrupted. Please note that while keys of up to 240 characters are supported, key sizes should be limited to 150 characters or less for efficient index operation. o Bug fixed: selecting a cut-and-paste area on the screen caused the display to become corrupted if the screen was scrolled. o Bug fix: To increase compatibility with BITS programs, the Portable Contiguous and Portable Indexed Contiguous drivers have been changed to follow BITS alignment rules when OPTION FILE ACCESS RAW is used. Using FILE ACCESS RAW, the current file position will no longer be rounded up to an even byte boundary when reading or writing numeric variables or when executing MAT READ or MAT WRITE statements. The new behavior matches that of the UniBasic Contiguous and Indexed Contiguous drivers. If desired, the Portable Contiguous driver (pcontig.c) in the dL4 development kit can be modified to restore pre-3.1 behavior. o Bug fixed: an address violation or memory corruption could occur if an 'EG' (End Graphics) mnemonic was the first character in an output string when using either the UniBasic or IRIS character set. This would most commonly occur when printing to an output pipe using the default character set. o Bug fixed: SCOPE or RUN would "hang" (enter an infinite loop) when attempting to run or link a program that contained a duplicate procedure definition in a library. o Bug fixed: the cursor is moved to the end of input line when an enter key is pressed during input editing. o Bug fixed: SPC(23) returned -1 instead of "n" after the statement "LIB n" had been executed. o Bug fixed: the FoxPro Full-ISAM driver did not correctly concatenate field names for members of sub-structures. When a member of a record structure was itself a structure, all members of that sub-structure were treated as having the same, incorrect name. o Bug fixed: trailing exclamation marks were not recognized by the DUPLICATE or MODIFY statements for Portable Indexed Contiguous files. o Bug fixed: the SYSTEM statement generated a runtime syntax error if a status variable was used with an external system command ('SYSTEM "cmd",S'). o Bug fixed: converting a string to a date caused an error 15 if the date was numeric and a two digit year of zero was used. For example, the statement 'D# = "14-10-00"' would fail and report an error. o Bug fixed: expressions containing 24 string concatenation operations could cause memory violations or corrupt the current program. o Bug fixed: reading the command line ("INPUT (0,X)C$") after using the debugger could cause memory violations. o Bug fixed: input was echoed incorrectly in insert mode. o Bug fixed: including a space in BREAK/NOBREAK search string (such as in "BREAK /CALL PGM/") resulted in a format error. o Bug fixed: if a newly built and structured Portable Indexed Contiguous file was CLEARed (rather than CLOSEd), the index portion of the file wasn't deleted. o Bug fixed: pfilter sometimes delayed output until subsequent output or a CLOSE occurred. o Bug fixed: rounding of ICE format numbers has been improved so that values such as "4.49999999" will be loaded correctly. o Bug fixed: a "Record not written" error was generated whenever a program was executed with LIBSTRING defined in HKEY_LOCAL_MACHINE of the registry. o Bug fixed: an "Internal driver error" occurred in the Microsoft SQL Server Full-ISAM driver when searching a non-unique index that shared key fields with the primary unique index. o Beta version bug fixed: when using LUMAP with numeric directories (Logical Unit numbers), all leading zeroes were deleted except for the last zero. Thus, "005/file" and "05/file" were treated as having a directory name of "05" rather than "5". o Bug fixed: if LUMAP was defined and the current directory was one of the directories in LUMAP, then a CALL, CHAIN, or SWAP to a program in the current directory would fail if the program filename did not specify a directory ('CALL "PGM"' rather than 'CALL "1/PGM"'). In addition, a SCOPE "CD lu/" resulted in an "illegal filename" error. o Beta version bug fixed: an attempt to load a program or library saved by an older version (2.3.1 or earlier) of dL4 would result instead in loading a different, but previously loaded, program. o Beta version bug fixed: if two identical programs were loaded consecutively, they were treated as having the same path. Networking ========== o File access under dL4 has been tested with Windows NT file servers using both TCP/IP and NetBEUI protocols. dL4 file access does not use any special network system calls and should be compatible with any network file service that supports file access through normal file access system calls. File access to Novell servers or using third-party NFS client software has not been tested. o Windows 95/98 systems with out-of-date system files or incorrect configuration can improperly cache file data from network file servers. This caching problem can corrupt data files and their indexes. The dL4 checksys.exe utility in the dL4 installation directory should be run on all Windows 95/98 systems that share data files over a network. The utility will detect any needed local system updates and will offer to set necessary system registry options. The utility should also be copied to and run on all Windows NT file servers accessed by Windows 95/98 client systems. This caching problem has been detected only when using Windows 95/98 client systems. The problem has not been observed when using Windows NT file servers with Windows NT client systems (service pack 3 or later applied to all systems). Testing has not been performed on Windows 2000 because a production release of that operating system was not available at the time of this release. Notes ===== o dL4 for Windows 95/98/NT cannot be used with Windows 3.1. dL4 will only run under the Window 95, Windows 98, or Windows NT operating system. o Before using dL4, Passport for Windows 95/98/NT must be installed and a valid license and SSN must be registered using the ssnmaint utility. The ssnmaint utility is part of Passport and can found in the Passport program group. Please contact the sales department at Dynamic Concepts (sales@dynamic.com) for information on obtaining a license and SSN. o The record locking protocols used by the Portable Formatted and Portable Indexed Contiguous drivers are incompatible with pre-3.1 versions of dL4. The protocol was changed to support reading through locked records on both Unix and Windows. If a Portable Formatted, Contiguous, or Indexed Contiguous file is accessed simultaneously by this release and a pre-3.1 release, the file data may be corrupted. o The "OPTION FILE ACCESS RAW" statement is used to select BITS compatible file treatment and data alignment rules. In pre-3.1 versions of dL4, the Portable Contiguous, Portable Indexed Contiguous, and Full-ISAM Bridge drivers did not properly follow BITS alignment rules when OPTION FILE ACCESS RAW was used. In dL4 3.1, these errors have been corrected. If your programs use the FILE ACCESS RAW option, your programs and file layouts should be examined for compatibility with these changes. Using FILE ACCESS RAW, the current file position will no longer be rounded up to an even byte boundary when reading or writing numeric variables or when executing MAT READ or MAT WRITE statements. If desired, the driver sources in the dL4 development kit can be modified to restore pre-3.1 behavior. o Copy and Paste functions are available via the "Edit" menu which is part of the main window menu bar or part of the System menu ("Alt-Space"). o Font characteristics, window size, keyboard translation, and input action assignments can be modified using the "Preferences" menu. The "Preferences" menu is part of the main window menu bar or part of the System menu ("Alt-Space"). The "Preferences" menu provides access to the "Font", "Initial Values" and "Keyboard" dialogs. Features that are controlled by the "Initial Values" dialog will not change until the next entry into scopew or runw. o The number of lines and columns in the main window is controlled by registry settings and defaults to 25 lines of 80 columns. The values cannot be changed for a running instance of dL4, but the registry values can be modified by the "Initial Values" dialog for use by the next entry into dL4. In that dialog, the canvas values control the actual number of rows and columns while the window values control the number of rows and columns that are displayed. o The default foreground and background colors are controlled by registry settings and default to those of the system color scheme. The default values cannot be changed for a running instance of dL4, but the registry values can be modified for future invocations by using the "Initial Values" dialog. o Keyboard translations and input action assignments can be modified using the "Keyboard" dialog of the "Preferences" menu. Changes are applied immediately and are saved in the registry for all future invocations of dL4. The "Keyboard" dialog contains two sections: "Special Key to Unicode" and "Unicode to Input Action". The "Special Key to Unicode" section is used to examine, add, or modify translations of key combinations to Unicode characters. For example, to define "Shift-F1" to be the character 'F13', enter "F14D", the Unicode character value of 'F13', in the edit box under the heading "Unicode", select the edit box under the heading "Key Combination", press the SHIFT and F1 keys, and then click "Set" and "Ok". Warning: it is possible intercept normal Windows keys such as Alt-F4 (Close Window/Application) and thus interfere with normal Windows keyboard usage. In the list box, a "Key Combination" value of "VK=xxx" indicates a key combination which isn't supported by the keyboard. The "Unicode to Input Action" section is used to examine, add, or modify assignments of input actions to Unicode characters. For example, the character 'F9' is assigned by default to be the SWAP character. To use 'F9' as a data character, select the character range U+F149 to U+F149 in the list box, select "Data" from the "Action" drop down list, and the click "Set" and "Ok". o The default input action assignments are: control-B Send signal to program control-C Interrupt program control-D Abort program control-E Toggle echo and enter control-E into input Backspace Backspace and delete character Enter Enter control-X Delete all input Escape Escape program Left-arrow Move cursor left Right-arrow Move cursor right Insert Toggle input insert/replace mode Delete Delete input character Home Move cursor to start of input End Move cursor to end of input Control-Left-arrow Move cursor to previous word Control-Right-arrow Move cursor to next word Control-End Delete characters to end of input F9 Swap (if enabled via SWAPF()) BEGIN Enter "BEGIN" mode o The port number used by dL4 can be controlled by setting the PORT environment variable or the registry REG_DWORD value PORT under one of the following keys: HKEY_CURRENT_USER\Software\DynamicConcepts\dL4\Environment HKEY_LOCAL_MACHINE\Software\DynamicConcepts\dL4\Environment o The values for SPC(5), SPC(7), and MSC(7) can be controlled by creating SPC5, SPC7, and/or MSC7 environment variables or registry values. Registry values must be of the type REG_DWORD and must be created under one of these keys: HKEY_CURRENT_USER\Software\DynamicConcepts\dL4\Environment HKEY_LOCAL_MACHINE\Software\DynamicConcepts\dL4\Environment o The LIBSTRING value can be set by creating a LIBSTRING environment variable or registry value. A Registry value must be created under one of the following keys: HKEY_CURRENT_USER\Software\DynamicConcepts\dL4\Environment HKEY_LOCAL_MACHINE\Software\DynamicConcepts\dL4\Environment o The registry can be edited using the standard REGEDIT (for Windows 95/98) or REGEDT32 (for Windows NT) utilities. o Screen, keyboard, and other configuration information can be copied between systems by exporting the registry contents of Software\DynamicConcepts\dL4 to a file and then importing that file on the target system. Under Windows 95/98 or Windows NT 4.0, the standard REGEDIT utility can be used to perform this function. Platforms ========= Operating system information for dL4 4.1 production: ID Platform OS ---------------------------------------------------------------- 1B Win32 Intel Windows 95/98 or Windows NT 4.0