

        
      ޱޱޱޱޱޱޱ
      ްޱޱޱްޱްޱްްްޱ
      ޱޱޱޱޱޱޱޱްޱ
      ޱޱޱޱޱޱޱ
      ޱޱޱޱްްޱްޱޱ
      ޱޱޱޱޱޱޱޱޱްްޱ
      ޱޱޱޱޱޱޱ
      
      
        

  Volume 2, Number 10                                      28 March 1992

                 (c) Daniel Doekal, All Rights Reserved

     The BBS Clipper magazine, published SEMIWEEKLY, every FRIDAY

     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.  EDITORIAL  .............................................................  1
    Long time nothing  .....................................................  1
2.  ARTICLES  ..............................................................  2
    Nantucket Code Guidelines  .............................................  2
    Starters corner (part 4)  ..............................................  6
    NOVLIB, as promised here it is  ........................................ 11
    Hitch Hikers Guide To The Net (7)  ..................................... 17
    @...GET MEMO  .......................................................... 20
    Clipper file/record locking  ........................................... 24
    Get exit code after RUN command  ....................................... 25
3.  SOFTWARE  .............................................................. 26
    Novell FORUMS on Compuserve  ........................................... 26
    What is what (1)  ...................................................... 27
    Printing out memory file  .............................................. 32
4.  NEWS  .................................................................. 35
    Clipper Interface Handbook  ............................................ 35
5.  ANOMALIES  ............................................................. 36
    ANOMALIES reports and commets  ......................................... 36
6.  COMMENTS  .............................................................. 37
CLIPBBS 2-10       Table of Contents (...)        28 Mar 1992


    Funny set SET DATE  .................................................... 37
    __DOS_HOLD problem  .................................................... 38
7.  CLIPPER NET  ........................................................... 39
    Index of described files in Clipper BBS Magazine  ...................... 39
8.  CLIPBBS  ............................................................... 41
    CLIPBBS distribution  .................................................. 41
    CLIPBBS, how to write an article!!!  ................................... 43

                                   - - - - -
CLIPBBS 2-10                   Page 1                   28 Mar 1992


===============================================================================
                                   EDITORIAL
===============================================================================


                             Long time nothing

It's a long time i did write latest editorial and also there are many holes
in making new versions of CLipper BBS. Problem as usual is called TIME.
It's a nice hobby to make CLIPBBS, but it costs a lot of time. Thanx to all
who are also contributing in magazine and i wish they will also continue,
otherwise there will be more and more difficulties. Company in which i
belongs has top priority over hobbies and we are now pretty busy with
several networks. Therefore publishing of CLipper BBS magazine is slowed
down and most probably will be slowed in future also. Also few things got
lost during changes of servers in our company networks and i'm actually
afraid i did skip one number which was never out, or maybe is out but i
don't have it anymore (funny...).

One important news - i have new membership on Compuserver, therefore
Clipper BBS Magazine will come in this worldwide medium also. 100064,2343
is Compuserver number of Daniel Docekal.....

.DD.

-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 2                   28 Mar 1992


===============================================================================
                                   ARTICLES
===============================================================================


                          Nantucket Code Guidelines

7.  Preprocessor Directives

    7.1     Preprocessor directives are lowercase and are preceded by a "#"
            sign:

             #include "Inkey.ch"

            COMMENTS: Absolutely agree about directive lowercasing. Prefixing
            of them with "#" is i guess must given by syntax of CLipper
            language and therefore can be left out of any guidelining...

    7.2     Pseudo-function names follow the same conventions as
            user-defined function and procedure names (see section 6).

            COMMENTS: There is one disadvantage of this guideline. All pseudo
            functions are UNAVAILABLE in debugger and therefore i prefer
            making them in UPPERCASE because then one can see directly that
            function is PSEUDO (#define or #translate made)

    7.3     Manifest constants are uppercase:

             #define ESCAPE 27
             IF LASTKEY() == ESCAPE

            COMMENTS: Agree, expansion a bit is. EVERYTHING defined by
            #define or #translate should be uppercase for better recognizing.

    7.4     A blank line should be placed before and after #if...#endif
            directives:

         @ 2,10 SAY "ACME Stock Control System"

            #if PASSWORD
                <Ask user for password>
         #endif

         MainMenu()

            COMMENTS: Agree. It's very good and also is good to use on indent
            level to the right more INSIDE of #if..endif construction.
            SOmetime i'm dreaming about CLEVER editor which will be able to
            make some kind of outlining with Clipper constructions....

8.  Standard Classes

    8.1     Class names follow the same conventions as user-defined
            function and procedure names (see section 6).

            COMMENTS: It's logical and useful to follow the same naming
CLIPBBS 2-10                   Page 3                   28 Mar 1992


            convention for classes. All clases are of course prefixed with
            "o" letter, immediately showing that 'this is a object'.

    8.2     Instance variable names begin with a lowercase letter, and
            include uppercase letters wherever necessary to indicate new
            words:

         oError:canDefault := .T.

            COMMENTS: There is one important moment. Starting of instance
            variables with small letters is allowing to make difference
            of them and any other names. Only one weakness is here. There
            is no way how to present which kind of value is inside of class
            variable.

    8.3     Method names follow the same convention as instance variable
            names (see above):

         oBrowse:pageUp()

    8.4     When referring to a class method in text, you must also specify
            the class name:

         To reposition the data source to bottom-of-file, use the
         TBrowse:goBottom() method.

            COMMENTS: This paragraph is talking about case that one is writing
            documentation or book about Clipper. Because of nature, that class
            methods (variables) belongs to specific class, is needed to write
            down which CLASS is related to method.

9.  Spaces

    9.1     Whenever a list of two or more items is used, a space is placed
            after each comma separator:

            MyFunc(nChoice, 10, 20, .T.)

            COMMENTS: This is rule coming about readability of program.
            Sometime is better to not use it, because of some functions with
            very long argument list. Then it's too long to waste space with
            space characters between arguments.

    9.2     NEVER use spaces to indent code; use tabs instead (see section
            15).

            COMMENTS: GOLDEN rule for all programs (not only in Clipper).
            When program is formatted using SPACES, there is always problem
            with reformating of program. Also spaces formated program is
            BIGGER (and significantly) than TABS formatted program (TAB is
            one character and can be in some cases replacement for 2 to 7
            spaces).

    9.3     When parameters are specified as part of a function
            declaration, a space is placed inside each parenthesis:

CLIPBBS 2-10                   Page 4                   28 Mar 1992


         FUNCTION SayInBox( cMessage, cColor )

            COMMENTS: Again readability rule. It's giving better reading of
            parameters when definining function.

    9.4     A space is placed on either side of each binary operator:

            nTotal := nSubTotal + nNewCost

            COMMENTS: It's good to follow this, but again. Long and complex
            expressions flowing among more lines, are difficult to keep in
            this way, because are coming longer and longer.

10  Declarations

    10.1    Each variable is declared separately on its own line:

         LOCAL nSomeNum
         LOCAL cString := ""

            COMMENTS: I'm still prefering method to use ONE LOCAL statement
            and then multiple line declarations:

            LOCAL   nSomeNum ,;
                    cString     := ""

            It's question what is better, because in Nantucket's guideline,
            there is possible to place comments after every LOCAL statement,
            in my case it's impossible (because of buggy implementation of /*
            and */ operators).

11  Logicals

    11.1    Logical values are referred to in text as follows:

         true (.T.)
         false (.F.)

            The terms "true" and "false" are all lowercase unless they appear
            at the beginning of a sentence, and are followed by the code form
            of the logical value enclosed in parentheses.

            COMMENTS: Exactly opposite. TRUE and FALSE are upper case,
            always.  That's because they are defined as #define constants and
            #define symbols are always uppercase in my programs (see
            somewhere on start of guidelines comments about #define).

12  Operators

    12.1    The in-line assignment operator (:=) is used for assignments in
            all Clipper 5.0 code:

         lContinue := .T.

            COMMENTS: 100% agree. ":=" operator is only one used in Clipper.
            That's because of:
CLIPBBS 2-10                   Page 5                   28 Mar 1992


            1)  REPLACE command can be replaced with this operator
            2)  there is possible to use this operator inside of expression
                and mostly in if () statements...

    12.2    The == operator is used for exact equality tests in all Clipper
            5.0 code:

         lDuplicate := (CustFile->CustName == cCustName)

            COMMENTS: 100% agree. "==" operator is better readable than combi-
            nation of SET EXACT and "=" operators....

-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 6                   28 Mar 1992


Starters corner                                                       Paul Ket
===============                                                       ========

Last time we left with a brand new way of storing the data in the files.  We
created the Thirdtry.dbf. It consisted of three files. Two containing the
real data, one is used as a reference to look-up words. In this episode we
look at the meganisms behind our program. Now the real fun starts!

Last time i've made a nasty mistake: i've forgotten to include a full
description of THIRDTRY.DBF. Sorry about that. Complains can be send to the
editor :-> . It is contained in the addendum of this episode.

