home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / q / qlib56.zip / INTRO.DOC < prev    next >
Text File  |  1992-12-11  |  47KB  |  777 lines

  1.  
  2.     QLIB version 5.6 advanced function library for Microsoft BASIC compilers
  3.     Copyright (C) 1988-1992 Douglas Herr ■ all rights reserved
  4.  
  5. WHAT IS QLIB?
  6.  
  7.     QLIB is a library of functions and subroutines for the following
  8.     Microsoft BASIC compilers:
  9.  
  10.     QuickBASIC 4.0
  11.     QuickBASIC 4.0b
  12.     QuickBASIC 4.5
  13.  
  14.     BASIC Professional Development System 7.0
  15.     BASIC Professional Development System 7.1
  16.  
  17.     Visual Basic for DOS (with thanks to Lee Bonnifield and Tony Kulik)
  18.  
  19.     QLIB subroutines provide the BASIC programmer with many additional
  20.     functions and commands, along with un-BASIC-like speed and power.
  21.  
  22. WHY USE QLIB?
  23.  
  24.     Compiled BASIC programming represents an enormous leap in BASIC
  25.     programming over interpreted BASICA or GWBASIC, and is a language that
  26.     many programmers already know.  However, many programmers also know that
  27.     many compiled BASIC commands are not really quick, can be extremely
  28.     cumbersome, and/or will eat tremendous amounts of memory.
  29.     QLIB subroutines are written in assembly language for maximum speed and
  30.     compact size.  QLIB subroutines can be up to 10 times faster than
  31.     comparable BASIC commands and can reduce the size of your .EXE files
  32.     dramatically.  QLIB's subroutines also provide many functions and screen
  33.     modes which are impossible with BASIC alone.
  34.  
  35.     Ideas for these routines come from a wide variety of sources.  If you want
  36.     to see additional routines, let me hear about it.  In this way, QLIB's
  37.     users can affect the direction QLIB takes.
  38.  
  39. DISCLAIMER
  40.  
  41.     Each QLIB routine has been tested extensively, but since I cannot foresee
  42.     every possible use or abuse of QLIB, I cannot be held responsible for any
  43.     damages resulting from its use.  I have used QLIB with IBM PC/XT, PC/AT,
  44.     PS/2 Model 30, 50z, Leading Edge model D, Zenith SuperSport 286, ATT 6300,
  45.     and with XT, 286, 386sx, 386-33 and 486-25 clones with PC/MS-DOS
  46.     versions 3.1 through 5.0.  Video systems tested include IBM EGA
  47.     with 64k, Paradise EGA 480, Everex Micro Enhancer EGA, IBM's MCGA
  48.     and VGA built into the PS/2s, Hercules Graphics Card Plus, Hercules
  49.     InColor, cheap Hercules clones, IBM's Monochrome Display Adapter, and
  50.     a few SuperVGAs.  I have tested the subroutines with QuickBASIC versions
  51.     4.0b and 4.5, with BC 7.0 and with BC7's QBX.
  52.  
  53.  
  54. DISTRIBUTION and REGISTRATION
  55.  
  56.     QLIB is user-supported shareware, NOT public domain software.  The QLIB
  57.     files you have received are the complete QLIB package, usable within the
  58.     QuickBASIC or QBX editor to develop programs, and linkable with your
  59.     object code to create stand-alone .EXE programs.  These files may be
  60.     distributed freely in un-altered form, but if you use QLIB in your BASIC
  61.     programs, you are expected to register.
  62.  
  63.     The advantages of registering are many:
  64.  
  65.     Registered users receive the latest version available when they register
  66.     and may upgrade at any time for the paltry fee of $10.00.
  67.  
  68.     Registered users will receive the huge model library QLIBH.LIB as well
  69.     as the medium model QLIB.LIB
  70.  
  71.     Registered users may request custom modifications to any of QLIB's
  72.     subroutines (but I will not guarantee I can make all modifications!).
  73.  
  74.     Programs linked with registered versions of QLIB will be slightly smaller
  75.     than those linked with the distribution version, and will not contain my
  76.     copyright notice.
  77.  
  78.     Your registration fee supports my efforts, and encourages me to continue
  79.     development of QLIB.
  80.  
  81.     No royalties are required and registration costs only $25, and you will
  82.     have confidence that you are using a version of QLIB which has not been
  83.     altered by others.
  84.  
  85.     Register by sending $25 to:
  86.  
  87.               Douglas R. Herr
  88.               P. O. Box 207
  89.               Sacramento, CA  95812
  90.               U. S. A.
  91.  
  92.               telephone (916) 721-8762
  93.               CompuServe 71247,3542
  94.  
  95.  
  96.     Please specify which size disk you prefer, and which version you are
  97.     registering (QLIB for QuickBASIC 4.x or BC6, or QXLIB for BC7/QBX or
  98.     VBDOS).  If you want both QLIB and QXLIB, please add $10.
  99.     Assembly-language source code for any of the libraries is an
  100.     additional $25.
  101.  
  102.     Any questions or problems should be sent to me at the above address.
  103.     Please include a stamped, self-addressed envelope if you are not a
  104.     registered user, or for fastest response, send a message on CompuServe.
  105.  
  106.     QLIB is a rapidly evolving library, so it is likely that by the time you
  107.     register there will be several additional routines or refinements to
  108.     existing routines available.
  109.  
  110. HOW DO I USE QLIB?
  111.  
  112.     Beginning with version 5.0, QLIB has been optimized for QuickBASIC 4.0,
  113.     4.5 and BC7.  There are two versions of the QLIB5 library: QLIB.LIB
  114.     for QuickBASIC 4.0 and QuickBASIC 4.5, and QXLIB.LIB is for BC7, QBX
  115.     and VBDOS.  QLIB.LIB should also work with BC6.
  116.  
  117.     QLIB may be used with your BASIC compiler by copying QLIB.BI and
  118.     QLIB.LIB (or QXLIB.LIB) to your BASIC directory.  You will need to
  119.     make a .QLB version of QLIB to use QLIB with the QB, QBX or VBDOS
  120.     development enviornment.  You will need the BQLB4x.LIB, QBXQLB.LIB
  121.     or VBDOSQLB.LIB libraries supplied by Microsoft with your compiler.
  122.  
  123.     Make your .QLB file this way:
  124.  
  125.     QuickBASIC 4.0:   LINK /Q /SE:150 QLIB.LIB,,nul,BQLB40.LIB;
  126.     QuickBASIC 4.0b:  LINK /Q /SE:150 QLIB.LIB,,nul,BQLB41.LIB;
  127.     QuickBASIC 4.5:   LINK /Q /SE:150 QLIB.LIB,,nul,BQLB45.LIB;
  128.     QBX:              LINK /Q /SE:150 QXLIB.LIB,,nul,QBXQLB.LIB;
  129.     VBDOS:            LINK /Q /SE:150 QXLIB.LIB,,nul,VBDOSQLB.LIB;
  130.  
  131.     If you are using QuickBASIC 4.0 or 4.0b, LINK will give you an error
  132.     message related to QLIB's use of the 8087 emulator.  This error message
  133.     is expected.  The practical effect of this error is that QLIB
  134.     subroutines which use BASIC's 8087 emulator will not work within the
  135.     QuickBASIC editor enviornment if you do not have a math coprocessor.
  136.     The emulator will be linked properly when you create your .EXE files.
  137.  
  138.     QuickBASIC 4.0b's BQLB41.LIB library can be patched to eliminate the
  139.     error message (this may also work with QB 4.0's BQLB40.LIB):
  140.  
  141.     Step 1: extract object files from BCOM41.LIB
  142.             C:\LIB BCOM41 *BFPSIG *FIXUPS *EMOEM *PIEMR;
  143.  
  144.     Step 2: add these object files to BQLB41
  145.             C:\LIB BQLB41 +BFPSIG +FIXUPS +EMOEM +PIEMR,BQLB42;
  146.  
  147.     Step 3: Make a new QLIB.QLB
  148.             C:\LINK /Q /SE:200 QLIB.LIB,,NUL,BQLB42;
  149.  
  150.     I have not had the 8087 emulation problem with BQLB45.LIB or with
  151.     QBXQLB.LIB.  This patch seems to work within the QuickBASIC editor
  152.     but since 90% of the PCs I've used have math coprocessors, I can't
  153.     be certain.  Your experience with your own system is your best guide.
  154.  
  155.  
  156.  
  157.     To load QLIB with the QuickBASIC editor, use the command
  158.  
  159.          QB /L QLIB.QLB
  160.  
  161.     or for QBX, use:
  162.  
  163.          QBX /L QXLIB.QLB
  164.  
  165.     for VBDOS:
  166.  
  167.          VBDOS /L QXLIB.QLB
  168.  
  169.     To use QLIB's functions, you MUST include the INCLUDE file QLIB.BI in
  170.     your source code.  QLIB.BI changes BASIC's default data type from
  171.     SINGLE to INTEGER, and also contains the declarations for QLIB's
  172.     functions.  QLIB's functions MUST be declared before they can be used,
  173.     and the INTEGER default data type is required.  You should change
  174.     the default data type to INTEGER whether you use QLIB or not, so your
  175.     programs will be smaller and faster.  Use SINGLE and DOUBLE data types
  176.     only when nessesary.  The documentation for QLIB's functions shows
  177.     you how to use the INCLUDE file.
  178.  
  179.     QLIB.BI has the function declarations for ALL of QLIB's functions.
  180.     You should use this as a template for the function declarations for
  181.     your programs.  If you compile your programs using an un-altered
  182.     QLIB.BI file,  all of the functions declared in the INCLUDE file
  183.     may be included in your .EXE program whether the program uses the
  184.     functions or not.  Edit QLIB.BI to remove functions you don't need
  185.     and you will have more space in the development enviornment and,
  186.     depending on which BASIC you use, your .EXE programs may be smaller.
  187.  
  188.     REGISTERED USERS: note that QLIBH.BI should be used in place of QLIB.BI
  189.     if you are using the huge model library QLIBH.LIB.
  190.  
  191.  
  192.     SPECIAL NOTE TO VBDOS PROGRAMMERS:
  193.  
  194.     I have not purchased VBDOS yet, so all my information regarding
  195.     compatibility of QXLIB with VBDOS is from you people in the trenches.
  196.     Feedback from Lee Bonnifield and Tony Kulik has been particularly
  197.     valuable and informative; if you are using VBDOS and you run into
  198.     problems, let me hear about it!  I can't fix the problem if I don't
  199.     know it exists!
  200.  
  201.     VBDOS programmers may also need to include QXLIB subroutine
  202.     declarations in the .BI file when compiling from the DOS command line.
  203.  
  204.     Example:
  205.     DECLARE SUB QPrint(s$, row%, column%, attribute%)
  206.  
  207.  
  208.     Compile your source code using
  209.  
  210.          BC myprog /O;
  211.  
  212.     (many QLIB subroutines require the /O option)
  213.  
  214.     Link QLIB with your object files with
  215.  
  216.          LINK /EX /NOE myprog,,NUL,QLIB.LIB;
  217.     or   LINK /EX /NOE myprog,,NUL,QXLIB.LIB;
  218.  
  219.     You may compile your source code and link to QLIB.LIB from within the
  220.     QuickBASIC editor, but QuickBASIC may include the ENTIRE QLIB.LIB file
  221.     in your .EXE file, whether you use any subroutines or not.  This is not
  222.     the way to keep your program small!  Link from the command line as I have
  223.     shown and your .EXE file will include only the subroutines you need.
  224.  
  225.     QLIB's documentation has been divided into several files in order to keep
  226.     each one down to a managable size.  The .DOC files are:
  227.  
  228.     INTRO.DOC      this file
  229.     INPUT.DOC      keyboard input subroutines
  230.     COMPLEX.DOC    COMPLEX data subroutines
  231.     DATA.DOC       data manipulation subroutines
  232.     DISK.DOC       disk and file management subroutines
  233.     EMS.DOC        LIM Expanded Memory subroutines
  234.     SYSTEM.DOC     subroutines which determine PC equipment or status
  235.     GRAPHICS.DOC   subroutines for graphics
  236.     SOLVE.DOC       solutions for common mathematical equations
  237.     VIDEO.DOC      video input and output subroutines (text modes)
  238.     UPDATE.DOC     important information if you are upgrading from an
  239.                    earlier version of QLIB
  240.  
  241.     Note: the other files which make up the QLIB5 package are:
  242.  
  243.     QLIB.LIB       QuickBASIC link library
  244.     QXLIB.LIB      BC7/VBDOS link library
  245.     QLIB.BI        INCLUDE file for QuickBASIC, BC7/QBX and VBDOS
  246.  
  247.  
  248.     In the spirit of QB 4.5's on-line documentation, each of the .DOC
  249.     files may be loaded into the QuickBASIC or QBX editor (use DOCUMENT
  250.     switch), from which you may cut and paste into your source code to
  251.     your heart's content.  Hard copy of the documentation may be easily
  252.     (and inexpensively) obtained by using your printer.
  253.  
  254.     If you are upgrading from a version of QLIB prior to 5.0, read ALL of
  255.     the new .DOC files completely.  Many subroutines have been changed to
  256.     functions, and others have been replaced by new subroutines.  While
  257.     this may cause you some inconvenience in the short run, doing this
  258.     allowed me to provide higher performance and smaller code.
  259.  
  260. BASIC DATA TYPES
  261.  
  262.     QLIB's documentation is filled with reference to data of the %, &,
  263.     !, # and $ types.  If you already know what these mean, you may skip
  264.     this section, as long as you pay attention to the data types required
  265.     by QLIB's subroutines.  If you are not familiar with BASIC's data types,
  266.     by all means read your manual.
  267.  
  268.     Even if you don't use QLIB, the data types you use in your programs
  269.     will affect the speed and size of your programs.  In general, you
  270.     should use INTEGER (%) data types where possible, and DOUBLE (#)
  271.     types only where nessesary.
  272.  
  273.     BASIC assumes that all data is SINGLE (!) unless otherwise declared.
  274.     You can change the default data type to INTEGER with the command
  275.  
  276.           DEFINT A-Z
  277.  
  278.     I put this at the beginning of all my programs to improve speed, reduce
  279.     size and to eliminate the need for those silly % signs.  This statement
  280.     is part of the INCLUDE file QLIB.BI.
  281.  
  282.     When using QLIB subroutines, pay particular attention to the data types
  283.     required by each subroutine.  If you use the wrong data types, it is
  284.     likely (though not certain) that you will end up with garbage.  If you
  285.     find that it helps, you can add subroutine declarations to the QLIB.BI
  286.     INCLUDE file so that your BC compiler or QB/QBX/VBDOS development
  287.     environment will check data types for you.  I haven't done this because
  288.     adding all of QLIB's subroutines to QLIB.BI takes too much memory and
  289.     slows the loading of QLIB.BI to a snail's pace.
  290.  
  291.     Example:
  292.     DECLARE SUB QPrint(s$, row%, column%, attribute%)
  293.  
  294.  
  295.     QLIB supports a COMPLEX data type consisting of paired SINGLE data.
  296.     Each COMPLEX value is 8 bytes.  COMPLEX data arrays should be allocated
  297.     with BASIC's DIM statement as DOUBLE data.  Once QLIB has established the
  298.     values of the COMPLEX data, BASIC in general will not interpret the data
  299.     correctly.  Exception: for complex conjugates, you can use BASIC.
  300.  
  301.     if c0# is a QLIB COMPLEX data type, this BASIC statement will result in
  302.     c1# = complex conjugate of c0#:
  303.  
  304.     c1# = -c0#
  305.  
  306.     Subroutines specific to the COMPLEX data type are described in
  307.     COMPLEX.DOC.
  308.  
  309.  
  310. SUBROUTINE REFERENCE
  311.  
  312. Documentation for QLIB's subroutines can be found in the following .DOC
  313. files:
  314.  
  315. Name           description                                      .DOC file
  316.                                                                         
  317. AddINTArray    add a constant to an integer array                DATA.DOC
  318. AddLNGArray    add a constant to a long integer array            DATA.DOC
  319. AddSNG         adds two SINGLE values, returning error flag      DATA.DOC
  320. AddDBL         adds two DOUBLE values, returning error flag      DATA.DOC
  321. AllocMem       allocates memory for QLIB from DOS memory area    DATA.DOC
  322. ANSIColor      determines color attribute used by ANSI.SYS      VIDEO.DOC
  323. APrint         Print on the screen using ANSI device driver     VIDEO.DOC
  324. APrintN        like APrint, but advances cursor to next line    VIDEO.DOC
  325. APrintT        APrint plus tab on same line                     VIDEO.DOC
  326. ASCII          returns ASCII code of a string, avoiding error    DATA.DOC
  327. BigPrint       print string on screen in big characters         VIDEO.DOC
  328. Bit2INT        converts a bit pattern to an integer              DATA.DOC
  329. BitBlockBytes  graphics screen manipulation                  GRAPHICS.DOC
  330. BitBlockRestore  restore graphics screen saved earlier       GRAPHICS.DOC
  331. BitBlockSave   save part of graphics screen                  GRAPHICS.DOC
  332. BitPlaneRestore  restore graphics plane saved earlier        GRAPHICS.DOC
  333. BitPlaneSave   save part of a plane of graphics screen       GRAPHICS.DOC
  334. BitPlaneBytes  calculates bytes required for BitPlaneSave    GRAPHICS.DOC
  335. BlockFrame     BIOS routine to frame a block of the screen      VIDEO.DOC
  336. Border         changes color of screen border                   VIDEO.DOC
  337. BPrint         BIOS print on screen                             VIDEO.DOC
  338. BPrintL        BIOS print, lower case                           VIDEO.DOC
  339. BPrintU        BIOS print, upper case                           VIDEO.DOC
  340. C2F            converts degrees Celcius to Farenheit            SOLVE.DOC
  341. CapsOFF        force capslock toggle off                       SYSTEM.DOC
  342. CapsON         force capslock toggle on                        SYSTEM.DOC
  343. CircleAspect   DrawCircle options                            GRAPHICS.DOC
  344. ClearBlock     BIOS clear portion of screen                     VIDEO.DOC
  345. ClearEOL       clears a row from cursor to edge of screen       VIDEO.DOC
  346. ClearKBD       clears the keyboard 'type ahead' buffer          INPUT.DOC
  347. ClearView      clear portion of Graphics screen              GRAPHICS.DOC
  348. Clock          prints a time display on text-mode screens       VIDEO.DOC (b)
  349. ClrScreen      quickly clear entire screen                      VIDEO.DOC
  350. Color16        calculate color value for changing palette    GRAPHICS.DOC
  351. Color256       calculate color value for changing palette    GRAPHICS.DOC
  352. ColorAttr      calculate color attibute                         VIDEO.DOC
  353.  
  354. CombineINTArray  Add one array to another (or subtract)          DATA.DOC
  355. CombineLNGArray  Add one array to another (or subtract)          DATA.DOC
  356. CombineSNGArray  Add one array to another (or subtract)          DATA.DOC
  357. CombineDBLArray  Add one array to another (or subtract)          DATA.DOC
  358. CopyMem        copies a block of memory                          DATA.DOC
  359. CPX2Real       splits COMPLEX value to real & imaginary parts COMPLEX.DOC
  360. CPXAdd         add two COMPLEX values                         COMPLEX.DOC
  361. CPXDiv         divides COMPLEX values                         COMPLEX.DOC
  362. CPXMul         multiplies two COMPLEX values                  COMPLEX.DOC
  363. CPXNeg         returns negative of a COMPLEX value            COMPLEX.DOC
  364. CPXNegI        returns complex conjugate of a COMPLEX values  COMPLEX.DOC
  365. CPXNegR        returns negative complex conjugate             COMPLEX.DOC
  366. CubeFitF4      use Least Squares to fit a curve to coordinates  SOLVE.DOC
  367. CubeFitF8      use Least Squares to fit a curve to coordinates  SOLVE.DOC
  368. CubeFitI2      use Least Squares to fit a curve to coordinates  SOLVE.DOC
  369. CubeFitI4      use Least Squares to fit a curve to coordinates  SOLVE.DOC
  370. CursorColor    enables InColor color palette, sets cursor color VIDEO.DOC
  371. CursorOFF      makes text cursor invisible                      VIDEO.DOC
  372. CursorON       places cursor on text screen                     VIDEO.DOC
  373. Date2LNG       compresses a date to a long integer for storage   DATA.DOC
  374. DayName        returns ASCII day name given day number 1-7       DATA.DOC
  375. DayOfWeek      returns the day of week for any given date        DATA.DOC
  376. DelArray2      deletes one element from an array of 2-byte data  DATA.DOC
  377. DelArray4      deletes one element from an array of 4-byte data  DATA.DOC
  378. DelArray8      deletes one element from an array of 8-byte data  DATA.DOC
  379. DelVSTRArray   deletes one element from a string array           DATA.DOC
  380. DBL2STR        DOUBLE-to-string conversion with formatting       DATA.DOC
  381. DGeyKey        DOS keyboard input; may be redirected            INPUT.DOC
  382. DiskWP         traps "drive not ready" errors                    DISK.DOC
  383. DOSError       returns MS-DOS error code for last DOS function SYSTEM.DOC
  384. DotBAK         renames existing file as backup (.BAK) file       DISK.DOC
  385. DrawBox        draws a box on a graphics screen              GRAPHICS.DOC
  386. DrawCircle     draws a circle on graphics screen             GRAPHICS.DOC
  387. DrawLine       draws a line on graphics screen               GRAPHICS.DOC
  388. DriveSpace     determine free and total space on a disk          DISK.DOC
  389.  
  390. EGAinfo        determine EGA configuration                     SYSTEM.DOC
  391. EMSclose       closes an EMS "file"                               EMS.DOC
  392. EMSopen        opens an EMS "file"                                EMS.DOC
  393. EMSready       determines if EMS is installed                     EMS.DOC
  394. EMSRead        copies data from an EMS "file" to an array         EMS.DOC
  395. EMSRead1       copies one byte from an EMS "file"                 EMS.DOC
  396. EMSRead2       copies two bytes from an EMS "file"                EMS.DOC
  397. EMSRead4       copies four bytes from an EMS "file"               EMS.DOC
  398. EMSRead8       copies eight bytes from an EMS "file"              EMS.DOC
  399. EMSsize        determines free and available EMS memory           EMS.DOC
  400. EMSversion     determines EMS software version                    EMS.DOC
  401. EMSWrite       copies data to an EMS "file" from an array         EMS.DOC
  402. EMSWrite1      copies a 1-byte value to EMS memory                EMS.DOC
  403. EMSWrite2      copies a 2-byte value to EMS memory                EMS.DOC
  404. EMSWrite4      copies a 4-byte value to EMS memory                EMS.DOC
  405. EMSWrite8      copies an 8-byte value to EMS memory               EMS.DOC
  406. EXEName        returns full drive and path name of program     SYSTEM.DOC
  407. Exist          see if a file or subdirectory exists              DISK.DOC
  408. F2C            converts degrees Farenheit to Celcius            SOLVE.DOC
  409. Factorial      calculates the factorial of an integer        SOLVE.DOC
  410. FCopy          copy a file to another disk or directory          DISK.DOC
  411. FFlush         flushes QLIB and DOS file buffer                  DISK.DOC
  412. FClose         close a file opened by FCreate or FOpen           DISK.DOC
  413. FCreate        creates a new file for fast binary I/O            DISK.DOC
  414. FileCount      counts the number of files matching a template    DISK.DOC
  415. FontWidth      Changes GPrint default character width        GRAPHICS.DOC
  416. FOpen          opens an existing file for fast input or output   DISK.DOC
  417. FGet           buffered input from a file opened by FOpen        DISK.DOC
  418. FGet1          fast 1-byte input from a file opened by FOpen     DISK.DOC
  419. FGet2          fast 2-byte input from a file opened by FOpen     DISK.DOC
  420. FGet4          fast 4-byte input from a file opened by FOpen     DISK.DOC
  421. FGet8          fast 8-byte input from a file opened by FOpen     DISK.DOC
  422. FGetSTR        fast string input from a file opened by FOpen     DISK.DOC
  423.  
  424. FillArea       fills an irregular region on graphics screen  GRAPHICS.DOC
  425. FillBox        fills a box on graphics screen                GRAPHICS.DOC
  426. FillEOL        fills from cursor position to edge of screen     VIDEO.DOC
  427. FillPattern    establish fill pattern                        GRAPHICS.DOC
  428. Find1          finds 1-byte value in an array                    DATA.DOC
  429. Find2          finds 2-byte value in an array                    DATA.DOC
  430. Find4          finds 4-byte value in an array                    DATA.DOC
  431. Find8          finds 8-byte value in an array                    DATA.DOC
  432. FindFileAttr   FindFirstMatch/FindNextMatch option               DISK.DOC
  433. FindFileDate   FindFirstMatch/FindNextMatch option               DISK.DOC
  434. FindFileName   FindFirstMatch/FindNextMatch option               DISK.DOC
  435. FindFileSize   FindFirstMatch/FindNextMatch option               DISK.DOC
  436. FindFileTime   FindFirstMatch/FindNextMatch option               DISK.DOC
  437. FindFirstMatch find first matching file with wildcards           DISK.DOC
  438. FindMONO       determine if a monochrome monitor is present    SYSTEM.DOC
  439. FindNextMatch  find next file with wildcards                     DISK.DOC
  440. FLoad          quickly loads a disk file into far memory         DISK.DOC
  441. Floppies       determine number of floppy drives installed     SYSTEM.DOC
  442. FloppyType     determine type of floppy drive installed        SYSTEM.DOC
  443. FPrimeF4       calculate the differential of a polynomial       SOLVE.DOC
  444. FPrimeI2       calculate the differential of a polynomial       SOLVE.DOC
  445. FPut           fast output to a file opened by FOpen or FCreate  DISK.DOC
  446. FPut1          fast byte output to file opened by FOpen/FCreate  DISK.DOC
  447. FPut2          2-byte output to file opened by FOpen or FCreate  DISK.DOC
  448. FPut4          4-byte output to file opened by FOpen or FCreate  DISK.DOC
  449. FPut8          8-byte output to file opened by FOpen or FCreate  DISK.DOC
  450. FPutCRLF       CR+LF output to file opened by FOpen or FCreate   DISK.DOC
  451. FPutSTR        string output to file opened by FOpen or FCreate  DISK.DOC
  452. FreeMem        releases memory block allocated by QLIB           DATA.DOC
  453. FSeek          set the file pointer position for a file          DISK.DOC
  454. FSize          determine size of a file opened by QLIB           DISK.DOC
  455. FValue         calculate future value of contant cash flow      SOLVE.DOC
  456. GBaseSeg       direct QLIB graphics to an alternate buffer   GRAPHICS.DOC
  457. GCenter        centers a string on a graphics screen         GRAPHICS.DOC
  458. GCenterX       centers a string on a graphics screen         GRAPHICS.DOC
  459. GCopy          copies one page of Graphics memory to another GRAPHICS.DOC
  460. GCursor        puts a text cursor on graphics screen         GRAPHICS.DOC
  461. GetANSI        determine ANSI screen color                      VIDEO.DOC
  462. GetCMD         returns case-sensetive command line parameter   SYSTEM.DOC
  463. GetCPU         determine processor installed                   SYSTEM.DOC
  464. GetCRT         determine video system                          SYSTEM.DOC
  465. GetDOSVer      determine DOS version installed                 SYSTEM.DOC
  466. GetDot         determine pixel status on graphics screen     GRAPHICS.DOC
  467. GetDRIVE       determine default drive                           DISK.DOC
  468. GetFileAttr    determine file attributes                         DISK.DOC
  469. GetKBDToggle   determine status of key toggles and shift keys  SYSTEM.DOC
  470. GetKey         returns first key pressed                        INPUT.DOC
  471. GetPOS         determine cursor position                        VIDEO.DOC
  472. GetSpeed       determine if CPU is operating at fast speed     SYSTEM.DOC
  473. GetSUB         determine default subdirectory                    DISK.DOC
  474. GetTime        returns system time to program                    DATA.DOC
  475. GetView        determine current graphics viewport           GRAPHICS.DOC
  476. GLineEdit      line editor for graphics screen               GRAPHICS.DOC
  477. GLoad          copies a graphics image file to video memory  GRAPHICS.DOC
  478. GMouse         initialize alternate graphics mouse cursor    GRAPHICS.DOC
  479. GPage          combines UseGPage and ShowGPage subroutines   GRAPHICS.DOC
  480. GPlaneSize     calculates array size for GPlane subroutines  GRAPHICS.DOC
  481. GPrint         print text on a graphics screen               GRAPHICS.DOC
  482. GPrintDOWN     text on graphics screen from top to bottom    GRAPHICS.DOC
  483. GPrintUP       text on graphics screen from bottom to top    GRAPHICS.DOC
  484. GPrintX        expanded text on graphics screen              GRAPHICS.DOC
  485. GPrint2X       expanded text on graphics screen              GRAPHICS.DOC
  486. GPrintDOWNX    expanded text on graphics screen              GRAPHICS.DOC
  487. GPrintDOWN2X   expanded text on graphics screen              GRAPHICS.DOC
  488. GPrintUPX      expanded text on graphics screen              GRAPHICS.DOC
  489. GPrintUP2X     expanded text on graphics screen              GRAPHICS.DOC
  490. GPullDown      pull-down menu system for graphics modes         INPUT.DOC (b)
  491. GSave          saves a graphics screen as a file             GRAPHICS.DOC
  492. GUCursor       puts underscore cursor on graphics screen     GRAPHICS.DOC
  493.  
  494. HGraph         establish Hercules graphics mode              GRAPHICS.DOC
  495. HGraph0        same as HGraph, but clears only page 0        GRAPHICS.DOC
  496. HideMouse      make mouse cursor invisible                      INPUT.DOC
  497. HideGMouse     make alternate graphics mouse invisible          INPUT.DOC
  498. HRam8043       switch to RamFont 43-row mode                    VIDEO.DOC
  499. HRam9025       switch to RamFont 90-column mode                 VIDEO.DOC
  500. HRam9043       switch to RamFont 90-column, 43-row mode         VIDEO.DOC
  501. HScroll        quick horizontal scroll of text screen           VIDEO.DOC
  502. HText          return to text mode from Hercules graphics    GRAPHICS.DOC
  503. InsArray2      inserts 2-byte data in an array                   DATA.DOC
  504. InsArray4      inserts 4-byte data in an array                   DATA.DOC
  505. InsArray8      inserts 8-byte data in an array                   DATA.DOC
  506. InsVSTRArray   insert a string in a variable-length string array DATA.DOC
  507. InsertOFF      force insert mode off                           SYSTEM.DOC
  508. InsertON       force insert mode on                            SYSTEM.DOC
  509. InsertString   insert one string in another, at any position     DATA.DOC
  510. InString       INSTR-like function                               DATA.DOC
  511. InStringCount  counts number of times a pattern is in a string   DATA.DOC
  512. InString2      INSTR-like function, case-insensitive             DATA.DOC
  513. InStringR      Reverse INSTR-like function                       DATA.DOC
  514. InString2R     Reverse INSTR-like function, case-insensitive     DATA.DOC
  515. INT2SNG        integer to floating point conversion              DATA.DOC
  516. INT2STR        integer to string conversion with formatting      DATA.DOC
  517. IsAlpha        determines if a key code is A-Z or a-z           INPUT.DOC
  518. IsATT          determines if program is running on ATT 6300    SYSTEM.DOC
  519. IsDigit        determines if a key code is 0-9                  INPUT.DOC
  520. IsLower        determines if a key code is a-z                  INPUT.DOC
  521. IsMSHERC       determines if MSHERC.COM is loaded              SYSTEM.DOC
  522. IsSEVGA        determines if a Super EGA/VGA is installed      SYSTEM.DOC
  523. IsUpper        determines if a key code is A-Z                  INPUT.DOC
  524. JaNein         German language version of YesNo                 INPUT.DOC
  525. KBDType        determine if an enhanced keyboard is present    SYSTEM.DOC
  526. KeyFilter      returns selected keys given input key code       INPUT.DOC
  527. KeyIfWaiting   returns key if one is waiting in keyboard buffer INPUT.DOC
  528. KeyOrButton    returns first keyboard or mouse input            INPUT.DOC
  529. KeyRate        sets keyboard typematic rate (AT and PS/2)      SYSTEM.DOC
  530. KeyWaiting     determines if a key has been pressed             INPUT.DOC
  531. KillFile       deletes file, with error trapping                 DISK.DOC
  532. KillSUB        deletes subdirectory, with error trapping         DISK.DOC
  533. KillVScreen    release VScreen memory                           VIDEO.DOC
  534. LastEdit       option for LineEdit and GLineEdit                INPUT.DOC
  535. LineEdit       text-mode line editor                            INPUT.DOC
  536. LineFitF4      use Least Squares to fit a line to coordinates   SOLVE.DOC
  537. LineFitF8      use Least Squares to fit a line to coordinates   SOLVE.DOC
  538. LineFitI2      use Least Squares to fit a line to coordinates   SOLVE.DOC
  539. LineFitI4      use Least Squares to fit a line to coordinates   SOLVE.DOC
  540. LinePattern    DrawLine and DrawBox option                   GRAPHICS.DOC
  541. LNG2Date       uncompresses a date stored by Date2LNG            DATA.DOC
  542. LNG2SNG        long integer to floating point conversion         DATA.DOC
  543. LNG2STR        long integer to string conversion                 DATA.DOC
  544. LOcase         converts text to lower case                       DATA.DOC
  545. MakeSUB        creates a new subdirectory with error trapping    DISK.DOC
  546. MakeGVScreen   virtual Hercules screens for QLIB graphics    GRAPHICS.DOC
  547. MakeVScreen    virtual screens for quick video subroutines      VIDEO.DOC
  548. MaskEdit       edit string with fixed field(s) and delimiters   INPUT.DOC
  549. MathChip       find math coprocessor                           SYSTEM.DOC
  550.  
  551. MaxDBLArray    find maximum of double-precision array            DATA.DOC
  552. MaxDBLb        find maximum of multi-dimensioned array           DATA.DOC
  553. MaxINTArray    find maximum of integer array                     DATA.DOC
  554. MaxINTb        find maximum of multi-dimensioned array           DATA.DOC
  555. MaxLNGArray    find maximum of long integer array                DATA.DOC
  556. MaxLNGb        find maximum of multi-dimensioned array           DATA.DOC
  557. MaxSNGArray    find maximum of single-precision array            DATA.DOC
  558. MaxSNGb        find maximum of multi-dimensioned array           DATA.DOC
  559. MaxVSTRArray   find longest in variable-length string array      DATA.DOC (b)
  560. MinDBLArray    find minimum of double-precision array            DATA.DOC
  561. MinDBLb        find minimum of multi-dimensioned array           DATA.DOC
  562. MinINTArray    find minimum of integer array                     DATA.DOC
  563. MinINTb        find minimum of multi-dimensioned array           DATA.DOC
  564. MinLNGArray    find minimum of long integer array                DATA.DOC
  565. MinLNGb        find minimum of multi-dimensioned array           DATA.DOC
  566. MinSNGArray    find minimum of single-precision array            DATA.DOC
  567. MinSNGb        find minimum of multi-dimensioned array           DATA.DOC
  568. MinVSTRArray   find shortest in variable-length string array     DATA.DOC (b)
  569. ModeColor      switch to color text mode                        VIDEO.DOC
  570. ModeMono       switch to monochrome monitor                     VIDEO.DOC
  571. Mode13225      switch to 132-column, 25-row mode                VIDEO.DOC
  572. Mode13243      switch to 132-column, 43-row mode                VIDEO.DOC
  573. Mode43         switch to EGA 43-row mode (VGA 50-row mode)      VIDEO.DOC
  574. MonthName      returns ASCII month name given month number       DATA.DOC
  575. MouseLimit     limit range of mouse motion                     SYSTEM.DOC
  576. MousePos       position mouse cursor on the screen             SYSTEM.DOC
  577. MouseReady     determine if mouse is available                 SYSTEM.DOC
  578. MouseStatus    returns mouse position and button status         INPUT.DOC
  579. MovePOS        moves the cursor by row and column offsets       VIDEO.DOC
  580. MulCURArray    multiply CURRENCY array by a constant             DATA.DOC (a)
  581. MulCURb        multiply CURRENCY array by a constant             DATA.DOC (a)
  582. MulDBLArray    multiply double-precision array by a constant     DATA.DOC
  583. MulDBLb        multiply double-precision array by a constant     DATA.DOC
  584. MulINTArray    multiply integer array by a constant              DATA.DOC
  585. MulINTb        multiply integer array by a constant              DATA.DOC
  586. MulLNGArray    multiply long integer array by a constant         DATA.DOC
  587. MulLNGb        multiply long integer array by a constant         DATA.DOC
  588. MulSNGArray    multiply single-precision array by a constant     DATA.DOC
  589. MulSNGb        multiply single-precision array by a constant     DATA.DOC
  590. NetPValue      calculate net present value                      SOLVE.DOC
  591. NoClock        de-activates clock display                       VIDEO.DOC (b)
  592. NumOFF         forces NumLock off                              SYSTEM.DOC
  593. NumON          forces NumLock on                               SYSTEM.DOC
  594. PaintScreen    quick complete color change, entire screen       VIDEO.DOC
  595. PaintWindow    quick complete color change, part of screen      VIDEO.DOC
  596. Palette16      change color palette in E/VGA 16-color modes  GRAPHICS.DOC
  597. Palette256     change color palette in 256-color modes       GRAPHICS.DOC
  598. Path$          returns the path in the program's enviornment   SYSTEM.DOC
  599. Payment        calculates periodic payment or capital recovery  SOLVE.DOC
  600. PrinterError   detect off-line or out-of-paper errors          SYSTEM.DOC
  601. PrnScreenOFF   disable Print Screen                            SYSTEM.DOC
  602. PrnScreenON    enable Print Screen                             SYSTEM.DOC
  603. PullDown       pull-down menu system for text modes             INPUT.DOC (b)
  604. PutDot         turn Graphics pixel on or off                 GRAPHICS.DOC
  605. PValue         calculate present value of constant cash flow    SOLVE.DOC
  606. QCenter        centers a string on the screen                   VIDEO.DOC
  607. QPrint         quick print to screen or virtual screen          VIDEO.DOC
  608. QPrintCE       quick print and clear to end of line             VIDEO.DOC
  609. QPrintFArray   quick print array of fixed-length strings        VIDEO.DOC
  610. QPrintL        quick print, lower case                          VIDEO.DOC
  611. QPrintU        quick print, upper case                          VIDEO.DOC
  612. QPrintVArray   quick print array of variable-length strings     VIDEO.DOC
  613. QPrintW        quick print with word wrap                       VIDEO.DOC
  614. QRead          quick read from screen or virtual screen         VIDEO.DOC
  615. QuadFitF4      use Least Squares to fit a curve to coordinates  SOLVE.DOC
  616. QuadFitF8      use Least Squares to fit a curve to coordinates  SOLVE.DOC
  617. QuadFitI2      use Least Squares to fit a curve to coordinates  SOLVE.DOC
  618. QuadFitI4      use Least Squares to fit a curve to coordinates  SOLVE.DOC
  619. Quadratic      calculates the solutions of a quadratic equation SOLVE.DOC
  620.  
  621. RAMsize        determines installed base RAM                   SYSTEM.DOC
  622. ReadSShort     read signed short integer from an array           DATA.DOC
  623. ReadUShort     read unsigned short integer from an array         DATA.DOC
  624. Real2CPX       form COMPLEX data from real & imaginary parts  COMPLEX.DOC
  625. ReColorScreen  quick selective color change, entire screen      VIDEO.DOC
  626. ReColorWindow  quick selective color change, part of screen     VIDEO.DOC
  627. Rename         renames a file, avoiding QB's ON ERROR            DISK.DOC
  628. ReplaceString  replace part of a string with another, any length DATA.DOC
  629. Restore256     restore saved 256-color palette               GRAPHICS.DOC
  630. Save256        saves palette registers for 256-color palette GRAPHICS.DOC
  631. Scramble       makes a string of text unreadable                 DATA.DOC
  632. ScreenDump     prints Hercules graphics screen               GRAPHICS.DOC
  633. ScreenRestore  restores a screen saved by ScreenSave            VIDEO.DOC
  634. ScreenRows     determines the dimensions of the screen          VIDEO.DOC
  635. ScreenSave     copies screen to restore later                   VIDEO.DOC
  636. ScreenMem      allocates memory required to store a screen      VIDEO.DOC
  637. ScreenMode     set text/graphics screen mode                 GRAPHICS.DOC
  638. Scroll         BIOS screen scroll                               VIDEO.DOC
  639. ScrollOFF      forces scroll lock off                          SYSTEM.DOC
  640. ScrollON       forces scroll lock on                           SYSTEM.DOC
  641. SetBLINK       disable/enable blinking attributes               VIDEO.DOC
  642. SetArray1      set initial value of short integer array          DATA.DOC
  643. SetArray1b     set initial value of short integer array          DATA.DOC
  644. SetArray2      set initial value of INTEGER array                DATA.DOC
  645. SetArray2b     set initial value of INTEGER array                DATA.DOC
  646. SetArray4      set initial value of LONG or SINGLE array         DATA.DOC
  647. SetArray4b     set initial value of LONG or SINGLE array         DATA.DOC
  648. SetArray8      set initial value of DOUBLE or CURRENCY array     DATA.DOC
  649. SetArray8b     set initial value of DOUBLE or CURRENCY array     DATA.DOC
  650. SetDRIVE       set default drive                                 DISK.DOC
  651. SetFileAttr    set file attributes                               DISK.DOC
  652. SetFileDate    set file date and time                            DISK.DOC
  653. SetGBlock      restores portion of graphics screen           GRAPHICS.DOC
  654. SetKBDToggle   set keyboard toggles                            SYSTEM.DOC
  655. SetPOS         position the cursor on the screen                VIDEO.DOC
  656. SetSpeed       sets CPU speed on multi-speed computers         SYSTEM.DOC
  657. SetSUB         changes default subdirectory                      DISK.DOC
  658. SetView        establish active graphics viewport            GRAPHICS.DOC
  659. ShiftCUR       shift the bits in an unsigned currency integer    DATA.DOC (a)
  660. ShiftINT       shift the bits in an unsigned integer             DATA.DOC
  661. ShiftINTArray  shift the bits in an unsigned integer array       DATA.DOC
  662. ShiftLNG       shift the bits in an unsigned long integer        DATA.DOC
  663. ShiftLNGArray  shift the bits in an unsigned long integer array  DATA.DOC
  664. ShowGPage      changes graph page visible on the screen      GRAPHICS.DOC
  665. ShowGraphPlane select visible color plane in 16-color graphs GRAPHICS.DOC
  666. ShowMouse      make mouse cursor visible                        INPUT.DOC
  667. ShowGMouse     make alternate graphics mouse visible            INPUT.DOC
  668. ShowTPage      switch visible screen page (text mode)           VIDEO.DOC
  669. SmallText      GPrint and GLineEdit option                   GRAPHICS.DOC
  670. SNG2INT        copies the integer portion of a! to a%            DATA.DOC
  671. SNG2LNG        copies the integer portion of a! to a&            DATA.DOC
  672. SNG2STR        SINGLE-to-string conversion with formatting       DATA.DOC
  673. SnowOFF        disable CGA "snow" control                       VIDEO.DOC
  674. SnowON         enable CGA "snow" control (QLIB's default)       VIDEO.DOC
  675.  
  676. SortDBLArrayHI sort double-precision array from high to low      DATA.DOC
  677. SortDBLArrayLO sort double-precision array from low to high      DATA.DOC
  678. SortINTArrayHI sort integer array from high to low               DATA.DOC
  679. SortINTArrayLO sort integer array from low to high               DATA.DOC
  680. SortLNGArrayHI sort long integer array from high to low          DATA.DOC
  681. SortLNGArrayLO sort long integer array from low to high          DATA.DOC
  682. SortSNGArrayHI sort single-precision array from high to low      DATA.DOC
  683. SortSNGArrayLO sort single-precision array from low to high      DATA.DOC
  684. SortVSTRArrayHI sort variable-length string array from hi to low DATA.DOC
  685. SortVSTRArrayLO sort variable-length string array from low to hi DATA.DOC
  686. SortVSTRArrayHI2 case-insensetive string array sort              DATA.DOC
  687. SortVSTRArrayLO2 case-insensetive string array sort              DATA.DOC
  688. SShiftCUR      shift bits in a signed currency integer           DATA.DOC (a)
  689. SShiftINT      shift bits in a signed integer                    DATA.DOC
  690. SShiftLNG      shift bits in a signed long integer               DATA.DOC
  691. SShiftINTArray shift bits in a signed integer array              DATA.DOC
  692. SShiftLNGArray shift bits in a signed long integer array         DATA.DOC
  693. StartEdit      option for LineEdit and GLineEdit                INPUT.DOC
  694. StdDevDBL      calculates standard deviation of a DOUBLE array  SOLVE.DOC
  695. StdDevINT      calculates standard deviation of an INT array    SOLVE.DOC
  696. StdDevLNG      calculates standard deviation of a LONG array    SOLVE.DOC
  697. StdDevSNG      calculates standard deviation of a SINGLE array  SOLVE.DOC
  698. StdText        restores normal text size on graphics screen  GRAPHICS.DOC
  699. strchr         search a string for a specified character         DATA.DOC
  700. StripChar      removes specified characters from a string        DATA.DOC
  701. SumDBLArray    calculates the total of a double-precision array  DATA.DOC
  702. SumINTArray    calculates the total of an integer array          DATA.DOC
  703. SumLNGArray    calculates the total of a long integer array      DATA.DOC
  704. SumSNGArray    calculates the total of a single-precision array  DATA.DOC
  705. SumDBLb        calculates the total of a double-precision array  DATA.DOC
  706. SumINTb        calculates the total of an integer array          DATA.DOC
  707. SumLNGb        calculates the total of a long integer array      DATA.DOC
  708. SumSNGb        calculates the total of a single-precision array  DATA.DOC
  709. Super13        320 x 400 256-color graphics mode for VGA     GRAPHICS.DOC
  710. Super13a       360 x 480 256-color graphics mode for VGA     GRAPHICS.DOC
  711. SVGA16         set SuperVGA 16-color modes                   GRAPHICS.DOC
  712. SVGA256        set SuperVGA 256-color modes                  GRAPHICS.DOC
  713. TCopy          copies one screen page to another (text or Herc) VIDEO.DOC
  714. TLoad          loads a disk file into video memory              VIDEO.DOC
  715. TMouseStatus   get mouse character position & buttons pressed   INPUT.DOC
  716. TPage          combines UseTPage and ShowTPage subroutines      VIDEO.DOC
  717. TrimRight      used to trim blanks off the end of a string       DATA.DOC
  718. TSave          saves a text-mode screen as a disk file          VIDEO.DOC
  719. Today          returns today's date                              DATA.DOC
  720. UCursorON      places underscore cursor on text screen          VIDEO.DOC
  721. UnScramble     restores a string scrambled by Scramble           DATA.DOC
  722. UPcase         converts text to upper case                       DATA.DOC
  723. Use32k         Hercules memory management                    GRAPHICS.DOC
  724. Use64k         Hercules memory management                    GRAPHICS.DOC
  725. UseDefault     causes QLIB to use system graphics mode       GRAPHICS.DOC
  726. UseFont        font definitions for QLIB graphics text       GRAPHICS.DOC
  727. UseGPage       change active graphics page                   GRAPHICS.DOC
  728. UseHerc        causes QLIB to use Hercules graphics          GRAPHICS.DOC
  729. UseTPage       set active page in text mode                     VIDEO.DOC
  730. VertList       vertical list menu system                        INPUT.DOC
  731. VScroll        quick vertical scroll of screen                  VIDEO.DOC
  732.  
  733. WhichVGA       finds VGAKIT-compatible equipment             GRAPHICS.DOC
  734. WindowClear    quick clear portion of screen                    VIDEO.DOC
  735. WindowEdit     edit a string in a window on the screen          INPUT.DOC
  736. WindowFill     quickly fill a portion of a text-mode screen     VIDEO.DOC
  737. WindowFrame    quick window outline draw                        VIDEO.DOC
  738. WindowRestore  restores portion of screen saved by WindowSave   VIDEO.DOC
  739. WindowSave     copies a portion of screen to restore later      VIDEO.DOC
  740. WindowMem      allocates memory needed to store screen          VIDEO.DOC
  741. WLastEdit      WindowEdit option                                INPUT.DOC
  742. WriteShort     write a short integer to an array                 DATA.DOC
  743. WStartEdit     WindowEdit option                                INPUT.DOC
  744. XMode16        Super EGA/VGA 16-color graphics               GRAPHICS.DOC
  745. XMode16A       Super EGA/VGA 16-color graphics               GRAPHICS.DOC
  746. YesNo          waits for "Y" or "N" key to be pressed           INPUT.DOC
  747.  
  748. (a) these subroutines work with BC7/QBX and VBDOS only
  749.  
  750. (b) these subroutines work only with QuickBASIC or BC7 without /FS option
  751.  
  752.  
  753.  
  754. Several QLIB users have requested a cross-reference listing of QLIB
  755. object files in order to extract individual subroutines from the QLIB.LIB
  756. library file.  I have begun to provide this information in the documentation
  757. for each subroutine.  Since many QLIB subroutines call subroutines in
  758. other QLIB object modules, a cross reference list can become quite messy.
  759.  
  760. The subroutine documentation may include lines like this:
  761.  
  762.      Subroutine: QPrint(a$, row%, col%, attr%)
  763.      Object files: qprint.obj (crt.obj, q$qprn.obj)
  764.  
  765. In this case, QPRINT's primary subroutine is in qprint.obj, and
  766. qprint.obj calls subroutines in crt.obj and in q$qprn.obj.  All three
  767. object files must be extracted from QLIB.LIB if you want to extract
  768. QPRINT from the library.
  769.  
  770. Use the LIB utility supplied by Microsoft with your compiler to extract
  771. the object files:
  772.  
  773. LIB QLIB *qprint*crt*q$qprn;<enter>
  774.  
  775. This command will copy the object files from the library to your disk.
  776.  
  777.