Standards of the dUFLP Library (written by Jay Parsons) The purpose of this library is to assist programmers using the dBASE language, preferably users of the Borland dBASE products. Contributions of neat ways to do new things, better ways to do old things or just handy routines are earnestly requested. Once accepted, all such routines are considered placed in the public domain, but support from the contributor will be appreciated and may be requested. In order to make the library as useful as possible, please have your contributions adhere to the following standards, which are goals more than rules: Modularity - Contributions should be of procedures or functions that can be used, as far as possible, in any context within the versions of dBASE for which written. Where use of external global variables or files opened before calling the routine is inevitable, the routine header should specify the required environment. Style - Please use the header form, styles of capitalization and naming of variables and other conventions set forth in DHUNG2.ZIP (on COMPUSERVE's dBASE Forum, Library 4). This makes it much easier for readers of items contributed from different sources to find the information they need; it may also be required by library-management programs to assure the inclusion of called routines in files to which the calling routines are copied. Encapsulation - Routines that can reasonably operate without changing any external variables, active windows, etc., without printing to the screen, a printer or a file and without changing any dBASE "SET" items should do so. ALL VARIABLES CREATED WITHIN A ROUTINE SHOULD BE "PRIVATE", AND ALL PARAMETERS LEFT UNCHANGED, to keep changes made within from affecting the outside world. Any departures from complete encapsulation, such as opening or closing files, input, output, changing "SET" items or work areas should be noted in the header. This does not mean a routine should not change such items, but that if it does, it should restore them to the starting status if it reasonably can. This standard is necessarily subjective. One of the nicer routines ( CURRPORT() ) in this release is a workaround for the failure of dBASE IV 1.5 to contain a printerset() function to report what file or device PRINTER is SET to, without which it cannot be reset on exit. The workaround routine is complex and slow enough that it may be preferable simply to note in the header of a routine using printer redirection that the routine changes the setting, leaving it to users to add the code needed to detect the original setting and restore it if it matters to them. Error handling - There is generally no need to handle errors such as calling a routine with the wrong number or type of parameters. This can be left to the calling program or dBASE itself. Handling errors with screen displays of messages, prompts for reentry of data, etc. is sufficiently complex that this too can usually be left to dBASE or the calling program. However, in no case should a function return a value as an error code that might be mistaken for a valid result, such as 0 for the average of numbers in an array if there are no such numbers or array. Something available to the calling routine after the return should be provided that will, if inspected by the calling routine, give it notice that an error has occurred. And, of course, the manner in which the calling routine should check for an error should be documented in the header if not obvious. Planning ahead - The library contains many fine routines that are somewhat obsolete. If contributing one for the future, try to anticipate changes. A center() function that takes a string of characters and prints it in the middle of an 80 x 25 screen is nice, but one that also takes the width and returns the string padded with blanks on the left or both ends to the given width is probably better, because it supports use with screens of other widths or heights, printing the resulting string to a file and other variations. This too is subjective, as anticipating unlikely contingencies will require extra and slowing code. This is your library. Enjoy it, contribute what you can, and please report any bugs or other unexpected results to: Ken Mayer ( CIS: 71043,3232 ) Programmer and Librarian