I also promised to take a closer look at the files. That can wait till an
other time. Now is the time for the creative part of programming!

What do we want?
----------------

First we have to ask ourselves what we actually want our program to do.
Think about this at "grass-root" level. We want the program to start and
present us the contents of de files. On the screen to be precise.

Besides that we want to browse and to look up things. At the end we also want
to make a hardcopy of the recipe. After that we sign off and go off to the
kitchen.

What does the intended user want?
----------------------------------

What we want is important. But not as important as the wishes of the user.
Remember episode 1, in which we stated that this project was also intended to
pay in our debt to Mum. She agreed on buying a computer with the demand for a
good program for her recipes(A). In jargon: a novice user. Somebody who
doesn't want to learn about fields and records. Doesn't want to spent the
leisuretime at the keyboard. So: simplicity, clarity and easy to use are
major demands.

These demands are important because by our design with all those files we've
created a great opportunity for making things complex. Let's not do that!

Basics
------

To have something to show to anyone else, it's nice to start with the design
of the screen. We've waited with that to make a good design for our
datafiles, but now the time has come to do so (B)!

Designing the screen
--------------------
We start desinging with a few questions.

First: what has to be present on the screen?
Three categories of information can be present:

(1) Data
The real data:
CLIPBBS 2-10                   Page 7                   28 Mar 1992


     - the name of the recipe
     - the ingredients
     - the presription how to prepare it.

(2) Extra info
Things commonly seen, handy, but no complaints if you leave them out:
     - time
     - date
     - filepath
     - number of the recipe
     - number of ingredients

 INTERMEZZOĿ
 Altering the database structure                                     
 -------------------------------                                     
 At this point in the process i get the strong urge to add extra     
 information, extending the amound of information to store. Think of:
      - the last time the recepe was made                            
      - date of data-entry                                           
      - names of visitors who have eaten it                          
      - names of family who don't like it                            
      - record-size                                                  
                                                                     
 Why not? Go ahead!                                                  
 Some parts can be stored in THIRDTRY.DBF, others in LOOKUP (c).     
 

(3) Directives.
A user has a right to know where s/he is and what to do. So we have to tell
where we are and where we can go to.

These three types of information deserve a special place on the screen.
In the pre-windows-era this was called window-ing. Each type of information
has his own place on the screen. Now you talk about "view-ports". It means
the same without refering to that product of Microsoft.

Here's one of my favorite screen designs. It is 24 rows by 80 colums (D). You
might have to adjust your pinter. But it shows beautifully on your screen!

>---------- screen starts here --------------<
Date:  10 jan 1992                                             Recepe:    1
Time:  12:12                                                   Total:  1123

                                          Breek de eieren in een beslagkom.
Fried eggs Extra                          Roer ze goed door. Doe de boter in de
                                          pan, smelt ze. Doe de geroerde eieren
slices bread          3                   in de pan. Zet het vuur zo laag
eggs                  5                   mogelijk. Doe een deksel op de pan!
mature cheddar        50 grames           Laat het langzaam sudderen. Na 3
butter                little              minuten de kaas op het ei doen.
garlic                little              Kruiden naar smaak. Deksel weer op
red pepper            1                   de pan doen. Als de kaas grotendeels
pepper                little              gesmolten is is het ei goed. Opdienen
                                          op de sneetjes brood.


CLIPBBS 2-10                   Page 8                   28 Mar 1992


< Display    >
F1= Help
F5= Look-Up
< Esc = Exit >
>---------- screen ends here --------------<

You can see three zones in this screen. At the top the Extra information. Two
lines. Left and right filled out. As you can see i present there the number
of this recepe and the total amount of recepe's i've got. In the middle the
main information. Note the absence of captions like "Name", "Ingredients"
etc. I think those are redundant. At the bottom the user-guide. It clearly
shows only three options and gives us information about where we are
(Display).

Techniques
----------

There is some programming necessary for getting this screen. I don't intent
to give full listings but here's how i would do this.

For a start: i have a MAIN procedure/function which contains the main
program.  In this function there's a loop.

          DO WHILE .not. <END>
              PresentScreen()
              GetUserKey()
              ProcessKey()
          ENDDO

The biggest part of the screen is organised in PresentScreen(). Not all. The
horizontal lines are not disturbed at all. So, i write them only once: at the
start of the program.

The time, presented in line 2, has to be updated -more ore less- continously.
So, i make a small function TimeUpd() which i call in all three functions in
the loop.

The keys available to the user are dependent on the place of the user in the
program. So, i present this information after i've processed the last
keystroke, in the function ProcessKey().

This leaves us with the thask to present the contents of THIRDTRY.DBF, the
date, recepe number and the total number of recepes. Below you find a (buggy)
source-listing of PresentScreen(). It depends on some unstated assumptions
but it is only intended to give an idea of how this can be done(E).

>------------------ part of PresentScreen() ----------------<
USE THIRDTRY.DBF ALIAS Third
USE INGRDNT.DBF ALIAS Ing

@ 1,60 SAY "Recepe:" + STR(nRecepe),6)
@ 2,60 SAY "Total: " + STR(LASTREC(),6)
Select Third
LOCATE FOR Third->Re_num=nRecepe
IF found()
     @ 4,0 SAY third->Name
CLIPBBS 2-10                   Page 9                   28 Mar 1992


     cDesc := third->Desc
     Select Ing
     LOCATE FOR ing->re_num = rRecepe
     DO WHILE found()
        @ A,B SAY LookUp(ing->ing_num)
     ENDDO

ENDIF

>------------------ End of PresentScreen() -----------------<
- - - - -

Notes:

(A) complaints are received about the sexist approach. Author likes to state
that no harm is or was intended. Wherever wanted he can be replaced by she or
the other way around.

(B) Handbooks and people who have studied programming will get sick at this
time. Ok, it's wrong. But it works! Let's call it prototyping.

(C) What the result will be will be discussed in a forthcoming episode.

(D) Because i think you'll look at it with a Word-Perfect-alike. i haven't
made it 25 * 80. A normal screen is of course 25 * 80 but in WordPerfect you
"only" get 24 * 80.

(E) If somebody knows an equal simplistic but better way for doing the same
job: please let me know!

---------------------- ADDENDUM ------------------------------------

      Name: Lookup.dbf (3)
      ===========================
         NAME     TYPE     LENGTH
      1  Ing_num   N        3,0
      2  Ing_nam   C       30
      ---------------------------
      TOTAL                33

       Name: Ingrdnt.dbf  (3)
       ======================
          NAME     TYPE    LENGTH
       1  Re_num    N     4,0
       2  Ing_num   N     3,0
       3  Amount    C    10,0
       ----------------------
       TOTAL             17

       Name: THIRDTRY.DBF (3)
       =====================
          NAME     TYPE    LENGTH
       1  Re_num    N       4,0
       2  Name      C      40
       3  Desc      M      10
       --------------------------
CLIPBBS 2-10                   Page 10                  28 Mar 1992


       TOTAL               54

-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 11                  28 Mar 1992


                     NOVLIB - one complex Novell library


As promised, it's coming. NOVLIB, one from most complex Novell libraries.
It has not ANY other use, than pure Novell networking. Written mostly in
Turbo C (2.0) as is visible in .LIB files is convering almost everything
avaialable from Novell Netware. Last time (in Clipper BBS Magazine number 9,
Volume 2) was coming review of NETLIB. This article will cover complete
review of NOVLIB. Next coming article will compare both libraries for easiest
way to see what is in which library.

NOVLIB covers ONLY Novell Netware, nothing else. That's very important
information. Scale of functions in NOVLIB is well spread over complete
services of Novell Netware, all configuration and also statistic information.
NOVLIB is coming just as two .LIB files, one with generic 2.xx and 3.xx
functions and second with functions related only to Novell 2.xx (3.xx is
missing all statistical services - SYSCON command in those two versions of
Novell is therefore also different).

    Bindery information and access

 AccBindRd()      Returns the workstation's bindery read access security.
 AccBindWr()      Returns the workstation's bindery write access security.
 Bindery()        Opens & Closes the NetWare bindery.
 BindCurrOb()     Returns current number of bindery objects. [286]
 BindMaxOb()      Returns maximum number of bindery objects. [286]
 BindPeakOb()     Returns peak number of bindery objects. [286]
 BindSearch()     Searches the bindery for specified objects (users etc).
 UserAdd()        Adds a new user to the bindery.
 UserAddGrp()     Adds a specified user to a user group.
 UserDelete()     Deletes a specified user.
 UserDelGrp()     Deletes a specified user from a user group.
 UserFName()      Returns or sets user's full name.
 UserFree()       Returns amount of free space available to specified user.

    Printing and Redirecting

 BannerFlag()     Enables & disables the printing of a Banner.
 BannerName()     Returns or sets the banner user name for printing.
 CapBanner()      Returns or sets the banner text for printing.
 CapCancel()      Cancels capture of the specified LPT device.
 CapCopies()      Returns or sets the number of copies for printing.
 CapEnd()         End capture of the specified LPT device.
 CapFlush()       Flushes capture of the specified LPT device.
 CapFrmFeed()     Enables & disables the form feed after printing
 CapFrmName()     Returns or sets the form name for printing.
 CapFrmNo()       Returns or sets the form number for printing.
 CapKeep()        Enables & disables printing of an interupted print
 CapMaxChar()     Returns or sets maximum characters per line for printing.
 CapMaxLine()     Returns or sets the maximum lines per page for printing.
 CapPrnNo()       Returns or sets the destination printer for printing.
 CapQueue()       Directs captured printing to a specified queue.
 CapSetup()       Sets up print capturing for the specified LPT device.
 CapStart()       Starts capture of the specified LPT device.
 CapTabSize()     Returns or sets the tab size for printing.
 CapTimeout()     Returns or sets the timeout count for printing.
