home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / CLIPPER / RCMP20 / RCMPLIB.DOC < prev    next >
Text File  |  1993-09-20  |  25KB  |  637 lines

  1. ┌─────────────────────────────────────────────────────────────────────────╖
  2. │                                                                         ║
  3. │                       RCmpLib  version 2.0 (20/09/93)                   ║
  4. │                                                                         ║
  5. │                                                                         ║
  6. │        (c) 1993  Rolf van Gelder, EINDHOVEN - All rights reserved       ║
  7. │                                                                         ║
  8. ╘═════════════════════════════════════════════════════════════════════════╝
  9.  
  10. 1     INTRODUCTION --------------------------------------------------------
  11.  
  12.       RCmpLib is a CLIPPER LIBRARY with data compression functions.
  13.  
  14.       Because RCmpLib is fully written in ASSEMBLER its functions are
  15.       VERY FAST !
  16.  
  17.       Three libraries are enclosed :
  18.  
  19.       RCmpExo.lib - ExoSpace compatible library for Clipper 5.xx & Sum '87
  20.       RCmpLib.lib - Library for Clipper version 5.xx
  21.       RCmpS87.lib - Library for Clipper Summer '87
  22.  
  23.       RCmpLib is a Shareware product :
  24.  
  25.       You have the opportunity to try the program at no charge to see if
  26.       it meets your needs.
  27.       If you continue to use the program after evaluation,
  28.       please complete the included registration form (RCmpLib.FRM)
  29.       and send it with the applicable registration fee to the author.
  30.  
  31.  
  32.       FEATURES :
  33.  
  34.       *    Functions to COMPRESS and DECOMPRESS files
  35.  
  36.       *    FAST & RELIABLE COMPRESSION with a GOOD COMPRESSION FACTOR
  37.  
  38.       *    A NORTON GUIDE with a description of all functions in the library
  39.  
  40.       *    EXOSPACE COMPATIBLE
  41.  
  42.       *    A DEMO PROGRAM with examples of the use of all functions in
  43.            RCmpLib.
  44.  
  45.  
  46.  
  47. 2     COMPRESSION AND DECOMPRESSION ---------------------------------------
  48.  
  49.  
  50. 2.1   COMPRESSION ALGORITHM -----------------------------------------------
  51.  
  52.       The compression and decompression functions of RCmpLib are based on
  53.       the so-called Lempel-Ziv principle, to be specific the LZW algorithm.
  54.       This base principle is used by almost all famous compression programs
  55.       (as LHARC, ARJ and PKZIP).
  56.  
  57.       The principle works in short as follows :
  58.       (Sub-)Strings that appear often in the file to compress are being
  59.       replaced by numerical codes.
  60.  
  61.       While decompressing these codes are replaced again by the original
  62.       strings.
  63.  
  64.  
  65. 2.2   THE USE OF COMPRESSION IN CLIPPER APPLICATIONS ----------------------
  66.  
  67.       The most common use of compression function in Clipper applications
  68.       is the following scenario :
  69.  
  70.       Decompress all Clipper data files (.DBF,.DBT,.NTX,.FRM,... etc.) at
  71.       the beginning of an application. While the application is running
  72.       all the files are accessible in their normal, uncompressed form.
  73.  
  74.       Compress all the Clipper data files (.DBF,.DBT,.NTX,.FRM,... etc.)
  75.       at the termination of the application.
  76.  
  77.       Advantages of this method :
  78.  
  79.       - During the execution of the application all is normal
  80.         (all the files are uncompressed on the disk)
  81.  
  82.       - After the termination of the program, the application will consume
  83.         much less disk space (the data files are compressed)
  84.  
  85.       - Backups of the application consume much less floppy disk space
  86.         (data files are backupped in their compressed form)
  87.  
  88.       - One of the greatest advantages is :
  89.         After the application is terminated all data files will be
  90.         UNACCESSIBLE to the user (or other persons).
  91.  
  92.         A compressed file is also ENCRYPTED !!
  93.  
  94.         Files with secret information can't be examined using an editor
  95.         or list program. 
  96.         It will be IMPOSSIBLE to manipulate the files with for example
  97.         dBASE or any other .DBF viewer/editor :
  98.         The (compressed) database can't be corrupted doing that way.
  99.  
  100.  
  101.  
  102. 2.3   QUALITY OF THE COMPRESSION ------------------------------------------
  103.  
  104.       The compression method used by RCmpLib is fast, reliable and gives
  105.       a good compression factor.
  106.  
  107.       In comparison with the commercial compression programs as PKZIP 2.04
  108.       and ARJ 2.41, RCmpLib will score a little less.
  109.  
  110.       The comparison is not completely fair because PKZIP and ARJ standalone
  111.       programs are with only one goal : compression.
  112.       RCmpLib is a part of a complete Clipper application and has to deal
  113.       with less resources (as memory).
  114.  
  115.  
  116.  
  117. 3     FUNCTIONS IN RCMPLIB ------------------------------------------------
  118.  
  119.  
  120. 3.1   Function R_Compress :  Compresses a file using the Lempel-Ziv algorithm
  121.  
  122.       Syntax
  123.         nRetCode := R_Compress ( cInFile [, cOutFile[, nCmpFact ] ] )
  124.  
  125.       Arguments
  126.         cInFile         File specification of the file to be compressed
  127.                         (=input file)
  128.                         Format  : [drive:][\path\]filename[.ext]
  129.                         Example : C:\INVOICE\INVOICE.DBF
  130.  
  131.         cOutFile        File specification of the compressed file
  132.                         (=output file)
  133.                         Format  : [drive:][\path\]filename[.ext]
  134.                         Example : C:\INVOICE\INVOICE.ZIP
  135.  
  136.                         If NO output file name is specified the output file
  137.                         will be created on the default drive, in the default
  138.                         directory, with the same name as the input file.
  139.                         THE FIRST CHARACTER OF THE FILE NAME EXTENSION WILL
  140.                         BE REPLACED BY THE '#' CHARACTER.
  141.  
  142.                         Examples:
  143.                         R_Compress ( 'TEST.DBF', 'TEST.LZC' ) => TEST.LZC
  144.                         R_Compress ( 'TEST.DBF' )             => TEST.#CP
  145.  
  146. (v2.0)  nCmpFact        Compression factor [1-5]
  147.                         Higher numbers give a higher compression factor.
  148.                         Default value is 5. In most cases this is the best
  149.                         choice. If there are "not-enough-memory" problems
  150.                         take a lower compression factor : this saves memory
  151.                         (but the size of the compressed files will increase
  152.                         a little bit ...).
  153.  
  154.       Returns
  155.         nRetCode        Numeric return code
  156.  
  157.                         The values and descriptions of this return code
  158.                         are defined in RCmpLib.CH :
  159.  
  160.         ┌────┬────────────────────┬─────────────────────────────────╖
  161.         │Code│Constant            │Description                      ║
  162.         ├────┼────────────────────┼─────────────────────────────────╢
  163.         │  0 │CP_OKAY             │Everything okay                  ║
  164.         │  1 │CP_INVALID_PARM     │Invalid parameter(s) passed      ║
  165.         │  2 │CP_OPEN_INPUT       │Error OPENING input file         ║
  166.         │  3 │CP_NOT_RCMPLIB      │Not compressed by RCmpLib        ║
  167.         │  4 │CP_WRONG_VERSION    │Wrong version of RCmpLib         ║
  168.         │  5 │CP_CREATE_OUTPUT    │Error CREATING output file       ║
  169.         │  6 │CP_READ_INPUT       │Error READING  input  file       ║
  170.         │  7 │CP_WRITE_OUTPUT     │Error WRITING  output file       ║
  171.         │  8 │CP_CLOSE_INPUT      │Error CLOSING  input  file       ║
  172.         │  9 │CP_CLOSE_OUTPUT     │Error CLOSING  output file       ║
  173.         │ 10 │CP_MEMORY_ERROR     │Not enough memory                ║
  174.         │ 11 │CP_ALLOCATE_ERROR   │Error allocating buffer          ║
  175.         ╘════╧════════════════════╧═════════════════════════════════╝
  176.  
  177.       Description
  178.         Compresses the input file using Lempel-Ziv compression.
  179.  
  180.         ┌────────────────────────────────────────────────────────────────╖
  181.         │                         -+- CAUTION -+-                        ║
  182.         │                                                                ║
  183.         │     IN THE UN-REGISTERED  VERSION OF RCMPLIB THE FOLLOWING     ║
  184.         │     REGISTRATION MESSAGE WILL BE DISPLAYED AT RANDOM TIMES     ║
  185.         │     (WHILE EXECUTING THE R_COMPRESS() FUNCTION) :              ║
  186.         │                                                                ║
  187.         │ UN-Registered version of RCmpLib -+- Please wait for 8 seconds ║
  188.         │                                                                ║
  189.         │       AFTER A 8 SECONDS DELAY THE PROGRAM WILL CONTINUE.       ║
  190.         ╘════════════════════════════════════════════════════════════════╝
  191.  
  192.       Example
  193.         *-- Compresses the file INVOICE.DBF => INVOICE.#BF
  194.  
  195.         *-- Header file of RCmpLib
  196.         #include "RCmpLib.CH"
  197.  
  198.         LOCAL        nRetCode                        && Return code R_Compress
  199.         LOCAL        aCmpError := CP_ERRMSG          && Array with error msgs
  200.  
  201.         *-- Save the original file size
  202.         LOCAL        nFSizeIn   := R_FSize ( 'INVOICE.DBF' )
  203.         LOCAL        nFSizeOut                        && Size of output file
  204.         LOCAL        nFactor                          && Compression factor
  205.  
  206.         [...]
  207.  
  208.         nRetCode := R_Compress ( 'INVOICE.DBF', 'INVOICE.#BF' )
  209.  
  210.         IF nRetCode = CP_OKAY
  211.  
  212.                 *-- Compression is okay :
  213.                 *--    delete the original file
  214.                 FErase ( 'INVOICE.DBF' )
  215.  
  216.                 *-- Determine the size of the compressed file
  217.                 nFSizeOut := R_FSize ( 'INVOICE.#BF' )
  218.  
  219.                 *-- Calculate the compression factor
  220.                 nFactor   := 100*(nFSizeIn-nFSizeOut)/nFSizeIn
  221.  
  222.                 *-- Show the compression factor
  223.                 ALERT ( 'Compression factor : '+Str(nFactor)+' %' )
  224.  
  225.         ELSE
  226.                 *-- Oops, error while compressing ...
  227.  
  228.                 *-- Display the error message
  229.                 ALERT ( 'Error R_Compress() : ' + aCmpError [nRetCode] )
  230.         ENDIF
  231.  
  232.         *-- Continuation of the program
  233.         [...]
  234.  
  235.         More examples can be found in the demo program RCmpDemo.PRG.
  236.  
  237.  
  238. 3.2   Function R_CPName : Determines the original name of a compressed file
  239.  
  240.       Syntax
  241.         cFileName := R_CPName ( cCmpFile )
  242.  
  243.       Arguments
  244.         cCmpFile        File specification of a compressed file
  245.                         Format  : [drive:][\path\]filename[.ext]
  246.                         Example : C:\INVOICE\INVOICE.#BF
  247.  
  248.       Returns
  249.         cFileName       Original name of the compressed file.
  250.                         If an error is detected (p.e. the specified input
  251.                         file doesn't exist) a NIL pointer will be returned.
  252.                         The error can be examined using the R_LastErr ()
  253.                         function.
  254.  
  255.       Description
  256.         Determines what the file name of a file was before it was
  257.         compressed by R_Compress ().
  258.  
  259.       Example
  260.         *-- Compresses the file INVOICE.DBF => INVOICE.#BF and determines
  261.         *--        the original file name
  262.  
  263.         *-- header file of RCmpLib
  264.         #include "RCmpLib.CH"
  265.  
  266.         LOCAL        nRetCode                  && Return code R_Compress
  267.  
  268.         nRetCode := R_Compress ( 'INVOICE.DBF', 'INVOICE.#BF' )
  269.  
  270.         IF nRetCode = CP_OKAY
  271.                 *-- Compression okay : delete the original file
  272.                 FErase ( 'INVOICE.DBF' )
  273.  
  274.                 ?'The original name of INVOICE.#BF was : ', ;
  275.                         R_CPName ( 'INVOICE.#BF' )
  276.                 *-- Results to : 'INVOICE.DBF'
  277.         ENDIF
  278.  
  279.  
  280. 3.3   Function R_CPSize : Determines the original size of a compressed file
  281.  
  282.       Syntax
  283.         nFileSize := R_CPSize ( cCmpFile )
  284.  
  285.       Arguments
  286.         cCmpFile        File specification of a compressed file
  287.                         Format  : [drive:][\path\]filename[.ext]
  288.                         Example : C:\INVOICE\INVOICE.#BF
  289.  
  290.       Returns
  291.         nFileSize       Original (uncompressed) size of the compressed file.
  292.                         If an error is detected (p.e. the specified input
  293.                         file doesn't exist) the value -1 will be returned.
  294.                         The error can be examined using the R_LastErr ()
  295.                         function.
  296.  
  297.       Description
  298.         Determines what the file size of a file was before it was
  299.         compressed by R_Compress ().
  300.         This information can be used to check if there is enough free
  301.         disk space before decompressing files.
  302.  
  303.       Example
  304.         *-- Compresses the file INVOICE.DBF => INVOICE.#BF and determines
  305.         *--        the original file size
  306.  
  307.         *-- header file of RCmpLib
  308.         #include "RCmpLib.CH"
  309.  
  310.         LOCAL        nRetCode                   && Return code R_Compress
  311.  
  312.         nRetCode := R_Compress ( 'INVOICE.DBF', 'INVOICE.#BF' )
  313.  
  314.         IF nRetCode = CP_OKAY
  315.                 *-- Compression okay : delete the original file
  316.                 FErase ( 'INVOICE.DBF' )
  317.  
  318.                 ?'The original size of INVOICE.#BF was : ', ;
  319.                         R_CPSize ( 'INVOICE.#BF' )
  320.         ENDIF
  321.  
  322.  
  323. 3.4   Function R_DeComp : Decompresses a by R_Compress() compressed file
  324.  
  325.       Syntax
  326.         nRetCode := R_DeComp ( cInFile [, cOutFile] )
  327.  
  328.       Arguments
  329.         cInFile         File specification of the file to be decompressed
  330.                         (=input file)
  331.                         Format  : [drive:][\path\]filename[.ext]
  332.                         Example : C:\INVOICE\INVOICE.#BF
  333.  
  334.         cOutFile        File specification of the decompressed file
  335.                         (=output file)
  336.                         Format  : [drive:][\path\]filename[.ext]
  337.                         Example : C:\INVOICE\INVOICE.DBF
  338.  
  339.                         If NO output file name is specified the output file
  340.                         will be created on the default drive, in the default
  341.                         directory, with the same name as the ORIGINAL file.
  342.  
  343.                         Example :
  344.                         R_Compress ( 'TEST.DBF', 'TEST.#BF' )
  345.                         R_DeComp   ( 'TEST.#BF' ) => 'TEST.DBF'
  346.  
  347.       Returns
  348.         nRetCode        Numeric return code
  349.  
  350.                         The values and descriptions of this return code
  351.                         are defined in RCmpLib.CH :
  352.  
  353.         ┌────┬────────────────────┬─────────────────────────────────╖
  354.         │Code│Constant            │Description                      ║
  355.         ├────┼────────────────────┼─────────────────────────────────╢
  356.         │  0 │CP_OKAY             │Everything okay                  ║
  357.         │  1 │CP_INVALID_PARM     │Invalid parameter(s) passed      ║
  358.         │  2 │CP_OPEN_INPUT       │Error OPENING input file         ║
  359.         │  3 │CP_NOT_RCMPLIB      │Not compressed by RCmpLib        ║
  360.         │  4 │CP_WRONG_VERSION    │Wrong version of RCmpLib         ║
  361.         │  5 │CP_CREATE_OUTPUT    │Error CREATING output file       ║
  362.         │  6 │CP_READ_INPUT       │Error READING  input  file       ║
  363.         │  7 │CP_WRITE_OUTPUT     │Error WRITING  output file       ║
  364.         │  8 │CP_CLOSE_INPUT      │Error CLOSING  input  file       ║
  365.         │  9 │CP_CLOSE_OUTPUT     │Error CLOSING  output file       ║
  366.         │ 10 │CP_MEMORY_ERROR     │Not enough memory                ║
  367.         │ 11 │CP_ALLOCATE_ERROR   │Error allocating buffer          ║
  368.         ╘════╧════════════════════╧═════════════════════════════════╝
  369.  
  370.       Description
  371.         Decompresses the input file. The input file should be compressed
  372.         by the R_Compress() function.
  373.  
  374.         The timestamp of the original (uncompressed) file will be restored
  375.         after the decompression.
  376.  
  377.         ┌────────────────────────────────────────────────────────────────╖
  378.         │                         -+- CAUTION -+-                        ║
  379.         │                                                                ║
  380.         │     IN THE UN-REGISTERED  VERSION OF RCMPLIB THE FOLLOWING     ║
  381.         │     REGISTRATION MESSAGE WILL BE DISPLAYED AT RANDOM TIMES     ║
  382.         │     (WHILE EXECUTING THE R_DECOMP() FUNCTION) :                ║
  383.         │                                                                ║
  384.         │ UN-Registered version of RCmpLib -+- Please wait for 8 seconds ║
  385.         │                                                                ║
  386.         │       AFTER A 8 SECONDS DELAY THE PROGRAM WILL CONTINUE.       ║
  387.         ╘════════════════════════════════════════════════════════════════╝
  388.  
  389.       Example
  390.         *-- Decompressed the file INVOICE.#BF
  391.  
  392.         *-- Header file of RCmpLib
  393.         #include "RCmpLib.CH"
  394.  
  395.         LOCAL        nRetCode                        && Return code R_Compress
  396.         LOCAL        aCmpError := CP_ERRMSG          && Array with error msgs
  397.  
  398.         [...]
  399.  
  400.         nRetCode := R_DeComp ( 'INVOICE.#BF' )
  401.  
  402.         IF nRetCode = CP_OKAY
  403.  
  404.                 *-- Decompression okay :
  405.                 *--    original (compressed) file can be deleted !
  406.  
  407.                 FErase ( 'INVOICE.#BF' )
  408.  
  409.         ELSE
  410.                 *-- Oops, error while decompressing
  411.  
  412.                 *-- Display the error message
  413.                 ALERT ( 'Error R_DeComp() : ' + aCmpError [nRetCode] )
  414.         ENDIF
  415.  
  416.         && Continuation of the program
  417.         [...]
  418.  
  419.         More examples can be found in the demo program RCmpDemo.PRG.
  420.  
  421.  
  422. 3.5   Function R_FSize : Determines the size of a file
  423.  
  424.       Syntax
  425.         nFileSize := R_FSize ( cInFile )
  426.  
  427.       Arguments
  428.         cInFile         File specification of the file to be examined
  429.                         Format  : [drive:][\path\]filename[.ext]
  430.                         Example : C:\INVOICE\INVOICE.DBF
  431.  
  432.       Returns
  433.         nFileSize       Size of the input file (in bytes).
  434.                         If an error is detected (p.e. the specified input
  435.                         file doesn't exist) the value -1 will be returned.
  436.  
  437.       Description
  438.         Determines the size of a file
  439.  
  440.       Example
  441.         See the example of R_Compress()
  442.  
  443.  
  444. 3.6   Function R_IsRCmp : Determines if a file has been compressed
  445.                           by R_Compress()
  446.  
  447.       Syntax
  448.         lCompressed := R_IsRCmp ( cInFile )
  449.  
  450.       Arguments
  451.         cInFile         File specification of the file to be examined
  452.                         Format  : [drive:][\path\]filename[.ext]
  453.                         Example : C:\INVOICE\INVOICE.DBF
  454.  
  455.       Returns
  456.         lCompressed     .T. : file IS compressed by R_Compress()
  457.                         .F. : file IS NOT compressed by R_Compress()
  458.                               -OR- error occurred while executing R_IsCmp()
  459.                               (p.e. the input file doesn't exist)
  460.                               The error can be examined using the
  461.                               R_LastErr () function.
  462.  
  463.       Description
  464.         Determines if a file has been compressed using the R_Compress()
  465.         function.
  466.         Using this function it is easy to determine which files in a
  467.         particular directory are compressed by R_Compress() and so can
  468.         be decompressed using the R_DeComp() function.
  469.  
  470.       Example
  471.         *-- Decompressed all compressed file in the current directory
  472.  
  473.         #include "Directry.CH"
  474.  
  475.         AEval ( Directory ( '*.*' ), ;
  476.                 { |aFile| IF ( R_IsRCmp ( aFile [F_NAME] ), ;
  477.                                R_DeComp ( aFile [F_NAME] ), ;
  478.                                nil ;
  479.                              ) ;
  480.                  } ;
  481.               )
  482.  
  483.         See also the demo program RCmpDemo.PRG
  484.  
  485.  
  486. 3.6   Function R_LastErr : Retrieves the last occurred error code (v2.0)
  487.  
  488.       Syntax
  489.         nErrCode := R_LastErr ()
  490.  
  491.       Parameters
  492.         (None)
  493.  
  494.       Returns
  495.         nErrCode        Last occurred error code
  496.  
  497.                         The values and descriptions of this return code
  498.                         are defined in RCmpLib.CH :
  499.  
  500.         ┌────┬────────────────────┬─────────────────────────────────╖
  501.         │Code│Constant            │Description                      ║
  502.         ├────┼────────────────────┼─────────────────────────────────╢
  503.         │  0 │CP_OKAY             │Everything okay                  ║
  504.         │  1 │CP_INVALID_PARM     │Invalid parameter(s) passed      ║
  505.         │  2 │CP_OPEN_INPUT       │Error OPENING input file         ║
  506.         │  3 │CP_NOT_RCMPLIB      │Not compressed by RCmpLib        ║
  507.         │  4 │CP_WRONG_VERSION    │Wrong version of RCmpLib         ║
  508.         │  5 │CP_CREATE_OUTPUT    │Error CREATING output file       ║
  509.         │  6 │CP_READ_INPUT       │Error READING  input  file       ║
  510.         │  7 │CP_WRITE_OUTPUT     │Error WRITING  output file       ║
  511.         │  8 │CP_CLOSE_INPUT      │Error CLOSING  input  file       ║
  512.         │  9 │CP_CLOSE_OUTPUT     │Error CLOSING  output file       ║
  513.         │ 10 │CP_MEMORY_ERROR     │Not enough memory                ║
  514.         │ 11 │CP_ALLOCATE_ERROR   │Error allocating buffer          ║
  515.         ╘════╧════════════════════╧═════════════════════════════════╝
  516.  
  517.       Description
  518.         This function can be used in combination with one of the following
  519.         functions :
  520.         R_CPName(), R_CPSize() or R_IsRCmp().
  521.  
  522.         After calling one of these functions you can use R_LastErr() to
  523.         determine which error did occur.
  524.         (The error code is not returned by these functions).
  525.  
  526.       Example
  527.         #include "RCmpLib.CH"
  528.  
  529.         LOCAL  aCmpError := CP_ERRMSG   && Array with messages
  530.         LOCAL  cOrgName
  531.         LOCAL  nOrgSize
  532.  
  533.         cOrgName := R_CPName ( 'INVOICE.#BF' )
  534.         IF cOrgName = NIL
  535.                 *-- Determine & display error
  536.                 ?'Error: ' +  aCmpError [R_LastErr()]
  537.         ELSE
  538.                 ?'The original name is ', cOrgName
  539.         ENDIF
  540.  
  541.         cOrgSize := R_CPSize ( 'INVOICE.#BF' )
  542.         IF cOrgSize < 0
  543.                 *-- Determine & display error
  544.                 ?'Error: ' +  aCmpError [R_LastErr()]
  545.         ELSE
  546.                 ?'The original size is ', nOrgSize, ' bytes.'
  547.         ENDIF
  548.  
  549.         IF !R_IsRCmp ( 'INVOICE.#BF' )
  550.                 *-- Determine & display error
  551.                 ?'Error: ' +  aCmpError [R_LastErr()]
  552.         ELSE
  553.                 ?'File is compressed by RCmpLib !'
  554.         ENDIF
  555.  
  556.  
  557.  
  558. 4     REGISTRATION --------------------------------------------------------
  559.  
  560.       RCmpLib is a Shareware product. It is available through Users Groups,
  561.       Bulletin Boards, etc.
  562.       You have the opportunity to try the program at no charge to see
  563.       if it meets your needs. If you continue to use the program after
  564.       evaluation, please complete the included registration form
  565.       (RCmpLib.FRM) and send it to:
  566.  
  567.                         Ing. R.P.B. van Gelder
  568.                         Binnenwiertzstraat 27
  569.                         5615 HG  EINDHOVEN
  570.                         THE NETHERLANDS
  571.  
  572.       The price for registration is :
  573.  
  574.       If you want to receive the library by E-MAIL : US $ 10,00
  575.  
  576.       If you want to receive the library by POST   : US $ 15,00
  577.  
  578.       Payment :
  579.  
  580.       Just include the appropriate amount of money (in cash) with the
  581.       registration form and send it to the address as mentioned above.
  582.  
  583.  
  584.  
  585. 4.1   BENEFITS OF REGISTRATION --------------------------------------------
  586.  
  587.       1) A registered version of RCmpLib will be sent to you by E-MAIL or
  588.          by POST.
  589.  
  590.          ┌─────────────────────────────────────────────────────────────╖
  591.          │ THE REGISTERED VERSION DOESN'T DISPLAY THE REGISTRATION     ║
  592.          │ MESSAGE AND DOESN'T HAVE THE 8 SECONDS DELAYS.              ║
  593.          ╘═════════════════════════════════════════════════════════════╝
  594.  
  595.       2) You will receive a small utility called DCmpAll.EXE.
  596.          With DCmpAll you can decompress all files in a directory.
  597.          This is very useful for system developers.
  598.  
  599.       3) Run-time royalty-free license. You will be free to integrate
  600.          RCmpLib functions into your Clipper applications without having
  601.          to pay any royalty or fee for doing so. You may also distribute
  602.          or market any such applications royalty-free.
  603.  
  604.       4) Support through E-Mail
  605.  
  606.          E-Mail addresses :
  607.  
  608.          Internet: RCROLF@urc.tue.nl
  609.          Bitnet  : RCROLF@heitue5
  610.  
  611.  
  612. 4.2   USER GROUPS / SHAREWARE DISTRIBUTORS --------------------------------
  613.  
  614.       PC User Groups are welcome to add RCmpLib to their libraries under
  615.       the following conditions :
  616.  
  617.       1) It must be completely unmodified
  618.  
  619.       2) A diskette/copying fee of $5 of less is charged; and
  620.  
  621.       3) This documentation file MUST be included.
  622.  
  623.       I would appreciate notification that you have added RCmpLib
  624.       to your library.
  625.  
  626.       IF YOU RECEIVED RCMPLIB THROUGH EITHER A USER GROUP OR A SHAREWARE
  627.       DISTRIBUTOR, PLEASE REMEMBER THAT THE DISKETTE FEE YOU PAYED DOES NOT
  628.       CONSTITUTE LICENSING THE SOFTWARE, AND YOU ARE STILL OBLIGATED TO 
  629.       REGISTER IF YOU DECIDE TO USE RCMPLIB.
  630.  
  631.  
  632.  
  633. 5     DISCLAIMER ----------------------------------------------------------
  634.  
  635.       The copyright owner disclaims all warranties and is not liable for
  636.       damages of any kind. By using RCmpLib you agree to this.
  637.