Early days of Clipper

Notes on early days of Clipper

Some quotations :

Clipper was originally built in 1985 as a compiler for dBASE III.

Clipper was built by Nantucket Corporation led by Barry ReBell (management) and Brian Russell (technical), and  later sold to …

Source

         ~~~~~~~~~~~~~~~~~~~

Brett Oliver, Jim Warner, Brian Russell, Richard McConnell …

Main architects and primary developers of Clipper and founders of Nantucket Corporation. It was 1984 when
Clipper was born.

Source

~~~~~~~~~~~~~~~~~~~

Clipper Summer’87 Manual, “Credits” page :

ClpSum87Credits

~~~~~~~~~~~~~~~~~~~

Clipper 5.0 Manual, “Credits” page :

Clp5.0Credits

~~~~~~~~~~~~~~~~~~~

… and 30 years after birth of this phenomenal myth, one (or first) of main builders suddenly appeared : Brett Oliver !

By a comment to one page of this blog :

Not only main starter / builder of Clipper, he is also author of wonderful books :

Clipper Programming: An In-Depth Introduction to Programming

This book also is a myth.

And he told me on request, something on beginning and building story of this great myth;

Brian was working at Ashton-Tate, as was I.

I was in tech support, alongside Brian, and customers that were phoning in kept asking for a compiler.

So I approached Barry for the money to back it. He had a temp agency. I met him in the Ashton-Tate cafeteria.

I recruited Brian at lunch at a Japanese restaurant in Culver city.

Clipper was the first program Brian had written in ‘C’.

He learned C as he programmed Clipper.

I asked him when I was recruiting him if he had ever written a compiler.

He said he had written a Pascal compiler in university. (He later admitted that it had never worked!).

The first development office was a beach house in Malibu.

Tom Rettig was the editor for dNEWS at Ashton-Tate. I took over as editor of dNEWS.

I was the first VP of sales, and one of my employees was Mary Beth. I introduced her to Brian and later they married.

At the first Comdex in Vegas, Brian was upstairs in his room – coding.

He got one command to work – paint a dot on the screen. We demonstrated that one command, and showed that we could draw a box 20 times faster than dBASE.

I wrote a couple of books on Clipper, and was also on the dBASE for Windows development team at Borland. 

I worked with Tom at his condo in Santa Monica for a time. Too bad he died.

Barry died in 2009.

Brian and I went dirt biking together. He loaned me his street bike for a couple of months when my car was getting fixed. He is a good guy. I think he is working in LA.

We live in San Diego, – my wife is from Liechtenstein. We have three boys.

I am Scottish. Currently programming in eCommerce.

Anyway, nice chatting.

Stay in touch.

I wish he will write more …

SP_IFMOUSEHD