CLIPBBS 2-10                   Page 12                  28 Mar 1992


 PrnForm()        Returns or sets the form type for specified LPT device.
 TabFlag()        Enables & Disables conversion of tabs to spaces

    Print servers and printer

 PrnOffline()     Checks whether the specified printer is Offline.
 PrnServer()      Returns or sets the server printer for the LPT device.
 PrnStopped()     Checks whether the specified LPT device is stopped.
 PServerVer()     Returns the printer server version number.

    Print Queues manipulation

 QDelJob()        Deletes the specified print queue job.
 QHalt()          Enables/disables print queue servicing.
 QJobAdding()     Checks whether the specified print queue job is adding.
 QJobDate()       Return print jobs entry date
 QJobEDate()      Set or Return defered printing execute date of a print job
 QJobDes()        Returns or sets the specified print queue job description.
 QJobFile()       Returns the name of the specified print job's spool file.
 QJobOpHold()     Places the print queue job on operator hold.
 QJobPos()        Returns or sets the print job's position in queue.
 QJobs()          Returns a list of print queue jobs.
 QJobSize()       Returns the size of the specified print queue job.
 QJobStn()        Returns station number which placed print job in queue.
 QJobTime()       Return print jobs entry time
 QJobETime()      Set or Return defered printing execute time of a print job
 QJobUser()       Returns user ID of user who placed job in queue.
 QJobUsHold()     Places the specified print queue job on user hold.
 QNewJobs()       Enables/disables new jobs being added to print queue.
 QNewServer()     Enables/disables new servers servicing print queue.
 QueueID()        Returns the ID number for a specified print queue.
 QVer()           Returns the queuing version number.

    Accounting

 AccVer()         Returns accounting system version number.

    Statistics

 BufferDirt()     Returns the number of dirty disk cache buffers. [286]
 Buffers()        Returns the total number of disk cache buffers. [286]
 BufferSize()     Returns the size of each disk cache buffer. [286]
 CacheHits()      Returns the number of fileserver cache hits. [286]
 CacheMiss()      Returns the number of file server cache misses. [286]
 CurrOpen()       Returns the current number of open files. [286]
 FatScanErr()     Returns the number of disk fat scan errors.     [286]
 FATCurrChg()     Returns the current number of changed FAT sectors. [286]
 FATErr()         Returns the number of FAT sector errors. [286]
 FATErrFat()      Returns the number of fatal FAT sector errors. [286]
 FATTotChg()      Returns the total number of changed FAT sectors. [286]
 FileOpens()      Returns the number of file open requests. [286]
 FileReads()      Returns the number of file read requests. [286]
 FileWrites()     Returns the number of file write requests. [286]
 FSProcess()      Returns the number of file server processes. [286]
 FSUtil()         Returns file server utilisation (%). [286]
 INBVer()         Returns Internet Bridge version.
CLIPBBS 2-10                   Page 13                  28 Mar 1992


 IOPending()      Returns number of disk I/Os pending. [286]
 LogDrives()      Returns the number of logical disk drives. [286]
 MaxConn()        Returns the maximum number of connections supported.
 MaxOpen()        Returns the maximum number of open files. [286]
 MaxVol()         Returns the maximum number of volumes supported.
 MemTotal()       Returns the total amount of server memory. [286]
 MemWaste()       Returns the amount of wasted server memory. [286]
 PeakConn()       Returns the peak number of connections.
 PeakOpen()       Returns the peak number of open files. [286]

    LAN/server configurations

 LANHostAdd()     Returns the specified LAN host address. [286]
 LANName()        Returns the specified LAN name. [286]
 LANNWAdd()       Returns the specified LAN network address. [286]
 LANOption()      Returns the specified LAN option. [286]
 LANSetting()     Returns the specified LAN setting. [286]
 NWAppNo()        Returns the Netware Applications Number
 NWError()        Returns the last NetWare error code.
 NWNumber()       Returns the default network number.
 NWSerNo()        Returns the Netware Serial Number.
 NWVersion()      Returns the NetWare version number.
 OSRev()          Returns the operating system revision number.
 SecureVer()      Returns the security version number.
 SFTLevel()       Returns the file server SFT level.
 VAPVer()         Returns the VAP version number.
 VConsVer()       Returns the virtual console version number.

    Rights, users...

 AccConsole()     Returns the workstation's Console Operator status.
 DirAddUser()     Makes a user a trustee of a directory.
 DirDelUser()     Deletes a user as trustee of a directory.
 DirEffRt()       Returns workstation's effective rights to a directory.
 IsMember()       Verifies that a user is a member of a specified group.
 PassChange()     Changes the specified user's password.
 PassCheck()      Checks the specified user's password.
 UserBlocks()     Returns the number of blocks owned by specified user.
 UserDirs()       Returns number of directories owned by a specified user.
 UserFiles()      Returns the number of files owned by a specified user.
 UserID()         Returns a specified user's ID number.
 UserName()       Returns a specified user's login name.
 UserRename()     Renames a specified user.

    Directories and mapping

 DirHandle()      Returns the directory handle of the current directory
 DirMap()         Maps a specified directory to a drive letter.
 DirMapDel()      Deletes a drive mapping.

    Connections and stations

 ConnClear()      Clears a specified connection number.
 ConnID()         Returns the default connection ID number.
 ConnNo()         Returns the current connection number.
 Conns()          Returns connection numbers where a user is logged in.
CLIPBBS 2-10                   Page 14                  28 Mar 1992


 ConnUsed()       Returns if a fileserver table slot is used
 CurrConn()       Returns the current number of active connections.
 FSAttach()       Attaches to new fileserver.
 FSConnNo()       Returns filserver Connection ID number.
 FSDetach()       Detaches from a fileserver.
 FSLogin()        Logs a specified user into the file server.
 FSLogout()       Logs the current user out of the file server.
 LockConn()       Returns connection number which has a record locked. [286]
 LoginDate()      Returns the login date of current user(s).
 LoginID()        Returns the ID number of current user(s).
 LoginName()      Returns the login names of current user(s).
 LoginStat()      Returns or sets the current file server login status.
 LoginTime()      Returns the login times of current user(s).
 NodeNumber()     Returns the workstation node number.
 ShellRev()       Returns the workstation shell revision number.
 ShellVer()       Returns the workstation shell version number.
 WSLHard()        Returns the workstation long hardware type.
 WSLocalDrv()     Returns number of logical local drives on workstation.
 WSOS()           Returns the workstation operating system type.
 WSOSVer()        Returns the workstation operating system version.
 WSSHard()        Returns the workstation short hardware type.

    Other...

 ExclOn()         Returns CLIPPER exclusive status. (NON working BTW)
 Strhex()         Converts number to hexadecimal string.

    File server manipulation

 FSDate()         Gets or Sets the file server date.
 FSTime()         Gets or sets the file server time.
 FSDown()         Downs the file server.
 FSName()         Returns the file server name.
 FSPrefID()       Returns or sets the prefered fileserver.
 FSPrimID()       Returns or sets the primary fileserver.
 LoginEnab()      Enables/disables file server login.

    Messaging services

 MsgConsole()     Sends a message to the file server console.
 MsgGet()         Returns a message from other users.
 MsgLogNet()      Logs a network message.
 MsgMode()        Returns or sets the workstation's message mode.
 MsgUser()        Sends a message to a specified connection number.

    File Services

 Purge()          Purges the workstation's erased files.

    Semaphores

 SemClose()       Closes the specified semaphore.
 SemCount()       Returns number of users with specified semaphore open.
 SemDec()         Decrements the specified semaphore value by 1.
 SemInc()         Increments the specified semaphore value by 1.
 SemOpen()        Opens the specified semaphore.
