============================================================================ A-Shell Release Notes Version 6.4.1546.2 (08 March 2017) ============================================================================ 1. Log file cleanup: Remove spurious XTREE trace (validate=#, exitpending=#) from the ASHLOG file. (It is now correctly conditioned on the XDEBUG TRACE flag.) ============================================================================ A-Shell Release Notes Version 6.4.1546.1 (07 March 2017) ============================================================================ 1. ATE-based SFTP bug fix: Recent updates to the ashnet library which implements SFTP2 "version 2" transfers resulted in a change to the return status on a successful single-file transfer (from 0 to 1), which was causing some file transfer front-ends, like ATSYNC (with the /V2 switch) and ZTXFER (with the /2 switch) to report a spurious failure code 1 even when the file was successfully transferred. ============================================================================ A-Shell Release Notes Version 6.4.1546.0 (07 March 2017) ============================================================================ 1. 6.3 development cycle now officially at an end; version advanced to 6.4. (At this point there should be only bug fixes to 6.4) 2. XTREE server-side optimization bug fix: under certain conditions, using XTROP_REPLACE to effectively delete rows (by supplying a new array with fewer items than the previous array) was deleting the wrong item due to sorting. ============================================================================ A-Shell Release Notes Version 6.3.1545.7 (06 March 2017) ============================================================================ 1. TABX/INFLD bug fix: redisplaying (recreating) an INFLD-based checkbox on a TABX control wasn't displaying the updated state. ============================================================================ A-Shell Release Notes Version 6.3.1545.6 (02 March 2017) ============================================================================ 1. COMPIL bug fix (edit 794) - the compiler was failing to report an error when a variable type other than F,6 was used as the return variable in a LOOKUP statement. (The runtime system, consistent with AMOS behavior, has always returned the value in F,6 format. This fix to the compiler will help prevent unexpected results when another variable type is advertently specified.) 2. HOSTEX.SBR refinement: a new suffix character, "^", allows for a slight variation in the Windows behavior that you otherwise would get without specifying any suffix character. In both cases, the parent session waits for the child to exit, but in the case of the "^" suffix, it does not try to get the focus back when the child returns, and it doesn't notify any sibling A-Shell sessions when the user transmits keystrokes or mouse events while waiting that are ignored by the child while the parent is waiting. This addresses an exotic situation with child processes that have no user interface support but which take long enough that it becomes likely for the user to either switch to another session in the meantime, or to try mouse or keyboard actions in the suspended parent session which then interfered with a sibling A-Shell session. ============================================================================ A-Shell Release Notes Version 6.3.1545.5 (02 March 2017) ============================================================================ 1. XTREE bug fix (server-side): file-mode multi-select trees were failing to return any selections in some cases. ============================================================================ A-Shell Release Notes Version 6.3.1545.4 (28 February 2017) ============================================================================ 1. TABX bug fix: deleting controls by id or name, which were not part of a TABX control, wasn't working properly when there was a TABX control present. 2. TABX/wallpaper bug fix: the main window wallpaper area wasn't being refreshed while a TABX control was present. 3. The default Copy/Paste context menu (introduced in 1539.0) is now disabled in the presence of XTREE. (The two were conflicting). ============================================================================ A-Shell Release Notes Version 6.3.1545.3 (28 February 2017) ============================================================================ 1. MX_FILESTATS bug fix: remote files (on the ATE workstation) with commas in the file name were not being recognized. 2. ERASE.LIT 3.4(130) fixes a display glitch in the /? help display affecting the the /F switch documentation. Also, all the internal messages have now been internationalized (via LITMSG.xxx). ============================================================================ A-Shell Release Notes Version 6.3.1545.2 (27 February 2017) ============================================================================ 1. XTREE bug fix: editable cell background color was reverting to white instead of a shade of the display color. (Bug introduced in 1545.0) 2. Bug fix: further revision to the bitwise operator fix in 6.3.1545.1. ============================================================================ A-Shell Release Notes Version 6.3.1545.1 (27 February 2017) ============================================================================ 1. Bug fix: the bitwise operator combinations AND NOT and OR NOT were giving unexpected results when one of the operands was less than &h80000000 and the other was >= &h80000000. (Problem was introduced in 6.3.1516 along with support for B6/I6 variables.) ============================================================================ A-Shell Release Notes Version 6.3.1545.0 (22 February 2017) ============================================================================ 1. XY.LIT 1.0(102) adds usage help display, supports XY x,y syntax. 2. ISMUTL.LIT 1.4(140) adds a new feature to allow dumping directly from the DAT file rather than from one of the indices. This can be useful in the rare case where the IDX file has become damaged, which could interfere with the ability to dump or rebuild it by the normal means. 3. ISMUTL.LIT 1.4(141) adds an option, when dumping directly from the DAT file, to dump just the active records (default), or just the deleted records, or all the records. The latter two options might be useful in exotic data recovery or other operations. For example, if you accidentally deleted some records, you could dump just the deleted records and then reload them (effectively un-deleting them). Or if you have a large file containing many deleted records, you could split it into two files -- one for the active records and one to archive the deleted records -- by dumping the active and deleted records separately and then using them to build two new files from scratch. 4. EDIT$() bug fix: the +2 flag (to remove control characters) was also removing any characters with the 8th bit set. (Bug introduced in 6.3.1534.) 5. libashtls.so.1.1.209.el7 added to the -el7 release. This matches the latest GNUTLS for that platform (3.3.24, aka ligbnutls.so.28). ============================================================================ A-Shell Release Notes Version 6.3.1544.9 (22 February 2017) ============================================================================ 1. TABX bug fix: when attempting to redundantly add a child control to a TABX panel, the returned control id was incorrect. ============================================================================ A-Shell Release Notes Version 6.3.1544.8 (20 February 2017) ============================================================================ 1. TABX bug fix: close a loophole in a recent optimization that was causing an XTREE to fail with error 207 when recreating an already existing tree on a TABX panel. 2. File handling bug fix: close loophole in which closing an SQL file within a nested SBX routine might result in the disappearance of the last file opened from the file table (generally leading to I/O to Unopened File error.) ============================================================================ A-Shell Release Notes Version 6.3.1544.7 (17 February 2017) ============================================================================ 1. LIBASHTLS.DLL 1.1(209) - TLS support for TCPX updated to use latest stable GNUTLS (3.4.9). From a library compatibility standard this is known as GNUTLS-30 (previously we were using -26). (Linux versions to follow.) ============================================================================ A-Shell Release Notes Version 6.3.1544.3 (14 February 2017) ============================================================================ 1. Further TABX paint refinement: deleting controls on a TABX panel using the wildcard method (setting text = "*" and specifying a rectangle within which to delete) was failing to visually remove them until some other action triggered a refresh (which may have been too late to prevent visual overwriting/overlapping of newly added controls) /jdm ============================================================================ A-Shell Release Notes Version 6.3.1544.2 (12 February 2017) ============================================================================ 1. FTP2 bug fix: XFTPF_DEL operation was failing due to bogus complain about library version. 2. ASHNET.DLL 1.10.158 fixes a variety of minor issues and adds several minor refinements to FTP2, mostly in the area of wildcard and sync operations. ============================================================================ A-Shell Release Notes Version 6.3.1544.1 (12 February 2017) ============================================================================ 1. ISAM-A bug fix: GET'PREV following a not-found lookup error on another file was causing the GET'PREV to return the current rather than previous record. The new library version is 6.11q (as shown in ISMUTL). The bug was exposed by the previous ISAM-A patch (see 1542.3) ============================================================================ A-Shell Release Notes Version 6.3.1544.0 (10 February 2017) ============================================================================ 1. Various refinements to the TABX display refresh logic to reduce the flickering and other display anomalies. 2. HTTP.SBR now exposed to Linux via libashnet.so.1.9.157. (See notes for CRYPTO under 6.3.1539.0 below for installation details.) 3. FTP2.SBR now exposed to Linux via libashnet.so.1.9.157. 4. HTTP.SBR refinement: filespecs passed in the request and response parameters are now folded to lower case. (The documentation has always noted that they are to be native filespecs, but since case doesn't matter in the Windows world, folding them to lower avoids a common mistake when porting a working application from Windows to Linux.) 5. FTP2 enhancement: wildcards are now supported in the SFTP protocol; previously they were only supported for the FTP protocol. 6. FTP2 enhancements: new opcode options: define XFTPF_RECURSE = &h00200000 ! recurse subdirs (with wildcards) ! [273] Following are mutually exclusive (SFTP only) M=missing, N=newer, S=size define XFTPF_SYNC_ALL = &h00000000 ! all matching files define XFTPF_SYNC_M = &h01000000 ! all files that don't exist in dest define XFTPF_SYNC_MN = &h02000000 ! all files that don't exist in dest, or are newer in source define XFTPF_SYNC_N = &h03000000 ! only files that exist in both places but are newer in src define XFTPF_SYNC_MS = &h04000000 ! all files that don't exist in dest or are different size define XFTPF_SYNC_MNS = &h05000000 ! all files that don't exist in dest or are different size or newer define XFTPF_SYNC_DELM = &h0F000000 ! with XFTPF_DEL, only remote files not existing locally The above opcode options apply only to the SFTP protocol (XTFPF_SFTP), and only come into play when a wildcard is specified in the relevant source argument and the destination is just a directory. The wildcard source argument acts as the first level of filtering on files to be transferred, with further filtering determined by the XFTPF_SYNC_xxx options. Note that unlike most of the XFTPF_xxx flags, which are coded as unique bits and thus could theoretically be combined in any way (provided it makes functional sense), the XFTPF_SYNC_xxx options are all mutually exclusive (i.e., choose only 1). Also note that XFTPF_SYNC_DELM only applies in conjunction with XFTPF_DEL. When doing wildcard transfers or remote deletions, the status parameter now returns (on success) the number of files transferred or deleted, rather than just zero. Also, the emsg parameter in that case will contain a list of the files transferred or deleted (delimited by line breaks). See new FTPTST program (SOSLIB:[907,33]) for testing. ============================================================================ A-Shell Release Notes Version 6.3.1543.5 (07 February 2017) ============================================================================ 1. Fix some anomalies in validating new style licenses. 2. XTREE refinement: missing semicolon at end of PopupMenu definitions now supplied automatically. (It only a problem when concatenating multiple indexed PopupMenus.) ============================================================================ A-Shell Release Notes Version 6.3.1543.4 (03 February 2017) ============================================================================ 1. TABX control update/correction: minor adjustments to the new TABX control implementation. Note that the SftTabs_IX86_A_60.dll is no longer supported due to compatibility issues with the new _65.dll. 2. PCKLST/XTREE bug fix: close a loophole in which an empty first line of the file (in file mode) was causing the data load to terminate without displaying any data. Note that this fix is to the server side. (Absent the fix, the workaround is to just make sure that the first line of the file contains at least one space if nothing else.) ============================================================================ A-Shell Release Notes Version 6.3.1543.3 (03 February 2017) ============================================================================ 1. XTREE bug fix: checkboxes in property sheets were displaying and acting like read-only numbers rather than checkboxes. (Introduced in 6.3.1530.0) ============================================================================ A-Shell Release Notes Version 6.3.1543.2 (02 February 2017) ============================================================================ 1. AUI_CONTROL bug fix: static controls with palette colors (e.g. values in range of 0-79 rather than RGB values) were not displaying the right color in many cases. 2. AUI_CONTROL bug fix: static panel background colors were not displaying as opaque in the presence of wallpaper, even when the panel was within a dialog. (Wallpaper generally requires transparent backgrounds but only for controls that are directly on the wallpaper and intended to bleed through.) ============================================================================ A-Shell Release Notes Version 6.3.1543.1 (31 January 2017) ============================================================================ 1. XTREE bug fix: close loophole allowing an infinite loop when a column title contained a ":" character. (Bug introduced in 6.3.1537.0) ============================================================================ A-Shell Release Notes Version 6.3.1543.0 (31 January 2017) ============================================================================ 1. MSGBOX.SBR enhancements - up to 5 buttons, customizeable button labels or icons, tool tips, time delay, time out, optional hyperlink field, colors, fonts, etc. New syntax: xcall MSGBOX, msg, title, btnflag, iconflag {, miscflags, rtncde, & {mxflags, timeout, timein, url, iconspec, & btn1, btn2, btn3, btn4, btn5, tip1, tip2, tip3, tip4, tip5, & fontface, fontscale, fgc, bgc}} The original arguments msg thru rtncde remain as before. If 6 or fewer arguments are specified, it continues to use the original MSGBOX implementation (based on the standard Windows Message Box for GUI environments, or INMEMO for plain text environments). Otherwise (i.e. if the mxflags argument is specified), the routine uses a new implementation entirely internal to A-Shell. For GUI environments, the new implementation is similar to an extended version of the standard Message Box; for plain text environments it uses the same INMEMO implementation as before. Note that many of the new features will be ignored in the plain text version (icons, tooltips, fonts, hyperlinks, etc.) New Parameters: mxflags (num) [in] - flags related to extended options: MBX_RCBTNO &h10000000 ! return 101-105 for buttons 1-5 MBX_FRCTXT &h20000000 ! force plain text version MBX_TI1 &h00100000 ! time-in delay on button 1 MBX_TI2 &h00200000 ! time-in delay on button 2 MBX_TI3 &h00400000 ! time-in delay on button 3 MBX_TI4 &h00800000 ! time-in delay on button 4 MBX_TI5 &h01000000 ! time-in delay on button 5 timeout (num) [in] - if not zero, sets the timeout (in seconds) on the default button (at which point the button is auto-clicked). Except in the case of icon buttons, the button will show the countdown progress. See comments regarding pausing the countdown. timein (num) [in] - used in conjunction with the MBX_TIx flags (see mxflags) to specify a time (in seconds) before which one or more buttons are unable to be clicked (i.e. disabled). This is useful when you want to make sure the message box stays on the screen for at least a certain number of seconds, either so that the user can read the message, or perhaps to prevent the possibility of accidentally clicking a button before understanding the consequences. Note that the timeout and timein values run concurrently. Setting them both for the same button will result in the visual countdown starting with button disabled. When the timein value expires, the button becomes enabled but the countdown continues. (It only makes sense for the timeout value to be >= timein value.) url (str) [in] - optionally specified a clickable hyperlink that appears beneath the message text and above the buttons. The visible text may be the same as the target url, or you may use HTML format to display something other than the actual link, e.g. http://www.microsabio.com MicroSabio Home Page MicroSabio Home Page The third example shows the proper HTML format (with the url field quoted). Note that to embed such quotes within a BASIC quoted string you need to use double-double quotes (""). The second example (without the extra quotes) is supported for convenience. iconspec (str) [in] - optionally specifies an icon (native Windows filespec or iconname::icondll, e.g. "warning:ashico1") to be used instead of the standard one based on the iconflag value (which will be ignored if iconspec is non-null). If neither an iconflag no an iconspec is specified, the message box will have no icon. btn1 - btn5 (s,32) [in] - optional text or icon to display for up to 5 buttons (assuming you want to override the default button text corresponding to the btnflag parameter). Although you can mix text buttons and icon buttons, it probably works (or looks) best if you stick to one or the other. For icons, you can use the native Windows filespec of the .ico file or the iconname::icondll format for an icon within an icon library (like ashico1.dll). Note the 32 byte limit on the length of each field; for ico filespecs, to fit within 32 characters you may need to drop the directory from the path and either put the icon in the current directory or in the default A-Shell icon search path (e.g. the cache, permcache, or icons subdirectories). tip1 - tip5 (str) [in] - optional tool tips for up to 5 buttons. fontface (str) [in] - optional font to use fontscale (num) [in] - optional font scale adjustment in percent. 0 is treated the same as 100 percent. In modern high-res environments, you may find that increasing the font size makes for a more readable message. Note that the font scale does not affect the title bar, but it does affect nearly everything else in the message box. fgc (num) [in] - optional RGB value to use for the message text. bgc (num) [in] - optional RGB value to use for the background of the message. Comments: Aside from the features documented above, another advantage of the enhanced message box (vs the standard Windows message box) is that although it forces you to respond to the message box before returning to the application (i.e. it is task modal), it allows you to access the A-Shell menu bar, for example, to use the Print Screen utility. Pausing the countdown: in the case of a countdown (see timeout parameter), the user may want to pause the countdown in order to allow more time to study the message, seek help etc. This can be accomplished by right-clicking on the affected button, which suspends the countdown and displays a simple context menu containing the single option "Resume". Although this may not be obvious to the interested user, if you don't supply your own button tooltip, one will assigned automatically saying "Right-click to pause countdown". (It may still not be obvious to the user but at least they have a fighting chance of stumbling on it.) If you supply your own tooltip, you may want to include wording to the same effect. 2. New release of the DLL underlying TABX control (SftTabs_IX86_A_65.DLL, previously SftTabs_IX86_A_65.DLL). 3. New LIT commands: MUSER.LIT 1.0(100) LOGON.LIT 1.0(100) MUSER maintains a database of user info, and LOGON provides a menu-driven text-mode logon portal for A-Shell. Together they simulate the logon scheme used under AMOS. Most A-Shell users rely on the Windows or UNIX logon scheme, thus eliminating the need for a separate emulation of the AMOS logon. But for those who have integrated aspects of the AMOS logon into their application logic, the A-Shell emulation of the feature may be useful. Note that although both AMOS and A-Shell store the user database in the file OPR:USER.SYS, the file layouts are not compatible. Thus you'll have to manually enter all the users when porting from AMOS. Also, several of the AMOS-centric fields in the USER.SYS are ignored. Also note that when you use LOGON to log on as a user defined in the USER.SYS database, A-Shell will replace the native operating system logon name with the name specified in LOGON.LIT. (This name will apply within A-Shell, but will not affect the real identity of the user from the host operating system perspective.) 4. New SBX: FNDUSR.SBX 1.0(101) emulates the AMOS subroutine of the same name, acting as a companion to MUSER.LIT and LOGON.LIT to retrieve information about the current (or another user) from the database. Usage: xcall FNDUSR, user'name, status, user'map user'name (str) [in/out] is the name to look for. (If blank, the current user is retrieved.) status (f,6) [out] returns 0=success, else unable to locate user user'map (struct) [out] returns attributes of found user: MAP1 USER'MAP MAP2 USER'NAME,S,20 MAP2 USER'FLAGS,F,6 MAP2 USER'ROOT'PPN,S,10 MAP2 USER'ROOT'DEVICE,S,10 MAP2 USER'MAIL'PPN,S,10 MAP2 USER'MAIL'DEVICE,S,10 MAP2 USER'MAIL'CPU,S,10 MAP2 USER'PRIV,F,6 MAP2 USER'CLASS,F,6 MAP2 USER'EXP,F,6 MAP2 USER'CPU'TIME,F,6 MAP2 USER'CONNECT'TIME,F,6 MAP2 USER'KRAM,F,6 MAP2 USER'DISK'READS,F,6 MAP2 USER'DISK'WRITES,S,6 MAP2 USER'PAGES'PRINTED,F,6 MAP2 USER'DEFAULT'PROTECTION,F,6 MAP2 USER'DEFAULT'PRIORITY,F,6 MAP2 USER'DEFAULT'LANGUAGE,F,6 MAP2 USER'DEFAULT'PROMPT,S,20 The above structure is also defined as DEFSTRUCT ST_USER_MAP in ASHINC:USER.DEF 5. Bug fix: close a loophole in which an un-mapped array might cause a GPF or segmentation fault when first accessed, depending on whether the string stack had been auto-expanded and to where. (Note that we recommend mapping all variables, especially arrays, but such unmapped variables remain legal and thus must be supported for backward compatibility.) 6. New MIAMEX function MX_LANGUAGE (190) to retrieve or set the current language: xcall MIAMEX, MX_LANGUAGE, op, lang {,status} op (num) [in] Operation: 0=get, 1=set lang (str) [in/out] For the get operation, returns the current language name. (Note that this is the name defined within the LDF file, not the name OF the LDF file. For example, the ENGLSH.LDF file contains the name "ENGLISH") For the set operation, must specify the name of the LDF file to load. This can be either an unadorned filename, like "ENGLSH" (in which case it will look for DSK0:lang.LDF[1,6]), or a complete filespec. Note that although the status parameter will indicate if the file was found, the only to really evaluate the success of the operation is to use GTLANG.SBR to retrieve all the attributes of the new language. status (num) [out] If specified, returns 0 for success, else -1 if the specified LDF is not found. 7. SET.LIT 1.2(161) enhancement: now supports setting/display language: SET LANGUAGE {lang} If lang not specified, it displays the name of the current language. Otherwise if tried to load the specified language file, interpreting lang as the LDF file name (i.e.g the same way that MX_LANGUAGE does). Thus, while SET LANGUAGE may return "SPANISH", to set the language to Spanish you may need to use SET LANGUAGE SPANSH (assuming the LDF file name is DSK0:SPANSH.LDF[1,6]). 8. DATES.SBR bug fix: was outputting mm/dd/yy when it should have been mm/dd/ccyy (i.e. when the output string length >= 10). ============================================================================ A-Shell Release Notes Version 6.3.1542.3 (25 January 2017) ============================================================================ 1. ISAM-A bug fix: GET'NEXT/GET'PREV (and FIND'NEXT/FIND'PREV) were not operating as expected after a seek operation hitting the end of file (e.g. after a FIND or GET to a key past the last key, or after opening the file with the END'FILE modifier). At that point, instead of GET'NEXT and FIND'NEXT failing with status -3, they were locating the last key and returns status 0. And instead of GET'PREV and FIND'PREV returning the last key, they were returning the 2nd to the last key. New ISAMA version is 6.11p (as reported in ISMUTL.LIT). ============================================================================ A-Shell Release Notes Version 6.3.1542.2 (22 January 2017) ============================================================================ 1. XTREE bug fix - fix bug (introduced in 6.3.1536.0) in which clicking on a checkbox or radio button in an inactive tree was toggling the visual state of the element, but not returning the updated state in the answer array. ============================================================================ A-Shell Release Notes Version 6.3.1542.1 (20 January 2017) ============================================================================ 1. XTREE bug fix - close loophole in which an empty shared list column might result in truncation of the answer array results. ============================================================================ A-Shell Release Notes Version 6.3.1542.0 (16 January 2017) ============================================================================ 1. AUI_CONTROL enhancement: auto-countdown buttons. To enable this feature, append "<##>" to the text of a button (ctype MBF_BUTTON), where ## is the desired length of the countdown in seconds. The button display will be updated each second with the remaining length of the countdown until it reaches zero. At that time, the "<##>" suffix will be removed entirely, and one of the following two events will occur: a) If the button was initially disabled (MBST_DISABLE), then it will become enabled. (This might make sense in a situation where you want to prevent the user from prematurely or accidentally triggering an action with serious consequences.) b) If the button was initially enabled, then the click event will be triggered. 2. ASHNET.DLL 1.9.157 bug fix: resolve various problems with the plain FTP protocol support in the FTP2.SBX routine. The ASCII/BINARY and PASSIVE/ACTIVE options weren't working, nor was the simple PC-to-host option. (Presumably the excuse for this oversight was that hardly anyone uses plain FTP anymore, preferring SFTP instead.) 3. XSHLEX.SBX added to distribution to provide a standardized robust way of doing a "Shell Execute" (i.e. launch the application that goes with a specified file or URL object), without having to consider which platform you are on. This doesn't provide much advantage over MX_SHELLEX for those in a pure local Windows environment, but for developers programming across various environments, it eliminates the need for logic to deal with local/remote and file transfer considerations. (For example, in an ATE environment, it detects if the object is a file on the server, and if so, transfers it automatically to the ATECACHE directory when it then launches the corresponding app.) Syntax: xcall XSHLEX, objectspec {,status,action,parms,dir,showflags, & waitflag,clisvr,exitstatus} The parameters all correspond to the equally named MX_SHELLEX parameters (which see for specifications). Only the deviations/extensions from the MX_SHELL parameter descriptions are noted below. Also note that the order of the first two parameters is reversed from MX_SHELLEX (reducing the mininum syntax to a single parameter). objectspec (str) [in] File or URL to launch. Unlike MX_SHELLEX, the file spec may be in AMOS format; the routine will figure out if it is relative to the server or the client. If on the server in an ATE or ZTERM connection, file will be transferred to the client for launch (using ATEAPX.SBX). status (num) [out] Combines status codes returned by MX_SHELLEX, with those of ATEAPX.SBX (which is used for file transfer if necessary) and adds a few more. The best reference (both for documentation and actual program usage) is the function Fn'Shell'Exec'Status'Description$() in the new SOSLIB fnshellex.bsi [https://bitbucket.org/microsabio/soslib/src/bb6659e417127151e863126f35cf6213cba5ccce/907010/fnshellex.bsi?at=default&fileviewer=file-view-default] function. action, parms, dir$, showflag, waitflag, exitstatus (same as for MX_SHELLEX) clisvr (str) [in] Similar to MX_SHELLEX usage, except that if omitted or blank, the routine will attempt to figure out if objectspec is a file on the server or client. If the application knows the object is on the client PC, it can set it to "C" (for client) to avoid the self-determination logic. Comments: The new fnshellex.bsi module (see link above) contains a convenient wrapper function Fn'Shell'Exec(objectspec$) for maximum simplicity, e.g. STATUS = Fn'Shell'Exec(objectspec$) 4. SHLEXC.LIT 1.0(103) enhanced (using XSHLEX.SBX which see above) so that it now works in server environments (with ATE or ZTERM clients), auto- transferring the file to the client if necessary. Requires XSHLEX.SBX and ATEAPX.SBX in BAS: 5. xMASCB.SBR routines fixed to support the dynamic string stack. 6. XTREE PopupMenu enhancement: individual menu items may now be marked as disabled with a "!" at the start of the item text, i.e. PopupMenu=!disabled item,VK_xF999; ... 7. XTREE PopupMenu enhancement to support sub-menus. Syntax is the same as for Hover/Context menus, i.e. set the cmd field (of the text,cmd; menu item pair) to "[SUB]" to mark the beginning of the submenu, and the text field of a subsequent item to "[ENDSUB]" to mark the end of the submenu. For example: coldef$ += "0~0~ ~SH~PopupMenu=" & + "!Retire\tF2,VK_xF501;" & + "|arrow_right_green::ashico1|Peacetime,[SUB];" & + "|photo_portrait::ashico1|Visit\tF3,VK_xF502;" & + "|signpost::ashico1|Pass Through,VK_xF503;" & + "[ENDSUB],;" & + "-----,;" & + "|gear::ashico1|Wartime,[SUB];" & + "Attack,VK_xF504;Lay Siege,VK_x507;" & + "[ENDSUB],;" & + "-----,;" & ... The above defines a PopupMenu which looks something like: Retire F2 (disabled item) Peacetime (submenu with icon) Visit F3 (submenu item with icon) Pass Through (submenu item with icon) --------------------- (separator) Wartime (submenu with icon) Attack (submenu item) Lay Siege (submenu item) --------------------- (separator) ... 8. XTREE enhancement: indexed PopupMenus. These allow for column- and/or row- specific context menus to be assembled by concatenating one or shared partial indexed menus. To accomplish these three new variations of the PopupMenu syntax are introduced: PopupMenu:?=lbl1,cmd1;lbl2,cmd2;...lblN,cmdN PopupMenu={+}?{???} PopupMenu={+}### (where each ? is replaced by an alphabetic character A-Z, and ### is replaced by a column number). The first variation defines a full or partial menu to be indexed by the letter replacing ?. The definition can be attached as an Advance Coldef Option clause to any column definition (zero column or a real column). Unlike the standard PopupMenu definition syntax, the resulting menu is not automatically invoked; it only becomes available for reference via one of the other syntax options associated with a real column. The second variation may be associated with a real column, indicating that the context menu for that column should be made up of the previously indexed menus associated with the ? character(s). The optional "+" prefix prepends the global PopupMenu to the start of the column-specific menu. For example: PopupMenu=+AQZ indicates that the context menu for the column should be made from the global PopupMenu, combined with the indexed PopupMenus A, Q, and Z. The third variation indicates that the specified column ### (current row) contains the list of indexed PopupMenus to be used for this column, thus allowing the possibility of a different set of context menu items for each cell. Note that the specified column ### would normally be hidden, but it doesn't have to be. See the EXLIB sample program XTRA21 for an example. 9. SIZE.SBR bug fix: The variations to count the number of lines (flags 1 and 2) were incorrectly including the byte count. 10. DYNLIB.SBR enhancement: automatic convertion from ANSI to/from UTF8 now supported via the "A" (read only) and "a" (read/write) codes. (This is used in the Linux version of the LIBXL API to handle accented and other special Latin1 characters.) 11. KILL.LIT 2.2B(125) now supports localization; see LITMSG.xxx 039,### for message customization. 12. SORT.LIT 1.1(106) now supports localization; see LITMSG.xxx 056,### for message customization. Also, the display has been updated to show the number of records sorted. 13. ISMBLD.LIT/SBX 2.1(143) bug fix: SBX version wasn't putting the IDA on the same device as the IDX when the fspec contained a device specification and the IDADEV parameter was blank. ============================================================================ A-Shell Release Notes Version 6.3.1541.0 (21 December 2016) ============================================================================ 1. XTEXT enhancement - new flag TXF_SILENT (&h00100000) eliminates the user interface and causes the operation to exit immediately. This is mainly useful in conjunction with TXOP_CREATE to convert a file from one format into another. ============================================================================ A-Shell Release Notes Version 6.3.1540.0 (19 December 2016) ============================================================================ 1. New feature - "Group Licensing". This allows fine tuning of the license usage by providing a means of reserving and/or limiting the license usage relative to license groups. For example, in a 15 user license, you can reserve 2 license for "admin" users, and limit the "remote" users to no more than 5 licenses. When group licensing is enabled (in the license code), A-Shell will call BAS:ASLICGRP.SBX on startup (if it exists) to determine which license group the current user should be assigned to, and also to specify the number of licenses that each group should be allocated or limited to. See the sample ASLICGRP.SBX source code in [907,52] of the SOSLIB for details on the calling interface. 2. SYSTAT.LIT 3.2(175) will display the group each job is assigned to, if applicable, with the /CU switch. 3. INFLD enhancement: TYPE code |& ('smart' re-enabling of protected fields), when specified in the INFDEF string, now affects BASIC INPUT fields. (Normally, the INFDEF options only apply to XCALL INPUT, XCALL INFLD, etc.) This can be handy in an application that uses protected fields along with BASIC INPUT, assuming that the BASIC INPUT does not deactive the protection (which INFLD would otherwise do). 4. AG_WALLPAPER now supports PNG and other image formats for main window wallpaper. This was always the case for dialog wallpaper (see 6.3.1527 below), but previously, main window wallpaper was limited to BMP files. ============================================================================ A-Shell Release Notes Version 6.3.1539.0 (11 December 2016) ============================================================================ 1. Windows UI refinement: blocks can now be marked starting from the lower right corner and dragging to the upper left. (Previously, only marking down and to the right was supported.) 2. Window UI refinement: right clicking on a dialog or the main window will now generate a generic copy/paste context menu if there is not a custom context menu already defined. 3. XTREE refinement / enhancement: the Advanced Coldef Option Dspwid may now be explicitly set to 0 (Dspwid=0) to produce an effect similar to hiding the column (Cformat "H"), except that the column is still technically visible (just 1 pixel wide). This allows you to manually resize it with the mouse (not possible for truly hidden columns), and also may be useful in exotic situations. For example, you may have a column that you want to leave essentially invisible for rows where it is empty, but let it spill over to subsequent columns for rows where it is not empty. 4. CGIUTL bug fix: HTML decoding of an explicit string request passed to CGIOP_GETPARX or _GETPARARY was failing if the string length was > 2K. 5. CRYPTO.SBR enhancements: - XCALL syntax upgraded to enable the initialization vector (iv) and replace the salt parameter with aad (additional authentication data) and authtag: XCALL CRYPT, opcode, status, src, decoding, src, encoding, cflags & {, cipher, key, keybits, cmode, padding {, cbsrc & {, iv {, aad, authtag}}}} iv (string or X) [in] Initialization vector for optional use with CRYPTOP_ENCRYPT/DECRYPT opcodes with the AES cipher (all cipher modes except ECB). For cipher modes other than GCM or ECB, it should match the cipher block size, i.e. 16 bytes for AES (128 bits, not to be confused with the key size). For GCM cipher mode, 96 bits or less is recommended for best efficiency and interoperability. In all cases, it should be unique for any given key, preferably randomly generated. For GCM, it is only necessary that each IV not be used more than once. The same iv used for the encryption must be supplied to the decryption. The iv may be specified as raw bytes (preferably using an X format variable), or as a string of hex digits (in which case the CRYPF_IVHEX flag must be specified.) aad (string, null terminated) [in] Additional authentication data for use with the new GCM cipher mode (see below). Must be in the format of a string of hex digits. This is typically used to provide an identifying label or other association for the encrypted text, with the intent of making sure that the decrypted text is not just valid, but valid for a particular context/use. A corresponding authentication tag is generated (by combining the aad with the message and hashing and encrypting it) and output to the authtag parameter. The aad does not have to be kept secret, but both it and the corresponding authtag must be provided to the decryption routine in order to authenticate the result. The aad parameter can be null, but a unique authtag will still be generated and must be passed (along with the null aad) to the decryption. authtag (string, 33+ bytes) [in/out] Required for AES-GCM encryption/decryption. During encryption, an authentication tag is generated from the combination of the aad and the message text and output to this parameter in the form of a string of 32 hex digits. This computed value must then be passed along with the origional aad to the decryption. - New cipher modes (cmode) added for use with the AES encryption algorithm: CBC - Cipher Block Chaining (block) CTR - Counter Mode (stream) CFB - Cipher Feedback (stream) OFB - Output Feedback (stream) GCM - Galois/Counter Mode (stream) - Note that the stream cipher modes (CTR,CFB,OFB,GCM) do not require or use padding and thus ignore the padding parameter (use of CRYPT_PAD_NA recommended for clarity). Without padding, the encrypted text is the same size as the plain text (assuming the same encoding). The block cipher modes (ECB and CBC) do require one of the other padding options, all of which will increase the encrypted text size up to a multiple of the block size (i.e. a multiple of 16). - CRYPTO.SBR now supported on the Linux platform, in addition to Windows. Requires /usr/lib/libashnet.so.1 -> /libashnet.so.1.9.156 - New symbols in ashinc:cipher.def define CRYPTO_MODE_CTR = 4 ! Counter Mode define CRYPTO_MODE_CFB = 5 ! Cipher Feedback define CRYPTO_MODE_OFB = 6 ! Output Feedback define CRYPTO_MODE_GCM = 7 ! Galois/Counter Mode define CRYPF_IVHEX = &h0800 ! IV is hex-encoded (else binary) define CRYPTO_PAD_NA = -1 ! padding not applicable. (Use with ! stream cipher modes CTR,CFB,OFB,GCM) Note that all of these CRYPT-related enhancements require ASHNET.DLL 1.9.156+ (for Windows) or libashnet.so.1.9.156 (for Linux). ============================================================================ A-Shell Release Notes Version 6.3.1538.1 (05 December 2016) ============================================================================ 1. XTREE bug fix / refinement: Cformat code "o" (to allow previous column to spill over into the current one) was not working in file mode when the column also had a cell background color (Cformat "B"). ============================================================================ A-Shell Release Notes Version 6.3.1538.0 (28 November 2016) ============================================================================ 1. Language enhancement (compiler edit 792) : new dot variables .LINENO and .LOCATION : .LINENO returns the last line number, similar to err(1) except without requiring an error. Not to be confused with the dot function .LINENO(ch) (which returns the physical line # since the last page break in the output file open on the specified channel). .LOCATION returns the current program location counter, i.e. the offset in bytes from the start of the current program (RUN, LIT or SBX) to the current statement position. Note that the location counter is generally represented in hex (as it appears in the LSX files created by the compiler /LF switch), so you would probably want to print it using the SOSLIB function Fn'Dec2Hex(.LOCATION). 2. File hook enhancement: add new fields chan, location and lineno to the ST_HOOK_ENV structure passed to the hook SBX. These are mostly motivated by the desired to use the hook mechanism for application forensics than for more traditional purposes (export, data audit), i.e. they allow the hook return to more information context in which the file operation occurred. The end of the ST_HOOK_ENV structure now looks like this: map2 user,s,24 ! user name map2 chan,b,4 ! actual file channel (may not match fileid) map2 location,b,4 ! location counter map2 lineno,b,2 ! last line # Note that the expanded structure does not break compatibility with existing hook routines, nor do hook routines using the expanded structure lose their backwards compatibility. (The new fields just won't be available.) See ASHINC:HOOK.DEF for the updated structure and related symbol defintions. 3. File hook bug fix: the recno field in the ST_HOOK_ENV wasn't being adjusted for non-zero SCALE factors. 4. New MIAMEX function MX_CALLSTACK (189) to return information about the call stack. The motivation here, as with the enhancement to the ST_HOOK_ENV structure, is to allow application routines to identify the context in which they were called. For example, the file hook subroutine, or an error trapping routine, might want to identify not just the location where the file operation or error occurred, but if that location was within a callable routine, the routine(s) that called it. The syntax: xcall MIAMEX, MX_CALLSTACK, maxdepth, csarray(1) {, program$} maxdepth (num) [in/out] should be set to the number of elements in the csarray(), i.e. the maximum number of stack levels (working backwards from the current stack frame context) to retrieve. On return, it will be set to the number of levels in the current stack. (If greater than the number you originally specified, it indicates that not all of the levels were returned.) csarray(1) (array of ST_CALLSTACK) [out] is the first element of an array of structures defined in ASHINC:CALLSTACK.DEF as follows: defstruct ST_CALLSTACK map2 calltype,b,2 ! type of call (see CSTF_xxx) map2 src'lno,b,2 ! line # at or prior to call map2 src'loc,b,4 ! location counter at call map2 dst'loc,b,4 ! target location (for call, fn, proc) map2 dst'name,s,52 ! name of sbx or AMOS command line endstruct Typically csarray() would be defined via: dimx callstack(MAX_CALLSTACK), ST_CALLSTACK (MAX_CALLSTACK should be set to the maximum # of levels you want to retrieve.) program$ (string) [out] optionally returns the main program at the top of the callstack. Example: ++include ashinc:ashell.def ++include ashinc:callstack.bsi define MAX_CALLSTACK = 10 map1 misc map2 program$,s,10 map2 stackdepth,i,2 dimx callstack(MAX_CALLSTACK), ST_CALLSTACK stackdepth = MAX_CALLSTACK ! max # levels we can handle xcall MIAMEX, MX_CALLSTACK, stackdepth, callstack(1), program$ for i = 1 to stackdepth min MAX_CALLSTACK ? Fn'Call'Stack'Descr$(callstack(i)) next i The Fn'Call'Stack'Descr$() function referenced above is in the SOSLIB module ASHINC:CALLSTACK.BSI. It creates a one line description of a call (gosub, procedure, function, xcall, amos statement, etc.) from one location/context to another. An example showing a context six levels deep looks like this: from loc 3B7 call proc() @3DF from loc 38C fn'() @393 from loc 32B call proc() @331 from loc 4F1 xcall callstack1 from loc 47C fn'() @483 from loc 323 call proc() @41A Notes: - In the above example, the program had no line numbers, so they weren't listed in the output. - To match up the location counter values to source code lines, see the LSX file created by the compiler /L switch. - The entry in the array (shown at the top) describes the level that called the code that executed the MX_CALLBACK function. So in the above case, the current code is within a procedure that starts at location 3DF (hex) and was called from location 3B7. Location 3B7 is within a function that starts at location 393, which in turn was called from location 38C, etc. ============================================================================ A-Shell Release Notes Version 6.3.1537.1 (27 November 2016) ============================================================================ 1. XTREE bug fix: XTROP_REPLACE was resulting in some editable cell data anomalies after identical changes by the application to both the data and answer arrays. ============================================================================ A-Shell Release Notes Version 6.3.1537.0 (21 November 2016) ============================================================================ 1. XTREE enhancement: You can now define a footer, which is like a mirror of the header, i.e. a line which remains fixed (not affected by scrolling or by loading/updating of data or answer lines). To enable and configure the display of the footer line, two new fields have been added to the bottom of the XTRCTL parameter structure, which now ends like this: ... map2 XTR'CTLID,B,2 ! A-Shell ctl # map2 XTR'LEFTINDEX,B,1 ! Left-most visible column map2 XTR'SHOWFOOTER,B,1 ! Show footer map2 XTR'FOOTERSTYLE,b,1 ! same XTHSF_xxx flags as HEADERSTYLE (6.3.1537+) map2 XTR'UNUSED2,X,12 ! was 14 ! (total size = 128) To enable the display of the footer, set the SHOWFOOTER field to 1. The FOOTERSTYLE field can be used to adjust the attributes of the footer, using the same options as in the HEADERSTYLE field for the headers.` To define the display contents of each column in the footer, you can append a clause to the header field of the coldef. The footer clause must begin with a pair of colons (::) followed by a string of text which has follows the same syntax as for the header. For example, the following COLDEF excerpt defines a column starting in position 9, 12 characters wide, with "Qty" in the header and "Total Qty" in the footer... COLDEF += "9~12~Qty::Total Qty~#EX~~" In practice, you might want to replace the generic description "Total Qty" with the actual total for that column. To do that, you would need to sum the column in the application (initially, and/or after any changes to the column), and then the COLDEF string would have to be rebuilt with the updated footer definition, e.g. COLDEF += "9~12~Qty::Total: "+TOT'QTY using "#####"+"#EX~~" (The COLDEF for an existing tree can be updated by just passing the new COLDEF string in an XTROP_REPLACE or XTROP_RESELECT call.) You may also define font, scale, and color attributes using the following new Advanced Coldef Options: FooterFont= (same syntax as for HeaderFont) FooterScale= (same syntax as for HeaderScale) RGBbgFooter= (same syntax as for RGBbgTotals) RGBfgFooter= (same syntax as for RGBfgTotals) ============================================================================ A-Shell Release Notes Version 6.3.1536.3 (17 November 2016) ============================================================================ 1. Fix MBF_VCENTER with static controls (reverted to top-justification in 6.3.1535.0). 2. ASHNET.DLL 1.8.154 refinement: the properties options introduced in 1.8.153 now apply to the HTTPF_REQGET ("simple get") operation as well as the other operations/modes. (Previously they were ignored for the simple get.) Also, the default timeout parameters (30 seconds on connection, 75 on read) now apply to the HTTPF_REQGET operation even if properties are not explicitly specified. Previously the timeouts were indeterminate, but definitely shorter than the new defaults. 3. ATHTTP.SBX 1.2(106) removes the 256 byte limit on the length of the returned response string. The new theoretical limit is 500K, although there may be other effective limitations based on resources, timing, etc. ============================================================================ A-Shell Release Notes Version 6.3.1536.2 (16 November 2016) ============================================================================ 1. Fix XTREE bug related to use of a date picker control for editing a cell within an XTF_SPLIT tree. If the column had to be enlarged to fit the date picker, the resulting layout was a bit crazy. (Same as 6.2.1428.8) ============================================================================ A-Shell Release Notes Version 6.3.1536.1 (16 November 2016) ============================================================================ 1. XTREE performance optimization: updating the answer array on exit from an editing session is now considerably faster than before. In most cases, this may not be obvious because it was already fast. But there were some cases, in particular large XTF_SPLIT trees with an editable expand/collapse state column (=UH) were the speed up is quite noticeable (from a few seconds down to a few milliseconds). ============================================================================ A-Shell Release Notes Version 6.3.1536.0 (15 November 2016) ============================================================================ 1. ASHNET.DLL 1.8.153 - relink with updated SSL, SFTP and HTTP libraries to incorporate many minor bug fixes and improvements in the underlying libraries over the last 11 months. (The DLL is backwards compatible to A-Shell and ATE 6.2) 2. HTTP.SBX enhancement: rename the Certfile parameter to Properties and revise its meaning/interpretation to: Properties (string) [in] An optional list of name=value clauses delimited by semicolons, e.g.: name1=value;name2=value2,value3;...;nameN=valueM To maintain backwards compatibility, if there is no "=" character in the string, it will be intepreted as the Certfile spec (as before), although this syntax is now deprecated (replaced with the Cert=fspec clause). The current list of property names and values is shown below. Note that the property names are case sensitive, but the values are not. For boolean values, anything starting with "T" or "1" is considered TRUE; everything else is considered false. (Note the default values for the case where the property is not specified.) Name=value Default Description (* = see Comments) ------------------ ------- --------------------------------------- Cert= none Specify cert file spec AllowHeaderFolding True Disables MIME header folding BasicAuth False Allows HTTP basic authentication * RequiresSslCertVerify False If true, verify server's SSL cert; if expired or invalid, abort connection. SslAllowedCiphers Specify comma-delimited list of allowed SSL/TLS ciphers * AutoAddHostHeader False If true, the "Host" header will be added to the request header for XHTTPF_REQGET MimicFireFox False If true, headers are added to XHTTPF_REQGET calls to mimic those used by FireFox MimicIE False If true, headers are added XHTTPF_REQGET to mimic those used by Internet Explorer ReadTimeout 75 Time in seconds to wait while reading the response from the server before timing out. ConnectTimeout 30 Time in seconds to wait for the connection to be established before timing out Comments (*) BasicAuth: Basic Authentication is one of many types of HTTP authentication, but it is often considered a security risk because the name and password are transmitted in plain text. For an SSL/TSL connection, this may be ok, but in any case, the default is set to False just to err on the safe side. SslAllowedCiphers: To limit SSL/TLS connections to a more specific set of possible ciphers, specify one or more of the following (comma-delimited). You may also use the special value "best-practices" to request "current best practices". Currently this means the following, but may evolve over time: - Any RSA keys must be 1024 bits or more - All renegotiations must be secure - All ciphers using RC4, DES or 3DES are disallowed Available Ciphers ------------------------------- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 TLS_DHE_RSA_WITH_AES_256_CBC_SHA TLS_RSA_WITH_AES_256_CBC_SHA256 TLS_RSA_WITH_AES_256_GCM_SHA384 TLS_RSA_WITH_AES_256_CBC_SHA TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 TLS_DHE_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_128_GCM_SHA256 TLS_RSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA TLS_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_RSA_WITH_RC4_128_SHA TLS_RSA_WITH_RC4_128_SHA TLS_RSA_WITH_RC4_128_MD5 TLS_DHE_RSA_WITH_DES_CBC_SHA TLS_RSA_WITH_DES_CBC_SHA 3. ATHTTP.SBX 1.2(105) adds support for the HTTP Properties parameter (see above), and also for the Certpw parameter. 4. Fix bug (introduced in 6.3.1524) which resulted in spurious error #13 (file already open) errors in certain sequences where a file channel is closed and then reopened. 5. XTREE performance optimization related to the return of editable cell data from tree to application. Particularly in the case of XTF_SPLIT, the improvement could amount to seconds for very large trees. ============================================================================ A-Shell Release Notes Version 6.3.1535.3 (11 November 2016) ============================================================================ 1. Fix intermittent crash in CGIUTL opcode 6 (CGIOP_MRGFIL). (Same patch as in 6.2.1428.7) ============================================================================ A-Shell Release Notes Version 6.3.1535.2 (09 November 2016) ============================================================================ 1. Eliminate spurious runtime error when passing .NULL to a function param expecting an array passed by reference. (Note that the way to test for this within the function is to check if .EXTENT($ARY()) < 0.) 2. Compiler bug fix (edit 791) - certain obscure syntax errors were putting the compiler into an infinite loop. 3. (ATE) - Remove the text message "remote connection has been terminated by host/user". It had become either superseded by the dialog, or superfluous. ============================================================================ A-Shell Release Notes Version 6.3.1535.1 (06 November 2016) ============================================================================ 1. Replace old acorn and ate icons with the newer A-Shell and ATE icons. (For various reasons, the old versions were hanging around and resurfacing when they should have been replaced long ago.) 2. Update start.cmd[901,2] and ashupd.lit to reference new Bitbucket repository rather than the outdated SOSLIB update package. ============================================================================ A-Shell Release Notes Version 6.3.1535.0 (03 November 2016) ============================================================================ 1. ATE enhancement: add checkbox option to login panel of configuration dialog (atecfx.sbx 4.4(176)) to force the login dialog to be called prior to the connection attempt. This addresses two situations in particular: - the case where you want to display your custom login dialog prior to connection even when the login name and password appear to be already set. - the ATSD case where ATE cannot rely on standard login status information (or the existence of a name and/or password) to determine if the login dialog needs to be displayed. Previously (prior to 6.3.1516) the login dialog was only called after a login failure. Starting in 6.3.1516, it was called prior to the first connection attempt if either the name or password field was blank. Now it is called for the following conditions: 1) the Login Dialog option is checked; 2) the name and/or password is set to "[INIT]"; 3) under UNIX, the login credentials passed to the server are rejected. 2. AUI_CONTROL refinement: static text controls with BGC=NUL_BGC (-2) now inherit the background color of a parent TABX panel even when using MBF2_CUSTDRAW or MBF_VCENTER. ============================================================================ A-Shell Release Notes Version 6.3.1534.2 (02 November 2016) ============================================================================ 1. Compiler refinement (edit 790) - use of .ARGCNT within a PRIVATE_BEGIN / PRIVATE_END block now generates a compile error. Although the expression wouldn't technically be illegal, because the PRIVATE block is essentially called for initialization by whatever function or procedure in the module gets called first, there's really no good way to predict in advance what the .ARGCNT value will represent, and thus it is almost certain to create a discrepancy between the expected and actual behavior. 2. DIR.LIT 3.3(160) enhancement: new /MEMREQ switch displays the memory required for static variable storage (for programs such as LIT, RUN and SBX files) in place of the file size. When both /SSIZE (sort on file size) and /MEMREQ are specified, it also sorts based on the memory requirement. Note that the value displayed by /MEMREQ is only a total for the combined sizes of the fixed variables in the program. While this is far short of of the total operating system memory used by the program (which includes dynamic variable, stack and other auxiliary memory allocations), it is a good measure of how large your job memory partition needs to be. (This is particularly true since 6.3.1518 when the string stack was moved to dynamic memory.) A reasonable rule of thumb would be to set your partition size to 300-500K larger than the largest /MEMREQ value for your application. (Use DIR /MEMREQ/SSIZE to find the largest values; don't forget to also check the LIT files in SYS: since some of them may have large requirements.) 3. QUTL.LIT 3.1(129) refinement: remove previous maximum of 20000 FLOCK or XLOCK records and reduce the fixed partition memory requirement from approximately 700K to 200K by using dynamic arrays. 4. HOST.LIT 2.0(106) refinement: reduce minimum partition memory requirement from about 265K to 3K and increase the maximum output capture buffer size (when using /O) from 256K to 512K. Note that the total memory requirement when using /O has actually increased rather than decreased, but it is only required when using /O and in that case it is dynamically allocated outside the memory partition. ============================================================================ A-Shell Release Notes Version 6.3.1534.1 (28 October 2016) ============================================================================ 1. ATE refinement: remove previous limit of 1K on length of string returned by AG_XFUNCS. ============================================================================ A-Shell Release Notes Version 6.3.1534.0 (27 October 2016) ============================================================================ 1. Enhancements to EDIT$(expr,flags) function: - Add new flags &h0040 (unquote) and &h0080 (exempt quoted characters). - Define symbols (in ashell.def) for the various EDIT$ flags: EDITF_SPTB &h0002 remove spaces and tabs EDITF_CTLS &h0004 remove chr(127) & chr(0)-chr(31) except TAB EDITF_SPTBL &h0008 remove leading spaces and tabs EDITF_SPTB1 &h0010 shrink spaces & tabs to one space EDITF_SPTBR &h0020 remove trailing spaces and tabs EDITF_UNQT &h0040 unquote (and reduce "" to ") * EDITF_EXQT &h0080 limits action to outside matched quotes ** Notes: * EDITF_UNQT performs two operations: 1) if the first and last character, after any other processing (such as removal of leading/trailing spaces and tabs), are both double quotes ("), then are removed. 2) Any remaining double double-quotes ("") which are not preceded by a single double-quote are reduced to a single double-quote ("), unless the string has been reduced to a single pair of double double-quotes (""). ** Exemption for quoted strings allows for multiple quoted subsections. This works well with JSON documents, which may contain many individually quoted strings, yet it may be convenient to remove all the whitespace not within those quoted strings. For example: S$ After EDIT$(S$,EDITF_SPTB+EDITF_EXQT) --------------------- ------------------------------------------ "name" : "v1 v2" "name":"v1 v2" "name" : v1 v2 "name":v1v2 "name : v1 v2" ] "name : v1 v2"] "6"" ruler" "6"" ruler" S$ After EDIT$(S$,EDITF_UNQT) --------------------- ------------------------------------------ "6"" ruler" 6" ruler "6"" ruler":$1.99 "6"" ruler":$1.99 In the last example above, the outer quotes were not removed because they didn't completely enclose the string, and the "" was not reduced to " because it followed a " character. 2. XTREE bug fix: when using XTROP_CREATE to replace an existing tree, not all attributes of the original column definitions were being reset. This was resulting in some oddities where a column in the new tree might retain some attributes from the corresponding column in the old tree. ============================================================================ A-Shell Release Notes Version 6.3.1533.2 (25 October 2016) ============================================================================ 1. Compiler bug fix (edit 789): revise compiler edit 763 so that it only uses the 48 bit integer format for large numeric literals that are either explicitly tagged with the "L" suffix or with the hex (&h) or octal (&o) prefix. Previously it was using the new format for large numeric literals expressed in exponential or decimal notation, which was causing unexpected backwards compatibility problems when compiling under 6.3 and running under 6.2. ============================================================================ A-Shell Release Notes Version 6.3.1533.1 (21 October 2016) ============================================================================ 1. Compiler bug fix (edit 788): fix conflicts between /PX, ++IFLBL, and PRIVATE function declarations. /PX was removing functions that were only called within ++IFLBL blocks testing for the existence of the function. And ++IFLBL was not seeing PRIVATE function labels. 2. Runtime bug fix: close a loophole in the space() function whereby it could cause an invalid memory reference if the first space(x) call was with x=0. (This was noticed in VUE on an initial ^B command; problem introduced in 1532.0.) ============================================================================ A-Shell Release Notes Version 6.3.1533.0 (21 October 2016) ============================================================================ 1. Language enhancement: .SPLICE statement now allows an optional 4th parameter to specify the splice position in the destination array: .SPLICE $dst(), $src(), count, dstpos where dstpos may be: -1 (default) indicates end of the $dst() array 0 indicates the start of the $dst() array n (n > 0) indicates after the nth item in $dst() array Note that this option only applies when the destination parameter is expressed as a base array, as in the above example. Attempting to specify the dstpos parameter when the first parameter is an iterator or other individual element reference will result in a syntax error. For example, if $kids() contains the list: "john", "fred", "sally", "pilar" and $pets() contains the list: "dog", "cat", "mouse", "lizard" then: .SPLICE $kids(), $pets(), 1, 0 would splice "dog" to the start of the $kids() array. .SPLICE $kids(), $pets(), 3, 2 would splice the first 3 pets ("dog", "cat", "mouse") after the 2nd kid, i.e. in between "fred" and "sally". .SPLICE $kids(), $pets(), 0, -1 would be the same as .SPLICE $kids(), $pets() i.e. would splice all of the pets (count=0), to the end of the kids (-1). .SPLICE $kids(), $pets(), 0, 0 would splice all of the pets to the start of the kids array. 2. Language enhancement: .SORT $mlist() now implemented: .SORT $kids() Sorts according to the collating sequence (just as the ordered map does). ============================================================================ A-Shell Release Notes Version 6.3.1532.6 (20 October 2016) ============================================================================ 1. Compiler bug fix/refinement to .SPLICE statement: 3rd argument (count) can now be any numeric expression; previously only a variable was allowed. (This was an unnecessary compiler restriction, there was no such limitation in the runtime system.) 2. Runtime refinement: the .splice statement now accepts limited use of a reverse iterator, but only when the count is 1. ============================================================================ A-Shell Release Notes Version 6.3.1532.5 (20 October 2016) ============================================================================ 1. Close memory handle leak which was causing a memory handle to be used up whenever an INPUT operation within an SBX required more than 4K bytes. (Same fix as 6.2.1428.3) ============================================================================ A-Shell Release Notes Version 6.3.1532.4 (19 October 2016) ============================================================================ 1. Windows bug fix: closing a sequential file that had been associated with a socket via MX_FILESOCK (see 1524 below) was sometimes crashing the session. 2. Fix bug causing corruption of the memory handle table during SBX calls involving collections and/or recursion. (Introduced in 1532.0.) ============================================================================ A-Shell Release Notes Version 6.3.1532.3 (13 October 2016) ============================================================================ 1. Compiler bug fix/refinement (edit 785) - an array received by reference in a function definition may now be given a default value of .NULL in order to make the parameter optional (consistent with indirect functions). (Note that prior to edit 765 the compiler allowed a default value of "".) ============================================================================ A-Shell Release Notes Version 6.3.1532.2 (12 October 2016) ============================================================================ 1. Compiler bug fix (edit 784) - ++PRAGMA GLOBAL_BEGIN crashing compiler if /PX switch used. ============================================================================ A-Shell Release Notes Version 6.3.1532.1 (10 October 2016) ============================================================================ 1. Close loophole allowing corruption of the string stack when processing a very large string constant in an expression. 2. Compiler bug fix (edit 783) - /px switch was conflicting with Private routines (in some cases removing them from the RUN even if they were being called.) 3. Standalone compiler bug fix: edit 783 of the standalone compiler includes two additional fixes/updates: a) The -px switch is now recognized. Previously it was being treated the same as -p (which avoided the problem with Private functions) but also failed to deliver the "tree-shaking" (unused routine removal) benefits. b) The -igoo (treat all ++include as ++include'once) switch now supported. 4. COMPIL.LIT / COMPLP.LIT 1.1(133) update: /IGOO switch now recognized. (This was actually implemented in the internal compiler 779 update when the INCLUDE_GLOBAL_ONCE_ONLY pragma was added.) 5. ATE refinement: the FTP transfer protocol and ports now default based on the terminal transport protocol and port if the "Link to Transport Settings" option is set. (This is mainly for the benefit of the ATE Web Connect protocol where it is easy, and possibly desirable, to not specify such settings.) ============================================================================ A-Shell Release Notes Version 6.3.1532.0 (08 October 2016) ============================================================================ 1. Runtime enhancement: Remove limit on memory handles (previously 500) to to support very large MLIST structures (which use a lot of memory handles). 2. Improvements to webcaching of DLLs - webcache option can now be enabled after a failed attempt to load the XTREE or XTEXT dll. (Previously XTREE and XTEXT gave up after the first failed attempt so wouldn't benefit from activating webcache and retrying.) A-Shell test web repository (http://www.microsabio.net/testrepo) now contains copies of the various DLLs that can be web-loaded. 3. Add CMD:TESTCACHE.CMD as a convenience to make it easy to test the webcache. Contains the commands: SET WEBCACHE REPO http://www.microsabio.net/testrepo SET WEBCACHE ENABLE,ALL,ATE 4. Add missing SftTree_IX86_U_75.dll to distribution. 5. Update check-for-updates module (was reporting availability of 6.2 version on first try before updating itself.) ============================================================================ A-Shell Release Notes Version 6.3.1531.0 (05 October 2016) ============================================================================ 1. A-Shell/Windows runtime enhancement: Webcache feature now supports most A-Shell/Windows DLLs. These are downloaded to the A-Shell executable directory if it is writeable; otherwise they are downloaded to the webcache directory. 2. SET.LIT 1.2(158) adds new flags DLL, ALL, and ATE. DLL flag causes A-Shell to attempt web download of missing DLLs from repository; if possible, it downloads them directly into the executable directory, else into the webcache directory. .SET WEBCACHE ENABLE,DLL ALL flag sets all options (but not ENABLE itself), equivalent to PROG, OPENI,LOOKUP,DLL (and any others to come). .SET WEBCACHE ENABLE,ALL ATE pseudo-flag tells SET to pass the webcache flags and repo info to the ATE client. Note that if you want to assign different options and/or repository directory to ATE, use the following sequence: .SET WEBCACHE REPO .SET WEBCACHE ENABLE,,ATE ! forward options & repo to ATE .SET WEBCACHE REPO .SET WEBCACHE ENABLE, ! set server options only 3. The following flags has been added to ashell.def for MX_WEBCACHE: WCDF_DLL &h00000010 download DLLs to bin or webcache WCFG_ALL &h000000FE all flags (except WCDF_ENABLE) 4. New AG_WEBCACHE (108) command to get/set webcache options from host: ? tab(-10,AG_WEBCACHE);op{,flags{,url}};chr(127); op is 0 to retrieve and 1 to set. On retrieval, the returned string will contain "flags,url" (current webcache flags and repo url). flags is a decimal number containing the WCDF_xxx flags url, if specified, is the web directory for the repository. For example: ? tab(-10,AG_WEBCACHE);"1,";(WCDF_ENABLE or WCDF_ALL); & ",http://www.myrepo.com/app1";chr(127); ! enable;set repo ? tab(-10,AG_WEBCACHE);"1,0";chr(127); ! disable ? tab(-10,AG_WEBCACHE);"0";chr(127); ! retrieve ? tab(-10,AG_WEBCACHE);chr(127); ! same (retrieve) input line, response$ ! input flags,url 5. Important bug fix: assignment to DIMX type B or type I array elements using INPUT, READ, or XGETARG{S}, wasn't working properly due to a failure to pick up the correct element size from the descriptor of the array (which differs between static and DIMX arrays). This was a very longstanding problem (may go back to the original implementation of DIMX arrays), but was easily overlooked until 6.3.1516 when the B6 and I6 variables were introduced, because prior to that, the destination variable size was defaulting to 4 bytes when not set to another valid size. For the B2 and I2 cases, this would have assigned the correct value but also overwritten the next 2 bytes in memory (i.e. the next element in the array). Since 6.3.1516, it was doing nothing (i.e. resulting in a received value of zero). 6. ZTXFER 1.4(108) now supports /ATE switch to force alternative transfer protocol (i.e. using ATE terminal channel). This was already automatic for transfers between an ATE client and a Windows server, but now can be forced in other situations. (For example, under UNIX, FTP/SFTP transfers may be blocked by some security or other obstacle, while the ATE terminal channel would work.) ============================================================================ A-Shell Release Notes Version 6.3.1530.1 (05 October 2016) ============================================================================ 1. Important bug fix: using XFUNC$() in a string expression was corrupting the string stack, resulting in somewhat unpredictable string results. (Problem introduced with the auto-expanding string stack in 6.3.1518) 2. ATE refinements related to use of the ashell-ate: URL scheme to launch ATE from a web page. These include: - The MIAME environment variable is now always set to match the location of the miame.ini file. (This is virtually always the case anyway, except that when launched from a URL link, visibility restrictions on the environment between Windows and the browser were resulting in it reverting to C:\VM\MIAME.) - The Cache and PermCache directories now default to %MIAME%\Cache and %MIAME%\PermCache, respectively, if not set. (This was a potential issue when building a minimal configuration on the fly from the URL.) - When building the ATE configuration on the fly, you can define pseudo configuration values LoginSBX= and WebRepo= to cause ATE to check the web repository for the custom login dialog. ============================================================================ A-Shell Release Notes Version 6.3.1530.0 (04 October 2016) ============================================================================ 1. Run-time enhancement: quoted native filespecs now supported with RUN, e.g. .RUN "/vm/miame/webcache/hello.run" 2. INSTR(spos,subject,pattern,flags) enhancement: two new flags implemented: INSTRF_ANY &h01000000 Treat pattern as set of characters; match first one that appears in subject. INSTRF_ANYQT &h02000000 Same as INSTRF_ANY but ignores characters in subject between matching quotes. Note that unlike all of the other INSTR() flags, these do not actually use the REGEX library. They are instead based on the standard C function strpbrk(). Example: PRINT INSTR(1, "DSK0:ABC.RUN /X", ";/ ", INSTRF_ANY) Of the three characters in the pattern (";/ "), the first to occur in the subject is the space at position 13. The above is equivalent to the REGEX character set pattern "[;/ ]"; it simply eliminates any doubts about REGEX syntax for special characters. But the INSTRF_ANYQT version is much harder to implement using REGEX. 3. New release of the DLL underlying XTREE (SftTree_IX86_U_75.DLL, previously SftTree_IX86_U_70.DLL) 4. XTREE enhancement: 3-state editable checkbox columns now support the extended mode (T3+) which adds the ability to check-all (^A), uncheck-all (^B) and undo (^Z). 5. XTREE enhancement: extended checkbox columns may now be extended to a second degree by adding a second "+" (e.g. T++ or T3++). This adds a 3-state checkbox to the header of the column which is automatically set to the checked state if all the boxes in the column are checked; the unchecked state if all the boxes are unchecked, or the indeterminate state if there is a mixture (or if all of the boxes are indeterminate). Clicking the checkbox in the header cycles through the check-all, uncheck-all, set-all-to-indeterminate (if 3-state), and back to the origional mixed state (if applicable). 6. XTREE enhancement: column ordering for all the columns (up to the max of 100) can now be saved when using the TreeID mechanism with the XTUCFG_COLORD bit set in the XTR'USRCFG field. Previously the limit was 31 columns, which remains the limit when using the XTR'COLORDER() array method without the TreeID option. ============================================================================ A-Shell Release Notes Version 6.3.1529.0 (30 September 2016) ============================================================================ 1. A-Shell runtime enhancement: auto cache/download of files from a web directory if not found in the local search path. Downloaded files are cached in the directory %MIAME%/webcache, which is checked first (as in a web browser) to avoid the overhead of unnecessary web accesses. The feature is referred to under the generic umbrella of "WEBCACHE" and may be enabled and configured via a new SET.LIT option and/or a new MIAMEX function (both described below). Option flags determine which types of files are subject to the feature. By default it applies to images and any other kind of file operation that currently supports automatic lookup in the cache and permcache directories. Additional file/type options: PROG - programs (RUN, LIT, SBX) OPENI - files being opened for sequential input LOOKUP - files reference by LOOKUP statement or XCALL SIZE Currently only a single web directory (at a time) is supported, although it is conceivable that multiple directories and/or trees may be implemented in the future. The webcache directory, like the permcache directory, is not auto-cleared at the end of the session. But like a typical web browser cache, it can be cleared with a command. Individual files or files matching a pattern can also be cleared. Also, as with a typical web browser, the existence of a file in the cache short-circuits any web lookup for that file; there is no automatic comparison of file sizes or dates between the cached copy and the web copy (because this would completely undermine the performance benefit of the cache). So you have to clear the cache in order to get a refreshed copy from the web repository. 2. SET.LIT 1.2(157) now supports options to enable/disable, clear, and otherwise configure webcache feature: .SET WEBCACHE ! display current webcache settings .SET WEBCACHE ? ! display usage information .SET WEBCACHE ENABLE ! enable .SET WEBCACHE DISABLE ! disable .SET WEBCACHE CLEAR ! erase all files in local webcache .SET WEBCACHE REFRESH ! remove files from cache matching spec .SET WEBCACHE REPO ! set the web repository directory .SET WEBCACHE ! set options... options: PROG - activate webcache for programs (RUN, LIT, SBX) OPENI - activate webcache for sequential input file opens LOOKUP - activate webcache for LOOKUP operations 3. New MIAMEX MX_WEBCACHE (188) function to related to the web cache feature: xcall MIAMEX, MX_WEBCACHE, opcode, status, ... xcall MIAMEX, MX_WEBCACHE, 0, status xcall MIAMEX, MX_WEBCACHE, 1, status xcall MIAMEX, MX_WEBCACHE, 2, status, url$ xcall MIAMEX, MX_WEBCACHE, 3, status, url$ xcall MIAMEX, MX_WEBCACHE, 4, status, url$, localfile$ xcall MIAMEX, MX_WEBCACHE, 5, status {,wildspec$} opcode (num) [in] Determines operation (see below). status (signed int) [in/out] Sets or returns options, or returns status codes (see below). url$ (string) [in] Specifies a web directory for ocodes 2 and 3, and a fully qualified file URL for opcode 4. Currently the only URL schemes supported are http:// and https://. An optional :port may be appended to the end. Examples: http://www.mysite.com/webrepo http://www.mysite.com/webrepo/myfile.run:10080 https://www.mysite.com/my web repository Opcode 0 retrieves the current webcache options in status. Status flags (defined in ashell.def) : WCDF_ENABLED &h00000001 web cache enabled (else disabled) WCDF_PROG &h00000002 download/cache programs (RUN,LIT,SBX) WCDF_OPENI &h00000004 download/cache files on open for input WCDF_LOOKUP &h00000008 download/cache any file on LOOKUP or SIZE.SBR Opcode 1 sets the webcache options to the value status. Opcode 2 and 3 retrieve and set webcache url (web directory), respectively. Status will return 0 for success. Opcode 4 performs a manual download from the specified url$ to the specified localfile$. If the url$ is just a file.ext and the webcache url directory has been previously set, then the two are combined to form the complete source url. If localfile$ is "", the source file.ext is used. If the localfile$ does not contain a directory, then the local webcache directory (%MIAME%\webcache) is used. Returned Status will equal the # of bytes downloaded if successful, else an error code: Status Meaning -1 Unsupported URL scheme (e.g. not http:// or https://) -2 Specified URL does not contain filename (Opcode 2) -3 URL too long -4 Unable to connect to host web server -5 Error sending HTTP GET command to server -6 Error in local webcache directory\file spec -7 Response from web server missing header terminator -8 Response from web server not recognizable -9 Transmission problem receiving header -### HTTP response error code (converted to negative) Opcode 5 clears the local webcache directory. If the wildspec$ parameter is specified and non-blank, only those files matching the wildspec$ will be cleared; otherwise all of the files in the cache will be cleared. Returned status will equal the number of files removed from the cache. 4. New LIT command: .WEBRUN url {args} Front-end to RUN.LIT which downloads the specified program from the url into the webcache directory and then runs it, passing any {args} to it. If the url contains spaces, it must be quoted, and if any {args} are specified, there must be at least one space between the url and the {args}. If the url filename has no extension, .run is assumed. It also enables the webcache feature and all options (equivalent to SET WEBCACHE ENABLE,PROG,OPENI,LOOKUP) and sets the default URL based on URL given (minus the filename). NOTE: this command also bypasses the normal search path, i.e. will ignore a copy of the target program in the current [p,pn], [p,0] or [7,6] directories. Examples: .WEBRUN http://www.mysite.com/app1/myprog Enables all webcache options; sets the repo to http://www.mysite.com/app1, checks local webcache for myprog.run; if not there, tries to download it from the URL. Finally, tries to execute it from the webcache dir. .WEBRUN "http://www.another site/app2/prog2.run" /demo Similar to previous example except that it also passes the command line switch "/demo" to the target program prog2.run. ============================================================================ A-Shell Release Notes Version 6.3.1528.1 (27 September 2016) ============================================================================ 1. Compiler bug fixes (edits 780 and 781) fix misc parsing problems related to passing/receiving $$i.sublist, ordmap, and ordmapm arrays. 2. Runtime bug fix: passing an iterator value to a function was generating a bogus parameter type mismatch error (introduced in 1528). 3. Refinements to the MLIST .SPLICE operations. ============================================================================ A-Shell Release Notes Version 6.3.1528.0 (20 September 2016) ============================================================================ 1. Language enhancement (compiler edit 776) - indirect function calls. A reference to a function or procedure may now be passed as an argument to another function or procedure. This is an advanced technique that is mainly useful in multi-level (often recursive) algorithms consisting of a generic intermediate layer and a specific lower layer which may need to be customized for each particular problem. The indirect function call technique allows you to effectively customize the generic intermediate routine without actually having to modify it. (Instead, you pass your custom routine to it, which it then calls indirectly to do the parts of the algorithm which you want to customize.) The custom routine in this scenario is sometimes referred to as a "callback routine", since the idea is for the generic intermediate routine to call your routine back to perform the part of the algorithm requiring customization. For example, when parsing an XML file, you may want to employ a generic routine to walk the tree, but a custom routine to process nodes that meet some criteria. Because of the recursive nature of the routine to walk the tree, it is difficult for it to exit back to your application each time it hits one of the target nodes, without losing its position and ability to continue to the next node. The solution is to design the generic routine to accept a callback routine to be called for each target node. Each application can then use the generic routine in a different way by passing a different callback routine to it. The scheme consists of three parts: a. The callback routine. This is a normal function or procedure. b. The generic/intermediate routine, which receives the callback reference and makes calls to the callback routine. In this routine, the parameter to receive the indirect/callback reference must be defined as follows: Procedure Foo( ..., @fn'cb() as lblref, ... ) For functions, the formal name must follow the standard naming rules, i.e. start with "Fn'" and end with $ if the functions returns a string value. In all cases it must start with "@", and end with the "as lblref" clause. An empty pair of parentheses, as in the example above, is optional. (Parameters to be passed to the indirect routine are not specified in the declaration.) Beyond that, the name may be anything, for example: @fn'callback as lblref @FN'PROC$ AS LBLREF @Fn'Custom$() as lblref @myproc() as lblref The above parameter declarations would apply to a numeric function, two string functions, and a procedure, in that order. Inside the intermediate routine, you can call the callback routine using the name specified in the declaration. For example: call fn'cb(arg1,...) ! call actual callback with actual args Note: unlike nearly all other formal parameter types, lblref parameters default to .NULL rather than "" if the caller does not supply the actual parameter. This allows you to test whether the function reference was supplied, e.g. if .ISNULL(fn'cb) then ! if myproc not passed call my'default'proc(...) ! use a default routine else call fn'cb(...) ! else call the passed routine endif Within the intermediate routine, if you need to pass the callback routine indirectly again to another routine, or recursively to yourself, then retain the @ prefix, e.g. Procedure Foo(..., @fn'cb() as lblref, ...) ! intermediate rtn ... call Foo(...,, @fn'cb(), ...) ! pass callback again indirectly ... endprocedure c. The call to the generic/intermediate routine, in which you pass the reference to your callback routine as a parameter. Here you must precede the actual callback routine name with "@" and use an empty set of parens, e.g. Function Fn'Bar(...) ! actual callback routine ... Endfunction ... call Foo(...,@Fn'Bar(), ...) ! passing callback to intermediate Foo() Note: if you fail to specify the "@" prefix when passing the callback routine to the intemediate routine, it will still be syntactically and semantically legal, but the result will be completely different. To clarify, consider the following two examples: call Foo(Fn'Bar()) call Foo(@Fn'Bar()) In the first call, the function Fn'Bar() is evaluated first and its return value is passed to the procedure Foo(). In the second call, a reference to the Fn'Bar() function is passed indirectly to the procedure Foo(), which will then be able to call that function without knowing its real name. EXAMPLE The following example illustrates the scheme using a generic intermediate SOSLIB routine Fn'Dir'Scan() which scans a directory tree recursively looking for files whose names match a pattern. For each file that matches, it calls your custom routine with the filespec so that you can perform some processing on it. By using the callback technique, the generic recursive directory scanning logic can be re-used without modification in many different applications; the customized callback routine allows each application to process the files differently. Function Fn'Dir'Scan(dir$ as s260, wild$ as s100, & @procfile() as lblref) as i4 do file$ = if Fn'Dir'Scan += 1 ! count matching files call procfile(entry$) ! callback routine for file elseif count += Fn'ProcDir(file$, wild$, @profile()) ! recursion endif loop until EndFunction To use the Fn'Dir'Scan routine, we need to define our callback routine and pass it by reference to the Fn'Dir'Scan routine. For a simple example, here's a callback routine that just prints the file name... Procedure Show'File'Info(fspec$ as s260:inputonly) print fspec$ EndProcedure Now we can use the generic Fn'Dir'Scan() function to print the names of the .bp files in all of the subdirectories of c:\vm as follows... count = Fn'Dir'Scan("c:\vm", ".bp", @Show'File'Info()) Later in the same app we might want to copy all the matching files to a backup directory. We can use the same Fn'Dir'Scan() routine, but supply a different callback function... Procedure Backup'File(fspec$ as s260:inputonly) xcall MIAMEX, MX_COPYFILE, fspec$, ... EndProcedure ... count = Fn'Dir'Scan("c:\vm", "*.bp", @Backup'File()) 2. Compiler enhancement (edit 777) - new pragmas: ++PRAGMA ASHELL_EXTENSIONS ++PRAGMA PRE_PROCESS ++PRAGMA EXTENDED_PRE_PROCESS Each of above enables/disables the switches /X:2, /P, and /PX respectively. The argument is optional and defaults to "TRUE". Note that each of the above must be placed before any other code, except for comments, ++pragmas, ++IFxxx conditionals, and the PROGRAM statement. Also note that this change sets the default for all pragmas accepting a argument to "TRUE". (Previously some of them required an explicit argument while others did not.) So for example, the following two are now equivalent: ++pragma ERROR_IF_NOT_MAPPED ++pragma ERROR_IF_NOT_MAPPED "TRUE" (Previously, the first one would have triggered an invalid argument error.) 3. Compiler enhancement (edit 778) - new auto-defined macros: ABC_CURRENT_ROUTINE$ ABC_CURRENT_MODULE$ These equate to the current function/procedure name (or "" if none), and the current module filename (file.ext). Both may be useful in standardized error reporting. 4. Compiler enhancement (edit 779) - new pragma: ++pragma INCLUDE_GLOBAL_ONCE_ONLY When enabled, ++include is treated as ++include'once, except when it occurs inside a function or procedure. (In such cases, it is likely that you are intentionally including an extra copy of some map statements.) ============================================================================ A-Shell Release Notes Version 6.3.1527.0 (14 September 2016) ============================================================================ 1. AG_WALLPAPER enhancement: A new dlgid parameter on the command allows wallpaper to be applied to dialogs: ? TAB(-10,AG_WALLPAPER);imagespec${,flags{,dlgid}};chr(127); For dialogs, flags must be 0. (The only valid operation is to set the wallpaper to the dialog; it is destroyed when the dialog is deleted.) But unlike the case with main window wallpaper, for dialogs, the imagespec$ can be any image type recognized by AUI_CONTROL. (JPG is probably the best option here.) The dlgid parameter may either be the numeric or alphanumeric identifier for the dialog. If dlgid zero or omitted, the command works on the main window as before. Note: in most cases, you will want to create the dialog with the BGC parameter set to RGB_TRANSPARENT, else the background of static text controls will cover that portion of the wallpaper. 2. AUI_CONTROL bug fix: Using CTLOP_CHG to change the text associated with a control (including the image spec) was truncating the internally stored text for longer text strings. This would typically only become apparent after later manipulations were performed on the control, such as resizing it. (Same patch as 1428.1) 3. AUI_CONTROL bug fix: MBF2_STICKY was leaving 1 pixel between the right edge of some controls and the border of the parent. 4. ATE Enhancement: the -atecfg command line switch used to pass the configuration name to ATE now supports a compound argument up to 1024 bytes long which can be used with the ashell-ate custom URL scheme to pass an ad-hoc configuration as a set of value=attrib pairs. (Details of this feature will be documented later.) 5. TELNET.LIT 2.2(146) enhancement to support the new ashell-ate custom URL scheme. Details to follow. 6. Language enhancement (compiler edit 774) : New built-in system dot function: .INSTRR(spos,string,pattern) .INSTRR() is similar to INSTR() except it searches in reverse, e.g. it searches the string for the pattern, starting at the specified spos and working backwards towards the beginning of the string. The return value is the position of the last match (i.e. first match working backwards), with 1 indicating the 1st character of the string and 0 indicating no match. Unlike INSTR(), .INSTRR() supports both positive and negative starting positions, with negative values counting from the end of the string (e.g. -1 starts the search at the end of the string). However the return value is always >= 0 (i.e. position starting from the beginning of the string). Also unlike INSTR(), .INSTRR() does not support the 4th argument used for regular expression searches. 7. ATE refinement: The disconnected message box no longer displays when the disconnect was triggered by the menu disconnect option. ============================================================================ A-Shell Release Notes Version 6.3.1526.0 (10 September 2016) ============================================================================ 1. New MIAME.INI trace option: TRACE=JOBLCK causes all unresolved lock/unlock operations on the jobtbl.sys file to be traced in the file jobtbl.lck. The intent here is to make it easier to debug and resolve a rogue condition whereby a process has a lock on jobtbl.sys preventing other users from getting in or out of A-Shell. (Under Linux you can use the lslk utility to see who has a lock on the file, but under AIX this appears to be nearly impossible, and under Windows it may be difficult.) The jobtbl.lck file is created in the same directory as jobtbl.sys, and consists of human readable ASCII text lines in the following format: pid,op,recno where pid is the process id, op is either "lock" or "unlock", and recno is 0 for the jobtbl header, else a number indicating the jobtbl record for that job number. For example: 2415,lock,5 3723,lock,15 2415,unlock,5 3724,unlock,15 The above case indicates the following chronology: - process 2415 locked the jobtbl record for job #5 - process 3723 locked the jobtbl record for job #15 - process 2415 unlocked the jobtbl record for job #5 - process 3723 unlocked the jobtbl record for job #15 Since at this point the locks and unlocks match, on the next operation, the file will be truncated and started over again. If the option is enabled and you get a "unable to access JOBTBL.SYS" error, you can then display this file to hopefully identify which processes have locks on the file and can then investigate or kill those processes. Note: a stripped-down version of this feature was added to 6.2.1428.0. 2. SET.LIT 1.2(156) updated to support TRACE flags JOBLCK and EXEC (added in 6.3.1518.0) 3. MIAMEX functions MX_GETTRACE and MX_SETTRACE updated to support the TROP_JOBLCK (&h000100000000) TRACE flag. Note that this bit is beyond the 32 bit range of the typical 32 bit flags word, so you need to use B5, B6, I6, or F6/F8 to retrieve or set this bit. 4. Language enhancement (compiler edit 773) : New built-in system functions: IFELSE(cond,expr1,expr2) IFELSE$(cond,expr1,expr2) Each takes a conditional expression (cond) and two value expressions (expr1 and expr2). If the conditional expression evaluates to TRUE, then the function returns the value of expr1, else it returns the value of expr2. IFELSE returns a numeric value and IFELSE$ returns a string value. These functions are conveniences which can often eliminate the need for a temporary variable or duplication of statements that differ only by a single either/or choice. For example, consider a case where you want to print a value with one of two masks depending on whether the value is less than 1. You might code it like this: if VALUE >= 1 then PRINT VALUE USING "#####" else PRINT VALUE USING "#.###" endif With the IFELSE$() function, you can eliminate the IF statement and reduce the two PRINT statements to one: PRINT VALUE USING IFELSE$(VALUE>=1,"#####","#.###") Or, in the case of larger statements where you are more likely to introduce temporary variables than to repeat variations of the statement, IFELSE() can eliminate the need for a temporary variable, e.g. if flag'disable then CSTATE = MBST_DISABLE else CSTATE = MBST_ENABLE endif xcall AUI, AUI_CONTROL, CTLOP_ADD, CTLID$, CTEXT$, & CSTATE, CTYPE$, CMD$, FUNC$, ... The above can be reduced to a single statement using IFELSE(): xcall AUI, AUI_CONTROL, CTLOP_ADD, CTLID$, CTEXT$, & ifelse(flag'disable,MBST_DISABLE,MBST_ENABLE), CTYPE$, CMD$, FUNC$, ... ============================================================================ A-Shell Release Notes Version 6.3.1524.0 (01 September 2016) ============================================================================ 1. New feature: special file name .NULL may be used with sequential files to open a file which is not connected to anything. For example: OPEN #1, .NULL, OUTPUT OPEN #2, .NULL, INPUT For output, .NULL is equivalent to the device /dev/null under UNIX and NUL under Windows, i.e.any data output to the file is just discarded. For input, .NULL acts like an empty input file (returns EOF on the first input attempt). The ability to associate an output file channel with a null device adds to the flexiblity of the PRINT #CH statement, since depending on the value of CH and what file it is associated with, the statement can output to the screen (if CH=0), a disk file, or nothing at all. But the feature is even more useful in conjunction with the new MX_FILESOCK mechanism (see next). 2. New MIAMEX function: MX_FILESOCK (187) binds a TCP socket to a sequential file channel so that PRINT #CH and/or INPUT #CH transfers data over the socket rather than to/from the file. Syntax: XCALL MIAMEX, MX_FILESOCK, CH, SOCKET, STATUS CH (num) [in] must be a file channel (> 0) open for sequential input or output. (Typically you would open the file using the .NULL filespec as described in the previous edit note.) SOCKET (num) [in] must be a valid socket (opened via TCPX.SBR). STATUS (signed num) [out] returns 0 for success, else error. If CH was open for output, then after the successful completion of the MX_FILESOCK call, PRINT #CH statements will output to the socket instead of the file. Similarly, if CH was open for input, then INPUT #CH statements will read from the socket. Note that while sockets are bidirectional, sequential file channels are not, so if you want to both input and output to the socket this way, you'll need to open two file channels and bind them both to the same socket (with two separate MX_FILESOCK calls). Once the file channel is bound to the socket, closing the file channel will also close the socket. To simplify the operation of opening the file and socket and binding the two together, a pair of functions has been added to the SOSFUNC: library: Fn'FileSock'Out(ch, socket, server$) Fn'FileSock'In(ch, socket, server$) See the fnfilesock.bsi source code in the [907,10] directory of the SOSLIB for details, including a sample/test routine. 3. Bug fix: close an obscure loophole in the PRINT routine in which a device error during printing a CRLF pair might fail to raise the BASIC error (even though it displayed a "Device error" message.) 4. Bug fix: Sorting a file with BASORT may have crashed A-Shell if the filespec was longer than 80 characters. ============================================================================ A-Shell Release Notes Version 6.3.1523.0 (30 August 2016) ============================================================================ 1. Language/compiler (edit 770) enhancement: Private attribute for functions and procedures. Function and Procedure definitions within ++include modules may now be preceded with the keyword PRIVATE to make them invisible outside of that ++include file. This is analogous to the use of the PRIVATE keyword to declare a variable as being visible only within the ++include file. For example: PRIVATE FUNCTION FN'TEST() AS F6 .... ENDFUNCTION The two most likely motivations for declaring a function or procedure to be private are: - As a namespace mechanism to prevent conflicts with procedures of the same name in other include files. Previously, the only way to avoid this risk would have been to append or prepend some module-specific text (perhaps the module name) to the routine name, but this ends up making your routine names overly long, making them difficult to type and read. - As a way of making the code easier to understand or debug later. (Eliminating the possibility that the routine is called from anywhere outside the current module eliminates the need to consider impossible scenarios that would otherwise be difficult to rule out without searching every possible file that could use this module.) 2.SUBMIT.SBR refinement: subscripted string arguments are now supported (as they are in most other SBRs). ============================================================================ A-Shell Release Notes Version 6.3.1522.0 (13 August 2016) ============================================================================ 1. Language enhancement: new collection type: MLIST(varstr) MLIST(varx) MLIST (short for "Multi-level LIST") is a bidirectional linked list, with the added feature that each element may contain a link to a child MLIST. Aside from the links, each element may contain a variable length string (varstr) or blob (varx). The MLIST is effectively a kind of tree structure, useful for representing a variety of real-world data such as disk directories and XML/JSON documents, where the ability to maintain a particular order and to efficiently insert, delete, and splice elements or branches at arbitrary points is required. Unlike the ORDMAP and ORDMAPM collections, there is no direct access to an element by its key; there is only direct access to the first and last elements in the list, with the ability to iterate forwards, backwards, or down from there. The order of the elements in the list is preserved based on the order in which you build it. As with other collection types, an MLIST is created with the DIMX statement: DIMX $M, MLIST(VARSTR) DIMX $M, MLIST(VARX) The syntax for assigning and accessing elements is similar to that for ORDMAP, modeled on single-dimension array syntax. But instead of using string keys for the array index as in ORDMAP, the MLIST uses various special dot-variables which act as pseudo-keys. In addition, there are several new dot-statements and dot-functions and dot-members to perform operations particular to MLISTs that cannot be easily represented with existing statements and functions. These are summarized below, following by descriptions and syntax for the various operations. Dot-Variable Description ------------ -------------------------------------------------- .FRONT first element, e.g. ? $M(.FRONT) .BACK last element, e.g. ? M(.BACK) .PUSHFRONT add new element to front, e.g. $M(.PUSHFRONT) = X .PUSHBACK add new element to end, e.g. $M(.PUSHBACK) = X Dot-Statement Description ------------- -------------------------------------------------- .POPFRONT remove first element from list, e.g. .POPFRONT $M() .POPBACK remove last element from list, e.g. .POPBACK $M() .SPLICE splice elements from one list to other .SORT sort elements in list by value, e.g. .SORT $M() Dot-Function Description ------------ -------------------------------------------------- .REF($$i) returns a reference to iterator location, used when modifying an element by iterator, e.g. $M(.REF($$i)) = X .BEFORE($$i) specifies insertion position, e.g $M(.BEFORE($$i)) = X And finally, new dot-members: .SUBLIST specifies sublist of element, e.g. $$i.SUBLIST, or $M(.BACK).SUBLIST .KEY $$i.KEY is equivalent to .KEY($$i) MLIST Operations ---------------- All of the following descriptions and examples will assume the prior definition of these two MLISTs: dimx $m, MLIST(varstr) dimx $m2, MLIST(varstr) Adding Elements: New elements may be added to the front or back of a list using array assignment syntax equivalent to that used for the ORDMAP collection, except instead of string keys, you must use one of the special dot-variable pseudo keys: $m(.PUSHFRONT) = X ! add new element to front; assign value X $m(.PUSHBACK) = X ! add new element at back; assign value x You may also insert an element into the middle of the list using the special dot-function .BEFORE($$i). In the following example, we scan the list until locating an element whose value is "something", and then insert a new element before it: foreach $$i in $m() if $$i = "something" then $m(.BEFORE($$i)) = x ! insert new element before $$i position exit endif next $$i Modifying existing elements uses the same syntax as adding or inserting new elements, except with a different set of dot variables and dot functions: $m(.FRONT) = y ! change value of first element to y $m(.BACK) = y ! change value of last element to y To update the value of an element by iterator, you must use the special dot function .REF($$i) to return to updateable reference to the iterator (since $$i by itself is a read-only copy of the value of the element). foreach $$i in $m() $m(.REF($$i)) = $$i + "y" ! update value of each element next $$i Deleting: Elements can be deleted by assigning the special value .NULL to them, using the element modification syntax given above. For example: $m(.FRONT) = .NULL ! delete the first element $m(.BACK) = .NULL ! delete the last element foreach $$i in $m() if $$i = "something" then $m(.REF($$i)) = .NULL ! delete the element exit ! always exit foreach loop endif ! after removing an element, as it next $$i ! may invalidate the iterator In addition, you can use the following dot-statements to delete: .POPFRONT $m() ! delete first element .POPBACK $m() ! delete last element Retrieving elements: X = $m(.FRONT) ! retrieve value of first element into X X = $m(.BACK) ! retrieve value of last element into X foreach $$i in $m() ! access by iterator X = $$i ! X receives value of iterated element next $$i Splicing lists: one or more elements from one list can be spliced on to another using the dot-statement .SPLICE. Note no elements are actually allocated or deleted in this operation; they are just moved from the source list to the destination list. The general syntax for the .SPLICE statement is: .SPLICE dst-list-ref, src-list-ref {, count} If count (number of elements to move) is not specified, the operation moves all of the elements starting from the src-list-ref position. The list-ref parameters may be list base references, e.g. $m(), or they may be references to a particular element by iterator reference, e.g. .REF($$i). For example: .SPLICE $m(), $m2() The above case splices the entire $m2() list to the end of the $m() list. Afterward, the $m2() list will be empty (but still valid). .SPLICE $m(), $m2(), 1 Same as the previous case except only the first element of $m2() is spliced to the end of $m(). Note: prior to compiler edit 786 (6.3.1532.6), the count argument had to be specified in the form of a variable rather than an literal or expression as shown above. To splice to some position other than the end of the destination, specify a position via an iterator reference. For example, to move append the 3rd and 4th items from $m2() the end of $m()... count = 0 foreach $$i in $m2() count += 1 if count = 3 then ! 3rd iterated item .SPLICE $m(), .REF($$i), 2 ! splice 3rd & 4th items exit ! iterator corrupted after splice! must exit! endif next $$i The .REF($$i) iterator technique also works for the destination, i.e. to insert at a destination other than the end of the target list. To splice from an arbitrary Xth position in the source to the Yth position in the destination, use a double-nested foreach loop: ! splice count elements from position srcpos in m1$() to dstpos in m2$ idst = 0 ! counter for dest position foreach $$i in $m2() idst += 1 if idst >= dstpos then ! $$i is the dst splice-to position isrc = 0 foreach $$j in $m1() isrc += 1 if isrc >= srcpos ! $$j is the src splice-from position .splice .ref($$i), .ref($$j), count exit ! must exit after splice! endif next $$j exit ! must exit after splice! endif next $$i Note: as with other modifications to a collection, the use of .SPLICE corrupts the iterator; thus you must exit from the foreach loop after the .SPLICE operation. (In the above example, we have to exit from both loops.) Multi-level list operations: The sublists in an MLIST structure are themselves MLISTs, so all of the above operations work the same way on sublists. However, you do need a special dot-member, .SUBLIST, to specify when you are referring to the sublist for an element, rather than to the element as a member of the parent list. =============================================== !=== === =============================================== There are two ways to create a sublist, both involving the use of the special .SUBLIST qualifier. The first is to splice elements from another list on to the .SUBLIST member of an element in the destination list, for example: .SPLICE $m(.BACK).SUBLIST, $m2() The above statement splices the list $m2() as a sublist of the last element in $m(). Note that without the .SUBLIST modifier, the $m2() list would have been spliced on to the $m() list, just before the last element. foreach $$i in $m() if $$i = "something" then .SPLICE $$i.SUBLIST, $m2, 3 exit endif next $$i In the above example, we scan the $m() list for an element with value "something", and then splice the first 3 elements of the $m2() list as a sublist of that target element. =============================================== !=== this method works === =============================================== The second way to create a sublist involves passing it as a parameter to a function or procedure, which is dealt with in a separate section below, after the discussion of deleting sublists. To delete a sublist, assign .NULL to the target element, either using one of the dot-variable pseudo-keys, or using an iterator to target the element: $m(.BACK) = .NULL ! delete sublist from last element of $m() foreach $$i in $m() if $$i = "something" then $$i.SUBLIST = .NULL exit endif next $$i The above examples delete the sublist without deleting the element itself. Deleting the element will also delete any sublist(s) attached to it. Parameter Passing: MLISTs can be passed by reference to functions and procedures. This is similar to the way it works with ORDMAPS (see 1520.0) except that with MLISTs there is also a variation for passing sublists. To pass a regular MLIST to a function or procedure, use the following syntax (nearly identical to that for ORDMAPs except for the "AS" clause): call Proc( $m() ) ! passing the entire $m list by reference Procedure Proc( $mloc() as MLIST(varstr) ) $mloc(.PUSHBACK) = "new element" EndProcedure The above example adds the element "new element" to the MLIST $m(). Note that the local list $mloc() is effectively just an alias for the $m() list. As with passing ORDMAP arrays and other DIMX arrays by reference, you have to initialize the array first in the calling routine. The pre-initialization requirement does not apply to sublists though, which are automatically initalized when passing them to another routine: call Proc( $m(.back).SUBLIST ) In the above example, the SUBLIST for the last element of the $m() list is passed to the Proc procedure (given in the previous example). Note that the procedure does not know, or care, that the caller passed a sublist rather than an MLIST base reference; they are indistinguishable from the perspective of the procedure. Also note that since the sublist gets auto-initialized if necessary, the same syntax works regardless of whether the sublist initially exists. You can also pass a sublist of an iterator, e.g. foreach $$i in $m() if $$i = "something" then call Proc($$i.sublist) endif next $$i In the above example, for each element in the MLIST $m() whose value is "something", we pass the sublist to the Proc procedure, which adds a "new element" to the end of that sublist. ============================================================================ A-Shell Release Notes Version 6.3.1521.0 (08 August 2016) ============================================================================ 1. Language enhancement: new collection type ORDMAPM is equivalent to ORDMAP except it supports multiple keys of the same value. (This structure is typically known as an ordered multi-map but we went with ORDMAPM instead ORDMMAP or ORDMULMAP or ORDMULTIMAP because it seemed easier to read and type.) As with the standard ORDMAP, ORDMAPM collections declared with the DIMX statement and support the same two variations (one with a variable length string value, the other with a variable length binary/blob value; both with a variable length string key): DIMX $mymap, ORDMAPM(varstr;varstr) dimx $mymap, ordmapm(varstr;varx) Note that are no promises regarding the internal order of elements with the same key, nor of which of those elements will be the one returned when retrieving an element by key. However, iterating through the entire array will return all of the elements. In addition, iterating from a specific key will also return all of the matches for that key. For example: dimx $MM, ORDMAPM(varstr;varstr) ... foreach $$i in $MM(key$) ! will iterate through all of the elements .... ! matching $key, followed by all of the next $$i ! elements after $key ============================================================================ A-Shell Release Notes Version 6.3.1520.0 (04 August 2016) ============================================================================ 1. Language enhancement: ordered maps may now be passed by reference to functions and procedures. Conceptually and syntatically this is very similar to passing other kinds of DIMX arrays by reference. On the calling side, you specify the array in the parameter list using an empty set of parentheses, for example... dimx $mymap, ordmap(varstr;varstr) ... call MyProc($mymap()) ! pass $mymap() array by reference On the receiving side you declare the local name for the array in the parameter definition also with an empty set of parentheses, with the "as clause" specifying the ordered map type, e.g. Procedure MyProc($m() as ordmap(varstr;varstr)) $m("foo") = "bar" ! updating m$() updates $mymap() directly As with other DIMX array passing, the compiler does not attempt to determine if the source and destination array formats are compatible, but the runtime system enforces a degree of sanity, in this case, complaining if you attempt to pass an ordmap(varstr;varx) to an ordmap(varstr;varstr) or vice versa. ============================================================================ A-Shell Release Notes Version 6.3.1519.0 (30 July 2016) ============================================================================ 1. ATE enhancement: custom splash display. You can now replace the standard license/splash page with your own by creating a program ATESPLASH.LIT and placing it in the ATE directory %MIAME%\custom. As long as the file exists, and ATE was not launched with the -n option, the program will be executed instead of the standard license/banner. Note that unlike the built-in splash display, which lingers while internal operations are proceeding, ATE will simply wait for the ATESPLASH.LIT program to exit (so you should keep the duration of the display short - ideally only one or two seconds.) Also note that the program might be executed before the full runtime environment has been established, so the program should be kept simple, with no SBX calls. Any files that you need for the display (such as an image file) should also be stored in the %MIAME%\custom subdirectory. See sample in SOSLIB [907,50] 2. GUI refinement: non-standard dialogs (which omit the MBF_DIALOG flag and instead use the class "MIAMEDLG" along with WS_xxx flags) now support most of the standard dialog features, including the ability to center them on the desktop. 3. String stack bug fix: close a loophole created by the expandable string stack enhancement (see 1518 below) which led to a GPF fault after certain string operations on zero-length dynamic strings. ============================================================================ A-Shell Release Notes Version 6.3.1518.1 (27 July 2016) ============================================================================ 1. AG_IMAGE bug fix: IMGOP_LOADDISP arguments were not getting parsed correctly when relayed to the PC. (Introduced in 512.1) ============================================================================ A-Shell Release Notes Version 6.3.1518.0 (24 July 2016) ============================================================================ 1. New TRACE option EXEC traces RUN, CHAIN, command line and XCALL AMOS statements (useful for tracking user activity). Example trace formats: RUN PROG1 (from dot prompt or command file) Exec(CHAIN): c:\vm\miame\dsk0\007006\prog1.run CHAIN PROG2 (from PROG1) Exec(CHAIN): c:\vm\miame\dsk0\007006\prog2.run XCALL AMOS, "RUN PROG3" (from PROG2) Exec(AMOS): Exec(AMOS): RUN PROG3 LOG DSK0:100,150 (from dot prompt or command file) Exec(CMDLIN) LOG DSK0:100,150 So essentially you can search or filter for "Exec(" to easily pick up all the command lines and programs executed. As with other TRACE options, you can set it... In the MIAME.INI ... TRACE=EXECUTE From the command prompt ... SET TRACE EXECUTE ON From within a program ... XCALL MIAMEX, MX_GETTRACE, trflags XCALL MIAMEX, MX_SETTRACE, trflags OR TROP_EXECUTE (The symbol TROP_EXECUTE is defined as &h80000000 in ashell.def) 2. MX_GETTIME enhancement: an optional 3rd parameter can be passed to retrieve the offset (in seconds) between UTC and local time. Updated syntax: xcall MIAMEX, MX_GETTIME, secs {,usecs {,utcoffset}} where utcoffset (signed num) [out] Returns offset in seconds from UTC (Universal Coordinated Time, aka Greenwich Mean Time) and local time. Offset will be negative for timezones West of Greenwich. A value of -1 indicates an error. Note that A-Shell versions prior to this release will ignore the utcoffset parameter, so unless you check the version, you should probably set your utcoffset value to -2 before calling the routine so that you can detect if it worked. 3. Memory enhancement: Move the string expression stack out of the main partition into a separate module which now auto-expands as needed. This should eliminate the most common and yet most unpredictable cause of out-of-memory (or stack-overflow) errors, which are related to operations on strings whose size is not obvious or easily predictable in advance. The main partition (specified by the first and/or second values in the MEMORY statement in the miame.ini) is now used mainly for mapped variable storage, call stack, and command files. (The actual RUN files are loaded separately.) SYSTAT/M shows the minimum available memory in the partition since the beginning of the session, allowing you to perhaps gauge how much larger-than-necessary your partition allocation is. ============================================================================ A-Shell Release Notes Version 6.3.1517.1 (20 July 2016) ============================================================================ 1. MX_GDICALC bug fix: The MXGDI_CALCRECT patch (1516.3) broke the MXGDI_CALCLEN sub-function. ============================================================================ A-Shell Release Notes Version 6.3.1517.0 (15 July 2016) ============================================================================ 1. Compiler (edit 764) enhancement to recognize the new random generator functions RND() and SRND() in /X:2 mode (See next.) 2. New random number generator implemented and exposed through two new functions: SRND2(seed {,ubound,lbound {,stream}}) - initialize the generator RND2() - return next random number per the initialization/state Parameters: seed (32 bit integer) establishes the initial state of the generator. The sequence of numbers returned from RND2() will be different for each seed. A seed value of 0 results in a randomly selected seed (equivalent to executing the RANDOMIZE statement). ubound, lbound (32 bit signed integers) may be used to optionally set the range of returned values. If omitted or set equal to each other, the range of returned values will be from 0 to 1 (fractional) as with the traditional RND(). Otherwise, the returned values will be integers, uniformly distributed across the range specified by lbound and ubound, inclusive. stream (32 bit integer) may optionally be specified to select one of the multiple streams of values possible for a given seed. Combining 2^32 streams with 2^32 seeds increases the universe of possible sets/sequences of random values dramatically, but for most uses is probably not of much interest. Note however, that for a given seed, different streams are guaranteed never to overlap each other. If RND2() is called without first initializing the generator with SRND2(), it will be automatically initialized as if SRND2(0) had been called, i.e. a random seed will be selected and the range of returned values will be from 0 to 1 (fractional). The existing RANDOMIZE statement affects the new RND2() function in the same way as the traditional RND(x) function, i.e. establishes a pseudo- random seed and stream. It does not affect previously established lbound and ubound values. The primary motivation for implementing a new random number generator is to provide vertical stability across versions and horizontal uniformity across platforms. That is, for a given set of initialization parameters, the resulting sequence of numbers returned by the new RND2() function will be the same across all A-Shell platforms, all versions (going forward), and all operating system levels. (This is NOT the case with the traditional RND() function, which is based on standard C library routines which have different underlying implementations in different operating systems and which may change over time.) Stability and uniformity are critical for many applications of random number generators, including data encryption and test suites. Aside from stability/uniformity, the new generator offers some additional benefits: - The lbound,ubound feature makes it much easier (and faster) to generate integers in a particular range, which is probably the most common usage. It also eliminates the floating point rounding problem which allows the traditional RND(x) to sometimes return a value effectively equivalent to 1. (If you are converting the result to an integer range 1-N in the usual way, i.e. INT(RND(1)*N)+1, this would lead to a result of N+1, possibly causing an error in the application.) - RND2() is much less predictable than RND(), making it superior for cryptographic uses. - Splitting it into two functions, one to initialize and one to generate, reduces the confusion inherent in the overloaded nature of RND(x). The new generator is based on the the PCG family of random number generators (see www.pcg-random.org for more information). Warning: attempting to run a program containing RND2() or SRND2() in a version of A-Shell prior to 6.3.1517.0 will generate an unsupported function error when it hits either function. ============================================================================ A-Shell Release Notes Version 6.3.1516.3 (14 July 2016) ============================================================================ 1. MX_GDICALC bug fix: the MXGDI_CALCRECT operation was not properly recognizing "^M" line break indicators embedded in the text. ============================================================================ A-Shell Release Notes Version 6.3.1516.2 (12 July 2016) ============================================================================ 1. XTEXT bug fix: Failure of the control to recognize LF as a line terminator was leading to a situation where string buffer mode (TXFF_STRING) with RTF format was in some cases causing line breaks to be lost (sometimes along with the first token of the next line). ============================================================================ A-Shell Release Notes Version 6.3.1516.1 (11 July 2016) ============================================================================ 1. Fix problem with centering of static images nested inside a static panel when resizing dialog. 2. Fix problem with ATE login dialog (ATELGI.SBX) trying to use ATE communication channel to host before the connection has been established. 3. Minor adjustment to AUI_WINDOW secondary monitor querying logic to better accomodate unexpected configurations (which may contain gaps in the combined virtual desktop space due to high-res DPI scaling on one of the monitors and/or strange alignments). ============================================================================ A-Shell Release Notes Version 6.3.1516.0 (24 June 2016) ============================================================================ 1. Runtime enhancement: B6 and I6 variables now supported in the following operations: - Use in expressions just like any other numeric variable types. - Conversion to other types (via assignment or parameter passing), provided the receiving variable is large enough to contain the value. (The only other variable type that can contain the full range of B6 or I6 values is F8.) In the case of converting to string (or printing), you should set SIGNIFICANCE 15 to avoid exponential notation when dealing with large values. - Conversion from other types (via assignment or parameter passing), provided the source value is within the range of the target type (0 to 281474976710656 for B6, or -140737488355328 to 140737488355327 for I6). Fractional values will be truncated to leave just the integer component. - Bitwise operators (AND, OR, NOT, XOR, EQV) supported out to 48 bits (previously was 40 bits). - Built-in XCALLs, while having access to the new extended range of integers, have not been updated to take advantage of them. Unless the the documentation explicitly indicates otherwise, you should assume a 32 bit limit for general numeric parameters. - Decimal, octal, and hex constants and symbol definitions now support values extending to 48 bit integer or F8 floating point (previously was 40 bit integer or F6 floating point). You may optionally append an "L" to the end of such literal constants to make explicit that you want them to be encoded into the RUN file using the larger format, but this isn't necessary as the compiler will do it automatically as needed. 2. ATE refinement: when using the interactive dialog to specify the host login parameters, if the configuration is set to link the FTP login to the TELNET/SSH login, then the FTP login information will now be automatically set for the session. (Previously, the first FTP operation would require a second login.) 3. MX_OCVT now supports 48 bit values (up from 32). This is equivalent to 12 hex characters or 16 octal characters. Note that the standard SOSLIB Fn'Dec2Hex$() function has been updated accordingly. ============================================================================ A-Shell Release Notes Version 6.3.1515.0 (14 June 2016) ============================================================================ 1. Compiler (edit 763) enhancement: preliminary support for B6 (unsigned) and I6 (signed) variables. 2. LOG.SBR refinement: status now returns numeric error codes on failure rather than just -1. 3. LOG.LIT 3.0(124) now explicitly reports failure to log to directory (if A-Shell 6.3.1515.0+). 4. GUI refinement: MBST_xxx centering was not working with MBF2_DLGNOCAP (captionless) dialogs. ============================================================================ A-Shell Release Notes Version 6.3.1514.2 (14 June 2016) ============================================================================ 1. AUI_IMAGE bug fix: IMGOP_CAPTURE was broken by 1512.1. (Most noticeable in the Print Screen utility.) ============================================================================ A-Shell Release Notes Version 6.3.1514.1 (08 June 2016) ============================================================================ 1. XTREE bug fix: in the ATE environment, updating a sortable tree from both the data and answer arrays using XTROP_REPLACE was in some cases resulting in duplicate rows or cell updates to the wrong rows. (This effectively replaces earlier XTREE patches in 1421.2 and 1421.9 which failed to deal correctly with the scenario, and which actually expanded the scope of the problem to potentially affect non-ATE environments.) Same patch as 6.2.1427.2. ============================================================================ A-Shell Release Notes Version 6.3.1514.0 (02 June 2016) ============================================================================ 1. ATE enhancement: the manual login dialog may now be customized by creating an ATELGI.SBX. If BAS:ATELGI.SBX exists and the automatic login doesn't succeed, ATE will call it instead of the internal generic login dialog to get the login credentials. The calling interface is: xcall ATELGI, name, pw, sts, pkpw, host, cfg Where login (str) [in/out] - login name pw (str) [out] - password pkpw (str) [in/out] - private key passphrase sts (num) [in/out] - status (OK/CONNECT=1, CANCEL=0) host (str) [in/out] - host{:port} cfg (str) [in] - name of current ATE configuration 2. Compiler edit 762 implements optimization for unused functions. (Feature will be exposed for use in a subsequent update.) ============================================================================ A-Shell Release Notes Version 6.3.1513.5 (01 June 2016) ============================================================================ 1. XTREE bug fix: in the ATE environment, updating a sortable tree from both the data and answer arrays using XTROP_REPLACE was in some cases resulting in duplicate rows or cell updates to the wrong rows. (This effectively replaces earlier XTREE patches in 1421.2 and 1421.9 which failed to deal correctly with the scenario, and which actually expanded the scope of the problem to potentially affect non-ATE environments.) Same patch as 6.2.1427.1. ============================================================================ A-Shell Release Notes Version 6.3.1513.4 (31 May 2016) ============================================================================ 1. APEX - further refinements to zoom/pan. (Same as 6.2.1427.1) ============================================================================ A-Shell Release Notes Version 6.3.1513.3 (21 May 2016) ============================================================================ 1. XTREE bug fix: date/time sorting (cformat D and h) was not working. (Broken in 6.1.1365 during during the unicode conversion; same patch as 6.2.1426.8) 2. Dot prompt command line parser bug fix: certain commands with spaces in them (for example "DO XYZ") were failing to execute (bug introduced in 1509.1). ============================================================================ A-Shell Release Notes Version 6.3.1513.2 (21 May 2016) ============================================================================ 1. Minor internal changes for Raspberry Pi compatibility. (Note that Pi version yet doesn't support the REGEX, FCGI, USPS, and DYNLIB/LIBXL modules.) ============================================================================ A-Shell Release Notes Version 6.3.1513.1 (21 May 2016) ============================================================================ 1. XTREE bug fix: close loophole responsible for intermittent bogus "Editable column count" error messages. (Same patch as 6.2.1426.7) ============================================================================ A-Shell Release Notes Version 6.3.1513.0 (16 May 2016) ============================================================================ 1. New XTREE Advanced Coldef Option: MaskView= Option is identical to the existing Mask= option, except that the non-numeric mask characters (relative to the current LDF) are stripped from the editable fields returned in the answer array. This is most convenient when you plan to use the data returned from the tree in numeric calculations (where the mask formatting characters may interfere with the conversion from string to number). ============================================================================ A-Shell Release Notes Version 6.3.1512.2 (13 May 2016) ============================================================================ 1. Fix truncation problem in standard TAB control if the label definition string (ctext) between 200 and 400 characters; Was corrupting the exitcode for the final tab. (Same as 6.2.1426.6) ============================================================================ A-Shell Release Notes Version 6.3.1512.1 (09 May 2016) ============================================================================ 1. (Source code reorganization) - Symbols related to AUI_IMAGE have now been separated out of ashell.def into image.def and augmented. Programs using them should now ++include ashinc:ashell.def and ++include:image.def 2. AUI_IMAGE enhancement: IMGOP_ACQUIRE now supports optional ability to set the pagesize: xcall AUI, AUI_IMAGE, IMGOP_ACQUIRE, handle, status, filespec, attribs & {,appname {,pages, scanflags {,pagesize}}} Pagesize options are defined in the ashinc:ashell.def file, the most common options being: TWSS_A4LETTER = 1 TWSS_USLETTER = 3 TWSS_USLEGAL = 4 ============================================================================ A-Shell Release Notes Version 6.3.1512.0 (08 May 2016) ============================================================================ 1. AUI_IMAGE enhancement: the IMGOP_INFO (5) opcode now returns the percent black for B&W TIF images. The calculation eliminates some noise (individual floating bits) and also ignores an outer margin equal to 1/40th of the width and/or length, and may be useful as a way of detecting blank (or perhaps too-light or too-dark) pages during scanning. The updated layout for the IMGINFO parameter is: MAP1 IMGINFO ! Image info packet MAP2 IMG'OWIDTH,F ! Original image width (pixels) MAP2 IMG'OLENGTH,F ! Original image length (pixels) MAP2 IMG'DWIDTH,F ! Display width (pixels) MAP2 IMG'DLENGTH,F ! Display length (pixels) MAP2 IMG'BPP,F ! Bits per pixel MAP2 IMG'NA,F ! not used MAP2 IMG'TYPE,B,2 ! type: 1=tif,2=bmp,3=jpg,4=pcx,5=tga,6=gif,7=png MAP2 IMG'BW'BLKPCT,F ! % black pixels (B&W TIF only) ============================================================================ A-Shell Release Notes Version 6.3.1511.3 (05 May 2016) ============================================================================ 1. Parameter passing bug fix: a passed floating point variable was failing to be converted properly to a received string variable if the receivng string variable length matched the passed floating point variable length. For example, passing an F6 to an S6 or an F8 to an S8 was not giving the expected result. 2. XTREE/ATE bug fix: the answer array wasn't getting reprocessed in XTROP_REPLACE mode when the data array was updated and row optimization was resulting in only the updated rows being transmitted to the client. ============================================================================ A-Shell Release Notes Version 6.3.1511.2 (04 May 2016) ============================================================================ 1. ATE bug fix: AutoMouse option wasn't getting initialized on connection to match the state in the previously saved settings file. ============================================================================ A-Shell Release Notes Version 6.3.1511.1 (03 May 2016) ============================================================================ 1. APEX refinement: clicking on the preview page (in single page view) to zoom and/or click-dragging to pan now works somewhat more intuitively than before. Initially it starts in auto-scroll mode, whereby the image is automatically positioned to be maximally in view. After the first single- click zoom operation, it switches to click-drag mode, which allows you to click and drag the image in any direction. If, by some combination of zooming and dragging you manage to position the image almost or entirely out of the viewing pane, just click any of the toolbar zoom or view options to reset it. Previously, the viewer used some inscrutable heuristics to decide when to switch between the click-drag mode and the auto-scroll mode, which was frustrating when working with large images highly magnified. 2. APEX change/refinement: when previewing images (i.e. //IMAGE GDI directives), APEX now uses the same rendering logic as it does when printing to a real printer or when displaying to the screen using AUI_IMAGE. This seems to result in somewhat improved viewing aesthetics, particularly for PNG images containing fine lines (such as building plans), which previously may have appeared excessively faint when scaled down. ============================================================================ A-Shell Release Notes Version 6.3.1511.0 (29 April 2016) ============================================================================ 1. ATE enhancement to TAB(-10,AG_MOUSE): new opcode 8 will restore the AutoMouse setting to where it was prior to the previous change via opcode 7. Syntax: ? tab(-10,AG_MOUSE);"op{,flags}";chr(127); Valid op choices are 7 (set flags) or 8 (restore flags). Valid flags (may be combined): &h0001 Automouse disabled (default is enabled) &h0002 Doubleclick sends string only (no CR) 1 &h0008 Singleclick sends string only (no CR) &h0010 Singleclick sends string+CR &h0020 No singleclick auto col adjustment &h0040 No singleclick auto row adjustment &h0080 Doubleclick sends CR only &h0100 tab(-1,158) cursor reporting &h0200 Doubleclick sends ESC only &h0400 Doubleclick sends string+CR &h0800 Don't consider slash a token delimiter 2. VUE 3.2(370) now uses the above technique to disable AutoMouse on the ATE client during the VUE session, then restores the prior settings on exit. Previously, this only occurred for A-Shell/Windows local mode. Note that if the ATE version is prior to 6.3.1511.0, AutoMouse will get disabled on entry into VUE, but not restored on exit. ============================================================================ A-Shell Release Notes Version 6.3.1510.1 (28 April 2016) ============================================================================ 1. Refinement to XTREE handling of optional editable dates (cformat=DE, InfDef=DO). Now, when the date-valid checkbox is unchecked, the date displayed will be blanked out. Previously, it was grayed out, but the difference wasn't enough to avoid confusion. ============================================================================ A-Shell Release Notes Version 6.3.1510.0 (26 April 2016) ============================================================================ 1. AUI_IMAGE scanning enhancement: you can now set the scanner pixel type and resolution from the application by using the 2nd thru 4th bytes of the comp parameter: xcall AUI, AUI_IMAGE, IMGOP_ACQUIRE, handle, status, filespec, attribs & {,appname {,pages, scanflags}} where attribs replaces the previous comp parameter and is defined as: map1 attribs,b,4 ! compress, pixel type, resolution attributes map1 attribsx,@attribs ! overlay to break out fields map2 comp,b,1 ! compression options (as before) map2 pixtype,b,1 ! pixel type: (see below) map2 resx,b,1 ! x resolution (in multiples of 25 DPI) map2 resy,b,1 ! y resolution (in multiples of 25 DIP) The pixtype options are: 1=BW (bilevel), 2=Grayscale (8 bit), 3=RGB (24 bit), 4=Palette, 5=CMY, 6=CMYK, 7=YUV, 8=YUVK, 9=CIEXYZ. The first 3 of these are standard for most scanners; the others are somewhat exotic and may not be supported. The resx and resy fields are scaled to multiples of 25 DPI (i.e. 12=300 DPI) ( in order to fit a reasonable range of possible resolutions in 8 bits. For each of the pixtype, resx, and resy fields, 0 is interpreted as no change to the existing (or default) settings. So existing programs that pass only the comp value will continue to work as before. Note that for many scanners, setting the pixel type and resolution options may not have an effect unless the IMGSF_HIDEUI flag is set in the scanflags parameter. (That is, displaying the scanner's user interface may override the application settings with the scanner's own previously saved settings.) 2. AUI_IMAGE scanning enhancement: the IMGSF_HIDEUI (1) option in the scanflags parameter now works in single-page scanning mode. Previously single page scans (pages=1) always displayed the scanner's user interface regardless of the scanflags. 3. New SOSLIB routine ATEGFK.SBX retrieves a file from the PC via the ATE terminal connection. This is useful in situations where FTP isn't available or isn't practical. Syntax: XCALL ATEGFK, HOSTSPEC, PCSPEC, FLAGS, STATUS where HOSTSPEC (str) [in] is the destination (native or AMOS-style) PCSPEC (str) [in] is the source (PC native) FLAGS (num) [in] may contain zero or more of the following: +16 skip post-transfer verification +32 pre-verify (skip transfer if destination matches source) +64 ignore version 0 in pre-verification +128 put ATEGFK.LOG in current directory rather than OPR: STATUS (signed num) [out] returns status of operation: >0 file transferred =0 transfer not required -1 ATE required -2 source file doesn't exist -3 file transferred but failed to verify afterwards -4 transfer failure ATEGFK.SBX may work with ATE 6.1.1357+ but will be much better with ATE 6.1.1370.0+. See test program TSTATEGFK.BP. Both are included in [907,33] of the SOSLIB along with other ATE file-transfer related utilities. Also see MX_ATEFILEXFR and ATEXFR.SBX 4. APEX preview control SftPrintPreview_IX86_U_20.dll updated to 2.0.7 to correct some internal inconsistencies with related controls under Windows 10. (No outward behavior changes expected.) ============================================================================ A-Shell Release Notes Version 6.3.1509.3 (24 April 2016) ============================================================================ 1. PDFX printing refinement: the NOABORTDLG option in the printer init files now automatically sets the //PDFX,Saver.ShowProgress dialog option to false. (The theory being that if you don't want the one popup dialog, you presumably don't want the other.) 2. Minor refinements to close loopholes in which interactions between startup errors and error messaging/logging routines could lead to lockup of the entire system. (Same as 6.2.1426.2) ============================================================================ A-Shell Release Notes Version 6.3.1509.2 (22 April 2016) ============================================================================ 1. Further fix to STRTOK (see 1426.0) to ensure that the RDELIM parameter returns the final record delimiter character when the final field is terminated by only a record delimiter (rather than by field and record delimeter). Normally this would not be an issue, since programs that use STRTOK to process multiple records would have to deal with possibility of a totally empty record at the end (which will always return "" in RDELIM). But for programs parsing just a single record with an unknown number of fields and expecting the final record delimiter to be returned in RDELIM after the final field, the prior behavior may have caused the application to report an error condition. (Same as 6.2.1426.3) ============================================================================ A-Shell Release Notes Version 6.3.1509.1 (16 April 2016) ============================================================================ 1. Improve detection of native filespecs that otherwise appear as if they could be AMOS-style specs. ============================================================================ A-Shell Release Notes Version 6.3.1509.0 (16 April 2016) ============================================================================ 1. PDFX enhancement: Passing the WAIT switch to XCALL SPOOL when generating a PDF file using PDFX5+ now results in the routine waiting until the file is written to disk before returning. 2. New MIAMEX function MX_LASTPRTFIL (186) returns the filespec of the last file written by the PDFX printer driver. xcall MIAMEX, MX_LASTPRTFIL, fspec$ where fspec$ (str) [out] return the filespec. Currently this only works for PDFX5+, where it solves the problem of finding out the actual name of the PDF file which otherwise may be unknowable due to autonumbering strategies in the driver, or due to the operator using the Save As dialog to rename the file. The feature may be expanded in the future to support other similar printing situations. ============================================================================ A-Shell Release Notes Version 6.3.1508.0 (05 April 2016) ============================================================================ 1. Compiler (edit 761) optimization of PRIVATE_BEGIN/END logic so that the initialization is effectively "lazy", i.e. delayed until code within the module is executed. This eliminates unnecessary initializations that would otherwise occur if the ++include for the module is placed near the top of the parent program. 2. Fix bug in function call handler in which an unmapped array in the parameter list could corrupt the call/return stack. (Same as 6.2.1426.0) 3. Fix bug in filehook system which may have allowed memory corruption under certain sequences of opens, closes, and hook operations. (Same as 6.2.1426.1) 4. (LINUX) Minor adjustment to terminal drivers to avoid a weakness in an optimized version of some string handling library calls introduced in -el6. (No problems had been observed or reported though; the adjustment just reduces uncertainty in the library implementations.) (Same as 1426.1) 5. ATE refinement: when the transmission of a large response to the server is impededed by network congestion, the retry sequence is now more forgiving. Previously it gave up after 10 retries spaced some tens of milliseconds apart; now it keeps trying for several seconds. (6.2.1425.4) 6. Bug fix/refinement: XTREE was converting quote characters within the data array to apostrophes. They are now preserved. (Problem occurred only in the ATE environment, and the patch applies purely to the server side - no update needed for A-Shell or ATE clients.) (6.2.1425.3) 7. FLOCK bug fix/refinement: The memory allocation for the FLOCK cache now registers the name "FLKCACHE" in the log (useful when debugging memory handle use with the MALLOC TRACE). Close a memory leak whereby the cache was needlessly reallocated if FLOCK called within an SBX. (6.2.1425.7) 8. XTREE/ATE refinement: when using file mode for a multi-selection tree, previously it was transmitting the entire answer parameter. Now it transmits only the number of bytes needed for the specified rows. (Server side.) (6.2.1425.6) 9. XTREE/ATE refinement: in the case described above, the ATE-side log was registering a warning message about buffer sizes. The warning and the underlying issue have been cleaned up. (6.2.1425.6) ============================================================================ A-Shell Release Notes Version 6.3.1507.1 (22 February 2016) ============================================================================ 1. Misc refinements / fixes in new license handling. 2. LICENS.LIT 2.4(133) - support new PIC format. ============================================================================ A-Shell Release Notes Version 6.3.1507.0 (15 February 2016) ============================================================================ 1. New command line switch allows defining a system logical device that will be searched ahead of SYS:, CMD:, and BAS: -mntsys dev:=path For example: ashell -i /vm/miame.ini -mntsys asr63:=/vm/miame63/dsk0 log sys: Assuming the specified path /vm/miame63/dsk0 existed and contained 001004, 002002, and 007006 directories, these would be search prior to the corresponding dsk0:[1,4], dsk0:[2,2] and/or dsk0:[7,6] directories. This can be useful in situations where you want to test a new version of A-Shell without overwriting your existing DSK0: directories. 2. New command line file option: .clx e.g. ashell.clx or ashw32.clx Similar to the .cl file, the .clx file may be optionally placed along side the ashell executable in order to supply an alternate command line. But unlike the .cl file, which is only used if the original command line does not contain any switches, the .clx is used regardless of the original command line. This is useful in situations where you want to modify the ashell command line for all the users, without having to track down and modify all the individual user startup command or shortcut files. Also unlike the .cl files whose contents always augment the original command line arguments, the .clx command line may either replace the original command line, or be inserted prior to the original. To get the latter effect, add a " +" to the end of the .clx command line. For example, if the original command line is: ashell -i /vm/miame/miame.ini log bas: and there is an ashell.clx in the same directory as the ashell executable, containing: -mntsys asr63:=/vm/miame63/dsk0 + then the new effective command line will be: ashell -mntsys asr63:=/vm/miame63/dsk0 -i /vm/miame/miame.ini log bas: If the "+" was removed from the end of the .clx file, then the new effective command line would simply be the executable followed by the contents of the .clx file, i.e. ashell -mntsys asr63:=/vm/miame63/dsk0 3. New command line switch: -noclx When specified as the FIRST argument, it disables the search for the .clx and .cl files. ============================================================================ A-Shell Release Notes Version 6.3.1506.2 (13 February 2016) ============================================================================ 1. --- DYNLIB (Linux) refinement: when loading libraries, it now checks first in the bin directory before trying the system library path. ============================================================================ A-Shell Release Notes Version 6.3.1506.1 (11 February 2016) ============================================================================ 1. Support new license format XXXXXXX-XXXXXX-XXXXXX-XXXXXXX (Old format continues to be supported.) 2. Support new LibXL license option. ============================================================================ A-Shell Release Notes Version 6.2.1503.0 (20 January 2016) ============================================================================ 1. Add new MIAMEX function MX_MALLOCLIMIT (185) to get/set the MALLOCLIMIT: xcall MIAMEX,MX_MALLOCLIMIT,op,limit where: op [in] (num) is 0 to get the limit and 1 to set it limit [in/out] (b,4 or f) returns the current limit (op=0) or supplies the new limit (op=1). Units are bytes (not kilo-, mega-, or giga- bytes). Maximum practical limit is 2GB-1 (2147483647). (Feature also added to 6.2.1424.0) 2. Windows UI bug fix: Alt+Enter (to toggle between max and normal main window state) wasn't respecting the -mx command line switch (which removes the min/max/norm buttons from the main window, presumably to prevent the user from changing the window state). (Same patch as in 6.2.1424.1) 3. ISMBLD.LIT 2.1(142) bug fix: the current logged-in device was being stored in the IDX as the IDA device when the /L:# or /B:# switch was being used. The IDA device should have been left blank except in the case an explicit device specification appears on the ISMBLD command line. ============================================================================ A-Shell Release Notes Version 6.3.1502.0 (10 January 2016) ============================================================================ 1. ATE and A-Shell/Windows enhancement: the scrollback buffer has been enlarged from 100 to 200 lines. (Same patch as in 6.2.1422.7) 2. MX_SYNC refinements: Time elapsed in the sync() or fsync() call is now logged (in microsecond units) if the XDEBUG trace flag set. (This was motivated by suspicions that the sync() call is taking longer under CentOS/RHEL 6 and 7 than under CentOS/RHEL 5. Such suspicions can now be easily quantified.) Also, fsyncing now supported for ISAMA files (e.g. XCALL MIAMEX, MX_SYNC, CH {,STS}). (Same patch as in 6.2.1423.0) 3. New ZLOCK mode 55 (ERS custom function.) ============================================================================ A-Shell Release Notes Version 6.3.1501.5 (06 January 2016) ============================================================================ 1. XTREE refinement: Specifying the -$PRINT PopupMenu option was removing the print option from the popup menu, but it was not disabling the ability to print/preview using the built-in ^P command. To disable that, a new Advanced Coldef Option has been added: Print=Disabled Note that it doesn't really matter what follows the = sign - the only option is to disable since the default is for printing to be enabled. (Same patch as in 6.2.1423.0) 2. MX_FIND* bug fix: Specifying the cdate/ctime parameters but not the udate/utime parameters was exposing a loophole which could lead to crashing A-Shell. (Same patch as in 6.2.1423.0) ============================================================================ A-Shell Release Notes Version 6.3.1501.4 (06 January 2016) ============================================================================ 1. Bug fix: the .ash files were getting corrupted after repeated loading/ saving operations. (Introduced in 1422.3; problem can be corrected by re-saving with this version.) (Same patch as in 6.2.1422.8) ============================================================================ A-Shell Release Notes Version 6.3.1501.3 (04 January 2016) ============================================================================ 1. Print filter refinement: filter SBX names can now be up to 10 characters (previously was 6). (Same patch as in 6.2.1423.0) ============================================================================ A-Shell Release Notes Version 6.3.1501.2 (03 January 2016) ============================================================================ 1. INPUT #CH bug fix: When the last line of the input file was longer thanfor i the input variable, if the variable was followed by the byte sequence chr(26) chr(0), the chr(26) was getting set to null. The bug has been there for years, but probably went unnoticed because the conditions for it were fairly rare. (Same patch as in 6.2.1422.7) 2. Increase initial ATE handshake timeout from 3 to 6 seconds. (Same patch as in 6.2.1422.6) 3. XTREE bug fix: When using XTROP_REPLACE to effectively add rows, after previously deleting rows, the new rows were being added properly. (Same patch as in 6.2.1422.5) ============================================================================ A-Shell Release Notes Version 6.3.1501.1 (22 December 2015) ============================================================================ 1. XTREE bug fix: The numpad keys were not working in editable fields with the "#-" or "#." coldef codes. (Same patch as in 6.2.1422.4) ============================================================================ A-Shell Release Notes Version 6.3.1501.0 (21 December 2015) ============================================================================ 1. XCALL SIZE enhancement: new argument (flags) provides ability to return the number of lines or number of non-blank lines (for text files). xcall SIZE, fspec, count {,flags} flags count returns ------ ---------------------------------------------------------- 0 number of bytes in the file 1 number of lines (for text files) 2 number of non-blank lines (for text files) 2. Bug fix/enhancement: Selecting bold option in the system fixed pitch font selection dialog now affects the resulting font. (Same as 6.2.1422.3) ============================================================================ A-Shell Release Notes Version 6.3.1500.1 (07 December 2015) ============================================================================ 1. Bug fix: .ISNULL, .PAGENO, and .LINENO dot functions were not respecting the SCALE directive. (Same patch as 6.2.1422.2) ============================================================================ A-Shell Release Notes Version 6.3.1500.0 (05 November 2015) ============================================================================ 1. New XCALL DYNLIB provides general purpose ability to load and call routines in external DLLs (Windows) or shareable libraries (Linux). Initially reserved for internal use in conjunction with the new LibXL library (see next). To be documented later. 2. LibXL library provides mechanism to read and write XLS files directly, including low level features such as fonts, formats, colors, images, formulas, scroll-lock, individual row/col/cell attributes, etc. Functionality to be exposed to application developers via various API means in subsequent updates.