[comp.os.msdos.programmer] format of .QLB files?

ip@cns.umist.ac.uk (Ian Pallfreeman) (11/13/90)

Can anybody supply me with the details of how a .QLB ("quick library")
file is laid out?

Thanks in advance,

Ian.
-- 
University of Manchester Institute of Science and Technology, England.
JANET ian@uk.ac.umist : INTERNET ian@umist.ac.uk : UUCP ...!ukc!cns!ian
Don't let little things like facts alter your opinions.

stever@Octopus.COM (Steve Resnick ) (11/15/90)

In article <1990Nov13.121637.17357@cns.umist.ac.uk> ip@cns.umist.ac.uk (Ian Pallfreeman) writes:
>Can anybody supply me with the details of how a .QLB ("quick library")
>file is laid out?
>
>Thanks in advance,
>
>Ian.

This is one of the example programs from Microsoft QuickBASIC. The
program prints out the Quick Lib procedures. The QLB files are
stored as .EXE files with a slightly modified format. 

Hope this helps....
Steve
--------- Cut Here ----------- Cut Here ---------- Cut Here -----------------
' This program prints the names of QuickLibrary procedures

DECLARE SUB DumpSym (SymStart AS INTEGER, QHdrPos AS LONG)

TYPE ExeHdr                  ' Part of DOS .EXE header
    other1    AS STRING * 8  ' Other header information
    CParHdr   AS INTEGER     ' Size of header in paragraphs
    other2    AS STRING * 10 ' Other header information
    IP        AS INTEGER     ' Initial IP value
    CS        AS INTEGER     ' Initial (relative) CS value
END TYPE

TYPE QBHdr                   ' QLB header
    QBHead    AS STRING * 6  ' QB specific heading
    Magic     AS INTEGER     ' Magic word: identifies file as
                             ' a Quick library
    SymStart  AS INTEGER     ' Offset from header to first code symbol
    DatStart  AS INTEGER     ' Offset from header to first data symbol
END TYPE

TYPE QbSym                   ' QuickLib symbol entry
    Flags     AS INTEGER     ' Symbol flags
    NameStart AS INTEGER     ' Offset into name table
    other     AS STRING * 4  ' Other header info
END TYPE

DIM EHdr AS ExeHdr, Qhdr AS QBHdr, QHdrPos AS LONG

INPUT "Enter QuickLibrary file name: ", FileName$
FileName$ = UCASE$(FileName$)
IF INSTR(FileName$, ".QLB") = 0 THEN FileName$ = FileName$ + ".QLB"
OPEN FileName$ FOR BINARY AS #1

GET #1, , EHdr               ' Read the EXE format header.

QHdrPos = (EHdr.CParHdr + EHdr.CS) * 16& + EHdr.IP + 1

GET #1, QHdrPos, Qhdr        ' Read the QuickLib format header.

IF Qhdr.Magic <> &H6C75 THEN PRINT "Not a QB UserLibrary": END

PRINT "Code Symbols:": PRINT
DumpSym Qhdr.SymStart, QHdrPos ' dump code symbols
PRINT

PRINT "Data Symbols:": PRINT
DumpSym Qhdr.DatStart, QHdrPos ' dump data symbols
PRINT

END

SUB DumpSym (SymStart AS INTEGER, QHdrPos AS LONG)
   DIM QlbSym AS QbSym
   DIM NextSym AS LONG, CurrentSym AS LONG

   ' Calculate the location of the first symbol entry, then read that entry:
   NextSym = QHdrPos + SymStart
   GET #1, NextSym, QlbSym

   DO
      NextSym = SEEK(1)          ' Save the location of the next
                                 ' symbol.
      CurrentSym = QHdrPos + QlbSym.NameStart
      SEEK #1, CurrentSym        ' Use SEEK to move to the name
                                 ' for the current symbol entry.
      Prospect$ = INPUT$(40, 1)  ' Read the longest legal string,
                                 ' plus one additonal byte for the
                                 ' final null character (CHR$(0)).

      ' Extract the null-terminated name:
      SName$ = LEFT$(Prospect$, INSTR(Prospect$, CHR$(0)))

      ' Print only those names that do not begin with "__", "$", or "b$"
      ' as these names are usually considered reserved:
      IF LEFT$(SName$, 2) <> "__" AND LEFT$(SName$, 1) <> "$" AND UCASE$(LEFT$(SName$, 2)) <> "B$" THEN
         PRINT "  " + SName$
      END IF

      GET #1, NextSym, QlbSym    ' Read a symbol entry.
   LOOP WHILE QlbSym.Flags       ' Flags=0 (false) means end of table.
END SUB

-- 
----------------------------------------------------------------------------
steve.resnick@f105.n143.z1.FIDONET.ORG - or - apple!camphq!105!steve.resnick
Flames, grammar errors, spelling errrors >/dev/nul
The Asylum OS/2 BBS - (408)263-8017 IFNA 1:143/105.0