CLIPBBS 2-10                   Page 15                  28 Mar 1992


 SemValue()       Returns the value of the specified semaphore.

    TTS

 TTSAbort()       Aborts a TTS transaction.
 TTSAppThr()      Returns or sets the TTS application thresholds.
 TTSAvail()       Verifies that TTS is available. [286]
 TTSBegin()       Begins a TTS transaction.
 TTSCurrTrn()     Returns the number of current TTS transactions. [286]
 TTSEnable()      Enables/disables TTS. [286]
 TTSEnd()         Ends a TTS transaction.
 TTSLevel()       Returns the file server TTS level.
 TTSMaxTrn()      Returns the maximum number of TTS transactions. [286]
 TTSPeakTrn()     Returns the peak number of TTS transactions. [286]
 TTSSpace()       Returns the space currently used by TTS. [286]
 TtsTotBo1()      Returns the number of TTS backouts by system    [286]
 TtsTotBo2()      Returns the number of TTS backouts by workstat. [286]
 TTSTotTrn()      Returns the total number of TTS transactions. [286]
 TTSVolume()      Returns the volume number used for TTS workfiles. [286]
 TTSWSThr()       Returns the TTS workstation thresholds.
 TtsWTotTrn()    Returns the number of TTS made by workstations  [286]

    Volume and disks

 VolBlAvail()     Returns number of blocks available on specified volume.
 VolBlkSize()     Returns the size of each block on a specified volume.
 VolBlocks()      Returns the total number of blocks on specified volume.
 VolName()        Returns the name of the specified volume.
 VolNumber()      Returns the volume number of a specified volume.
 VolRemove()      Verifies that the specified volume is removable.
 PDChannel()      Returns the physical disk channel number. [286]
 PDCont()         Returns the physical disk controller number. [286]
 PDContDrv()      Returns the physical disk controller drive number. [286]
 PDContType()     Returns the physical disk controller type. [286]
 PDCyls()         Returns the number of cylinders on a physical disk. [286]
 PDDrvSize()      Returns the physical disk size. [286]
 PDDrvType()      Returns the physical disk type. [286]
 PDHeads()        Returns the number of heads on a physical drive. [286]
 PDHfxAvail()     Returns No. of Hot Fix redirection blocks available. [286]
 PDHfxEnab()      Verifies that Hot Fix redirection is enabled. [286]
 PDHfxSize()      Returns the size of Hot Fix redirection table. [286]
 PDHfxStart()     Returns Hot Fix redirection table starting block. [286]
 PDIOErrors()     Returns the number of physical disk I/O Errors. [286]
 PDName()         Returns the physical disk name. [286]
 PDRemove()       Verifies that the physical disk is removable. [286]
 PDSectors()      Returns the number of sectors on a physical disk. [286]
 PhyDrives()      Returns number of physical drives in the fileserver. [286]
 PhyRDErrs()      Returns the number of disk read errors.         [286]
 PhyRDReqs()      Returns the number of disk read requests.       [286]
 PhyWtErrs()      Returns the number of disk write errors.        [286]
 PhyWtReqs()      Returns the number of disk write requests       [286]
 ReadReqs()       Returns the number of dos disk read requests    [286]
 WriteReqs()      Returns the number of dos disk write requests   [286]

    Quite long, isn't? I was quite impressed saw it first time. Functionality
seems also very good. Documentation in .NG format is coming as common
CLIPBBS 2-10                   Page 16                  28 Mar 1992


standard, but is missing general comments (about linking), list of functions
per library, overlaying of library functions.

