같같같같같같같같같같같같같같같같 같같같같같같같같같같같같같같같같같같같같같같같같같� 같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같� 같같같갛께껐갛께껐같같께께같갛께께껐갛께께껐갛께께껐같께께같같같같같� 같같같같께 께같께 같같갛� 같갛� 께같께 께같께 께갛� 께같같같같같같 같같같같께 같 갛� 같같같께 같같께 갛� 갛� 갛� 갛� 갛� 께껐� 같같같같같같 같같같같갛� 같같같께 같같같께 같같께께� 갛께께 갛께께 갛께같같같같같같같같 같같같같갛� 같같같께 같껐같께 같같께 같께 께같께 께같� 께껐같같같같같같� 같같같같갛껐갛껐갛� 갛� 같께 같같께 같같갛� 갛� 갛� 갛� 께같께 같같같같같같 같같같같갛께� 께께께� 갛께껐같께께같같께께께 께께께 갛께� 같같같같같� 같같같같 같 같 같� 같같 같 같� 같같같같같 같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같� 같같같같같같같같같같같같같같같같같같같같같같같같같� 같같같같같같같같같같같같같같같같 Volume 1, Number 10 29 Octomber 1991 (c) Daniel Do놽kal, All Rights Reserved The BBS Clipper magazine, published PERIODICALLY, later WEEKLY...... Some of the material used comes from scanning CLIPPER echoes which are carried in various BBS throughout the World. These Echoes are very often the source of the most often asked Questions and Answers about Clipper. Other material, which is fully signed or abbreviated is the copyright of the appropriate persons. The publisher is not responsible for other authors submissions.... Published material is not necessarily the opinion of the publisher. Redaction: Publisher...................................Daniel Docekal Chief editor ...............................Daniel Docekal Language editor .................................Dave Wall Table of Contents 1. ARTICLES .............................................................. 1 The Programmer's Guide to CLIPPER Linkers - part (7) .................. 1 Some improvement to read command line arguments!!! .................... 7 Building code for REAL developers... .................................. 12 2. SOFTWARE .............................................................. 17 List of CLIPPER related areas on CLIPPER BBS HQ system ................ 17 3. ANOMALIES ............................................................. 21 ANOMALIES reports and commets ......................................... 21 Jo French anomalies report, some comments ............................. 21 AEVAL() Undocumented return reference ....................... 21 APPEND FROM Append From Delimited with Character Numbers ........ 22 4. CLIPPER NET ........................................................... 23 Index of described files in Clipper BBS Magazine ...................... 23 5. CLIPBBS ............................................................... 25 CLIPBBS distribution .................................................. 25 CLIPBBS, how to write an article!!! ................................... 26 - - - - - CLIPBBS 1-10 Page 1 29 Oct 1991 ============================================================================== ARTICLES ============================================================================== The Programmer's Guide to CLIPPER Linkers - part (7) 袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴 PRODUCT COMPARISONS 袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴 PLINK86s87 Current Version - Clipper Summer 87 List Price - Supplied with Clipper Summer 87 PLINK86s87 is the linker provided with Clipper and is compatible with all Clipper-compiled objects, Clipper-compiled libraries, the Clipper libraries, and all third-party libraries. PLINK86 is a "static overlay" linker and requires careful overlay design. PLINK86s87 supports overlaying of "MODULES" from libraries to allow you to take simplify your development environment and work from libraries rather than .OBJ files. PLINK86s87 is a mature, reliable linker which is sophisticated enough to handle linking of most large Clipper applications which requires overlays, provided that you are patient enough to analyze your code and structure your overlays properly. RTLINK Current Version - 3.11 List Price - $295.00 RTLINK.EXE is a general-purpose MS-DOS linker for all compiler languages, assembly languages, and Clipper. RTLINK is compatible with the Clipper libraries, Clipper-compiled objects and all third-party libraries. RTLINK is is also compatible with all PLINK86 commands and will link your applications from your existing PLINK86 *.LNK files. RTLINK is both a "static" overlay linker and a "reloadable" overlay linker. It's "reloadable" overlay feature is limited however to C/ASM object files and library modules. All of the modules in CLIPPER.LIB, EXTEND.LIB and most third-party n libraries are reloadable because they were written in C/ASM. CLIPBBS 1-10 Page 2 29 Oct 1991 All Clipper-compiled modules must be placed in "static-overlays" in the same manner as PLINK86. RTLINK also allows use of .PLLs (pre-linked libraries) to help reduce disk space usage of applications. RTLINK is a mature, reliable linker which is sophisticated enough to handle linking of any large application which requires overlays. RTLINK has a "VIRTUAL OVERLAY" feature which provides the added feature of including the DATA portion of object modules into overlay segments, by writing the data to a "virtual overlay" on disk and restoring the data whenever the overlayed code is reloaded into memory. RTLINK supports overlaying of "MODULES" from libraries to allow you to take simplify your development environment and work from libraries rather than .OBJ files. RTLINK is an excellent linker for all applications, but particularly for applications which are C/ASM code intensive and NOT Clipper-code intensive. RTLINKplus Current Version - 4.0 List Price - $495.00 RTLINKplus is an even more sophisticated version of RTLINK which offer much more power in the area of debugging tools. RTLINKplus includes MicroSoft CODE-VIEW support, a sophisticated runtime PROFILER, and an overlay analyzing system which scans .MAP files and produces graphs of overlay usage to help determine the efficiency of your overlay structures. RTLINKplus also includes a VIRTUAL MEMORY LINKING system which allows Microsoft C and MASM programs to automatically execute in all available conventional and expanded memory or in as little as 100k of conventional memory. RTLINK and RTLINKplus are available from: Pocket Soft, Inc. P.O. Box 821049 Houston, TX 77282 Voice: (713) 460-5600 Fax : (713) 460-2651 RTLINK/CLIPPER-5.0 Current version - 3.11 CLIPBBS 1-10 Page 3 29 Oct 1991 List Price - Included with CLIPPER-5.0 RTLINK-CLIPPER/5.0 is a custom version of RTLINK which supports all the basic features of RTLINK but with two important new features: 1. Automatic Clipper-code overlaying - this feature uses a "dynamic-overlaying" technique which automatically manages Clipper-code overlays in an overlay pool at runtime. 2. Incremental linking - this feature provides a faster link cycle than normal linking by maintaining a work file which is a history of past linking sessions. This work file is then used to insure that only the code "changed" since the last link session is linked into the new executable. ALINK Current Version - 1.08 List Price - $195.00 ALINK.EXE is a linker specially designed for Clipper applications. ALINK is compatible with the Clipper libraries and all third-party libraries. ALINK is also compatible with many PLINK86 commands and will link your applications from your existing PLINK86 *.LNK files with some modifications. ALINK is a "dynamic overlay" linker which provides dynamic overlays for Clipper-compiled object files only. ALINK will NOT overlay from .LIBrary files therefore all functions from .LIB files will be linked into the ROOT memory area. ALINK is the only linker which is NOT a stand-alone linking system. It is instead an overlay "pre-processor" which extracts all the code segments from the Clipper-compiled objects down to the function or procedure level, creates an .OVL file of Clipper-executable code, then creates a set of .SYM (symbol) files which are used by PLINK86 or Microsoft LINK to complete the symbol "fix-ups" and generate the .EXEcutable program. ALINK also includes a replacement for OVERLAY.LIB which is the "dynamic overlay" manager. This manager is linked into the .EXEcutable programs and manages the dynamic overlaying of all the Clipper code. ALINK uses the Clipper free pool to link its executable code segments, therefore it is recommended that you use a memory-packing utility and call the AL_FLUSH() function regularly in your ALINK-ed programs to reduce memory fragmentation. ALINK is an excellent linker for applications which are Clipper-code intensive. If you use many functions from third- party libraries, then ALINK will not allow these to be overlayed. CLIPBBS 1-10 Page 4 29 Oct 1991 ALINK is a available from: Accfin Software 329 North State St. Orem, UT 84057 1-(800) 336-6644 BLINKER Current Version - 1.3 List Price - $189.00 BLINKER.EXE is a linker specially designed for Clipper applications. BLINKER is compatible with the Clipper libraries, and all third- party libraries. BLINKER is also compatible with many PLINK86 commands and will link your applications from your existing PLINK86 *.LNK files with some modifications. Like ALINK, BLINKER is a "dynamic overlay" linker which provides dynamic overlays for Clipper-compiled objects and "some" C/ASM objects. BLINKER will allow overlaying of entire libraries with the "ALLOCATE" command. This is not always a useful feature because very few libraries have modules which are ALL compatible with BLINKER. BLINKER requires that C/ASM modules be "well- behaved". The EXTEND.LIB library is an example of a well-behaved library, therefore, it may be ALLOCATEd in an overlay section. BLINKER's dynamic overlay manager works excellently with Clipper-compiled code and the EXTEND.LIB library. Once you start experimenting with other libraries, you may find that it is not worth the effort to go any further. Some third-party library developers such as FUNCKY, FLIPPER, dCLIP, etc. have released new versions of their libraries which are broken out into "resident" and "overlayable" to be fully compatible with BLINKER. BLINKER provides the best memory management solution for Clipper- code intensive .EXEcutable applications. BLINKER is not a simple linker. It also imbeds functions into the linked program which are called between loading of overlay segments for "memory-packing" to help reduce the memory fragmentation caused by "dynamic- overlaying". This may cause problems with any non-standard memory allocation techniques you may have built into your application and should be taken into consideration. BLINKER supports special profiling features, incremental-linking, and allows "burning" of the SET CLIPPER environment into the .EXEcutable program. BLINKER evolved from ALINK's technology therefore it accomplishes CLIPBBS 1-10 Page 5 29 Oct 1991 its "dynamic-overlaying" in much the same manner, however it is a stand-alone linker and is 5 to 10 times faster than ALINK in producing an executable program. BLINKER is available from: BLINK, Inc. P.O. Box 7154 Richmond, VA 23221-0154 Voice: (804) 353-0137 Fax : (804) 355-1676 WARPLINK Current version - 1.50b List Price - $250.00 WARPLINK is a general-purpose linker designed for "dynamic- overlay" applications. WARPLINK is compatible with the Clipper libraries, and all third-party libraries. WARPLINK is NOT compatible with PLINK86 commands and will NOT link your applications from your existing PLINK86 *.LNK files. WARPLINK is a "dynamic overlay" linker which provides dynamic overlays for Clipper-compiled objects and "some" C/ASM objects. WARPLINK will allow overlaying of called modules from complete libraries by including the library name in (parenthesis). Like BLINKER, WARPLINK requires that C/ASM modules be "well- behaved". Because WARPLINK is a general-purpose linker it is more compatible with third-party libraries than BLINKER, and it produces as memory-efficient executables as BLINKER. There are applications, however, where WARPLINK will create better memory models than BLINKER due to its ability to overlay code not manageable by BLINKER and other situations where WARPLINK will create better speed performance than RTLINK because its "overlay-pool" technique is more efficient than RTLINK's disk- intensive "overlay-reloading". WARPLINK "learns" how to manage the pool most efficiently while the application is running. WARPLINK can overlay entire libraries but is NOT capable of overlaying "MODULES" like PLINK86 and RTLINK. WARPLINK also includes portions of the SMARTMEM (tm) library by Steve Steiner for memory profiling and memory defragmentation. WARPLINK works with all languages and can create .COM files directly from .OBJ files for much smaller non-Clipper applications. It also supports incremental linking by re-linking only the modules which have been changed. CLIPBBS 1-10 Page 6 29 Oct 1991 WARPLINK also includes a symbol-compacting utility which produces a second .EXE from the original .EXE and removes all duplicate (redundant) symbols from the symbol table to improve memory performance. This eliminates the need to compile your .PRGs into large objects using .CLP files. WARPLINK is an excellent linker for all applications. What it lacks in features, it more than makes up for in performance. WARPLINK is a available from: Hyperkinetix, Inc. 666 Baker #405 Costa Mesa, CA 92626 (714) 668-9234 ------------------------------------------------------------------------------ CLIPBBS 1-10 Page 7 29 Oct 1991 `C' Style ArgC() and ArgV() Function For Clipper 5.01 ===================================================== By David A Pearson. ------------------- After reading about the Exe_Path() function by Terry Carmen back in issue 1-02 I decided that it would be nice to expand on the idea and include a set of ArgC() and ArgV() functions in my library. Given below is the source for the functions I developed. The approach I took was to grab the whole command line from the PSP block and then write a Clipper function to `split' the command line in the same way that `C' does when your applications starts up. First off, the function for grabbing the command line: ;***************************************************************************** ; File....: _GETARGS.ASM * ; By......: David A Pearson * ; Function: Provides an internal function for getting the arguments passed * ; ........: to a clipper program. * ;***************************************************************************** Public _GetArgs Extrn __RetCLen:Far _GetArgs_Text Segment 'CODE' Assume CS:_GetArgs_Text ;***************************************************************************** ; Function: _GetArgs() * ; Syntax..: _GetArgs() --> cArgString * ; Usage...: Returns the argument string passed to the clipper program. * ; By......: David A Pearson. * ;***************************************************************************** _GetArgs Proc Far Push BP ; Save registers Mov BP,SP Push DS Push ES Push SI Push DI Mov AH,62h Int 21h ; BX now contains segment for PSP. Mov ES,BX Mov SI,80h ; Offset for arg' string size byte. ; Move size into AL. Mov AL,Byte Ptr ES:[SI] Xor AH,AH ; Zero AH. Push AX ; Place size onto stack. Inc SI ; Point to start of string. CLIPBBS 1-10 Page 8 29 Oct 1991 Mov AX,ES ; Move the segment of the string into ; AX. Mov BX,SI ; Move the offset of the string into ; BX. Push AX ; Place segment and offset onto the Push BX ; stack. Call __RetCLen ; Call Clipper with the string. Add SP,6 ; restore the stack. Pop DI ; Restore registers Pop SI Pop ES Pop DS Pop BP Ret ; And back we go _GetArgs EndP _GetArgs_Text EndS End I'm not too sure if this code will overlay very well with the likes of Blinker, but I'm sure that the ASM programmers among you will be able to sort that out! Now that we have a method of grabbing the command line we need to split it down into a usable form. Source code follows: /***************************************************************************** * File....: ARGS.PRG * * By......: David A Pearson * * Function: Provides a set of functions for getting at the command line * * ........: arguments in a 'C' style. * * Notes...: Compile with switches /n/w * * ........: Please note that the first time you call either ArgC() or Argv() * * ........: the function SetArgs() will be called. SetArgs() in turn calls * * ........: _GetArgs() to retrieve the command tail from the PSP block. It * * ........: then goes on to parse the string and split it up as 'C' would * * ........: before your program executes. * * ........: Because of this initial delay you may wish to make a dummy call * * ........: to one of the functions at the start of you application. * *****************************************************************************/ #define SLASH_R chr(13) // \r is an argument separator. #define SLASH_T chr(9) // \t is an argument sepatator. #define ARG_SEPARATORS " "+SLASH_R+SLASH_T #xtranslate PrevChar(,) ; => ; if( > 0,substr(,-1,1),"") static nArgC := NIL static aArgV := {} CLIPBBS 1-10 Page 9 29 Oct 1991 /***************************************************************************** * Function: ArgC() * * Syntax..: ArgC() --> nNumberOfArguments * * Usage...: Returns the number of arguments passed to the Clipper program. * * By......: David A Pearson * *****************************************************************************/ function ArgC() if nArgC == NIL SetArgs() endif return(nArgC) /***************************************************************************** * Function: ArgV() * * Syntax..: ArgV([]) --> cArg | aArgs * * Usage...: If is passed it returns the argument at the position * * ........: indicated by the index. If called with no parameter it returns * * ........: an array of all arguments. * * By......: David A Pearson * *****************************************************************************/ function ArgV(nArgIndex) local acReturn := NIL if nArgC == NIL SetArgs() endif if valtype(nArgIndex) == "N" if nArgIndex > 0 .and. nArgIndex <= nArgC acReturn := aArgV[nArgIndex] else acReturn := if(nArgIndex == 0,Exe_Path(),"") endif else acReturn := aArgv endif return(acReturn) /***************************************************************************** * Function: SetArgs() * * Syntax..: SetArgs() --> NIL * * Usage...: Internal function to read in the command line and split it into * * ........: it's componant parts in a style similar to 'C'. * * By......: David A Pearson * *****************************************************************************/ static function SetArgs() local cCommand := alltrim(_GetArgs()),; cThisArg := "" ,; cThisChar := "" ,; lInQuotes := .F. ,; nLoopCounter := 0 if empty(cCommand) nArgC := 0 else for nLoopCounter := 1 to len(cCommand) CLIPBBS 1-10 Page 10 29 Oct 1991 cThisChar := substr(cCommand,nLoopCounter,1) do case case cThisChar $ ARG_SEPARATORS .and. !lInQuotes if !(PrevChar(cCommand,nLoopCounter) $ ARG_SEPARATORS); .and. !empty(cThisArg) aadd(aArgV,cThisArg) cThisArg := "" endif case cThisChar == "\" if substr(cCommand,nLoopCounter+1,1) != '"' cThisArg += cThisChar endif case cThisChar == '"' if PrevChar(cCommand,nLoopCounter) == "\" cThisArg += cThisChar else if lInQuotes aadd(aArgV,cThisArg) cThisArg := "" else if !(PrevChar(cCommand,nLoopCounter) $ ARG_SEPARATORS); .and. !empty(cCommand) aadd(aArgV,cThisArg) cThisArg := "" endif endif lInQuotes := !lInQuotes endif otherwise cThisArg += cThisChar endcase next if !empty(cThisArg) aadd(aArgV,cThisArg) endif nArgC := len(aArgV) endif return(NIL) Please note that for ArgV() to work correctly you should include the Exe_Path() function in your application. ArgC() returns the number of paramaters passed on the command line, for example: nPassed := ArgC() ArgV() returns the actual value of the parameter, for example: function ShowArgs() local nArg := 0 for nArg := 0 to ArgC() ? ArgV(nArg) next return(NIL) CLIPBBS 1-10 Page 11 29 Oct 1991 would display a list of all arguments passed. Note that calling ArgV() with a value of 0 is the same as calling Exe_Path(). Also, you can call ArgV() with no parameters to get an array of all passed parameters. For example: function ShowArgs() local aArgs := ArgV() aeval(aArgs,{|element| qout(element)}) return(NIL) Please note that the returned array does *not* contain the output from Exe_Path(), Clipper isn't too keen on you asking for element 0 of an array! Using a ArgV()/ArgC() approach in your application has a couple of advantages. First, you can get access to the command line from any point in your system, not just from the top level function/procedure. Also, you can cater for a variable number of parameters. By using ArgV() you can also detect the Clipper // paramaters too, for example you can check if //F has been passed on the command line. I hope this is of use to someone. I developed these more for fun than anything else, and I must admit I've not used them for anything yet! __DavePearson() ------------------------------------------------------------------------------ CLIPBBS 1-10 Page 12 29 Oct 1991 BUILDING CODE FOR REAL (estate?) DEVELOPERS ----------------------------------------------------------- Copyright (C) G. L. Jereza 1991 All Rights Reserved. Developing software is very much like building a house. Let's look at two similarities and briefly elaborate on one. First, the system analyst is, in many ways, like the architect; the system designer is like the contractor; and the programmer the craftsman. And second, just as a house must be built with a set of building codes, so must a program be written according to design and coding standards. Standards are the application's bedrock. The standards in here come from several sources. Most are from personal experience. The others are from other language norms, or were adapted from Simonyi's Hungarian notation methodology, as well as other sources. The selection was, well ... eclectic. These standards have somewhat overlapping objectives: 1. improve maintainability 2. save time thinking about variable names 3. save effort entering unnecessary keystrokes 4. make debugging easier, and 5. encourage consistency through documentation The common theme is speed. However, since software evolve or die, the primary objective is to improve maintainability. In the long term, these standards are more economical than new hardware. Successful implementation, however, require consistent use, and of course, that both designer and programmer exercise discipline and a sense of idealism. Enough said. CLIPPER 5 DESIGN AND CODING STANDARDS Rule 1: Establish a clear objective. Remember that a problem understood is half solved. Use one sentence to describe it and several qualifiers to address 'doability' (including features), time, and cost constraints. Example: An interpreter module for Clipper. - IDE like QuickBasic 4.5 - x guru year(s) - priced less than $100 Once the objective has been created, stand by it. If the pressure to change becomes unbearable, then call it something else. A new version perhaps? (A very wicked grin is appropriate here). Or start a new project! (Easy to do when you have not invested your CLIPBBS 1-10 Page 13 29 Oct 1991 ego, or too much time, into that old project). Often times, it is far easier to start from the beginning as compared to modifying code. Rule 2: Define file structures and relationships, and normalize data (remove subcategories). Start a data dictionary where all the terms are defined. The key word here is 'start'. Rule 3: Avoid coding until the very last. Use pseudocode or structured English. Prototype as soon as possible. Draft a user's manual. Get user feedback. Make sure you WILL have users. Realize that there is no right way of doing the wrong thing. Rule 4: Code the program in three stages: First, make it work. Second, make it look good. Last, optimize the code. Test top modules first (i.e. top-down design). Use 'stubs' for lower modules. Rule 5: Avoid overly clever or convoluted code (e.g. compound Boolean expressions). Period. Rule 6: Practice good system design. Checklist: __ Modules should be functionally cohesive. Do not combine unrelated processes into meaningless modules. Avoid procedures. Use functions. __ Modules should be loosely coupled. Few data elements should be shared between module i.e. a module should not modify the internal logic or data of another module. Use local and static variables. __ A module should not call more than approximately half a dozen lower-level modules. __ Any module affected by the outcome of a decision should be subordinate to the module that affects the decision (though not necessarily the immediate subordinate). Rule 7: Design a user-friendly interface. This means you must design for the user and you must know your subject. Checklist: __ Maintain the user's interest. __ Orient the user (e.g. number screens). __ Communicate in concrete and specific terms. __ Request inputs and produce outputs in consistent terms. __ Ask for information in a logical sequence. __ Make it obvious what kind of error was commited and where. __ Provide a way to cancel part or all of the transaction. __ Provide a convenient help mechanism. __ Give the user control. CLIPBBS 1-10 Page 14 29 Oct 1991 __ Keep the user informed at all times. __ Provide defaults for standard inputs. __ Take advantage of color and sound, but don't overdo it. __ Focus the user's attention e.g. a cursor. People focus on one concept at a time. Do not focus on the technology. __ Keep it simple even if it means code complexity. Avoid unnecessary parts. Avoid the feature-creature. Rule 8: Do not re-invent the wheel. Do what CPAs (certified public accountants) do: cut, paste, and attach. Isaac Newton said, "If I have seen further, it is by standing on ye shoulders of giants". Re-use code, but do not code for re-usability (unless this is *the* objective). Rule 9: Write clear code, and complete but concise comments. Checklist: __ Lower case all native language words. Exceptions: a. FUNCTION, RETURN, LOCAL, STATIC, and FIELDS. b. Object oriented export instance variables. Example: oBrowse:getColumn(oColumn) ^--- lowercase tagname. __ Begin user-defined functions with Capital letters. Start functions from a 3rd party source with a "3". (What?! You don't have the source code?). Use UpperLower combinations to delimit identifiers, e.g. FirstName. Also, start conversion functions with the value they take and end with the converted value separated by the number 2. __ Prefix all variables with a character type prefix: a - Array o - Object b - Code block s - Screen variable c - Character k - Color string d - Date m - a variable in .mem file l - Logical z - miscellaneous or catchall n - Numeric Use the single type-prefix character for temporary variables. __ Express file names in capital letters. Begin file names with a common prefix. Index files should reflect the file that they belong to but not what the index expression is. Example: CLIPBBS 1-10 Page 15 29 Oct 1991 Correct: NAMES.DBF ---> NAMES1.NTX NAMES2.NTX Wrong: NAMES.DBF ---> NAMESF.NTX NAMESL.NTX Also, reference all fields with an alias. __ Layout each code page in an orderly manner. Avoid writing lines that extend beyond the visible right margin. Use continuation symbols. Indent logical levels 3 spaces. Do not use tabs. Use parentheses liberally. Use a full screen width line of dashes to delineate a logical break in a program file. __ Use a standard 'header' for each program file. Example: Name .......: 3GOOD() Description.: Check code integrity. Syntax .....: 3GOOD() Returns ....: Logical Called by...: Main() Calls.......: -none- Example ....: if !3GOOD() zap endif Comments....: Function from Free Inc. __ Limit module listings to 54 lines or 1 page. Large complex modules should be broken into submodules. On rare ocassions, trivial modules consisting of two to three lines, can be combined into a supermodule. __ Use version control software to document code during development. __ Use include files. __ Ideally, final code should be self - documenting. Four letter command abbreviations are counter-productive. Like code, comments should be modular. No references to other sources (other than in the header) allowed. __ Compile using the following example: CLIPPER filename [/m/n/s/m | /m/n/b/p] __ Link using the following example: RTLINK FI filename VE 2 LIB 3freelib PLL base50 Rule 10: Test your application with this in mind: "testing can show the presence, but never the absence of CLIPBBS 1-10 Page 16 29 Oct 1991 errors". Where the documentation and the software are inconsistent with each other, generally assume that the error is in the software (or as our publish- er is fond of saying, 'reality is different'). That's it. Just like the ten commandments. And like the ten commandments, the list is not all inclusive or comprehensive. It is aimed toward smaller projects. In those instances, it worked for me. And it should work for you too. ------------------------------------------------------------------------------ CLIPBBS 1-10 Page 17 29 Oct 1991 ============================================================================== SOFTWARE ============================================================================== List of CLIPPER related areas on CLIPPER BBS HQ system Mentioned files are available on NETCONSULT BBS, 31-10-4157141 (working hours, workdays 18:00->08:00, weekends 24hours/day) Speeds 1200bps -> 14400bps (V32 modem) FIDONET 2:285/608, Signet 27:1331/4412 郞袴袴錮袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴� � # 53 � CLIPPER related utilities *CL* Access Level : 10 � 쳐컴컴컨컴컴컴컴컴컴컴컫컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컫컴컴컴컴컴컴컴컴컴컴컴� � 같같갚굇굇께께꾼栢栢 � 153 KBytes in 2 Files � 栢栢昉께께굇굇굅같같 � 突袴袴袴袴袴袴袴袴袴袴賈袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴賈袴袴袴袴袴袴袴袴袴袴袴� XREF140C.ZIP 152610 10-17-91* [002] DBase/Clipper DBF and NDX/NTX Documentation Tool 郞袴袴錮袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴� � # 54 � CLIPPER text&.NGuides *CL* Access Level : 10 � 쳐컴컴컨컴컴컴컴컴컴컴컫컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컫컴컴컴컴컴컴컴컴컴컴컴� � 같같갚굇굇께께꾼栢栢 � 1499 KBytes in 42 Files � 栢栢昉께께굇굇굅같같 � 突袴袴袴袴袴袴袴袴袴袴賈袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴賈袴袴袴袴袴袴袴袴袴袴袴� -旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴커 -� TEXT FILES about/around CLIPPER 넸 -� 넸 -읕컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴켸� - 賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽 RELCLIP5.ARJ 59424 06-11-91 [002] Release note in WP 5.1 format - THis file uploaded by somebody there maybe for making betters - score of Download:Upload ratio contains complete text of release - note about Clipper 5.01. NED.TXT 2271 05-07-91 [002] lezen van commandline (clipper 5.0 + EXPAND.LIB) - Sample text about reading a command line parameters from inside - of Clipper more universal than PARAMSTR() function. (Dutch text) SHARE.MSG 6028 09-30-90 [001] Text about using SHARE.EXE with CLIPPER - Usefull text explaining SHARE.EXE command from MS DOS. Especialy - usefull because written from point of view CLIPPER. CL50PRG.ARJ 25684 09-16-91 [002] Discussion about 5.0 from CW on Nantucket - Discussion about Clipper 5.0x from CLIPPER WORLD. CLIPPER World is - Nantucket BBS in UK and contains areas for CLipper with direct - support of Nantucket stuff in England. CLIPLINK.ARJ 38148 09-06-91 [002] documentation about LINKERs for CLIPPER - 굅� Document about CLipper linkers. Giving complete list of linkers for - 굅� clipper. Compares them and explaining all linking and overlaying - 굅� methods. Giving explanation about how to static overlay clipper and - 굅� how to control some from linkers. VERY GOOD text. CLIPBBS 1-10 Page 18 29 Oct 1991 CLPGUID4.ARJ 29404 04-14-91 [002] Errate of programs for Rick Spence's book - This is a complete set of programs used in Rick Spences's book about - Clipper, together with fixes of mistakes inside. -旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴커 -� NORTON GUIDES or another help for CLIPPER 넸 -� 넸 -읕컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴켸� - 賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽 50NGCH.ARJ 9583 01-06-91 [002] Norton Guide for Clipper 5.0 header files - This is ONLY a complete .NG database contains all .CH file coming - with CLIpper 5.0. It's nice to have it sometime when one is - interested in some constants or structures stored inside of this - header files. -旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴커 -� NANTUCKET and ANOTHER CLIPPER NEWSLETTERs.... 넸 -� 넸 -읕컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴켸� - 賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽 NN0101.ARJ 9869 12-11-90 [002] Nantucket News Volume 1 Number 1 NN0102.ARJ 17079 12-11-90 [000] Nantucket News Volume 1 Number 2 NN0103.ARJ 17921 12-11-90 [000] Nantucket News Volume 1 Number 3 NN0104.ARJ 8164 12-11-90 [000] Nantucket News Volume 1 Number 4 NN0201.ARJ 7576 12-11-90 [000] Nantucket News Volume 2 Number 1 NN0202.ARJ 18900 12-11-90 [000] Nantucket News Volume 2 Number 2 NN0203.ARJ 3205 12-11-90 [000] Nantucket News Volume 2 Number 3 NN0204.ARJ 9125 01-04-91 [000] Nantucket News Volume 2 Number 4 NN0301.ARJ 16109 12-11-90 [000] Nantucket News Volume 3 Number 1 NN0302.ARJ 12296 12-11-90 [000] Nantucket News Volume 3 Number 2 NN0303.ARJ 15879 12-11-90 [000] Nantucket News Volume 3 Number 3 R(C)0206.ARJ 47402 12-11-90 [000] Reference Clipper Volume 2 number 6 R(C)0209.ARJ 69086 12-11-90 [000] Reference Clipper Volume 2 number 9 R(C)0210.ARJ 141162 12-11-90 [000] Reference Clipper Volume 2 number 10 R(C)0211.ARJ 97237 12-11-90 [000] Reference Clipper Volume 2 number 11 R(C)0212.ARJ 123300 12-11-90 [000] Reference Clipper Volume 2 number 12 R(C)0306.ARJ 19940 09-12-90 [000] Reference Clipper Volume 3 number 6 R(C)0307.ARJ 48238 12-11-90 [000] Reference Clipper Volume 3 number 7 R(C)0310.ARJ 125633 09-12-90 [000] Reference Clipper Volume 3 number 10 R(C)0311.ARJ 127102 09-12-90 [000] Reference Clipper Volume 3 number 11 R(C)0312.ARJ 201636 09-12-90 [000] Reference Clipper Volume 3 number 12 TIPS_1.ARJ 4708 08-20-91 [001] Another ROGER DONNAY text about TIPS_2.ARJ 3770 08-15-91 [001] Clipper, Linking, Overlaying TIPS_3.ARJ 5064 08-15-91 [002] And other usefull things CLPFON.ARJ 54373 09-10-91 [001] Some EGA/VGA Clipper Fonts, needs Expand Lib CL5103.ARJ 28749 09-16-91 [003] Anomaly report No. 3 for Clipper 5.01 ALTDO328.ARJ 25805 09-16-91 [001] Fast, small DBF file utility CLIP110.ARJ 27114 09-16-91 [001] Clip 1.10, easy MAKE for Clipper '87 & 5.0x CL-ROUTE.263 4499 09-21-91 [000] CLN routing plan for Friday, 20 Sep 1991 SCANCODE.ARJ 2154 09-27-91 [000] dbf-file with all ScanCodes CL-ROUTE.270 5109 09-28-91 [000] CLN routing plan for Friday, 27. Sep 1991 FECHO.DAT 512 10-15-91* (yet to be descriped) CLIPBBS 1-10 Page 19 29 Oct 1991 -------------------------------------NEW_------------------------------- CL-POL.007 3319 10-14-91* CLN policy No. 07, Sunday, 13. Oct 1991 CL-ROUTE.286 5686 10-14-91* CLN routing plan for Sunday, 13. Oct 1991 CTNEWS01.ARJ 21220 10-14-91* [001] Deutsche Clipper News Ausgabe 1 von Henry Jalbuena (2:246/14.5) 郞袴袴錮袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴� � # 55 � CLIPPER libraries *CL* Access Level : 10 � 쳐컴컴컨컴컴컴컴컴컴컴컫컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컫컴컴컴컴컴컴컴컴컴컴컴� � 같같갚굇굇께께꾼栢栢 � 1072 KBytes in 14 Files � 栢栢昉께께굇굇굅같같 � 突袴袴袴袴袴袴袴袴袴袴賈袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴賈袴袴袴袴袴袴袴袴袴袴袴� -旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴커 -� LIBRARIES for Clipper - all kinds 넸 -� 넸 -읕컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴켸� - 賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽賽 CLIP327.ARJ 13141 03-17-90 [000] 5.0x Communication CLIPPER<-->IBM3270 - This is .LIB file which will allow to connect Clipper application - to IBM3270 communication. CLPNET.ARJ 8855 07-11-90 [003] 5.0x NOVELL Bindery functions Library - .LIB file for accessing bindery informations from NOVELL bindery. - Novell bindery contains all informations about users and objects - inside of server. Therefore can be very useful to have access to - this kind of informations. LXNET.ARJ 18048 09-30-90 [002] 5.0x NOVELL Bindery and printing - This is a another version of CLPNET.ARJ. Adding some possibilities - to access a printing abilities of Novell Netware. MOUS50.ARJ 13507 03-23-91 [001] 5.0x mouse library - Complete MOUSE library for use in Clipper 5.0x applications. - Of course is NOT supplied source, only .LIB file. CLIPFPCX.ARJ 34268 05-24-91 [004] S87 5.01x Clipper s87/5.01: "Fast" PCX - 굅� VERY good library for VERY FAST displaying a PCX file to display - 굅� of your computer. Working really very fast and taking very small - 굅� part of memory for to do it. VWINDOW.ARJ 11257 05-16-91 [005] 5.0x Windowing library for CLipper - This is a library with documentation for windowing system for use - with Clipper 5.0x. Seems nice, but i have my own one. AHELP5.ARJ 197215 05-16-91 [001] Complete Linkable (.LIB) help - This library is offering complete HELP system with all normal - HELP possibilities. There is also good documentation for it. TRL.ARJ 311671 04-04-91 [002] 5.0x Tom Rettig Library for Summer+5.0 - 굅� Well known library with mostly low level functions. Now it's - 굅� totally free for use and is coming together with ALL sources. - 굅� EXPAND50.ARJ 78090 04-04-91 [001] 5.0x Expand Library for CLIPPER 5.0 EXPAND52.ARJ 87272 06-18-91 [002] 5.01 Expand library v2.00 EXPAND30.ARJ 65418 08-29-91 [001] S87 Expand Library for Summer 87 - 굅� Dutch origin library. Very good combination of low level and - 굅� high level functions for all kind of system dependent functions. - 굅� Modem communication, mouse, PRINT support and number of next - 굅� well usefull functions. This is really VERY good library. V2.00 - 굅� lot of new function which are really very nice! TSDWIN10.ARJ 27895 03-06-91 [002] 5.0 Another windowing library CLIPBBS 1-10 Page 20 29 Oct 1991 - Complete windowing library for CLipper 5.0 which seems be a good. - I didn't test this library but probably i will do this because - seems to be really nice. 3PX50.ARJ 65134 11-24-90 [000] Another Library for Clipper - some function to improve your programs... CLHLP100.ARJ 140920 07-04-91 [001] Create Help utility for your program.!! - Library for both versions of Clipper S87 and 5.01 ------------------------------------------------------------------------------ CLIPBBS 1-10 Page 21 29 Oct 1991 ============================================================================== ANOMALIES ============================================================================== ANOMALIES and their comments This part of Clipper BBS Magazine is dedicated to all discovered anomalies and comments about them in Clipper products. Because Nantucket is still unable to give own bug and anomalies reports (as actually did in past with Summer 87 version) is very handy to have results of many investigations done on many user places. I'm also doing my own investigatings, because i'm always very good when someting has hidden problems. Everything what i buy will first show all problems and then all normal things. This amazing part of my live is sometime making me crazy, but for testing of programs it's great . Daniel ------------------------------------------------------------------------------ Jo French anomalies report, some comments Following serie of anomalies and comments to them is using as basis complete JO FRENCH anomaly report (file CL5103.NG), eventually later version (5104 is slowly coming somewhere around). Because i'm not member of Compuserver and from Europe is Compuserver one from most expensive and most hard accesible medias to acces, i want to comment some Jo French reported anomalies here. Maybe he will get all this commment and will be able to update his report for new things from mine and also for some commented facts. Jo French is making great deal. For 5.0 version of CLipper it was wonderfull job to collect all those bugs (anomalies so called) and in this time Jo's report was very good with very good checking. Probably during time and lot of work it's sometime loosing quality of previous reports. Because i'm keeping also mine personal buglists, my investigations of all Jo's reported problems is sometime different. Therefore i want to pick up those differences and hope that someone else will be able to give me additional informations to finish my private research. Daniel ------------------------------------------------------------------------------ AEVAL() Undocumented return reference. Problem Statement AEVAL() documentation does not mention the presence of a second return reference; i.e., the element number. ---COMMENT--- CLIPBBS 1-10 Page 22 29 Oct 1991 Maybe my english knowledge is not enough good to understand this simple sentence , but i don't see any possibility to have presence of a second return reference from one function. Only via changing directly some parameter of function, but how two returns? JO, if you are reading this, please try to keep good work which i saw in all 5.0 version reports and complete all description to be enough clear and descriptive. .DD. ------------------------------------------------------------------------------ APPEND FROM Append From Delimited with Character Numbers. Problem Statement APPEND FROM DELIMITED does not translate numbers enclosed in quotes to numerics for input to a numeric field. ------COMMENT----- Maybe i'm missing some background of this problem, but when i'm creating test program like this: 旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴� � #define VARSIZE 128 � � dbcreate('test01.dbf',; � � { {"CHARS", "C", VARSIZE , 0 },; � � {"NUMBR", "N", 12 , 2 } }) � � � � use TEST01 � � append from test.txt delimited � 읕컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴� Then creating file TEST.TXT with text for append: 旼컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴� � 1,1 � � "2","2" � � 3,3 � � "4","4" � � 5,5 � � "6","6" � � 7,7 � � "8","8" � � 9,9 � 읕컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴� Result is as expected. Numeric field correctly filled with numbers coming from appended text, never mind if closed in quotes or not. Has anybody around some other experience? .DD. ------------------------------------------------------------------------------ CLIPBBS 1-10 Page 23 29 Oct 1991 ============================================================================== CLIPPER NET ============================================================================== Following is COMPLETE list of all published file descriptions in Clipper BBS magazine in previous numbers. Purpose of this index list is to allow anybody find needed file descriptions in growing number of described files. Short description after name will give first possible close image about file. Number enclosed in "[]" will mean number of Clipper BBS magazine. 旼컴컴컴컴컴컴쩡컴컫컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴쩡컴컴커 쿑ileName 쿞rc 쿏escription 쿥here � 쳐컴컴컴컴컴컴탠컴컵컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴탠컴컴캑 쿌CCESS.ARJ 쿎ln 쿞ource of speed testing program �[1-06]� 쿌CH2TB.ARJ 쿎ln 쿎onvert ACHOICE to TBROWSE �[1-05]� 쿌CHOO2.ARJ 쿎ln 쿝eplacement of ACHOICE with GET possibilites �[1-06]� 쿌DHOC302.ARJ 쿎ln 쿞ummer 87 inteligent report program �[1-04]� 쿎ALC14.ARJ 쿎ln 쿛oPup Calculator �[1-08]� 쿎L5103.ARJ 쿎ln 쿝eport of 5.01 anomaly number 3 �[1-04]� 쿎L5REP6.ARJ 쿎ln �5.01 replacement of REPORT command �[1-04]� 쿎LIP110.ARJ 쿎ln 쿎lipper Documentor program �[1-05]� 쿎LIPLINK.ARJ 쿎bs 쿎omplete text of R.Donnay about linkers �[1-04]� 쿎LIPSQL.ARJ 쿎ln 쿏emo of complete SQL library for CLipper �[1-05]� 쿎LPFON.ARJ 쿎ln 쿞et of fonts for EXPAND.LIB from author �[1-03]� 쿎OND.ARJ 쿎ln 쿍uilder of conditional indexes like SUBNTX �[1-03]� 쿏BSCN2.ARJ 쿎ln 쿞creen designer generator �[1-05]� 쿏IAL.CLN 쿎ln 쿏ialer with using of FOPEN() �[1-07]� 쿏OC111.ARJ 쿎ln 쿏ocumentor, newer version �[1-08]� 쿒SR151.ARJ 쿎ln 쿒lobal Search and replace for programmers �[1-07]� 쿓GLASS.ZIP 쿎ln 쿓our glass for indication of index progression �[1-04]� 쿔NDXSL.ARJ 쿎ln 쿢ser Fields selection builder for index generate�[1-03]� 쿔OBASYS9.ARJ 쿎ln 쿏emo of S87 library and calling Clipper from C �[1-03]� 쿕G2.ARJ 쿎ln 쿕umping between GET statements in READ �[1-08]� 쿖F_LOKUP.ARJ 쿎ln 쿞et of program for database relations �[1-07]� 쿗UTLIB.ARJ 쿎ln 쿌nother Clipper library �[1-08]� 쿘K30.ARJ 쿎ln 쿘ouse library demo version �[1-03]� 쿘OVEGETS.ARJ 쿎ln 쿒ETSYS change for moving between gets via VALID �[1-03]� 쿙FDESC2.ARJ 쿎ln 쿙anForum library description list �[1-06]� 쿙FLIB2.ARJ 쿎ln 쿙anForum library main file �[1-06]� 쿙FSRC2.ARJ 쿎ln 쿙anForum library Source files �[1-06]� 쿙OTATION.ARJ 쿎ln 쿎omplete text of article about hungarian notat. �[1-04]� 쿚OPSCL5.ARJ 쿎ln 쿌nother version of pseudo objects �[1-07]� 쿛ACKUP.ARJ 쿎ln 쿌SM source of PACK/UNPACK replacement SCRSAVE.. �[1-04]� 쿛AT1.ARJ 쿎ln 쿎IX NanForum Libraryy PATCH �[1-07]� 쿛OPUPCAL.ARJ 쿎ln 쿛opup calender �[1-05]� 쿛OWER10.ARJ 쿎ln 쿑rench library �[1-07]� 쿝EADPW.ARJ 쿎ln 쿒ETSYS change for password invisible reader �[1-03]� 쿞CANCODE.ARJ 쿎ln 쿏atabase with scan codes �[1-07]� 쿞CRSAVE.ARJ 쿎ln 쿞creen AntiBurning utility (inactivity snake) �[1-05]� 쿞HELP50A.ARJ 쿎ln 쿞uperHelp for Clipper �[1-07]� 쿞OUND.ARJ 쿎ln 쿘ultiple TONE() used as one SOUND function �[1-06]� 쿞YMBOL.ARJ 쿎ln 쿏umper of symbol tables of Summer87 .EXE �[1-03]� 쿟BWHL4.ARJ 쿎ln 쿥HILE browsing using TBROWSE, well commented �[1-06]� 쿣SIX711.ARJ 쿎ln 쿣ernon Six Clipper utilities and library �[1-05]� CLIPBBS 1-10 Page 24 29 Oct 1991 읕컴컴컴컴컴컴좔컴컨컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴좔컴컴켸 Src can be: Cln File is accesible on ClipperNet Cbs File is accesible in HQ BBS of CLipper BBS Magazine ------------------------------------------------------------------------------ CLIPBBS 1-10 Page 25 29 Oct 1991 ============================================================================== CLIPBBS ============================================================================== CLIPBBS Distribution CLIPBBS is special magazine about CLIPPER and CLIPPERing (or about another related problems and xBASE languages). This magazine is for free and articles aren't honored. Nobody can make a profit from the distribution of this magazine. CLIPBBS can be freely downloaded and uploaded to any BBS or any other public system without changes of original contents or number of files in original archive (kind of archive can be changed, but we are sup- porting ARJ archive because is best and smallest). If you are interested in CLIPBBS and would like to become a DISTRIBUTION site, contact publisher on 2:285/608@fidonet or 27:1331/4412@signet or just call to 31-10-4157141 (BBS, working 18:00->08:00, 2400bps) or voice to 31-10-4843870 in both cases asking for DANIEL (Docekal). Distribution sites: United Kingdom Welsh Wizard, SYSOP Dave Wall, phone 44-656-79477 United States of America The Southern Clipper, SYSOP Jerry Pults, phone 1-405-789-2078 ------------------------------------------------------------------------------ CLIPBBS 1-10 Page 26 29 Oct 1991 How to write articles in CLIPBBS? Submission of articles to CLIPBBS is really easy: Maximum of 78 characters per line, as long or as short as you like ASCII text. Choose from the list of extension which most describes your text, or just name it .ART as ARTicle and send it to publisher or to any distribution site via modem to BBS or with mailer as file attach. Article will come automatically appear in the next free issue. Extensions are: Articles (anything) .ART Software .SOF News .NEW Question and Answers .Q&A ANOMALIES and their comments .ANO Letters to editors .LET Advertisement .ADV Wanted .WAN Comments .CMS DUMP from conferences .DMP Clipper Net .CLN That's all at the moment, there will probably be changes later, as the magazine evolves. If you have any ideas for a new section of CLIPBBS, please tell us, or just write an article about it. Daniel, publisher ------------------------------------------------------------------------------