IFMOUSEHD()

  Short:
  ------
  IFMOUSEHD() Checks if mouse held down,evals codeblock while it is

  Returns:
  --------
  NIL

  Syntax:
  -------
  IFMOUSEHD(bBlock, [oTbrowse])

  Description:
  ------------
  You'll often want to hold the left mouse button down on a hot object
  in order to cause an action to repeat rapidly over and over. An
  example would be on an up or down arrow that caused a tbrowse object
  to go up or down. Rather than go click-release-click-release-click..etc,
  you prefer to just hold the mouse down.

  If you detect the mouse has been pressed and you then want to check
  if its held down and perform an action repetetively while it is,
  you can use this function.

  <bBlock> is the code block to be evaluated continuously while the mouse
  is held down. (there is a .01 second delay between iterations).

  [oTbrowse] is an optional Tbrowse object that you wish to be refreshed
  during the evaluation of the block. (otherwise, you could hold the mouse
  button down continuously and not se anything happen. You could have
  your codeblock refresh the Tbrowse, of course. Its just easier this
  way.

  Examples:
  ---------
  // this code is taken from SMALLS(), our lookup table popup

  case ISMOUSEAT(nMouseR, nMouseC, nBot+2, nLeft, nBot+2, nLeft+2)
      oTb:up()
      IFMOUSEHD({||oTb:up()},oTb)
  case ISMOUSEAT(nMouseR, nMouseC, nBot+2, nLeft+3, nBot+2, nLeft+5)
      oTb:down()
      IFMOUSEHD({||oTb:down()},oTb)

  Source:
  -------
  S_MOOSE.PRG

 

SP_HELPMOD

HELPMOD()

  Short:
  ------
  HELPMOD() Interactively build and modify help screens

  Returns:
  --------
  Nothing

  Syntax:
  -------
  SET KEY xxx TO HELPMOD

  Description:
  ------------
  HELPMOD() creates and modifies help screens for
  HELP() which are stored in HELP.DBF.

  HELPMOD() allows online creation and modification of
  the size, location and contents of the help screen for the
  current PROC,VARIABLE combination, and stores the results in
  HELP.DBF.

  HELPMOD() is intended to be used online, during
  program execution, by the developer/programmer. It can be
  removed after development.

  By setting a key xxx to this function, the current
  PROC and VARIABLE are passed to it when the key is pressed
  during the program.

  By comparing the PROC and VARIABLE parameters against
  entries in the HELP.DBF, HELPMOD() can then provide the
  appropriate help screen for modification, or, if no matching
  record is found, allow creation of a new help screen record.

  HELP.DBF is created if not present.

  Examples:
  ---------
   EXTERNAL HELPMOD

   SET KEY -30 TO HELPMOD  && alt-F1

  Notes:
  -------
  Will not be much use during ACHOICE or MENU TO

  Source:
  -------
  S_HELPM.PRG

 

SP_HELP

HELP()

  Short:
  ------
  HELP() Provides context sensitive popup help

  Returns:
  --------
  Nothing

  Syntax:
  -------
  SET KEY xxx TO HELP

  Description:
  ------------
  By setting a key xxx to this function, the current
  PROC and VARIABLE are passed to it when the key is pressed
  during the program.

  By comparing the PROC and VARIABLE parameters against
  entries in the HELP.DBF, HELP() can then provide the appropriate
  help screen for the user. If no matching record is found, HELP()
  displays a 'No Help Found' message to the user.

  HELP() works in conjunction with HELPMOD() which is
  used to create help screen records for the HELP.DBF. HELPMOD()
  allows online creation and modification of the size, location
  and contents of the help screen for the current PROC,VARIABLE
  combination.

  Examples:
  ---------
   EXTERNAL HELP

   SET KEY 28 to HELP

  Warnings:
  ----------
  The SET KEY that called this proc is still active
  inside the proc. You may wish to modify the proc to turn off/on
  the set key.

  i.e. if called with key 28 (F1)

  at start :  SET KEY 28 to
  at end:     SET KEY 28 to HELP

  Notes:
  -------
  Will not be much use during ACHOICE or MENU TO

  Source:
  -------
  S_HELP.PRG

 

SP_HARDCOPY

HARDCOPY()

  Short:
  ------
  HARDCOPY() Prints current record or memo fields to printer

  Returns:
  --------
  Nil

  Syntax:
  -------
  HARDCOPY([aFields,aFieldDesc,aFieldTypes])

  Description:
  ------------
  Prints out contents of the current record, or any
  memo fields in the current record, to printer or file.

  [aFields,aFieldDesc,aFieldTypes] are optional arrays
  of field names, field descriptions, and field types. Default is
  field names, field names, and field types in current area.

  Examples:
  ---------
   HARDCOPY()

  Source:
  -------
  S_HARDC.PRG

 

SP_GLOBREP

GLOBREP()

  Short:
  ------
  GLOBREP() Performs global selective replace of a field

  Returns:
  --------
  Nothing

  Syntax:
  -------
  GLOBREP([aFields,aDesc])

  Description:
  ------------
  Allows user to point to a field and then enter a
  replacement value for it. Replacement can be executed for all
  records, query matches, or tagged records.

  [aFields,aDesc] arrays of field names, and field
  descriptions.

  Examples:
  ---------
   If nChoice == 9   // Global replace

     GLOBREP()

   endif

  Warnings:
  ----------
  These changes are, of course, permanent.
  New to 3.5:
  -Preview (view changes before they happen)
  -'Build Formula' replacement option type. Lets user build a
  formula for replacing the target field.

  Source:
  -------
  S_GLOBR.PRG

 

SP_GETJUMP2

GETJUMP2()

  Short:
  ------
  GETJUMP2() Determines if mouse clicked on a get

  Returns:
  --------
  <nJumpTo> => Number of get that mouse clicked on

  Syntax:
  -------
  GETJUMP2(nMouseRow, nMousecol, [aGetList] )

  Description:
  ------------
  This function checks nMouseRow and nMouseCol against the getlist,
  either passed by you as [aGetList], or by accessing the most recent
  RAT_READ() get list, and determines if the user clicked on a
  get. How you then get to that get is up to you. RAT_READ and the
  specialized get readers in SuperLib make use of this function to
  jump to non-contiguous gets.

  Examples:
  ---------
  IF (nGet := GETJUMP2(nMouseR, nMouseC,getlist) ) > 0
     ....
  ENDIF

  Notes:
  -------

  Source:
  -------
  S_RREAD.PRG