-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 17                  28 Mar 1992


                    Hitch Hikers Guide To The Net
                               Episode 7

 (Xaphod, Gillian, Rod, Martin, and Arnold Lint continue their descent into
 the heart of Netrothea. Flarg Brittashik has vanished leaving only a tin
 of Putrina Rat Chow in his stead.)

 Xaphod: Wow, that was far out|
 Martin: If you say so.

 (All of a sudden, the 12" CRT on Xaphod's shoulder starts up . . .  Star
 Wars type music kicks in . . .  Once upon a time, in a Net far, far away,
 a band of steadfast hackers are fighting a gallant fight.  Vast swarms of
 nauseatingly repetitious messages are swamping their news. They must
 retaliate.  This is their story . . . This is Zar Wars. . . All the nodes
 beginning with the letter Z have banded together, they are tired of always
 being last because the Net does everything alphabetically. They decide to
 stage a bold attack and make their presence known| to this end they
 devised a cunning scheme to echo their news articles across the known Net
 several multiple times each posting. In this way, they would be assured
 the attention they feel they deserve. Net.landers are at this moment
 preparing for a counterattack.  They are preparing massive Photocomplaint
 rays, Gargantugripe bombs, and the ever deadly Superplasmicautor-
 everberatingmegamoleculozapperdingledangledonglehyperintensified-
 newandimprovedtimewarping complaint field generators. The last device is
 one of the most feared (and hardest to pronounce) in the known Net. Its
 power is so incredible that grown men have been known to pull out their
 own livers rather than be subjected to its awesome force.)

 Rod        : Turn that off
 Xaphod     : (Doing so) Yah, what a drag.
 Arnold Lint: Well, what do we do now.
 Gillian    : I guess we keep going.
 Martin     : Do we have to?
 All        : Yes
 Arnold Lint: Sure could go for a cup of tea.
 Xaphod     : (Mumbling to himself) Stupid git
 Martin     : Do you people really think this is necessary? Why can't you
              be satisfied with things as they are? Must you always try to
              change them - things can only get worse.
 Xaphod     : Look you morose metal moron, we're going on so shut up. Look
              upon this as an adventure into a whole new life.
 Martin     : Oh no, not another.

 (The stairwell they are on leads into a huge room. So huge that it defies
 commentary, only to say that it is, in fact, bloody huge. Off in the
 distance there is a faint light. Arnold Lint and company head for it. Two
 weeks later they arrive. the light is being emitted from a strange kind of
 TTY. There is a plaque nearby which reads: "For the answer to Life, the
 Net and Everything, type in 'Help'. For dirty books or leather goods, ring
 bell for service. The Inter-Net Megamind Exchange and Novelty Shoppe
 thanks you for your patronage of our establishment".)

 Arnold Lint: Wow, the answer to Life, the Net, and Everything
 Xaphod     : Who cares, lets get at the dirty books
 Rod        : Yah, I wonder if they have "Advanced Necrophilia for
CLIPBBS 2-10                   Page 18                  28 Mar 1992


              Scientists and Engineers" or "Yes, you can be a Toad-Sexer"?
 Arnold Lint: Dirty books, way out here?
 Xaphod     : Of course, depravity is the universal language.  Pornographic
              material is generally considered legal tender anywhere in
              the Net. I once lived for a whole year on Carnolea, just on
              trading my old "Gland" magazines and lubricants for
              supplies.
 Gillian    : (Disgusted by the antics of Rod and Xaphod)Lets see
              the answer already - boy what sicko's.
 Xaphod     : OK, but then can we get some dirty books.

 (Xaphod types in 'HELP' to the keyboard. Strange hummings and buzzings
 start to emanate from the TTY. The cryptic characters "101010" appear on
 the screen.)

********************************************************************
 "The Hitch Hikers Guide To The Net" points out that the number 42, when
 viewed in it's binary representation is in fact, quite revealing.  There
 are many theories for what it actually means. The adult magazine "Spurt"
 suggests that it is the perfect pattern for an orgy, three males and three
 females being the supposed ideal. The actual shape of the characters of
 '101010' seem to bear this out.  Also the fact that it does go
 'boy-girl-boy . . . ' also helps. The religious magazine 'Modern Moral
 Majority' (MMM) suggests that it is in fact a message from God. The
 pattern indicates that two of the same sex shall not have intercourse. The
 fact that there are equal numbers of both male and female indicates that
 monogamous relationships are the thing to do.  Also the fact that, when
 read, left to right, the man always comes first, really gave them an edge
 on the ERA (who really didn't listen anyway). Most other people simply
 wondered why everyone thought the binary sequence had anything at all to
 do with sex.
 ******************************************************************]

 Rod        : That's it?
 Xaphod     : Apparently.
 Gillian    : There must be more than just 42.
 Martin     : I certainly hope not.
 Xaphod     : Well, lets try to get some more info|

 (Xaphod once again starts typing at the TTY. Characters flash and buzzers
 buzz. The TTY finally gives up, it types out: "All right already, if you
 really want the answers, take the service elevator to the 127,366,247th
 floor, then follow the green line till it meets the blue line till it
 meets the orange line till it becomes the slightly off white line. Then
 climb out the window, jump off and ask for Ralph.  He'll tell you the
 whole story. Now push off, I've had a bad day. (To itself now) Where did I
 put those Valliums. Crap, I need a drink . . .  ")

 Xaphod     : Oh well, what do we have to loose.
 Martin     : Not much really, just our lives. Of course, my life means so
              little already, I doubt I'd mind if it were lost.
 Rod        : Quiet.

         ******************** End Of Part 7 ********************

 What is the actual answer to Life, the Net, and Everything? Will Arnold
CLIPBBS 2-10                   Page 19                  28 Mar 1992


 Lint get his tea? Will Xaphod get his dirty book? Will the net sponsor a
 Pot-Luck-Orgy? For the answers to these and many other pointless questions
 . . . Tune in next time . . .  same Net-time . .  . same Net-channel.

-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 20                  28 Mar 1992


                                @...GET MEMO
                       (by Stephen Forbes in original)

In recent times there have been a number of messages on the Clipper Echo
about the use of memo fields inside a GET/READ. As a result I thought I would
try to emulate the dBASE style using a Get object. Whilst a true Get object
is created for the memo, this is simply used to enable the memo to be handled
as a member of the READ (in the order it is declared), the real work is done
by the function MemoReader().

********************************* CUT HERE ********************************

// GETMEMO.CH -------------------------------------------------------------
//
// Header file required for emulation of dBASE style memo gets in Clipper
//
// Written by Steve Forbes - Clipper User Group Melbourne - 1 Feb 92
//
// ------------------------------------------------------------------------

#command @ <Top>, <Left> GET MEMO <var> [WINDOW <t>, <l>, <b>, <r>]     ;
           [NAME <name> ]                                               ;
           [VALID <valid>] [WHEN <when>] [SEND <msg>]                   ;
      => SetPos( <Top>, <Left> )                                        ;
       ; AAdd( GetList,                                                 ;
               GetMemo( {| Val| iif( Val == NIL, <var>, <var> := Val)}, ;
                        <(var)>, <{valid}>, <{when}>,                   ;
                        <Top>, <Left> - 1, <t>, <l>, <b>, <r>, <name> ) )

// EOF - GETMEMO.CH -------------------------------------------------------

// TEST.PRG ---------------------------------------------------------------

#include "Inkey.ch"
#include "Box.ch"
#include "Getexit.ch"
#include "Getmemo.ch"

LOCAL cName  := SPACE(20),                                              ;
      mNotes := SPACE(100),                                             ;
      mNotes2 := "This is some data in the memo field",                 ;
      dDOB   := CTOD(""),                                               ;
      cBackground := REPLICATE( "CUG Melbourne ", 8 ), i

MEMVAR GetList

SET DATE BRITISH
SET SCOREBOARD OFF

dDOB   := CTOD("09/03/55")

SETCOLOR( "W+/B" )
CLS

// Draw Background

CLIPBBS 2-10                   Page 21                  28 Mar 1992


FOR i := 0 TO 22
   @ i, 0 SAY SUBSTR( cBackground, i + 1, 80 )
NEXT

SETCOLOR( "N/G" )
@ 4, 4, 11, 37 BOX B_SINGLE + " "
@ 6, 7 SAY "Name:  " GET cName
@ 7, 7 SAY "Notes: " GET MEMO mNotes
@ 8, 7 SAY "DOB:   " GET dDOB
@ 9, 7 SAY "Data:  " GET MEMO mNotes2 WINDOW 10, 6, 20, 73 NAME "Data"
READ

SETCOLOR( "W+/B" )

@ 24, 1 SAY "Press any key to see the value of GETS ..."
INKEY(0)
CLS

? "cName   -> " + cName
? "mNotes  -> " + MEMOTRAN( mNotes, " ", " " )
? "dDOB    -> " + DTOC( dDOB )
? "mNotes2 -> " + MEMOTRAN( mNotes2, " ", " " )

// EOF - GETMEMO.CH -------------------------------------------------------

******************************** CONTINUED ********************************

********************************* CUT HERE ********************************

// GETMEMO.PRG ------------------------------------------------------------
//
// GetMemo() provides emulation of dBASE style memo gets in Clipper
//
// Written by Steve Forbes - Clipper User Group Melbourne - 1 Feb 92
//
// ------------------------------------------------------------------------

FUNCTION GetMemo ( bValue, cVarName, bValid, bWhen,;
                    nTop, nLeft, t, l, b, r,cName )
LOCAL oGet

//--- Create the get object!
oGet := GetNew( nTop, nLeft, bValue, cVarName )

IF t == NIL .OR. l == NIL .OR. b == NIL .OR. r == NIL
   t := l := 0
   b := MAXROW()
   r := MAXCOL()
ENDIF
//--- Assign the different instance variables!
oGet:Reader := { | oGet | MemoReader( oGet ) }

IF oGet:cargo == NIL
   oGet:cargo := DictNew()
END
DictPut( oGet:cargo, "MemoCoord", { t, l, b, r } )
CLIPBBS 2-10                   Page 22                  28 Mar 1992


DictPut( oGet:cargo, "MemoName", cName )

@ oGet:row, oGet:col SAY "MEMO" COLOR ColorPair( oGet:colorSpec, 2 )

return( oGet)

// =======================================================================

FUNCTION MemoReader( oGet )
LOCAL nKey := 0, cBuffer, cScreen := SAVESCREEN( 0, 0, 24, 79 ), aCoords
LOCAL cName, cColor
DISPBEGIN()
oGet:SetFocus()
cBuffer := oGet:Buffer
oGet:KillFocus()
RESTSCREEN( 0, 0, 24, 79, cScreen )
DISPEND()
SETPOS( oGet:row, oGet:col )
DO WHILE .T.
   IF LASTKEY() == K_ESC
      oGet:exitState := GE_ESCAPE
      EXIT
   ENDIF
   nKey := INKEY(0)
   DO CASE
      CASE nKey == K_ENTER
         oGet:exitState := GE_ENTER
         EXIT
      CASE nKey == K_UP
         oGet:exitState := GE_UP
         EXIT
      CASE nKey == K_DOWN
         oGet:exitState := GE_DOWN
         EXIT
      CASE nKey == K_F10
         aCoords := DictAt( oGet:cargo, "MemoCoord" )
         cName := IF( ( cName := DictAt( oGet:cargo, "MemoName" ) ) == NIL,;
                        "", " " + cName + " " )
         cScreen := SAVESCREEN( aCoords[1],     ;
                                aCoords[2],     ;
                                aCoords[3],     ;
                                aCoords[4] )
         @ aCoords[1], aCoords[2], aCoords[3], aCoords[4] BOX B_DOUBLE_TOP
         @ aCoords[1], aCoords[2] + 2 SAY cName
         cColor := SETCOLOR( ColorPair( oGet:colorSpec, 2 ) )
         cBuffer := MEMOEDIT( cBuffer,        ;
                              aCoords[1] + 1, ;
                              aCoords[2] + 1, ;
                              aCoords[3] - 1, ;
                              aCoords[4] - 1, ;
                              .t. )

         oGet:varPut( cBuffer )
         SETCOLOR( cColor )
         RESTSCREEN( aCoords[1], aCoords[2], aCoords[3], aCoords[4], cScreen )
         SETPOS( oGet:row, oGet:col )
CLIPBBS 2-10                   Page 23                  28 Mar 1992


   ENDCASE
ENDDO
RETURN ( NIL )

//=======================================================================

FUNCTION ColorPair( cColorSpec, nWhich)
LOCAL n, cRetVal := "," + cColorSpec + ","
FOR n := 1 TO nWhich
    cRetVal := SUBSTR( cRetVal, AT( ",", cRetVal) + 1, LEN( cRetVal))
NEXT
cRetVal := LEFT( cRetVal, AT( ",", cRetVal) - 1)
RETURN ( cRetVal)

// EOF - GETMEMO.PRG ------------------------------------------------------

-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 24                  28 Mar 1992


                         Clipper file/record locking

Clipper does not lock the physical record, but instead locks a 1-byte area
offset (1000 000 000 + record number) bytes from the beginning of the file. I
found this out by monitoring record locking on Novell 3.1.

The following Borland C++ program is compatible with Clipper record locking. It
locks the first record in the database. I works perfectly in tandem with a
Clipper program on NW386. Locks are denied and permitted just as in a Clipper
prog.

#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <process.h>
#include <share.h>
#include <stdio.h>
#include <conio.h>

int main(void)

  int handle, status;
  long header=0x3B9ACA01,recsize=1;

  handle=sopen("test.dbf",O_RDWR,SH_DENYNO,S_IREAD);
  if (handle<0) {
    printf("sopen failed\n");
    exit(1);
  }
  status=lock(handle,header,recsize);
  if (status==0)
    printf("lock succeeded\n");
  else
    printf("lock failed\n");
  getch();
  status=unlock(handle,header,recsize);
  if (status==0)
    printf("unlock succeeded\n");
  else
    printf("unlock failed\n");
  close(handle);
  return 0;

-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 25                  28 Mar 1992


                       Get exit code after RUN command

----------------------------------------
(Asm routine to get exitcode to Clipper)

.MODEL  LARGE

EXTRN   __retni:FAR

        PUBLIC  GETELVL

.CODE

GETELVL PROC    FAR

        mov     ah,4dh          ; DOS function Get Return Code
        int     21h             ; call DOS
        push    ax              ; push Exit code on stack
        call    __retni         ; make result available to Clipper
        add     sp,2            ; reset stack pointer
        RET

GETELVL ENDP                    ; End of routine

        END

-----------------------------------------
(Small program to test above asm routine)

TEST.PRG

        RUN YOUR_PROGRAM
        exitcode := getelvl()
        ? exitcode

-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 26                  28 Mar 1992


===============================================================================
                                   SOFTWARE
===============================================================================


                        Novell FORUMS on Compuserve


Ŀ
        NOVA                 NOVB                    NOVC               
Ĵ
1) ELS NetWare         1) Servers & Workstn   1) General Info/Misc      
2) Async Communic'tns  2) Backups             2) Upgrades               
3) Mini/Mainfrme Links 3) Printing            3) Application/Utils      
4) LAN/LAN Links       4) Disk Drives/Cntr'lr 4) Btrieve/XQL/SQL        
5) NetWare Macintosh   5) K-12 Networking     5) E-Mail/MHS             
6) NetWare VMS         6) Closed - Go NOVA    6) P'gramming & N'Ware    
7) Portable NetWare    7) Closed - Go NOVA    7) NetworkManagement      
8) NW NFS - TCP/IP     8) Power Monitoring    8) ProductSuggestions     
9) NetWare Lite        9) Ethernet            9) UserGroups/Train'g     
10) NSE                10) Arcnet             10) OS/2 Requester        
11) LANalyzer/LANtern  11) Token-Ring         11) VAR/Dealertalk        
12) LANWrkPlaceDOS-OS2 12) Other LAN types    12) CNEs                  
13) UK Topic           13) Cabling/Media      13) Developers            
14)                    14) New Shells         14) On yourSoapbox!       
15)                    15) Windows            15) The LighterSide       
16)                    16)                    16)                       


Ŀ
        NETW2X                 NETW3X               NOVLIB              
Ĵ
1) Printing            1) Printing            1) Lib Questions Only     
2) Utilities           2) Utilities           2)                        
3) Disk Drives/Cntrls  3) Disk Drives/Cntrls  3)                        
4) Client/Shells       4) Client/Shells       4)                        
5) LAN Driver/Cards    5) LAN Driver/Cards    5)                        
6) Empty               6) Empty               6)                        
7) Empty               7) Empty               7)                        
8) Empty               8) Empty               8)                        
9) Empty               9) Empty               9)                        
10) Empty              10) Empty              10)                       
11) Empty              11) Empty              11)                       
12) Empty              12) Empty              12)                       
13) Empty              13) Empty              13)                       
14) 2.1x & Below/OS    14) 3.x OS Specific    14)                       
15) 2.2 OS Specific    15)                    15)                       


Novell NOVLIB Forum Libraries Menu

  1 Novell NEW Uploads
  2 General Information
  3 NetWare 2.X Specifc
  4 NetWare 3.X Specifc
  5 Client/Shell Drivrs
CLIPBBS 2-10                   Page 27                  28 Mar 1992


  6 NetWare Utilities
  7 Btrieve/XQL
  8 Mac/UNIX/LANalyzer
  9 Comunic'tns Product
 10 NetWare Lite
 11 Techinfo/IMSP's
 12 CLOSED
 13 Other Ptch's/Drvr's
 14 Independent Devl'mt
 15 ShareWare/Demo
 16 Public Domain/Text
 17 Other NEW Uploads

-------------------------------------------------------------------------------


                           What is what (1)

ADDCOMM 99

        Advanced communications library for dBASE. Baud rates to 19200
        bps, Xmodem, Xmodem-CRC, Ascii text capture to .DBF files.
        COM1 to COM4 supports. Can operate unattended. Includes macro
        processing

ARTFUL freshWin

        Database Warehouse, 129

        Windowing library, opening as many windows as you like, using
        popup, exploding or ventian-blind methods. Drag then, size
        them, float them, color them, say and get to them, hide them,
        write to them even when hidden. Coded in C and assembly where
        it counts, for insanely great speed. Complete source in 5.0 and
        C and assembly, nguide database and manual. Based on OOP

ARTFUL TWO also as ARTFUL.LIB

        Database warehouse, 285 for 5.0, 185 for Summer 87

        Rapid Application Development (RAD) for Clipper programmers:

        menu designer, dictionary manager, fiel-level dynamic help
        system, autohelp system displays help on ENTRY INTO a field,
        report manager, user manager, relational query, relational
        search, scrolling detail regions, scoped browsers, pusbuttongs,
        radio buttons, check boxes, field and file selectors,
        intelligent file maintenance objects, csrolling lookup tables,
        enumerated fields, milti-tag list boxes, automatic multi user
        apps, automatic file and index handling, automatic relational
        protections, dynamically selectable menus, individual colors,
        all text in header files for easy translations, complete source
        code in 5.0 and C

BAR CODE LIBRARY

CLIPBBS 2-10                   Page 28                  28 Mar 1992


        Offers a bar code printing facility that can be called from
        Clipper application, it can print a variety of different
        formats and supports most major printers. bar code reading
        systems are available from various other manufacturers.

BENCHTEST

        TST program which allow recording and playback of kestrokes in
        Clipper program. Also screen dumping, pausing with
        optional messages, sleeping, break points, choices of playback
        speed. Record to an easy to edit text files. Use for demos,
        debugging or unattended testing. Requires about 44KB of memory.

BITON

        Allows a Clipper application use ORACLE as a data storage
        medium through function calls. Requires Oracle 5.1b and
        MicroSoft C alternate Math lib (LLIBCA.LIB). Basic knowledge of
        Oracle SQL Required.

BLINKER

        Fast dynamic overlaylinker for Clipper. 6times faster than
        PLINK86 with automatic overlaying and compatible with existing
        .LNK files. also overlays well behaved C and ASM code and .LIB
        code Included profilling functions a free pool memory packer,
        burning in of SET CLIPPER variable and serial numbers plues
        creating of demonstration EXEs. Now supoprots incremental
        linking and comes with NG database.

CALC(DB)

        Fully functional spreadsheet library for Clipper5, Powerfull
        spreasheet and calculation facilities. Consists of an API which
        provieds for formula creating, Lotus 123, macro supports. Cell
        access and control, and coversion between .DBF and .WK1


CHYDALE DBF PROTECTOR

        With the addtion of a single line to your source code stops end
        users accessig DBF files with dBASE, DBU or other utilities,
        while allowing your application to accessthe files normally.
        The changes to the DBF can easily be reversed by you allowing
        YOU total control of access to DBF files.

CHYDALE DBT REPLACER

        Replaces DBT file associated with DBF files. Requires very
        little modification to any existing application to use it.
        reduces the number of file handles required and saves loads of
        disk psace, the DBT Replacer can be used to store variable
        length text and Binary data

CHYDALE MOUSE DRIVER

CLIPBBS 2-10                   Page 29                  28 Mar 1992


        Integrate mouse with your Colipper application using the
        Chydale Mouse driver and avoid trouble of programming the
        mouse. One line of code added to your source code enables mouse
        support for MENU TO, MEMOEDIT, GETs, ACHOICE, DBEDIT and more.
        A unique new BUTTON facility allows to associate and action
        with a region on the screen.

CHYDALE NETWORK LIBRARY

        Meets the requirements of network programmers. COnsists of thwo
        main parts, one for user entry protection and the other for
        user monitoring, Open a view of files in one function call with
        the view manageer,. System supervisor utility allows control of
        users by logging their activities and password protection.

CHYDALTE TEST CASE GENERATOR

        Generator is designed for programmers wishing to perform
        realisting test on systems. It fully populates data file
        avoiding laborious typing. It produces random data which meets
        constraints set by the programmer - such as ranger or related
        fileds.

CHYDALE PROFESSIONAL TOOLKIT

        DBF Protector, DBT REPLACER, MOUSE DRIVER, NETWORK LIBRARY and
        CASE GENERATOR

CHYDALE SUPERCLASS

        TRUE objects to be defined and created which operate in the
        same manner as Clipper 5's fixed classes. Create and export
        instance variables, assign methods just like the predefined
        classes. Integrates fully with 5.01 debugger, some fully
        documented sample classes included - menu, stack, image objects
        and others.

CL Professional

        Database Warehouse, 519
        (C) Dr.Huggle&Partner Gmbh

        CLTOOLS3.0 and CLREPORT 3.0 and CLTEXT 3.1 included in one
        package.

CLARINET

        Transparent connectivity to Novell's Netware operating system
        from withing datbase applications. This function library
        provides direct interation with network without having use
        external NEtware utilities. Fully network aware applications,
        includes service for connectios, worskstations, directories,
        bindery, printing....

CLASSY

CLIPBBS 2-10                   Page 30                  28 Mar 1992


        Adding own real objects (classes) into Clipper. For 5.0 it was
        shareware, for 5.01 it's classic product for buy.

CLEAR+
        Flowchars from source code, high resolution diagrams,
        multi-level system tree charts, formatted source listing,
        program flow simulation mode, multi-page charts with line
        indexing, PCX and PIC file output, zooming and rotation,
        portrait or landscape orientation. Supports dBASE II, III,
        III+, IV, Clipper, Focbase, QuickSilver and dBXL.

CLIP2EB

        Advantage of POWER of EMERALD BAY without leaving the security
        of Clipper.

CLIPFPCX

        Small and very fast function for displaying one .PCX file on
        screen. Nothing else, but SHAREWARE and really very fast.

CLIPPER TOOLS, also called NANTUCKET TOOLS

        Supported, supplied and written by Nantucket porvides with 270+
        useful functions covering basic windowing, serial port,
        database functions, screen, system informations, printer...

CLIPTOOLS

        More than 270 functions to help with problems. Store file/field
        details in text files and use intelligent functions to manage
        .DBT files, powerful browser and user interface functions,
        network, relation manipulation, menu system, virtual big screen
        made from physical screens, low level functions, stack system,
        full internatl network support, 500pages manual

CLIPX

        set of function for windowing, look-ups and popus, implode,
        explode and slide, DBHANDLE is a powerful replacement for
        DBEDIT, dbgen generates databases, dbseek seeks
        first/last/next/prevous key occurence, barmenu handles 4
        directional bar option selection, completely documented with
        numerous examples and help for NG engine.

CLIRMA

        Clipper and DCA's IRMA subroutines to allow PC programs to
        drive IBM 3270 mainframe screens via IRMA board. Requires
        Summer 87 and MS linker v3.61 or later

CLREPORT 3.0

        list programming, menu driven report rafting with WYSIWYG user
        interface, complex evaluations included in reports. Directly
        linkable runtime modules, more than 300 pritner types, graphics
CLIPBBS 2-10                   Page 31                  28 Mar 1992


        and text output, screen output with horizontal and vertical
        scrolling..

CLTOOLS 3.0

        Over 250 functions in 20 groups, mouse, windowing, graphics,
        operating system, serial interface, string processing, direct
        access to DOS background printer spooler, 43 line EGA, 256
        windows, nested GETs
        windows like surface, graphics library including:
        -       window processing on graphics screens
        -       event management for running dialog boxes
        -       mouse support, buttons, scrollbasrs, icon menues
        -       about every graphics element you could thing of, image
                management, presentation graphics
        -       PCS support, scan your pictures
        -       unachieved results in printing
        -       vector font, rubberbanding
        -       printer spooler
        -       serial interface functions
        -       string management

CLTEXT 3.1

        Object oriented text processing, 80 methosd of editing, MS word
        like in look and feel, 350 printer installations included,
        source included (probably).

123CONNECTION

        Transparent connectivity to Lotus compatible spreadsheet data
        from within database applications. Ability to access, read or
        write existin worksheets or create entirelyt new worksheets,
        compatible with Lotus 123 release 1.x and 2.x worksheets of
        unlimited size. Clipper Summer 87 and 5.0 compatible

CODE BASE

        "C" library for datbase and screen managemet, Compatible with
        data, index and memo files of dBASE and CLipper. Allows you to
        buold a milti-user dBASE/Clipper compatible application with
        pulldown menus, popup window, data entry from picklists and
        more. Runs much faster than Clipper of FOX. Needs TurboC++,
        Microsoft C, Zortech C++ or similar environment.

COMMTOOLS

        Give your application the power of communication, Commtols is
        development tool for CLipper 5.0 and Summer87 whcih extends the
        Clipper dialect to include comms facilities. Send Faxes, dial
        modems, importa data via your serial port, supports numernous
        communications protocols and variety of hardware.

dANALYST GOLD

        Converts from ANY single to multi-user application. Also
CLIPBBS 2-10                   Page 32                  28 Mar 1992


        provides blocking diagrams, cross references variables,
        performs data type analysis and lists data structures, Works
        with DV386 and allows creating of Windows applications. Works
        with Clipper, dBASE, Foxbase+, QuickSilver or C

DB2SC4

        Utility to transcribe data from .DBF files to Supercals 4 and 5
        formats by specifying record and field ranges and scopes.
        Character blanks and zeros are automatically excluded. prompt
        file paramters can automate the program from DOS. Developed in
        Clipper, linkable object code version is available.

DBDBAK

        Database Warehous, 129
        (c) Data Base Designs

        Comprehensive backup and restore library with
        compression/decompression up to 75% with DBF files, robust disk
        formatting routines, disk "branding", multiple directory backup
        and file tagging, large file splitting, error handling, arhive
        library maintenance, disc label printing, incremental file
        backup.  Clipper source provided.

DBDMOUSE

        Pull down menu generator with full mouse support.Written in
        Assembler.

DBDSCRL

        Provides sophisticated method of presenting data on screen with
        light bar scrolling, mouse support and field pnning with freeze
        capability. Can be called recursively. Source provided.

-------------------------------------------------------------------------------


                         Printing out memory file

 Here's MEMDUMP program in Clipper 5.01 (converted from Rick Spence's
 ideas). It fills an array with the contents of a .MEM file.  You would
 simply dump the contents instead of building the array.

 // #include "fileio.ch"
#define MEM_SIZE  32
#define CRLF chr(13)+chr(10)
#define MNAME 1
#define MTYPE 2
#define MLEN  3
#define MDEC  4
FUNCTION memdump( fname )
local mem_handle, mem_rec, _mem_rec := array(4)
local csize, value, contents := {}
    if pcount() != 1 .or. ((mem_handle := fopen(fname)) == -1)
CLIPBBS 2-10                   Page 33                  28 Mar 1992


        return contents
    endif
    mem_rec := space(32)
    do while (fread(mem_handle, @mem_rec, MEM_SIZE) == MEM_SIZE)
        Fill_Array(mem_rec, _mem_rec)
        do case
            case _mem_rec[MTYPE] == "C"
                csize := _mem_rec[MLEN] + _mem_rec[MDEC] * 256
                value := space(csize)
                fread(mem_handle, @value, csize)
            case _mem_rec[MTYPE] == "D"
                value := space(8)
                fread(mem_handle, @value, 8)
                value := IEEE2real( value )
                value := ctod('01/01/100') + value - 1757585
            case _mem_rec[MTYPE] == "L"
                value := space(1)
                fread(mem_handle, @value, 1)
                value := iif(asc(value)==0,".F.",".T.")
            case _mem_rec[MTYPE] == "N"
                value := space(8)
                fread(mem_handle, @value, 8)
                value := IEEE2real( value )
        endcase
        aadd(contents, { _mem_rec[MNAME], ;
                         _mem_rec[MTYPE], ;
                         _mem_rec[MLEN], ;
                         _mem_rec[MDEC], ;
                         value } )
    enddo
    fclose(mem_handle)
RETURN contents

PROCEDURE Fill_Array(mem_rec, _mem_rec)
    _mem_rec[MNAME] := substr(mem_rec, 1, 11)
    * Fix for Clipper's placement of non-null bytes after null terminator
    _mem_rec[MNAME] := left(_mem_rec[MNAME], at(chr(0),_mem_rec[MNAME])-1)
    _mem_rec[MTYPE] := chr( asc( substr(mem_rec, 12, 1)) - 128)  // & 127
    _mem_rec[MLEN]  := asc(substr(mem_rec, 17, 1))
    _mem_rec[MDEC]  := asc(substr(mem_rec, 18, 1))
RETURN

************************[ p. 1032, Lief's Book ]**************************
FUNCTION IEEE2real(cIee)
// note this function may have glitches on some numbers.
local retval := 0, k, x1 := "", sign, exponent, fraction
    if cIee <> replicate(chr(0),8)     // Are all bits set to zero?
        * x1 will be the 8 bytes converted to it's 64 bit binary equivalent
        * in text
        for k := len(cIee) to 1 step -1
            x1 += Dec2Bin(asc(substr(cIee,k,1)),8)
        next k
        sign     := (substr(x1,1,1) == "1")
        exponent := Bin2dec(substr(x1,2,11)) - 1023
        fraction := Bin2dec("1"+substr(x1,13),.t.) / (2**52)
        retval   := if(sign,-1,1) * ( fraction * (2**exponent))
CLIPBBS 2-10                   Page 34                  28 Mar 1992


    endif
RETURN retval

-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 35                  28 Mar 1992


===============================================================================
                                     NEWS
===============================================================================


Clipper Interface Handbook


There's a new book out called "The Clipper Interface Handbook" by John Mueller
that describes all about interfacing Clipper with both C and Assembly language.
It also includes references to DOS interrupts, tips on interfacing a mouse and
a into a Clipper app and command/function reference for Clipper, C and ASM. The
book covers all versions to 5.01 (but centers mainly on 5.01).

Stats  :
Title  : The Clipper Interface Handbook Version 5.x
Author : Mueller, John
ISBN   : 0-8306-3532-7
Publisher : Windcrest/McGraw Hill
Price  : $27.95 US Rec Retail

-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 36                  28 Mar 1992


===============================================================================
                                   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 <grin>.

Daniel



-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 37                  28 Mar 1992


===============================================================================
                                   COMMENTS
===============================================================================


Funny set SET DATE....
----------------------

This is most probably of the topic, BUT
  did you know that you could :
  SET DATE FORMAT TO "CC-YY,MM:DD"

and your dates would now display as 19-92,01:29

-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 38                  28 Mar 1992


                            __DOS_HOLD problem

The __dos-Hold problem arises also when you compile with the latest
Blinker-releases.  The problem can be solved when you put into your
module somewhere a function :

function __dos_hold
return .t.

-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 39                  28 Mar 1992


===============================================================================
                                  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.

Ŀ
FileName     Src Description                                     Where 
Ĵ
ACCESS.ARJ   Cln Source of speed testing program                 [1-06]
ACH2TB.ARJ   Cln Convert ACHOICE to TBROWSE                      [1-05]
ACHOO2.ARJ   Cln Replacement of ACHOICE with GET possibilites    [1-06]
ADHOC302.ARJ Cln Summer 87 inteligent report program             [1-04]
ASCPOS.ARJ   Cln replacement of ASC(substr(cString,nPosition,1)) [1-11]
BARNTX.ARJ   Cln Displaying bar indication during indexing       [1-13]
BLOCK.ARJ    Cln Tetris game written in Cliper                   [1-19]
BUTTON.ARJ   Cln @GET in form of BUTTON                          [1-14]
CALC14.ARJ   Cln PoPup Calculator                                [1-08]
CIVMIL.ARJ   Cln Upgrade of Civil->Military time conversion      [1-19]
CL5103.ARJ   Cln Report of 5.01 anomaly number 3                 [1-04]
CL5REP6.ARJ  Cln 5.01 replacement of REPORT command              [1-04]
CLIP110.ARJ  Cln Clipper Documentor program                      [1-05]
CLIPFPCX.ARJ Cln Fast .PCX displayer for CLipper                 [1-15]
CLIPLINK.ARJ Cbs Complete text of R.Donnay about linkers         [1-04]
CLIPPLUS.ZIP Cln Object extension for CLIPPER 5.0                [1-14]
CLIPSQL.ARJ  Cln Demo of complete SQL library for CLipper        [1-05]
CLIPWARN.AJ  Cln Semaphore for convert WARNING: into ERRORLEVEL  [1-11]
CLPFON.ARJ   Cln Set of fonts for EXPAND.LIB from author         [1-03]
COMET.ARJ    Cln Demo version of communication library           [1-19]
COND.ARJ     Cln Builder of conditional indexes like SUBNTX      [1-03]
CWDEMO.ARJ   Cln Classworks lib written in CLASS(Y)              [1-13]
DBSCN2.ARJ   Cln Screen designer generator                       [1-05]
DIAL.CLN     Cln Dialer with using of FOPEN()                    [1-07]
DOC111.ARJ   Cln Documentor, newer version                       [1-08]
DTF102.ARJ   Cln .DBT files replacement, fully functional        [1-14]
ENDADD.ARJ   Cln replacement of incrementing last char of string [1-11]
GETKEY.ARJ   Cln Input oriented library, wordprocessing          [1-12]
GETPP.ARJ    Cln Modified GETSYS.PRG well documented             [1-19]
GSR151.ARJ   Cln Global Search and replace for programmers       [1-07]
HGLASS.ZIP   Cln Hour glass for indication of index progression  [1-04]
HILITO.ARJ   Cln Highlighting of keywords on screen              [1-19]
HOTKEY.ARJ   Cln Makin unique hot key letter for every arrat el. [1-14]
INDXSL.ARJ   Cln User Fields selection builder for index generate[1-03]
IOBASYS9.ARJ Cln Demo of S87 library and calling Clipper from C  [1-03]
IS.ARJ       Cln Several c sources of ISxxxx functions           [1-11]
JG2.ARJ      Cln Jumping between GET statements in READ          [1-08]
KF_LOKUP.ARJ Cln Set of program for database relations           [1-07]
LUTLIB.ARJ   Cln Another Clipper library                         [1-08]
MK30.ARJ     Cln Mouse library demo version                      [1-03]
MOVEGETS.ARJ Cln GETSYS change for moving between gets via VALID [1-03]
CLIPBBS 2-10                   Page 40                  28 Mar 1992


MSWIN.ARJ    Cln Detection of Windows mode when running Clipper  [1-14]
NFDESC2.ARJ  Cln NanForum library description list               [1-06]
NFLIB2.ARJ   Cln NanForum library main file                      [1-06]
NFSRC2.ARJ   Cln NanForum library Source files                   [1-06]
NOTATION.ARJ Cln Complete text of article about hungarian notat. [1-04]
NTXBAR.ARJ   Cln Bar of indexing via system interrupts           [1-19]
OCLIP.ARJ    Cln Object extension, real (not #define/command)    [1-12]
OOPSCL5.ARJ  Cln Another version of pseudo objects               [1-07]
PACKUP.ARJ   Cln ASM source of PACK/UNPACK replacement SCRSAVE.. [1-04]
PARTIDX3.ARJ Cln Partial indexing                                [1-12]
PAT1.ARJ     Cln CIX NanForum Libraryy PATCH                     [1-07]
PAT2-2.ARJ   Cln Fix for FLOPTST.ASM in Nanforum Library         [1-13]
PAT2-3.ARJ   Cln TBWHILE improvement for Nanforum libray         [1-14]
PAT2-4.ARJ   Cln FT_PEGS() patch for NFLIB                       [1-15]
PAT2-5.ARJ   Cln FT_TEMPFIL() patch for NFLIB                    [1-16]
POPUPCAL.ARJ Cln Popup calender                                  [1-05]
POSTPRNT.ARJ Cln Postscript printing from inside of Clipper      [1-14]
POWER10.ARJ  Cln French library                                  [1-07]
PRINTSUP.AJR Cln Low level BIOS routines for printing            [1-11]
QS20F.ARJ    Cln Screen designer, demo, looks very good          [1-11]
READPW.ARJ   Cln GETSYS change for password invisible reader     [1-03]
SCANCODE.ARJ Cln Database with scan codes                        [1-07]
SCRSAVE.ARJ  Cln Screen AntiBurning utility (inactivity snake)   [1-05]
SEGUE.ARJ    Cln Novell library - demo                           [1-15]
SHADO.ARJ    Cln Creating shadow on screen                       [1-14]
SHELP50A.ARJ Cln SuperHelp for Clipper                           [1-07]
SHOWANSI.ARJ Cln Displaying a ANSI from inside CLIPPER no ANSI.SY[1-15]
SNAP497.ARJ  Cln Beta version of SNAP, partially compatible to 5 [1-12]
SNAP50.ARJ   Cln dBASE/CLIPPER documentor supporting 5.01 little [1-15]
SOUND.ARJ    Cln Multiple TONE() used as one SOUND function      [1-06]
STATUS.ARJ   Cln Timer interrupt hooked status indicator         [1-12]
SUPER160.ARJ Cln SUPER.LIB for Summer87                          [1-13]
SYMBOL.ARJ   Cln Dumper of symbol tables of Summer87 .EXE        [1-03]
TBUNIQUE.ARJ Cln Browsing unique without unique index            [1-12]
TBWHL4.ARJ   Cln WHILE browsing using TBROWSE, well commented    [1-06]
TICKER.ARJ   Cln Real Time Clock, interrupt driven on screen     [1-12]
VOICE200.ARJ Cln VOICE synthetizing library for Clipper          [1-13]
VSIX711.ARJ  Cln Vernon Six Clipper utilities and library        [1-05]
VSIX800.ARJ  Cln Vernon's library, lot of functions              [1-12]
WIPEV11.EXE  Cln VERY good screen manipulation library           [1-11]
ZIP2BAR.ARJ  Cln Printing BAR (USPS) code on EPSON printer       [1-15]


Src can be:
    Cln     File is accesible on ClipperNet
    Cbs     File is accesible in HQ BBS of CLipper BBS Magazine


-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 41                  28 Mar 1992


===============================================================================
                                    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, top is V32b) or
  voice to 31-10-4843870 in both cases asking for DANIEL (Docekal).

  Distribution sites:

  Clipper BBS Home system  
  
      NETCONSULT BBS, SYSOP Daniel Docekal, phone 31-10-4157141
      Daily 18:00 till 08:00 (GMT+1), sat+sun whole day
      Modem speed 1200, 2400, 9600, 12000, 14400 (V32b)
      2:285/608@fidonet.org

  United Kingdom   
  
      Welsh Wizard, SYSOP Dave Wall, phone 44-656-79477
      Daily whole day, modem speed HST

  Italy   
  
      Lady Bright BBS, SYSOP Gianni Bragante, Phone: +39-15-8353153
      20:00-08:00 monday to friday, from saturday 13:00 to 08:00 monday
      24h/24h holydays, 300-9600 baud v21,v22,v32,v42bis
      2:334/307@fidonet.org

  United States of America  
  
     The Southern Clipper, SYSOP Jerry Pults, phone 1-405-789-2078
      Daily whole day, modem speed HST

      The New Way BBS, SYSOP Tom Held, phone, 1-602-459-2412
      Daily 24hours, 1:309/1@Fidonet.org, 8:902/6@RBBS-Net

  Canada    
  
      SYSOP Gordon Kennet, phone 1-604-599-4451 
      Daily 24houts, 2400bps V42b, 1:153/931@fidonet.org

CLIPBBS 2-10                   Page 42                  28 Mar 1992


  WORLDWIDE   
  
  
      Clipper File Distrubution Network (ClipperNet, area CL-DOC)
      Various systems around whole world



-------------------------------------------------------------------------------
CLIPBBS 2-10                   Page 43                  28 Mar 1992


                     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

-------------------------------------------------------------------------------
