Category : BASIC Source Code
Archive   : ANGELLIB.ZIP
Filename : ANGELIB.WP

 
Output of file : ANGELIB.WP contained in archive : ANGELLIB.ZIP
ÿWPCÈ
ûÿ2ÆBRV`¶3|xRCourier 10cpiÿÿ‰?xxx
Krôxþ6X@ɓ8[X@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐ °°` Ðûÿ2½ Zø…Rv×pMStandard PrinterSTANPRIN.PRSÛx Œ
@ɇÏkÈX@07-15-92 01:24p Angelib docs wp ÿÈ
ÿa8DocumentgÁDocument Style Styleº ŠÂXÂÂX` ` ÂÆÐ ` Æ

a4DocumentgDocument Style StyleØªÖÁÁà ÃÃÃ.ÄÄ Ä Äûÿ2àkïkZ¥Åvja6DocumentgÁDocument Style Style ½³G†ÂXÂÆÐ Æ

a5DocumentgÁDocument Style Style }±­ÂXÂÆ(#Æ

a2DocumentgDocument Style Style<ño Ç
Ô ‰?È Ôà Ã؁A.Ø ÃÃ××××

Ä ÄÄÄa7DocumentgÁDocument Style Styleyý†ÂXÂÂX` ` ÂÆ(#` Æ

ûÿ2jtš† £ 
§ÃBibliogrphyÁBibliography¬‹†:ÂXÂÁ€°°
ÁÆ(#Æ

a1Right ParÁRight-Aligned Paragraph Numbers:`šSÁ@  ÁØI.Ø ƒÁ€°°
ÁÂXÂÆ(#Æ

a2Right ParÁRight-Aligned Paragraph Numbers Cýö ÁÁÁ@ø` ÁØA.Ø ƒÁ€Á°` ` ÂÆ(#` Æ

a3DocumentgDocument Style Style
B½
ºb
Ô ‰?È ÔÁÁà ÃØ‚1.Ø ××××
Ä Äûÿ2„
¬œ µH
¿ýȼ a3Right ParÁRight-Aligned Paragraph Numbers Lã!·
ÁÁÁ` ` ÁÁ@P
¸ ÁØ1.Ø ƒÁ€` ` Á¸ ¸ ÂÆ(#¸ Æ

a4Right ParÁRight-Aligned Paragraph Numbers U—…jÁÁÁ` ` ÁÁ¸ ¸ ÁÁ@¨ ÁØa.Ø ƒÁ€¸ ¸ ÁÂ` ÂÆ(#Æ

a5Right ParÁRight-Aligned Paragraph Numbers
_oãÁÁÁ` ` ÁÁ¸ ¸ ÁÁÁÁ@ˆhÁØ(1)Ø ƒÁ€Á¸ hh#ÂÆ(#hÆ

a6Right ParÁRight-Aligned Paragraph NumbershÎÁÁÁ` ` ÁÁ¸ ¸ ÁÁÁÁhh#ÁÁ@àÀ$ÁØ(a)Ø ƒÁ€hh#ÁÂÀÀ(ÂÆ(#ÀÆ

ûÿ2Vж
ن Ì_ ++
a7Right ParÁRight-Aligned Paragraph NumberspfJÁÁÁ` ` ÁÁ¸ ¸ ÁÁÁÁhh#ÁÁÀÀ(ÁÁ@°*ÁØi)Ø ƒÁ€ÀÀ(ÁÂh-ÂÆ(#Æ

a8Right ParÁRight-Aligned Paragraph NumbersyW"3!ÁÁÁ` ` ÁÁ¸ ¸ ÁÁÁÁhh#ÁÁÀÀ(ÁÁ-ÁÁ@p/ÁØa)Ø ƒÁ€-ÁÂÀpp2ÂÆ(#pÆ

a1DocumentgDocument Style StyleXqq
ÙÙ
Ô álÈ ÔÁà^ì)ÁÃÃà Ã××Ø€I.Ø ÙÙÙÙ×׃

ÄÄÄ ÄDoc InitInitialize Document StyleÿÅ“×

×Ô0*0*°Ô ÒŒ I. A. 1. a.(1)(a) i) a) I. 1. A. a.(1)(a) i) a)DocumentgŒÒÙÙûÿ2Dˆ‡ˆ‡®–Tech InitInitialize Technical Style¨.
kÒŒ I. A. 1. a.(1)(a) i) a) 1 .1 .1 .1 .1 .1 .1 .1 þTechnicalŒÒÙÙa5TechnicalTechnical Document Style)WÙD¾ÁÁà ÃØ„(1)Ø . Ä Äa6TechnicalTechnical Document Style)—àDÂÁÁà ÃØ…(a)Ø . Ä Äa2TechnicalTechnical Document Style<6óèí
Ô ‰?È Ôà Ã؁A.Ø ÃÃ××××ÄÄ

ÁÁÄ Äûÿ2 §v¦ÂÆ…a3TechnicalTechnical Document Style9W¢g
Ô –2È Ôà ÃØ‚1.Ø ××××
ÁÁÄ Äa4TechnicalTechnical Document Style8bv¢{Ô –2 Ôà Ã؃a.Ø ××××
ÁÁÄ Äa1TechnicalTechnical Document StyleF²è!<
Ô ‰?È ÔÃÃà Ã××Ø€I.Ø ÙÙÙÙ××

ÄÄÁÁÄ Äa7TechnicalTechnical Document Style(@DÆÁÁà Ã؆i)Ø . Ä Äûÿ2†=ÃÆa8TechnicalTechnical Document Style(àDËÁÁà Ã؇a)Ø . Ä ÄPleadingHeader for numbered pleading paper«P@n¹ÐÈÐÐ °° è ÐÕ‹È$]ÐÈÐÐ °°X° ÐÐÐX°` ¸ hÀpÈ xÐ (#€%Ø'0*ˆ,à.813è5@8˜:ð
ÁHHÀÁ1ƒ

ÁHHÀÁ2ƒ

ÁHHÀÁ3ƒ

ÁHHÀÁ4ƒ

ÁHHÀÁ5ƒ

ÁHHÀÁ6ƒ

ÁHHÀÁ7ƒ

ÁHHÀÁ8ƒ

ÁHHÀÁ9ƒ

ÁHÐÀÁ10ƒ

ÁHÐÀÁ11ƒ

ÁHÐÀÁ12ƒ

ÁHÐÀÁ13ƒ

ÁHÐÀÁ14ƒ

ÁHÐÀÁ15ƒ

ÁHÐÀÁ16ƒ

ÁHÐÀÁ17ƒ

ÁHÐÀÁ18ƒ

ÁHÐÀÁ19ƒ

ÁHÐÀÁ20ƒ

ÁHÐÀÁ21ƒ

ÁHÐÀÁ22ƒ

ÁHÐÀÁ23ƒ

ÁHÐÀÁ24ƒ

ÁHÐÀÁ25ƒ

ÁHÐÀÁ26ƒ

ÁHÐÀÁ27ƒ

ÁHÐÀÁ28Ó À+  ӋՊÐÐÐ °°°X ÐÕY |”ÃÃÁà¤$Áà ÃÃÃANGELIB for BC7/PDSÄÄÄ ÄÄăÁ`$€%NÁà ÃÄ Äƒ


YÕÓ
€
ÓÐÐX°` ¸ hÀpÈ xÐ (#€%Ø'0*ˆ,à.813è5@8˜:ð 0 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°°ÐÐÙ
ÀÀ If you did à ÃnotÄ Ä see the message "Formatting for default printer" when
loading this file then press à ÃShiftÄ Ä©Ã ÃF7Ä Ä Ã ÃSÄ Äelect printer and select your
printer. This will re©format the document.
ÀÀ Next, re©generate the TOC: à ÃAltÄ Ä©Ã ÃF5Ä Ä Ã ÃGÄ Äenerate à ÃGÄ Äenerate à ÃYÄ Äes
ÀÀ If you prefer full justification, place a à ÃShiftÄ Ä©Ã ÃF8Ä Ä Ã ÃLÄ Äine à ÃJÄ Äustify à ÃFÄ Äull
code after this comment.
ÀÀ There are no top/bottom margin or font settings
ÀÀ This comment will not print.Ù
Á€€Á_ÀÀÀÀÀÀÀÀÀÀ_ ÀÀÀÀ_ ÀÀÀÀ _ÀÀÀÀÀÀÀÀÀÀ_ ÀÀÀÀÀÀÀÀÀÀÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
Á€€ÁÀÀÀÀ ÀÀÀÀ ÀÀÀÀÀÀ_ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ
Á€€ÁÀÀÀÀ ÀÀÀÀ ÀÀÀÀÀÀÀÀ_ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ
Á€€ÁÀÀÀÀÀÀÀÀÀÀÀÀÀÀ ÀÀÀÀ ÀÀÀÀÀÀÀÀ ÀÀÀÀ ÀÀÀÀÀÀÀÀ ÀÀÀÀÀÀÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀÀÀÀÀÀÀÀÀÀÀ
Á€€ÁÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ
Á€€ÁÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ
Á€€ÁÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀ ÀÀÀÀÀÀÀÀÀÀ ÀÀÀÀÀÀÀÀÀÀÀÀÀÀ ÀÀÀÀÀÀÀÀÀÀÀÀÀÀ ÀÀÀÀ ÀÀÀÀÀÀÀÀÀÀÀÀÀÀ



Áà8)Áà ÃCONTENTSÄ Äƒ


×


ÂЀ€ÂÁ€°°
ÁI.Á€€ÁDISCLAIMER OF WARRANTYÆ°"€ÆÁp$€%MÁ 1ƒ

ÂЀ€ÂÁ€°°
ÁII.Á€€ÁCOPYRIGHTÆ°"€ÆÁp$€%MÁ 1ƒ

ÂЀ€ÂÁ€°°
ÁIII.Á€€ÁLICENSEÆ°"€ÆÁp$€%MÁ 1ƒ

ÂЀ€ÂÁ€°°
ÁIV.Á€€ÁTECHNICAL SUPPORT (HOW TO REACH ME)Æ°"€ÆÁp$€%MÁ 2ƒ
ÂЀ€ÂÂhèèÂÁ€€€ÁOfficial Distribution Bulletin BoardsÆ°"èÆÁp$€%MÁ 2ƒ

ÂЀ€ÂÁ€°°
ÁV.Á€€ÁINTRODUCTIONÆ°"€ÆÁp$€%MÁ 2ƒ

ÂЀ€ÂÁ€°°
ÁVI.Á€€ÁNOTES ABOUT THIS RELEASEÆ°"€ÆÁp$€%MÁ 3ƒ

ÂЀ€ÂÁ€°°
ÁVII.Á€€ÁREGISTRATIONÆ°"€ÆÁp$€%MÁ 4ƒ
ÂЀ€ÂÂhèèÂÁ€€€ÁA.ÁèèÁHow To OrderÆ°"èÆÁp$€%MÁ 5ƒ
ÂЀ€ÂÂhèèÂÁ€€€ÁB.ÁèèÁPricingÆ°"èÆÁp$€%MÁ 5ƒ
ÂЀ€ÂÂhèèÂÁ€€€ÁINVOICE & REGISTRATIONÆ°"èÆÁp$€%MÁ 9ƒ

ÂЀ€ÂÁ€°°
ÁVIII.Á€€ÁSYSTEM REQUIREMENTSÆ°"€ÆÁp #€%LÁ 10ƒ

ÂЀ€ÂÁ€°°
ÁIX.Á€€ÁFILES WHICH MAKE UP ANGELIBÆ°"€ÆÁp #€%LÁ 10ƒ

ÂЀ€ÂÁ€°°
ÁX.Á€€ÁUSING ANGELIBÆ°"€ÆÁp #€%LÁ 11ƒ
ÂЀ€ÂÂhèèÂÁ€€€ÁCreating a QLB (Quick Library)Æ°"èÆÁp #€%LÁ 11ƒ

ÂЀ€ÂÁ€°°
ÁXI.Á€€ÁREFERENCEÆ°"€ÆÁp #€%LÁ 12ƒ

ÂЀ€ÂÁ€°°
ÁXII.Á€€ÁUSING PRINTER FUNCTIONSÆ°"€ÆÁp #€%LÁ 49ƒ
›Ô˜!0*H&H&èèÔ Ó
€
Óà Ã××ØI.ØÁ€€ÁDISCLAIMER OF WARRANTYÄ Ä××

Á€€ÁI use the routines in ÃÃANGELIBÄÄ almost every day as I write
software and I am regularly adding, enhancing, or fixing. My software
will never be "done," and I hope that it gets better and better. In
any case, I can't guarantee that it's perfect; in fact, I'll guarantee
that it's not. By using this software and documentation ("ANGELIB")
you must accept this disclaimer of warranty:

Á€€ÁÃÃANGELIBÄÄ is provided "as is" without any warranties or
conditions, expressed or implied, including, but not limited to, those
concerning merchantability and fitness for a particular purpose. By
using ÃÃANGELIBÄÄ, you are expressly releasing the author, Angel Babudro,
from any liability resulting from the use of this software and
documentation. You must assume the entire risk of using ÃÃANGELIBÄÄ.


à Ã××ØII.ØÁ€€ÁCOPYRIGHTÄ Ä××

Á€€ÁThe author retains the copyright for all ÃÃANGELIBÄÄ source code,
documentation, assorted files, and all libraries. However, once
provided with registration from the author you may distribute any
program you write with the benefit of ÃÃANGELIBÄÄ, in compiled form only,
without royalties to the author. You must have written consent from
the author prior to distributing ÃÃANGELIBÄÄ source code in part or in
whole, whether modified or in original form.


à Ã××ØIII.ØÁ€€ÁLICENSEÄ Ä××

Á€€Á1. ÃÃANGELIBÄÄ is being distributed as Shareware. This library is
not free, although license is hereby granted for evaluation of the
Unregistered Edition for an unlimited time.

Á€€Á2. You may keep as many backup copies of ÃÃANGELIBÄÄ as you wish.
The Registered Edition is limited to simultaneous use on the number of
computers indicated by your registration level. The Unregistered
Edition may be used on any number of computers. You may share ÃÃANGELIBÄÄ
with others in complete and unmodified form. REGISTERED USERS may NOT
distribute the files ending in OBJ.

Á€€Á3. You MUST NOT charge any fee or receive any consideration for
distributing the ANGELIB files and you MUST NOT include ANGELIB with
another business transaction (e.g., a hardware sale) unless you have
express written consent from the copyright holder, Angel Babudro. You
MAY charge a fee of not more than US$6 (six dollars) for the disk
and/or service of distribution.

ÙÙÔ€%0*H&H&èèԌà Ã××ØIV.ØÁ€€ÁTECHNICAL SUPPORT (HOW TO REACH ME)Ä Ä××

Á€€ÁIf my wording is unclear or can't find some topic in here, give
me a holler and help me fix it or add it to the manual. A letter or
BBS message is preferred (and less expensive for you). Phone calls
are fine between 9am and 5pm Eastern Time as long as you are a
registered user or intend to become one. I thank you for your help in
making this library better.

Á€€ÁSysops please read SYSOP.DOC for special deals. Shareware
vendors please see VENDOR.DOC for distribution information.

Á€€ÁI can be reached via the mail or BBS. The bulletin boards below
should always have current versions of all my software and I will get
any messages left there for me.
Ðа€èÈ
0 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°°ÐÐ
Á€€ÁMailÂp

ÂAngel Babudro, "Organic Computer Wizardry",
28 Mulberry Street, Clinton, NY 13323©1506,
(315) 853©1070 Mon©Fri 9am©5pm Eastern Timeƀ%
Æ

Á€€Áà Ã××Official Distribution Bulletin BoardsÄ Ä××

Á€€ÁOn bulletin boards I use the first name "Angelo" since it avoids
gender confusion. I go by either name, anyhow.

East CoastÂp

ÂExcalibur, Central NY (315) 736©3792 USR 14.4ƀ%
Æ
ÂЀ€ 

ÂThis is my local distribution board where you can
always find the latest updates to all of my
software. I will get messages left here within a
few days. My software can be FREQed from this board
via RBBS Net address A:954/401, FIDO Net address
1:26501, or ICN Net 91:315/101.ƀ%
Æ

West CoastÂp

ÂResearcher's BBS, So Cal (805) 949©8151 USR DSƀ%
Æ
Á€€ÁÂp

ÂThis is my west coast distribution board which is
updated every 2©3 weeks with the latest versions of
all my software. Leave messages for me in
conference #136 (Organic Software).ƀ%
Æ

Á€€ÁMy software can also be found on many of the nations larger
bulletin boards, such as Exec©PC and Channel 1.

ÙÙ
à Ã××ØV.ØÁ€€ÁINTRODUCTIONÄ Ä××

Á€€ÁANGEL.QLB is a "high level" BC7 library for developing business
applications, especially data base uses. These are the routines I use
in developing my apps (with some help from three other shareware
libraries, most notably John Strong's EZ©Windows which is terrific).Ô€%0*H&H&èèԌ™Á€€ÁI put in the things that are simple but a pain to code every
time, like a "percent completed" bar graph in a window, and things
that are more complicated, such as a scrollable information window
with mouse support. ÃÃANGELIBÄÄ is written in BASIC. Even though it's
not the "tightest" code of its kind I think you will find it very easy
to use.

Á€€ÁSome of my routines trade flexibility for ease of use, like the
percentage graph which is always the same colour and at the same spot
on the screen. This keeps things simple and provides built©in
consistency. Just in case my ideas for standards aren't the same as
yours 🙂 I have decided to offer the licensing of my source code.

Á€€ÁWell, what more can I say? I hope my library helps you to write
a bit better and faster. If so maybe I'll see your registration in my
mail someday.

ÙÙ
à Ã××ØVI.ØÁ€€ÁNOTES ABOUT THIS RELEASEÄ Ä××

Á€€ÁEvery release fixes bugs found in previous releases and/or adds
a few new features. Here are some notes about each release:
ÐЀ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€` ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°°ÐÐ
à Ã1.9aÄ ÄÁ€€ÁRoutines updated: SayOk, ChooseFile$/ChooseFiles$

Á€€Á°` ` ÂÁ€€€ÁParameters modified: GetValidPath$, IsPath%ƀ%` Æ

à Ã1.9Ä ÄÂЀ€ÂFull LIB file is now included. I was severly chastised by the
dBASIC Toolkit BBS' sysop for distributing "crippled" software.
Sorry I never saw it that way before, and I find that I am in
agreement. Now you can compile to EXE form, but if you want to
distribute and/or sell your software please register the
library.ƀ%€Æ

à Ã1.8mÄ ÄÂЀ€ÂAll printer & font routines have been updated to allow use on
networks using DOS SHARE.ƀ%€Æ

à Ã1.8kÄ ÄÂЀ€ÂRoutines updated: ErrScn, FileBackup, SelFont, SelFontsƀ%€Æ

ÂЀ€ÂDocumentation corrected for HelpIndexƀ%€Æ

à Ã1.8jÄ ÄÂЀ€ÂÂà` ` ÂÁ€€€ÁI slaps myself inna face & says, "What was I thinking?" as I
notice that StrFmt's parameters are in reverse order
compared to every other similar function in the known
universe. Oops. Mask & source strings have been swapped.ƀ%` Æ

ÂЀ€ÂÂà` ` ÂÁ€€€ÁFixed: ChoosePtr% (problem if over 16 printers), Inform%
(highlight problem)ƀ%` Æ
Ô€%0*H&H&èèԌÁ€€ÁParameters modified: HelpIndex

ÂЀ€ÂÂà` ` ÂÁ€€€ÁRoutines dropped: BackupMethod%, ChooseCountry% © These simple
menus are easy to create with John Strong's EZ©Windows, so I
took them out to save space.ƀ%` Æ

ÂЀ€ÂÂà` ` ÂÁ€€€ÁDocumentation corrected: I forgot to update the documentation
for some routines. Now you can actually use InputDate,
FileBackup%, FileRestore%, FileRestores%, FmtFDD%ƀ%` Æ

à Ã1.8iÄ ÄÁ€€ÁNew routines: BarMenu%

à Ã1.8hÄ ÄÂЀ€ÂNew routines:ƀ%€Æ
ÂЀ€ÂÂà` ` ÂÁ€€€ÁChooseFileà ÃsÄ Ä$ allows multiple file names to be chosen (whereas
ChooseFile$ allows only one).ƀ%` Æ
ÂЀ€ÂÂà` ` ÂÁ€€€ÁFileRestoreà ÃsÄ Ä% allows single or multiple files to be selected
from a back©up copy.ƀ%` Æ
ÂЀ€ÂÂà` ` ÂÁ€€€ÁGetFileNameà ÃsÄ Ä$ allows more than one input file to be selected.ƀ%` Æ
ÂЀ€ÂÂà` ` ÂÁ€€€ÁOutDevà ÃsÄ Ä$ is identical to OutDev$ but is for use with these other
new routines (which all use a common routine from John
Strong's EZ©Windows library).ƀ%` Æ
ÂЀ€ÂÂà` ` ÂÁ€€€ÁGetFileDesc$ retrieves a file's long name from the DESCRIPT.*
fileƀ%` Æ

ÂЀ€ÂRenamed ToFDD% to FileBackup% and FromFDD% to FileRestore% © I
think these names are easier to remember.ƀ%€Æ

ÙÙ
à Ã××ØVII.ØÁ€€ÁREGISTRATION××Ä Ä

Á€€ÁAlthough I hope that you are so happy with ÃÃANGELIBÄÄ that
registering will be reward enough in itself, but I think it's more fun
& exciting to get something new. ÃÃANGELIBÄÄ is the library I use for
developing all of my applications, so it is constantly updated. Your
registered version will be an up©to©the©minute copy. Other benefits
of registration that come to à ÃmyÄ Ä mind include:
ÐЀ` ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€` @
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°°ÐÐ
Á€€Á1.°` ` ÂYou'll get OBJ files so you can create your own custom
libraries. I use the EZ©Windows and PBClone libraries for
some routines (why re©invent the wheel?), so you will need
to get them if you want to create custom libraries. Buying
all three libraries will cost around $70 which is far less
than most commercial packages.ƀ%` Æ
Á€€Á2.°` ` ÂWithin days you will get a library that would probably take
so long to develop yourself that by the time you've done it
you won't need it anymoreƀ%` Æ
Á€€Á3.°` ` ÂYou can order a printed & bound manual for $8ƀ%` ÆÔð#0*H&H&èèԌÁ€€Á4.°` ` ÂTechnical support is possible! You can contact a à Ãreal
programmerÄ Ä who is 98% knowledgeable about the library
(nobody's prefect) via mail, phone, or BBSƀ%` Æ
Á€€Á5.°` ` ÂYou'll have helped one of the little guys ÀÀ someone who
isn't a huge corporation. (Thank you...)ƀ%` Æ
ÙÙ
Á€€Áà Ã××ØA.ØÁ` ` ÁHow To OrderÄ Ä××
ÐЀ` @
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°€èÈ
xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0°°ÐÐ
Á€€ÁU.S. customers please send cash, check, or money order.
Canadian customers please send cash or Canadian International Money
Order (CIMO). Customers in other countries please send U.S. funds
drawn on a U.S. bank. If you send cash use a "security" no©seeªthrough envelope and you may want to send it via Registered mail, too.

Á€€ÁIf you prefer to use a credit card, you can order ÃÃANGELIBÄÄ from
Public (software) Library with your MC, Visa, AmEx, or Discover card
by calling 800©242©4PsL (from overseas: 713©524©6394) or by FAX to
713©524©6398 or by CompuServe to 71355,470. THESE NUMBERS ARE FOR
ORDERING ONLY. I CANNOT be reached at those numbers. To contact me
for information about dealer pricing, volume discounts, site
licensing, the status of shipment of the product, the latest version
number, or for technical information, call 315©852©6942 or write me at
28 Mulberry Street, Clinton, NY USA 13323©1506. Shareware is "try
before you buy" so please understand that product returns are not
allowed.

Á€€ÁWhen ordering from PsL ask for product #10799 and please note
that PsL will add $3 for shipping & handling to U.S. as well as
Canadian orders.

Á€€Áà Ã××ØB.ØÁèèÁPricingÄ Ä××
Ðа€èÈ
xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0°€èÈ
hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0°°ÐÐ
ÂЀ€ÂÁ€°°
ÁÃ ÃRegistration with DiskÄ Ä ÀÀÀÀ A single copy costs $25. You will receive
the latest version of ÃÃANGELIBÄÄ in LIB (so it can be merged with
other libraries) and OBJ (to make custom libraries) formats.
You will also receive notification of major updates. At this
time, updates for registered users are $5 or send me a disk and
return postage (I'll re©use your envelope). See below for
printed manuals.ƀ%€Æ

ÂЀ€ÂÁ€°°
ÁÃ ÃMultiple CopiesÄ Ä ÀÀÀÀ Each copy may be used on a single computer at a
time. To ease the financial burden and thank you for being
honest, you may apply the following discounts when ordering more
than one copy:ƀ%€Æ
ÂЀ€Â2 to 5 copiesƀ%€ÆÁ`à€%DÁ40% discountƒ
Á€€ÁOver 5 copiesÁ`à€%DÁ50% discountƒ

ÂЀ€ÂÁ€°°
ÁÃ ÃSite LicenseÄ Ä ÀÀÀÀ Register a single copy of ÃÃANGELIBÄÄ and purchase a site
license which allows you to make copies of the registeredÔ€%0*H&H&èèÔ version for use on more than one computer owned by the same
business. I would prefer that you order a registered copy and
Site License for each physical location of the same business,
but this is not required unless you would like to receive update
notices at each location.ƀ%€Æ
Á€€ÁÁèèÁUp to 4 computersÁ`x€%AÁ$30.00 per siteƒ
Á€€ÁÁèèÁUp to 10 computersÁ`x€%AÁ$70.00 per siteƒ
Á€€ÁÁèèÁUp to 20 computersÁ`€%@Á$125.00 per siteƒ
Á€€ÁÁèèÁAny number of computersÁ`€%@Á$400.00 per siteƒ

ÂЀ€ÂÁ€°°
ÁÃ ÃManualsÄ Ä ÀÀÀÀ I will print the latest version of the manual you are
reading right now (using Ventura Publisher and a laser printer)
and bind it. I am offering this as a service to those who want
a printed, bound manual with their software. Most of the cost
involved here is for materials and extra shipping costs.
Remember that ASCII and WP documentation files are always on
disk and if you provide your printer model on the registration
form I will send you a file ready to print on your printer.ƀ%€Æ
Á€€Á©ÁèèÁOne copyÁ`(#€%KÁ$8.00ƒ
Á€€Á©ÁèèÁTwo or more copiesÁ`ð€%BÁ$6.00 per copyƒ

ÂЀ€ÂÁ€°°
ÁÃ ÃSource Code LicenseÄ Ä ÀÀ You may license the use of the source code for
ÃÃANGELIBÄÄ for just $30. Thereafter, updates will be available for
$5 plus shipping. Please note that I call routines from EZªWindows (by John Strong) and PBClone (by Tom Hanlin) in my
library (why re©invent their wheels?), so you will need to
register one or both of these to use some OBJs in creating
custom libraries. I recommend both of them highly and will
gladly share unregistered versions of these with you © just ask.ƀ%€Æ
Ðа€èÈ
hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0°€èÈ
0 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°°ÐÐÙÙ
ÂЀ€ÂÁ€°°
Áà ÃComplimentary Registered EditionsÄ Ä © Á.ÁI would like to give you a
complimentary registration if you will give me a bit of
marketing assistance:ƀ%€Æ

ÂЀ€Â1.ÂhèèÂWrite a review of my software and post it on a bulletin
board, send me a copy of it showing the BBS's header and the
name and phone number of the BBS. Just give me your honest
praise and criticism in a decent review. Your review will be
most helpful to me if it mentions your best & worst©liked
features and any ideas you have for improvement. This will
help me decide the future of ÃÃANGELIBÄÄ and for that help I will
send you a complimentary registered disk.ƀ%èÆ

ÂЀ€Â2.ÂhèèÂIt helps me to know which BBSs carry my software and the more
the better, of course! If you will upload a package to at
least five public ("open") BBSs, send me their names and
phone numbers and I'll send you a complimentary registered
disk. I would appreciate you uploading to time©share
systems, private ("closed") BBSs, or part©time BBS, butÔ€%0*H&H&èèÔ please do not use these to apply for a complimentary
registered edition. BTW: I use an HST 14.4 modem so it would
be best if you provided me with BBSs which also use HSTs so I
can hook©up at high speed.ƀ%èÆ

ÂЀ€Â3.ÂhèèÂIf you are a consultant or other type of computer
professional and your recommendation leads to one or more of
your clients purchasing one of my packages, just send me a
note with your client's registration or have them mention
your name when they register. I will send a complimentary
registered edition or an update for every registration you
get for me. This is in lieu of a multiple copy discount; I
intend it for consultants who choose not to deal with sales
tax.ƀ%èÆ
Ðа€èÈ
0 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°°ÐÐ
Á€€ÁOne complimentary registration per person or company. A
complimentary registration is just like a paid one © you can upgrade
it with a site license, purchase manuals, etc. It helps when you send
back disks to be re©used © even the envelopes can be re©used. When
you order a complimentary registration please fill in the appropriate
blanks below PLUS the Invoice so I know what size disk you need, and
please send me a couple of dollar bills for shipping expenses.
Thanks.
ÙÙ
Á€€ÁI will promise these complimentary offers until at least
12/31/93 © after that date please check with me first.



Áà0 Áà ÃCOMPLIMENTARY REGISTRATION APPLICATIONÄ Äƒ
Áà´"ÁUse until Dec. 31, 1993ƒ


Á`˜€%=ÁDate_______________ƒ

Á€€ÁPlease also fill in the Invoice on the following page (put $0
for the disk). Include $2.00 for shipping within the U.S. or the
amount indicated for addresses outside the U.S. Remember to order
printed manual(s) if you so desire.


(__) Review posted on (BBS name & number)________________________
Á€€ÁInclude a copy of the review, please. Thank you very much!
Ù ÙÔ˜!0*H&H&èèԌ(__) I uploaded (archive name, like ANGEL18E.ARJ)__________________
ÂЀ€Âto these five 24©hour public ("open") BBSs:ƀ%€Æ
Ðа€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°h ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°°ÐÐ
Á
ÁÃÃBBS NameÁhh#ÁPhone Number/Modem TypeÁ  <ÁSysop NameÄÄ

1_______________________Áhh#Á________________________Á  <Á_______________
2_______________________Áhh#Á________________________Á  <Á_______________
3_______________________Áhh#Á________________________Á  <Á_______________
4_______________________Áhh#Á________________________Á  <Á_______________
5_______________________Áhh#Á________________________Á  <Á_______________

Á
ÁThese offers subject to withdrawal or change at any time without
notice. All prices are subject to change without notice. Bulletin
Board Sysops please see the file SYSOP.DOC for special pricing and
information; vendors & sysops please see VENDOR.DOC.

Áà ÁAngel Babudro ÀÀ "Organic Computer Wizardry"ƒ
Áà Á28 Mulberry Street ÀÀ Clinton, NY 13323©1506ƒ
Áà Á(315) 853©6942 Mon©Fri 9am©5pm Eastern Timeƒ
ÁàÌÁ(home phone; remember we're 3 hours later than Pacific coast)ƒ

Áàô Áà ÃPlease register the Shareware you keep.Ä ÄƒÔh 0*H&H&èèÔ Á`0€%:Áà Ã××INVOICE & REGISTRATION××Ä Äƒ
Á`X€%%ÁCredit card orders see "How To Order" aboveƒ

Your Name__________________________________________________________¬¬¬¬___

Company Name__________________________________________________________

Address_______________________________________________________________

______________________________________________________________________

City___________________________ State/Prov________ Zip________________
Ðаh ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°°ÐÐ
à ÃRegistrationÄ ÄÁ¨ ¨ ÁRegistration & disk: $25 x qty _____Á`H!€%GÁ$_______ ƒ

à ÃSource CodeÄ ÄÁ¨ ¨ ÁSource disk & license: $30 x qty _____Á`À!€%HÁ_______ ƒ

à ÃMultiple/Ä ÄÁ¨ ¨ Á2©4 disks ©© deduct 40%
à ÃWholesaleÄ ÄÁ¨ ¨ Á5 or more ©© deduct 50%Á`H!€%GÁ(_______)ƒ

à ÃSite LicenseÄ ÄÁ¨ ¨ ÁUp to 4 CPUs add $30; Up to 10 add $70
(add to above)Á¨ ¨ ÁUp to 20 add $125; Unlimited add $400Á`À!€%HÁ_______ ƒ

à ÃPrintedÄ ÄÁ¨ ¨ ÁOne copy is $8, 2 or more are $6 each
à ÃManualsÄ ÄÁ¨ ¨ ÁQty _____ x $_____ eachÁ`À!€%HÁ_______ ƒ

à ÃShipping &Ä ÄÁ¨ ¨ ÁCanada, AK, HI, VI, PR add $3 extraÁ`À!€%HÁ_______ ƒ
à à ExpensesÄ ÄÁ¨ ¨ ÁOther countries add $9 per copyÁ`À!€%HÁ_______ ƒ

ÁÁÁ¨ ¨ Áà Ã** T O T A L **Á`À!€%HÁ_______Ä Ä ƒ


ÐШ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTLÜôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°„ÐÐDisk size & quantityÁxx!Á[__] 3ÀÀ"Á/ÁÁ  <Á[__] 5ÀÀ"
ÐÐTLÜôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTLôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„„ÐÐDrive densityÁxx!Á[__] Low (DD) requiredÁ  <Á[__] High (HD) okay
Extended densitiesÁxx!Á[__] FDFORMAT extended densities okay

Which version are you using now?_____________________________________

Where did you get it?________________________________________________


ÃÃANGELIBÄÄ has been delivered to and accepted by customer. Upon receipt
of this paid invoice the latest Registered Edition disk and any
options chosen above will be sent. Send U.S. funds or CIMO. NYS
orders add local sales tax. Mail this page with your cash (use
Registered mail), cheque or money order to Angel Babudro, 28 Mulberry
Street, Clinton, NY USA 13323©1506. Please allow 1©3 weeks. Thank you!Ôð#
0*H&H&èèÔ ÐÐTLôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€` ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„°ÐÐà Ã××ØVIII.ØÁ€€ÁSYSTEM REQUIREMENTSÄ Ä××

Á€€ÁAll you need is PC/MS©DOS 3.3 or later, PDS/BC 7.1, and a
computer. You will need 200k to 500k of disk space for the files,
depending on which ones you decide to keep around.

ÙÙ
à Ã××ØIX.ØÁ€€ÁFILES WHICH MAKE UP ANGELIBÄ Ä××

Á€€ÁThe unregistered edition is made up of the following files:

Á€€ÁANGEL.LIBÂ` ÂThe linker library to make EXE files (check
MAKEQLB.BAT for help making a Quick Library)ƀ%Æ
Á€€ÁANGEL.BIÂ` ÂThe include file, function & subroutine
definitionsƀ%Æ
Á€€ÁCOLOURS.BIÁÁColour codes definitions, use is optional
Á€€ÁFKEYS.BIÁÁFunction key definitions, use is optional
Á€€ÁANGEL.TXTÁÁThe ASCII text file of this document
Á€€ÁANGEL.WPÂ` ÂThe WordPerfect file of this document (so you can
format it for your printer)ƀ%Æ
Á€€ÁQSORT.BASÁÁSource code to this public domain routine
Á€€ÁFKEY.LSTÁÁSample file for use with FKEYS routine
Á€€ÁREAD.MEÂ` ÂA file containing late©breaking news... May or
may not be part of the package you getƀ%Æ
Á€€ÁORDER.FRMÁÁOrder form for all of my software
Á€€ÁSYSOP.DOCÁÁSysop information
Á€€ÁVENDOR.DOCÂ` ÂDisk vendors & Sysops: pricing, detailed
description, and distribution informationƀ%Æ
Á€€ÁCOMPARE.EXEÂ` ÂA byte©by©byte file compare utility. Displays in
hex, decimal, and ASCII. Type COMPARE for help.ƀ%Æ
Á€€ÁDUMP.EXEÂ` ÂHex/octal/decimal file viewer. Type DUMP for help.ƀ%Æ

Á€€ÁThe registered edition also includes:

Á€€ÁFAROBJ.EXEÂ` ÂObject modules for creating custom libraries
(self©extracting archive)ƀ%Æ
Á€€ÁMLIB.BATÂ` ÂSample batch file for creating custom libraries
from OBJ modules. I use it all the time to reªcompile libraries during software development.
Allows OBJs to be anywhere you like rather than
all in one directoryƀ%Æ
Á€€ÁMLIB.LSPÁÁSample specification file for MLIB.BAT
Á€€ÁANGEL.INFÂ` ÂObject module information file for use with Tom
Hanlin's LIBWIZ utility © this makes it MUCH
easier to create your own custom libraries if
you've never done it before.ƀ%Æ

ÙÙÔ¸$ 0*H&H&èèԌà Ã××Ø X.ØÁ€€ÁUSING ANGELIBÄ Ä××

Á€€ÁBasically, just put the files wherever you want them and use the
INCLUDE meta©command to place the .BI definition files in your
programme (e.g., à Ã'$INCLUDE: 'Angel.bi'Ä Ä and à Ã'$INCLUDE: 'PtrRec.def'Ä Ä).
Using the $INCLUDE file lets you call subroutines without the CALL key
word.
ÙÙ
Á€€Áà Ã××Creating a QLB (Quick Library)Ä Ä××
ÐЀ` ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°€èÈ
xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0°°ÐÐ
Á€€ÁIf you want to use ANGEL.LIB routines in the QBX interactive
environment you need to make a file called ANGEL.QLB first. To do
this just use the command:

Á€€Álink /qu angel.lib,angel.qlb,nul,qbxqlb;

Á€€ÁIf you get "Bad command or file name" you will need to supply
the drive and path containing the file LINK.EXE.

Á€€ÁWhen you start QBX just use "QBX /L d:\path\ANGEL" (replacing
d:\path with your drive and pathname) ÀÀ this will load the quick
library into memory so you can run the routines. Please note that
it's a large library; if you have extended memory QBX will load some
of the library "high." If you run out of memory with a large
programme I can only console you with the fact that most of my
software is too large to run in the QBX environment and the Microsoft
help©line wasn't even able to help me.

Á€€ÁRather than write a probably©lame demonstration programme to
show off ÃÃANGELIBÄÄ's functions, I would like to suggest that you check
out my shareware from whence this library sprang: What Mailing List?
(WML), What Vehicle History? (WVH), What Job Summary? (WJS), What
Floppy Format? (WFF), and What Tape Back©up (WTB).

Á€€ÁRegistered Edition users have individual OBJ files which can be
combined into custom libraries, even adding OBJs from other libraries
(such as EZ©Windows) or your own routines. I find it easiest to make
a file, using an ASCII editor, which contains all of the names of the
OBJs I want in the library (see MLIB.LSP for a sample). This file
contains one routine per line, preceded by a "+" and ending with a "&"
(which is what LIB requires since this file is passed directly to
LIB.EXE). This makes it easy to recompile the library if you changed
some code or want to add or delete routines.

Á€€ÁAnother alternative for making your own libraries is to use Tom
Hanlin's LIBWIZ utility. This makes things very easy since LIBWIZ is
smart enough to figure out if a routine requires others (for example,
the INFORM%() function requires several other routines) and will
include those other routines automatically. The drawback to LIBWIZ isÔ€% 0*H&H&èèÔ that it has no "save" feature so you have to select each module every
time (which can get a bit tedious if you have 50 modules or so). If
you've never tried LIBWIZ you ought to at least check it out. The
most current version I know of is LIBWIZ13. To use it just enter
à ÃLIBWIZ ANGEL mylibnameÄ Ä (where "mylibname" is your library's name).

ÙÙÑ#Âdä2¼P±Ú®åKrXP#Ñ
à Ã××Ø
XI.ØÁ€€ÁREFERENCEÄ Ä××

Á€€ÁÃÃANGELIBÄÄ is made up of functions and subroutines. Functions
return a value to a variable ÀÀ e.g., a% = CalcAttr(White, Blue) puts a
value in a% ÀÀ whereas subroutines do not ÀÀ e.g., BackUpMsg just prints
a message on the screen.

Á€€ÁThe general syntax of a function call is
ÃÃvar = Function(param1,param2,etc)ÄÄ. For a subroutine, the "formal"
syntax is "ÃÃ[CALL] subname(param1, param2, etc.)ÄÄ" although "CALL" is
not needed when you include ANGEL.BI in your code.

Á€€ÁSubroutines do not yield any "result," but they often modify one
or more variables which are passed to them. DBFHeader is a good
example of this.

Á€€ÁThe routines below each show their name at the left margin and a
sample calling sequence aligned with the right margin, under which is
the english explanation of the routine's purpose followed by the
definition of variables.

Ðа€èÈ
xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0Ü| ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°„ÐÐÒ€UÈÈÈÈÈÈÈÈà ÃTable 1Ä ÄBÈÈÈÈÈPPà ÃTable 1Ä Ä!€ÒÙµ
The only font settng, a TAB setting, and the Table Box Options setting are
here in case you want to change them to better work with your printer.
This comment will not print.µÙÙ
Ù
à ÃBackupMsgÄ ÄÁ`H!€%GÁBackupMsgƒ
Úb!#Ð è°XÈÈPPØddÄE
hhÿÿPrints what I think of as a pseudo©subliminal reminder to back©up
your data 🙂 A little reminder pops onto the screen for a second
then the screen is cleared.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁNothing

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁNothingbÚÔ$°°€%€%p°°€%€%˜ !°%$Ô
Ù#ÙÔ0Ð
0*H&H&èè„°X%?#!
0Ԍà ÃBarMenu%Ä ÄÁ`P
€%Áopt% = BarMenu%(r%,c%,norm%,rev%,opts$(),seed%,getit%,ms%)ƒ
ÚúA#Ð °°ÈÈPPØ8ddÄEhhÿÿDisplays a horizontal bar menu and waits for user's choice of the
options.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁr%/c%ÂøøøÂRow and column at which to begin displayingÆ@øÆ

ÁXXÁnorm%/rev%ÂøøøÂNormal & reverse display attributes (via
CalcAttr%)Æ@øÆ

ÁXXÁopts$()ÂøøøÂString array containing choicesÆ@øÆ

ÂXXXÂseed% øøÂOption number to highlight initially (normally
"1")Æ@øÆ

ÁXXÁgetit%ÂøøøÂFlag to get user's input: If true routine waits
for user to select an option or press an extended
key (e.g., an arrow, PgUp, etc.) or ENTER or Esc.
If False, the routine displays the menu then
exits (which is useful for displaying a bunch of
horizontal menus on a setup screen, for example).Æ@øÆ

ÁXXÁms%ÂøøøÂMouse support (0=no, non©zero=yes)Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁFunctionÂøøøÂÁøøÁIf getit% is true, the user's final keypress is
returned © ENTER (13), Esc (27), or extended key
code (2nd byte of code). If getit% is false then
the returned value is irrelevant.Æ@øÆ

ÁXXÁseed%ÂøøøÂThe number of the highlighted item, numbered from
left to right starting with one.úÚÔ$°°€%€%È°°€%€%È A°%$Ô
Ù
Ù
à ÃCalcAttr%Ä ÄÁ`€€%0Áattr% = CalcAttr% (Fore%, Back%)ƒ
ÚXa#Ð è°Ð ÈÈPPØddÄEÈÀÿÿÿÿFor use with routines that need a single integer colour code.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁFore%ÁøøÁForeground colour code

ÁXXÁBack%ÁøøÁBackground colour code

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁFore% + (Back% * 16)XÚÔ$°°€%€%è°°€%€%˜ a°%$ÔÔ@€%0*H&H&èè!„°°%ÇA„°Ð %·(a@ԌÙٙà ÃChooseFD$Ä ÄÁ`€%@Áfdd$ = ChooseFD$ƒ
ÚL#Ð ˜ °°ÈÈPPظ ddÄEhhÿÿThis is a menu of available floppy disk drives. The function:

1.ÂXXXÂChecks the number of floppy disk drivesÆ@XÆ

2.ÂXXXÂIf there is only one drive then "A:" is returned, otherwiseÆ@XÆ

3.ÂXXXÂA pop©up menu of floppy drives is presented from which the
user may choose one or press Esc.Æ@XÆ

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁNothing

à ÃÃÃReturnsÄ ÄÄÄ
ÂXXXÂFloppy disk drive letter followed by a colon, or a blank
string if user presses Esc.LÚÔ$°°€%€%È°°€%€%H
 °%$Ô
Ù.ÙÔ0Ø0*H&H&èè„°°%G0Ԍà ÃChooseFile$Ä ÄÁ`€%ÁFile$ = ChooseFile$(FSpec$,Exclude$,ExtInfo%,ms%))ƒ
Ú„¡#Ð °!°°ÈÈPPØÐ ddÄEÈhÿÿPresents a scrollable list of files in a window which match
FileSpec$ (excluding Exclude$) and waits for user to choose one.

à ÃÃÃPassÄÄÄ Ä
ÁXXÁFSpec$ÂøøøÂFile specification to include in the list. May
include drive and path name, if necessary. For
example, "*.DAT" or "C:\DATA\*.DAT" are valid.Æ@øÆ

ÁXXÁExclude$ÂøøøÂFile specification to à ÃexcludeÄ Ä from the list
(e.g., "*.bak"). Do à ÃnotÄ Ä put a drive or path in
this.Æ@øÆ

ÁXXÁExtInfo%ÂøøøÂExtended Information flag & record size.
Controls display of extended information (file
size & long description). Set this variable to
zero for no extra file information, or to the
record size to show the number of records in the
file along with description (if a file DESCRIPT.*
is in the directory it will be used for file
descriptions). To show size in bytes use a
record size of one. If negative information will
be in DOS Name/Size/Description order. If
positive Description/Name/Size order will be
displayed.Æ@øÆ

ÁXXÁms%ÂøøøÂMouse support flag (true/false).Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÂXXXÂFile name chosen ÃÃwithoutÄÄ drive or path, or null string ("")
if user presses EscÆ@XÆ

à ÃÃÃNotesÄ ÄÄÄ
ÁXXÁIf ExtInfo% is non©zero, font files *.SFP and *.SFL will be
shown with their font names and other files will be shown with
their size & any description.
ÁXXÁI patterned the format of the DESCRIPT.* file after 4DOS:
file name followed by a space and up to 40 characters for the
description. 4DOS makes a à ÃhiddenÄ Ä file, however. ChooseFile$ will
only read "normal" (not hidden) files right now. I'll soon have
it so ChooseFile$ will read hidden files, too.
ÁXXÁChooseFile$() uses the EZ©Windows routine ScrlMenu and the
PBClone routines ScrSave & ScrRest.„ÚÔ$°°€%€%È°°€%€%`" ¡°%$Ô
Ù+ÙÔ0ð#0*H&H&èè„°°%_&¡0Ԍà ÃChooseFileS$Ä ÄÁ`h€%#ÁF$ = ChooseFileS$(Inc$,Exc$,Info%,many%,ms%))ƒ
ÚàÁ#Ð X°°ÈÈPPØxddÄEÈhÿÿShows a scrollable list of files in a window which match Inc$ and
excluding Exc$ then waits for user to choose one or more.

à ÃÃÃPassÄÄÄ Ä
ÁXXÁInc$ÂøøøÂFile specification to include in the list. May
include drive and path name, if necessary. For
example, "*.DAT" or "C:\DATA\*.DAT" are valid.Æ@øÆ

ÁXXÁExc$ÂøøøÂFile specification to à ÃexcludeÄ Ä from the list
(e.g., "*.bak"). Do à ÃnotÄ Ä put a drive or path in
this.Æ@øÆ

ÁXXÁInfo%ÂøøøÂExtended Information flag & record size.
Controls display of extended information (file
size & long description). Set this variable to
zero for no extra file information, or to the
record size to show the number of records in the
file along with description (if a file DESCRIPT.*
is in the directory it will be used for file
descriptions). To show size in bytes use a
record size of one. If negative information will
be in DOS Name/Size/Description order. If
positive Description/Name/Size order will be
displayed.Æ@øÆ

ÁXXÁmany%ÂøøøÂTrue=Allow multiple picks, False=Just oneÆ@øÆ

ÁXXÁms%ÂøøøÂMouse support flag (true/false).Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÂXXXÂFile names ÃÃwithoutÄÄ drive or path, or null string ("") if user
presses Esc. Names are padded to length of 12.Æ@XÆ

à ÃÃÃNotesÄ ÄÄÄ
ÁXXÁThis routine ends up about 10k larger than ChooseFile$()
since it requires an EZ©Windows routine (ScrlTag) which the other
routine does not. If your programme already uses ScrlTag you will
only see a slight increase in your programme size (about .5k) over
using ChooseFile$(). See ChooseFile$() for other notes.àÚÔ$°°€%€%È°°€%€%  Á°%$Ô
ÙÙÔ0˜!0*H&H&èè„°°%$Á0Ԍà ÃChoosePort%Ä ÄÁ`(€%+ÁPtrPort% = ChoosePort%(default%, ms%)ƒ
Úâá#Ð °°°ÈÈPPØÐddÄEÈhÿÿPresents a pop©up menu of printer ports (LPT1, LPT2, and LPT3) and
waits for user to pick one or press Esc.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁdefault%ÂøøøÂDefault (current) printer port setting (1©3).Æ@øÆ

ÁXXÁms%ÂøøøÂMouse support available: Á°°*Á0 = No, 1 = YesÆ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁPort number (1©3) or zero if user presses EscâÚÔ$°°€%€%È°°€%€%`  á°%$Ô
Ù"Ù
à ÃChoosePtr%Ä ÄÁ`0 €%ÁOk% = ChoosePtr%(pType$, path$, PtrNo%, PtrPort%, ms%)ƒ
ÚÝ#Ð P°hÈÈPPØpddÄEÈhÿÿPresents a pop©up menu of printer choices from the PRINTER.DAT
file. If there are less than 15 choices (that is, all choices fit
inside the window), then the default (PtrNo%) will be highlighted.

à ÃÃÃPassÄÄÄ Ä
ÁXXÁpType$ÂøøøÂPrinter types to include in the menu:Æ@øÆ
ÁXXÁÁøøÁD = Dot matrix printers
ÁXXÁÁøøÁL = Laser printers
ÁXXÁÁøøÁB = Both

ÁXXÁpath$ÂøøøÂFile specification for PRINTER.DAT file. path$
may contain a drive, path, and/or file name. If
no file name is given, PRINTER.DAT is used. If
no drive & path are given, the current drive &
path are used.Æ@øÆ

ÁXXÁPtrNo%ÂøøøÂRecord number of currently chosen printer in
PRINTER.DATÆ@øÆ

ÁXXÁms%ÁøøÁ0 = Keyboard only
ÁXXÁÁøøÁ1 = Use mouse, too

à ÃÃÃReturnsÄÄÄ Ä
ÁXXÁpType$ÂøøøÂChanged to "D" if dot matrix chosen or "L" if
laser printer chosenÆ@øÆ

ÁXXÁPtrNo%ÂøøøÂPRINTER.DAT record number for the chosen printerÆ@øÆ

ÁXXÁPtrPort%ÂøøøÂThe port number selected for the printer (LPT1 is
1, LPT2 is 2, etc.) or zero if user presses EscÝÚÔ$°°€%€%€ °°€%€% °%$ÔÔ@€%0*H&H&èè!„°°%_
á„°h%·(@ԌÙ
ٙà ÃContCan%Ä ÄÁ`h€%CÁi% = ContCan%ƒ
Úg!#Ð è°°ÈÈPPØddÄEhhÿÿÿÿDisplays "Continue" and "Cancel" keys at the bottom of the screen
and waits for response.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁNothing

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁTRUE (©1) if user presses Esc
ÁXXÁFALSE (0) if user presses Return (aka Enter)gÚÔ$°°€%€%È°°€%€%˜ !°%$Ô
ÙÙ
à ÃDateFmt$Ä ÄÁ`à€%$ÁFormattedDate$ = DateFmt$(d%, m%, y%, intl%)ƒ
ÚÌA#Ð `
° ÈÈPPØ€ ddÄEÈhÿÿI use this routine to print the formatted date after getting input
from the user. You can "PRINT DateFmt$()" or assign it to a
variable. Use the ChooseCountry% menu to let the user set Intl%.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁd%ÁøøÁDay on the month
ÁXXÁm%ÁøøÁMonth number
ÁXXÁy%ÁøøÁYear (4©digits)
ÁXXÁIntl%ÁøøÁInternational formatting
ÁXXÁÁøøÁ1 = USA (mm/dd/yyyy)
ÁXXÁÁøøÁ2 = Canadian (dd©mm©yyyy)
ÁXXÁÁøøÁ3 = USA & Cdn (dd MoName yyyy)
ÁXXÁÁøøÁ4 = International (dd MoName yyyy)

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁFormatted dateÌÚÔ$°°€%€%¸ °°€%€% A°%$Ô
Ù
Ù
à ÃDateVal%Ä ÄÁ`@€%8Ádv% = DateVal%(TheDate$)ƒ
Úa#Ð °° ÈÈPPØÐddÄEhhÿÿConverts dates from 1992 to 2078 to an integer number for date
calculations. For example, DateVal%(Date1$) © DateVal%(Date2$)
would give you the number of days between the two dates. Years
prior to 1992 are converted to 1992.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁTheDate$ÂøøøÂDate formatted the same as BASIC's DATE$ functionÆ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁInteger value based on the dateÚÔ$°°€%€% °°€%€%`  a°%$ÔÔP€%0*H&H&èè1„°°%— !„° %ÿA„° %·(aPԌÙٙà ÃDBFHeaderÄ ÄÁ`€% ÁDBFHeader file$, Fld$(), reclen%, recs&, NoFlds%ƒ
ÚƁ#Ð Ø°°ÈÈPPØøddÄEÈhÿÿOpens .DBF file FileName$ and returns field names in Field$(),
record length in reclen%, number of records in the file in recs&,
and number of fields in NoFields%. You can then call DBFPickFld
to pick fields from the list. See also DBFPickFld function.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁfile$ÂøøøÂThe DBF file name, including drive and path, if
necessaryÆ@øÆ

ÁXXÁFld$()ÂøøøÂThis array must be initialized prior to calling
DBFHeader to the maximum number of fields (I
would suggest setting it to at least 50, unless
you know better).Æ@øÆ

à ÃÃÃReturnsÄÄÄ Ä
ÁXXÁFld$()ÂøøøÂThe names of the fields. The first field name is
in Field$(1), etc.Æ@øÆ

ÁXXÁreclen%ÂøøøÂThe file's record lengthÆ@øÆ

ÁXXÁrecs&ÂøøøÂThe number of records on fileÆ@øÆ

ÁXXÁNoFlds%ÂøøøÂThe number of fieldsÆÚÔ$°°€%€%È°°€%€%ˆ °%$Ô
ÙÙ
à ÃDBFPickFld%Ä ÄÁ`Ѐ%&Áfld% = DBFPickFld%(iRow%, iCol%, field$())ƒ
Ú¡#Ð x °ÈÈPPؘddÄEÈhÿÿPresents the list of field names of a .DBF file at and waits for
user to select one. See also DBFHeader which will fill field$()
with field names.

ÁXXÁiRow%ÁøøÁTop row of window

ÁXXÁiCol%ÁøøÁLeft column of window

ÁXXÁfield$()ÂøøøÂArray containing field names from which to chooseÆ@øÆ

ÁXXÁms%ÂøøøÂMouse flag: 0 = no mouse, non©zero = use mouseÚÔ$°°€%€%¨°°€%€%(
 ¡°%$Ô
Ù&ÙÔ@˜!0*H&H&èè!„°°%‡„°%$¡@Ԍà ÃDBFShowFieldsÄ ÄÁ`€%ÁDBFShowFields row%, col%, show%, field$(), hilite%ƒ
ÚZÁ#Ð à°°ÈÈPPØddÄEhhÿÿÿÿDisplays a window filled with field names found in the field$()
variable (which can be set via DBFHeader). Field number hilite%
will be highlighted and placed in the centre of the window (if
possible).

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁrow%ÂøøøÂTop screen row of window (box corner)Æ@øÆ
ÁXXÁcol%ÁøøÁTop left corner of window
ÁXXÁshow%ÂøøøÂNumber of fields to show in the windowÆ@øÆ

ÁXXÁfield$()ÂøøøÂA 2©dimensional array field$(1©fieldnum, 0©2).
field$(fieldnum,0) is the field nameÆ@øÆ
ÂXXX øøÂfield$(fieldnum,1) is the field typeÆ@øÆ
ÁXXÁÁøøÁfield$(fieldnum,2) is the field length

ÂXXX øøÂAll you need to do is dimension field$() and then
pass it to DBFHeader which will fill it with the
field specs.Æ@øÆ

ÂXXX øøÂNote: DBFHeader sets field$(1,x) to "None" and
this routine also expects field$(1,x) to be the
"None" field.Æ@øÆ

ÁXXÁhilite%ÂøøøÂIndicates the field number to highlight on the
screen (a value of zero highlights nothing). The
first field in the window is Max%(1,hilite%©5),
so if hilite%=1,2,3,4, or 5 the first field in
the window is #1; if hilite%=6 the first field is
#2, etc.Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁNothingZÚÔ$°°€%€%È°°€%€% Á°%$Ô
Ù Ù
à ÃDelayÄ ÄÁ`Ð €%FÁDelay Sec!ƒ
Ú4á#Ð X°˜!ÈÈPPØxddÄEhhÿÿDelays for Sec! seconds. I use this for copyright messages, etc.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁSec!ÁøøÁNumber of seconds to delay (floating point)

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁNothing4ÚÔ$°°€%€%°°°€%€% á°%$Ô
ÙÙÔ@€%0*H&H&èè!„°°%Á„°˜!%ï'á@Ԍà ÃDrawFDDÄ ÄÁ``€%4ÁDrawFDD Light%, iRow%, iCol%ƒ
Úþ#Ð  °°ÈÈPPØ(
ddÄEÈhÿÿDraws a text picture of a floppy on the screen at iRow%,iCol%. If
Light% is TRUE (-1) then the light blinks red (bright white on
mono monitors), else it is white.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁLight%ÂøøøÂTrue if drive "light" is to blink, false if notÆ@øÆ

ÁXXÁiRow%ÁøøÁTop row of picture

ÁXXÁiCol%ÁøøÁLeft column of picture

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁNothingþÚÔ$°°€%€%È°°€%€%¸  °%$Ô
ÙÙ
à ÃDrawHDDÄ ÄÁ`€%.ÁDrawHDD Light%, iRow%, iCol%, Msg$ƒ
Ú^!#Ð `
°ÀÈÈPPØ€ ddÄEÈhÿÿSimilar to DrawFDD but draws a text picture of a hard disk and
places the current drive (CURDRIVE) letter in the box.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁLight%ÂøøøÂTrue if drive "light" is to blink, else falseÆ@øÆ

ÁXXÁiRow%ÁøøÁTop row of picture

ÁXXÁiCol%ÁøøÁLeft column of picture

ÁXXÁMsg$ÂøøøÂA message up to 20 characters long to display
inside the picture. If longer than 20 chars it
will be truncated.Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁNothing^ÚÔ$°°€%€%Ø°°€%€% !°%$Ô
ÙÙÔ@°0*H&H&èè!„°°%·„°À% !@Ԍà ÃDrvSpaceÄ ÄÁ`(€%+ÁDrvSpace (Drive$, Total&, Free&, EC%)ƒ
ÚÿA#Ð @
°°ÈÈPPØ` ddÄEÈhÿÿReturns total space and free space (in bytes) of drive Drive$.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁDrive$ÁøøÁDisk drive letter (e.g., "C")

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁTotal&ÂøøøÂTotal bytes are returned in this variableÆ@øÆ

ÁXXÁFree&ÂøøøÂFree bytes are returned in this variableÆ@øÆ

ÁXXÁEC%ÂøøøÂDOS error code is returned in this variable or
zero if no errorÿÚÔ$°°€%€%È°°€%€%ð
 A°%$Ô
ÙÙ
à ÃElapsedTimeÄ ÄÁ`€%ÁElapsedTime STime$, ETime$, Hour%, Minutes%, Secs%ƒ
Úøa#Ð €°øÈÈPPØ ddÄEÈhÿÿCalculates elapsed time.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁSTime$ÂøøøÂStarting time hh:mm:ss (same format as TIME$
function)Æ@øÆ

ÁXXÁETime$ÂøøøÂEnding time hh:mm:ss (same format as TIME$
function)Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁETime$ÁøøÁFormatted elapsed time (hh:mm:ss)
ÁXXÁHour%ÂøøøÂElapsed hoursÆ@øÆ
ÁXXÁMinutes%ÂøøøÂElapsed minutesÆ@øÆ
ÁXXÁSecs%ÂøøøÂElapsed secondsÆ@øÆ

à ÃÃÃExampleÄ ÄÄÄ
ÂXXXÂS$ = TIME$ 'Starting timeÆ@XÆ
ÁXXÁ(do whatever needs to be done)
ÁXXÁE$ = TIME$ 'Ending time
ÁXXÁElapsedTime S$, E$, H%, M%, S%øÚÔ$°°€%€%°°€%€%0 a°%$Ô
ÙÙÔ@ 0*H&H&èè!„°°%ïA„°ø%w"a@Ԍà ÃErrScnÄ ÄÁ`@€%8ÁErrScn ErrCode%, Module$ƒ
Ú^#Ð °°°ÈÈPPØÐddÄEhhÿÿPresents an error screen showing error number, english text,
possible solution, and module name.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁErrCode%ÁøøÁError number

ÁXXÁModule$ÁøøÁModule name

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁNothing^ÚÔ$°°€%€%È°°€%€%`  °%$Ô
ÙÙ
à ÃErrSolve$Ä ÄÁ`ˆ€%?ÁErrSolve$ Number%ƒ
Ú¡#Ð 8°hÈÈPPØXddÄEhhÿÿPrints possible solution to error number Number%. Used by
subroutine ErrScn. Not very extensive (to save memory), but it
sure beats no error handling...ÚÔ$°°€%€%€ °°€%€%è ¡°%$Ô
ÙÙ
à ÃErrText$Ä ÄÁ`€%@ÁErrText$ Number%ƒ
Ú§Á#Ð ¨°¨ÈÈPPÈddÄEhhÿÿPrints text of error Number%. Used by ErrScn.§ÚÔ$°°€%€%À°°€%€%X Á°%$Ô
ÙÙÔPà0*H&H&èè1„°°%_
„°h%Ÿ¡„°¨%OÁPԌà ÃFileBackup%Ä ÄÁ`(€%+Áec% = FileBackup%(FileMask$, Method%)ƒ
ÚEá#Ð °°ÈÈPPØ0ddÄEÈhÿÿAsks for user to enter path (including drive) on which to store
the back©up (e.g., "A:\" or "\TEMP\BACKUPS") then backs©up
FileMask$ to drive Drive$ using Method%.

à ÃÃÃPassÄÄÄ Ä
ÁXXÁFileMask$ÂøøøÂFile mask to include in restore (e.g., *.*,
*.DAT, OLD??.*, etc.)Æ@øÆ

ÁXXÁMethod%ÂøøøÂThe method to use in making the back©upÆ@øÆ
ÁXXÁÁøøÁ1 = DOS Copy
ÁXXÁÂøøøÂ2 = ARJ (req. a lot of free memory)Æ@øÆ
ÁXXÁÁøøÁ3 = LHARC
ÁXXÁÁøøÁ4 = PKZIP

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁ0 = Completed
ÁXXÁ1 = Cancelled
ÁXXÁ2 = Bad file mask
ÁXXÁ3 = No files matching file mask

à ÃÃÃNotesÄ ÄÄÄ
ÁXXÁRequires GetValidPath$() function (GETPATH.OBJ)EÚÔ$°°€%€%È°°€%€%À á°%$Ô
ÙÙÔ0P0*H&H&èè„°°%¿á0Ԍà ÃFileRestore%Ä ÄÁ`°€%*Áec% = FileRestore%(FileMask$, Method%)ƒ
Úd#Ð °°ÈÈPPØ0ddÄEÈhÿÿMenu of floppy drives then if Method% is 2, 3, or 4 a menu of
files matching FileMask$ (user can select à ÃoneÄ Ä to restore). If
Method%=1 Ã ÃallÄ Ä files matching FileMask$ are restored.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁFileMask$ÂøøøÂFiles to restore (*.*, *.DAT, OLD??.*, etc.)Æ@øÆ

ÁXXÁMethod%ÁøøÁThe method to use in restoring
ÁXXÁÁøøÁ1 = DOS Copy
ÁXXÁÂøøøÂ2 = ARJ (req. a lot of free memory)Æ@øÆ
ÁXXÁÁøøÁ3 = LHARC
ÁXXÁÁøøÁ4 = PKZIP
ÁXXÁÁøøÁAnything else = DOS Copy

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁ0 = Completed
ÁXXÁ1 = Cancelled
ÁXXÁ2 = Bad file mask
ÁXXÁ3 = No files matching file mask

à ÃÃÃNotesÄ ÄÄÄ
ÁXXÁRequires ChooseFile$() function (CHOOSEFL.OBJ).dÚÔ$°°€%€%È°°€%€%À °%$Ô
Ù Ù
à ÃFileRestores%Ä ÄÁ`8€%)Áec% = FileRestores%(FileMask$, Method%)ƒ
Ú«!#Ð X°ÈÈÈPPØxddÄEÈhÿÿSame as FileRestore%() function above except that user can select
à Ãone or multipleÄ Ä files to restore. See FileRestore%() for a
description of the parameters.

à ÃÃÃNotesÄ ÄÄÄ
ÁXXÁRequires ChooseFileS$() function (CHOOSEFS.OBJ). Will add ÀÀk
to 10k to your code size over using FileRestore%().«ÚÔ$°°€%€%à°°€%€% !°%$Ô
Ù-ÙÔ@°0*H&H&èè!„°°%¿„°È% !@Ԍà ÃFKeysÄ ÄÁ`X €%EÁFKeys Keys$ƒ
ÚÙA#Ð è °°ÈÈPPØ ddÄEÈhÿÿDisplays a list of function keys at the bottom of the screen.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁKeys$ÂøøøÂString of keys to be displayed (e.g., "EPNQ").
Plus sign (+) is a reserved character. If the
first character is a plus sign followed by twoªdigits, then the keys are placed starting on that
row. For example, "+24EPNQ" would place the keys
on row 24/25, instead of the default rows 23/24.Æ@øÆ

à ÃÃÃNotesÄ ÄÄÄ

The file FKEY.LST is seached first if it is in the current
directory, then an internal list is searched if the keys are not
found. The format of FKEY.LST ASCII file is:

ÁXXÁKeyCode$,KeyName$,KeyDesc$,XPos%

For example, a line reading "C,Enter,Continue,51" would place the
key "Enter" (in reverse video) and the description "Continue"
under it at column 51 whenever an FKeys "C" is issued in a
program. See the sample FKEY.LST file.

The routine scans the first screen row at column 1 for the colour
to use.

The keys "AacCFNoPQSsTtyn" are defined internally as follows:
ÁXXÁA © Up and Down arrows
ÁXXÁa © Up/Down/Right/Left arrows
ÁXXÁC © Esc = Cancel
ÁXXÁc © Enter = Continue
ÁXXÁN © PgDn = Next
ÁXXÁo © Enter = OK
ÁXXÁP © PgUp = Prev
ÁXXÁQ © Esc = Quit
ÁXXÁS © Enter = Select
ÁXXÁs © Esc = Stop
ÁXXÁT © TAB = Next
ÁXXÁt © BackTAB = Prev
ÁXXÁy © Enter = Yes
ÁXXÁn © Esc = NoÙÚÔ$°°€%€%È°°€%€%˜! A°%$ÔÙÙÔ0`"0*H&H&èè„°°%—%A0Ԍà ÃFmtFDD%Ä ÄÁ`h€%CÁec% = FmtFDD%ƒ
Úáa#Ð H°°ÈÈPPØhddÄEhhÿÿFormat floppy disks.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁNothing

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁTRUE if function completed
ÁXXÁFALSE if cancelled

à ÃÃÃNotesÄÄÄ Ä
ÂXXXÂIt's easiest to give you an algorithm of the logic flow:Æ@XÆ

ÁXXÁSearch DOS PATH for WFF.EXE (What Floppy Format?)
ÁXXÁIf found, run it and exit
ÁXXÁHow many drives does this computer have?
ÁXXÁIf more than 1 present list
ÂXXXÂIssue DOS command "FORMAT d:" and exitÆ@XÆ

ÂXXXÂI always put a "Format Floppies" option under my File menu
which simply does "i% = FmtFDD". See also FromFDD% and
ToFDD% functions.áÚÔ$°°€%€%È°°€%€%ø a°%$Ô
Ù!ÙÔ0ˆ0*H&H&èè„°°%÷a0Ԍà ÃFontDLÄ ÄÁ`°€%*ÁFontDL FontFile$, Pts%, Port%, FontNo%ƒ
Ú\#Ð ˆ°°ÈÈPPبddÄEÈhÿÿDownloads a soft font file to a laser printer and displays a
status window while doing so.

à ÃÃÃPassÄÄÄ Ä
ÁXXÁFontFile$ÂøøøÂThe full file name, including drive and path if
necessary, of the soft font file to be
downloaded.Æ@øÆ

ÁXXÁPort%ÂøøøÂThe port number (1©3) of the printer.Æ@øÆ

ÁXXÁFontNo%ÂøøøÂPCL font number to assign this font (e.g., 400).
Numbers >128 are generally best to use as the
lower numbers have standard fonts which typically
apply to them.Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁPts%ÂøøøÂThe point size of the font is returned in this
variable.Æ@øÆ

à ÃÃÃExampleÄ ÄÄÄ
ÁXXÁok% = FontDL%(FontFile$, Pts%, Port%, FontNo%)
ÁXXÁif ok% then
ÁXXÁ PRINT #PrintFile%, chr$(27)+"("+ltrim$(str$(FontNo%))+"X"
ÁXXÁ end if

à ÃÃÃNotesÄ ÄÄÄ
ÂXXXÂThe above sequence selects FontNo% as the primary font (the
'(' does this). To select it as the secondary font use
à Ãchr$(27)+"("+ltrim$(str$(FontNo%))+"X"Ä Ä\ÚÔ$°°€%€%È°°€%€%8 °%$Ô
ÙÙÔ0È0*H&H&èè„°°%70Ԍà ÃGetDateÄ ÄÁ`(€%+ÁGetDate d%, m%, y%, Intl%, Row%, Col%ƒ
Ú¡#Ð  °°ÈÈPPØÀddÄEÈhÿÿAccepts date from keyboard at {Row%,Col%} unformatted (no symbols,
just numbers run together). Extended keys (arrows, PgUp, etc.)
will exit plus a mouse button push or the Alt key. Intl%
determines the sequence of entry.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁd%ÂøøøÂDefault day (1©31), zero to use to©day's date,
negative to skip the dayÆ@øÆ

ÁXXÁm%ÂøøøÂDefault month number, zero to use current month,
negative to skip the monthÆ@øÆ

ÁXXÁy%ÂøøøÂDefault year number (4 digits), zero to use
current year, negative to skip the yearÆ@øÆ

ÁXXÁIntl%ÂøøøÂCountry setting (1=US, 2=Cdn, 3=US & Cdn,
4=Other)Æ@øÆ

ÁXXÁRow%ÂøøøÂScreen row on which to get inputÆ@øÆ

ÁXXÁCol%ÂøøøÂScreen column in which to get inputÆ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁd%, m%, and y% are set to user's inputÂÚÔ$°°€%€%È°°€%€%P ¡°%$Ô
ÙÙ
à ÃGetFileDesc$Ä ÄÁ`Ø€%5Ádesc$ = GetFileDesc$(file$)ƒ
Ú¸Á#Ð °°XÈÈPPàÐddÄEÈhÿÿGet a file's description (long name) from the DESCRIPT.* file in
the current directory.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁfile$ÂøøøÂDOS file name. You can specify a drive & path,
but the current directory will be accessed for
the DESCRIPT.* file.Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁDescription (long name) of the file.¸ÚÔ$°°€%€%p°°€%€%`  Á°%$Ô
ÙÙÔ@˜!0*H&H&èè!„°°%O¡„°X%$Á@Ԍà ÃGetFileName$Ä ÄÁ`¨ €%Áafile$ = GetFileName$(InOut%, ttl$, msg$, dflt$, ms%)ƒ
ÚÀá#Ð Ø°°ÈÈPPàøddÄEÈhÿÿGet a file name from user in a window, verify proper format of
entry, and check status of file.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁInOut%ÁøøÁInput or Output file?
ÁXXÁÂøøøÂ1 = Input file (file must exist; error message
displayed if not) ('1' is for 'I'nput)Æ@øÆ
ÁXXÁÂøøøÂ0 = Output file (checks that file does à ÃnotÄ Ä exist;
if file exists, presents a warning that file will
be over©written) ('0' is for 'O'utput)Æ@øÆ

ÁXXÁttl$ÁøøÁTitle of window

ÁXXÁmsg$ÂøøøÂHelp message displayed on the screen below the
file entry windowÆ@øÆ

ÁXXÁdflt$ÂøøøÂDefault responseÆ@øÆ

ÁXXÁms%ÁøøÁMouse flag (0=no mouse, non©zero=use mouse)
ÁXXÁÂøøøÂMouse cursor should be invisible (off)Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁName of file, including drive and path (if entered)ÀÚÔ$°°€%€%È°°€%€%ˆ á°%$Ô
ÙÙ
à ÃGetFileNames$Ä ÄÁ`0 €%Áfiles$ = GetFileNames$(InOut%, ttl$, msg$, dflt$, ms%)ƒ
Ú*#Ð Ð °ÈÈPPàð
ddÄEÈhÿÿSame as GetFileName$ except that user can specify more than one
input file.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁInOut%ÁøøÁInput or Output file?
ÁXXÁÂøøøÂ1 = Single input fileÆ@øÆ
ÁXXÁÁøøÁ©1 = Multiple input files
ÁXXÁÂøøøÂ0 = Output fileÆ@øÆ

Everything else is the same as GetFileName$() above.

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁDrive and path (if entered) followed by file name(s) padded
to 12 spaces.*ÚÔ$°°€%€%¨°°€%€%€  °%$Ô
ÙÙÔ@ð#0*H&H&èè!„°°%‡á„°%_&@Ԍà ÃGetFontInfoÄ ÄÁ`(€%+ÁGetFontInfo File$, FontName$, PtSize%ƒ
ÚÝ!#Ð `
°°ÈÈPPx€ ddÄE ÈhÿÿProvides name & size in the header of a soft font file. Try
FontDL% on your laser for a demonstration of this.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁFile$ÂøøøÂThe name of the soft font, including drive and
path, if necessary.Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁFontName$ÂøøøÂThe long name of the font is returned in this
variable, if present (some fonts do not have any
name in the header)Æ@øÆ

ÁXXÁPtSize%ÂøøøÂIn the font file's header is a point size ©© the
integer value of this is returned (decimal
chopped off). Although this should be the real
point size, it's possible for it to be wrong.ÝÚÔ$°°€%€%È°°€%€% !°%$Ô
Ù(ÙÔ0  0*H&H&èè„°°%! 0Ԍà ÃGetNum$Ä ÄÁ`@ €%Án$ = GetNum$(iRow%, iCol%, NumMask$, OrigNo$, ExitCode%)ƒ
ÚìA#Ð È°°ÈÈPPØèddÄE!ÈhÿÿGet formatted numerical input from user. Screen colours at the
specified location will be inverted during input and restored upon
exit.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁiRow%ÁøøÁRow at which to get input

ÁXXÁiCol%ÁøøÁLeft column at which to get input

ÁXXÁNumMask$ÂøøøÂFormat mask. Valid mask characters are pound
(#), dollar ($), and comma (,); all else are
literals (same as PRINT USING). E.g., "#,###",
"$$##.##" or "(###) ###©####".Æ@øÆ

ÁXXÁOrigNo$ÂøøøÂDefault number in string form to avoid numerical
data type conflicts. Can be integer or floating
point.Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÂXXXÂUser's entry as a string (use VAL to extract it into the
proper variable; for example, Cost@=VAL(A$) or Miles%=VAL(A$)Æ@XÆ

ÁXXÁExitCode%ÂøøøÂASCII value of key user pressed to exit. E.g.,
Esc = 27. If an extended key (e.g., F4, PgUp,
etc.) is used ExitCode% is negative.Æ@øÆ

à ÃÃÃExampleÄ ÄÄÄ
ÂXXXÂA$=GetNum$(15,30,"$$###.##",STR$(UnitPrice@),ExitCode%)Æ@XÆ

ÂXXXÂIn the above example an input field will be created at
location (15,30). The original number, UnitPrice@, will be
formatted and displayed using the mask "$$###.##", then the
computer will wait for the user's input. The key that the
user presses to exit the field will be returned in the
variable ExitCode%.Æ@XÆ

ÁXXÁSee FKEYS.BI for key definitions.ìÚÔ$°°€%€%È°°€%€%x A°%$Ô
Ù ÙÔ0 !0*H&H&èè„°°%w"A!0Ԍà ÃGetValidPathÄ ÄÁ`X€%%ÁGetValidPath Drv$, path$, Msg$, InOut%, ms%ƒ
ÚKa#Ð À°°ÈÈPPØàddÄE"ÈhÿÿDisplays Msg$ then asks user for a valid path name, defaulting to
Drv$ and Path$. If path does not exist and it is being used for
output, user is asked if s/he wants to create it.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁDrv$ÁøøÁDefault drive (e.g., "C:")

ÁXXÁPath$ÂøøøÂDefault path (e.g., "\TEST\DIR")Æ@øÆ

ÁXXÁMsg$ÂøøøÂHelpful message to display on the screen (using
Inform%)Æ@øÆ

ÁXXÁInOut%ÁøøÁ1=Input/0=Output
ÁXXÁÂøøøÂIf InOut%=0 will prompt to create a directory
that does not exist.Æ@øÆ

ÁXXÁms%ÂøøøÂ0=No mouse, 1=Use mouseÆ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁDrv$ÁøøÁSelected drive letter followed by a colon

ÁXXÁPath$ÂøøøÂSelected path with trailing foreslash (\) (e.g.,
"\TEST\DIR\")Æ@øÆ

à ÃÃÃNotesÄ ÄÄÄ
ÂXXXÂThe mouse must be initialized and visible to use it. To keep
things simple & save stack space, the windows are at fixed
positions (which also helps keep things consistent, too).KÚÔ$°°€%€%È°°€%€%p a°%$Ô
ÙÙÔ0"0*H&H&èè„°°%oa"0Ԍà ÃGoodbyeScreenÄ ÄÁ`x€%!ÁGoodbyeScreen Pkg$, Reg%, FirstUse$, TimesUsed%ƒ
ځ#Ð ð°°ÈÈPPØddÄE#ÈhÿÿPresents a 'goobye screen' with which I end my programmes. It
also has my name on it... 🙂 When you register ANGELIB you will
get a version which lets you put your copyright message on it.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁPkg$ÂøøøÂPackage abbreviation (e.g., "WVH", "WML", etc.).
Should be a short name to fit properly in window.Æ@øÆ

ÁXXÁReg%ÂøøøÂRegistration flag, true/false, controls the
information displayedÆ@øÆ

ÁXXÁFirstUse$ÂøøøÂDate of first use. Used to calculate number of
days package has been used.Æ@øÆ

ÁXXÁTimesUsed%ÂøøøÂNumber of times package has been used.Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁNothingÚÔ$°°€%€%È°°€%€%  °%$Ô
Ù&ÙÔ00#0*H&H&èè„°°%Ÿ#0Ԍà ÃHelpIndexÄ ÄÁ`Ø€%5ÁHelpIndex Topic$, FileSpec$ƒ
Ú)¡#Ð p°°ÈÈPPؐddÄE$hhÿÿDisplays a help index (menu) or a specific help screen.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁTopic$ÂøøøÂA specific topic to look up (as might be desired
with context©sensitive help). If blank an index
is presented in a scrollable menu. Once the user
selects a topic, the help text is displayed using
the Inform% function.Æ@øÆ

ÁXXÁFileSpec$ÂøøøÂThe specification for the help file. If blank,
"*.HLP" is used. FileSpec$ may contain a drive,
path, and/or file name (wildcards okay).Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁNothing.

à ÃÃÃNotesÄ ÄÄÄ

The help file is an ASCII text file which is arranged like this:

Topic #1+chr$(4)+Help information
more information at least one space from left
more help etc. etc.
Topic #2+chr$(4)+Help info...

Help files may contain up to 100 topics. The total length of the
help text for a single entry is limited to 99 lines with a maximum
of 50 characters per line (roughly 4k of text). Topics MUST begin
in column one, additional text MUST begin AFTER column 1 (i.e.,
indent the help text at least one space).

The topic may begin with a chr$(1) through chr$(3) to indicate an
outline level. For example, you might have FILE then
chr$(1)+Open.)ÚÔ$°°€%€%È°°€%€%  ¡°%$Ô
Ù-ÙÔ0°$0*H&H&èè„°°% ¡$0Ԍà ÃInform%Ä ÄÁ`Ø €%Áok% = Inform%(iRow%, iCol%, iWid%, iType%, ms%, snd%, Msg$)ƒ
ÚÁ#Ð x"°°ÈÈPPˆ˜!ddÄE%ÈhÿÿDisplays a scrollable information window containing up to 99 lines
of information. Msg$ may be any length. The routine will break
the message into lines of iWid% length or less. If the box is
positioned too low on the screen, it will be adjusted upwards.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁiRow%ÂøøøÂTop row of windowÆ@øÆ
ÁXXÁiCol%ÂøøøÂLeft column of windowÆ@øÆ
ÁXXÁiWid%ÁøøÁWindow width (in characters)

ÁXXÁiType%ÂøøøÂDetermines buttons (see below)Æ@øÆ
ÁXXÁÁøøÁ0="Message" (no buttons)
ÁXXÁÁøøÁ1="Note" (Ok button)
ÁXXÁÁøøÁ2="Caution" (Ok/Cancel)
ÁXXÁÁøøÁ3="Warning" (blinking) (Continue/Stop)
ÁXXÁÁøøÁ4="Attention" (blinking) (Yes/No)

ÁXXÁms%ÂøøøÂMouse supportÆ@øÆ
ÁXXÁÁøøÁ0 = No mouse
ÁXXÁÁøøÁ1 = Mouse available
ÁXXÁÂøøøÂ99 = Reset mouse & use it, if availableÆ@øÆ

ÁXXÁsnd%ÂøøøÂSound: 0=None 1=Squeak 2=Tick 3=BeepÆ@øÆ
ÁXXÁMsg$ÂøøøÂMessage to display in the window. Will be
truncated at 99 lines, if necessary.Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁTRUE if user presses ENTER to exit
ÁXXÁFALSE if user presses ESC to exit

à ÃÃÃNotesÄ ÄÄÄ

All message types except zero restore the screen on exit. Use
iType%=0 when you want to put information on the screen and leave
it there, such as instructions on how to enter data.

The mouse should be turned OFF before calling Inform%

ÃÃÃ ÃCustom TitlesÄÄÄ Ä

A custom title can replace the default. Just place a title plus
chr$(254) at the start of your message (changed from chr$(4) to
allow the code to be imbedded without the use of the CHR$ functionÚÔ$°°€%€%È°°€%€%(# Á°%$Ô
ÙÙÔ0¸$%0*H&H&èè„°°%''Á%0Ԍà ÃInformFillÄ ÄÁ`
€%ÁInformFill Row%, Col%, BegLine%, WinSize%, MLines$()ƒ
Ú§á#Ð ¨°°ÈÈPPÈddÄE&hhÿÿUsed by Inform% ©© fills the window with text.§ÚÔ$°°€%€%È°°€%€%X á°%$Ô
Ù+Ù
à ÃInputDateÄ ÄÁ`0 €%ÁInputDate Mo%, Dy%, Yr%, DtStr$, Row%, Col%, ExitCode%ƒ
Ú#Ð X°` ÈÈPPØxddÄE&hhÿÿAccepts a valid date. Unlike GetDate, InputDate only supports the
DD/MM/YYYY format and does not check for a mouse button or the Alt
key being pressed. However, the input is formatted whereas
GetDate has all the numbers run together.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁMo%ÂøøøÂMonth number (1©12)Æ@øÆ
ÁXXÁÂøøøÂZero for current monthÆ@øÆ
ÁXXÁÁøøÁ©1 to skip month

ÁXXÁDy%ÂøøøÂDay number (1©31)Æ@øÆ
ÁXXÁÁøøÁZero for current day
ÁXXÁÁøøÁ©1 to skip day

ÁXXÁYr%ÁøøÁYear number (4 digits)
ÁXXÁÁøøÁZero for current year
ÁXXÁÁøøÁ©1 to skip year

ÁXXÁr%/c%ÁøøÁScreen row & column at which to display/get date

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁDtStr$ÁøøÁDate string formatted MM/DD/YYYY.

ÁXXÁExitCode%ÂøøøÂSet to the key used to exit.Æ@øÆ

à ÃÃÃExample 1Ä ÄÄÄ
ÁXXÁM%=0: D%=0: Y%=0: row%=10: col%=20
ÂXXXÂInputDate M%, D%, Y%, DtStr$, row%, col%, ExitCode%Æ@XÆ

ÂXXXÂThis will get the date at location {10,20} using the system
date as default. Because InputDate is a BASIC subroutine, it
is not necessary to initialize DtStr$ before using it.Æ@XÆ

à ÃÃÃExample 2Ä ÄÄÄ
ÁXXÁM%=5: D%=©1: Y%=0: row%=10: col%=20
ÂXXXÂInputDate M%, D%, Y%, DtStr$, row%, col%, ExitCode%Æ@XÆ

ÂXXXÂThis will get a month and year at location {10,20} using May
and the system clock's year as default.ÚÔ$°°€%€%x°°€%€%  °%$ÔÔ@€%&0*H&H&èè!„°°%Wá&„°` %·(&@ԌÙ
ٙà ÃIsColour%Ä ÄÁ`ð€%BÁx% = IsColour%ƒ
Ú!#Ð X°°ÈÈPPØxddÄE'hhÿÿGet adapter card type.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁNothing

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁTrue (-1) if colour adapter card, otherwise False (0).ÚÔ$°°€%€%È°°€%€% !°%$Ô
Ù%Ù
à ÃIsPath%Ä ÄÁ`€%.Ástat% = IsPath%(Pathname$, InOut%)ƒ
ÚÏA#Ð ¨°ÈÈPPØÈddÄE'hhÿÿChecks validity & extends path. If directory is being accessed
for output and does not exist, user is prompted to create it.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁTheName$ÂøøøÂPath name in the format [d:][\path\]Æ@øÆ
ÂXXX øøÂIf the drive or full path are missing the current
drive/path are insertedÆ@øÆ

ÁXXÁInOut%ÂøøøÂ1=Input/0=OutputÆ@øÆ
ÁXXÁÂøøøÂIf directory does not exist and InOut%=0 then
user will be prompted to create the directoryÆ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁ0 = Path not found/not created (suitable for ÃÃOÄÄutput)
ÁXXÁ1 = Path exists (suitable for ÃÃIÄÄnput)
ÁXXÁ©1 = Bad path specification, or ÁXX%Á©2 = Other error

ÁXXÁTheName$ÂøøøÂContains the fully extended path name including
the drive letter unless user hit Esc when asked
permission to create the directory.Æ@øÆ

à ÃÃÃExampleÄ ÄÄÄ
Assume the current path is C:\ugh\ and no directories under it.

ÁXXÁPath$ = "test": InOut% = 0
ÁXXÁstat% = IsPath%(Path$, InOut%)
ÁXXÁselect case stat%
ÁXXÁ case 0 'Path not found & not created (user hit Esc)
ÁXXÁ case 1 'Path found, everything okay
ÁXXÁ case is < 0 'Bad path specification or DOS error

Inform user that C:\ugh\test\ does not exist & ask to create. If
"No" stat%=0 & Path$="test", else stat%=1 & Path$="C:\ugh\test\"ÏÚÔ$°°€%€%(
°°€%€%X A°%$ÔÔ@€%'0*H&H&èè!„°°% !'„°%·(A'@ԌÙٙà ÃMax%Ä ÄÁ`¸€%9ÁHighest% = Max%(A%, B%)ƒ
ÚŸa#Ð ¨°°ÈÈPPÐÈddÄE(hhÿÿReturns the larger of the two integersŸÚÔ$°°€%€%È°°€%€%X a°%$Ô
ÙÙ
à ÃMaxL&Ä ÄÁ`@€%8ÁHighest& = MaxL&(A&, B&)ƒ
Ú¡#Ð ¨°` ÈÈPPÀÈddÄE(hhÿÿReturns the larger of two long integers.¡ÚÔ$°°€%€%x°°€%€%X °%$Ô
ÙÙ
à ÃMaxS!Ä ÄÁ`@€%8ÁHighest! = MaxS!(A!, B!)ƒ
Ú»¡#Ð ¨°ÈÈPPðÈddÄE(hhÿÿReturns the larger of two single©precision floating point numbers.»ÚÔ$°°€%€%(
°°€%€%X ¡°%$Ô
ÙÙ
à ÃMin%Ä ÄÁ`0€%:ÁLowest% = Min%(A%, B%)ƒ
ڝÁ#Ð ¨°ÀÈÈPPàÈddÄE(hhÿÿReturns the smaller of two integers.ÚÔ$°°€%€%Ø°°€%€%X Á°%$Ô
ÙÙ
à ÃMinL&Ä ÄÁ`¸€%9ÁLowest& = MinL&(A&, B&)ƒ
Ú¢á#Ð ¨°pÈÈPP8ÈddÄE(hhÿÿReturns the smaller of two long integers.¢ÚÔ$°°€%€%ˆ°°€%€%X á°%$Ô
ÙÙ
à ÃMinS!Ä ÄÁ`¸€%9ÁLowest! = MinS!(A!, B!)ƒ
Ú­#Ð ¨° ÈÈPP`ÈddÄE(hhÿÿReturns the smaller of two single precision numbers.­ÚÔ$°°€%€%8°°€%€%X °%$Ô
ÙÙԀX(0*H&H&èèa„°°%Wa(„°` % („°%·¡(„°À%gÁ(„°p%á(„° %Ç(€ÔŒÃ ÃMonthDays%Ä ÄÁ``€%4ÁNoDays% = MonthDays%(M%, Y%)ƒ
Ú‡!#Ð x °°ÈÈPPؘddÄE)hhÿÿÿÿReturns the number of days in month M% of year Y%.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁM%ÁøøÁMonth (1©12)
ÁXXÁY%ÁøøÁYear (2 or 4 digits)

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁNumber of days in the specified month

à ÃÃÃExampleÄ ÄÄÄ
ÁXXÁMonthDays%(2,1992) returns 29‡ÚÔ$°°€%€%È°°€%€%(
 !°%$Ô
ÙÙ
à ÃOutDev$Ä ÄÁ`Ø€%5ÁPDev$ = OutDev$(Port%, ms%)ƒ
Ú˜A#Ð Ð °0ÈÈPPØð
ddÄE)hhÿÿPresents a menu of output devices: Screen, Printer, and Disk File.
If Disk File is selected the user is prompted for a file name
(using GetFileName$). If Printer is selected the routine checks
if the printer is on©line (that's partly why Port% is needed) and
returns the device name as "LPT1:", "LPT2:", or "LPT3:" (that's
also why Port% is needed).

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁPort%ÂøøøÂPort number of printer (1, 2, or 3)Æ@øÆ

ÁXXÁms%ÁøøÁMouse support: 0=no, non©zero=yes

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁDevice or file name˜ÚÔ$°°€%€%H
°°€%€%€  A°%$Ô
ÙÙ
à ÃOutDevs$Ä ÄÁ``€%4ÁPDev$ = OutDevs$(Port%, ms%)ƒ
Úa#Ð ° ÈÈPPØ ddÄE)hhÿÿSame as OutDev$ function, but for use with ChooseFiles$,
FileRestore2%, GetFileNames$, and SelectSoftFonts% routines.

See OutDev$ function for details.ÚÔ$°°€%€% °°€%€%° a°%$Ô
ÙÙÔP˜!)0*H&H&èè1„°°%'!)„°0%ÿA)„° %$a)PԌÙٙà ÃParseFSpecÄ ÄÁ`x€%!ÁParseFSpec TheName$, Drv$, Pathname$, TheName2$ƒ
Ú§#Ð  °°ÈÈPPØÀddÄE*hhÿÿSearches file name for the drive, path, and NAME.EXT components.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁTheName$ÂøøøÂFull file name to parseÆ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁDrv$ÂøøøÂDrive letter followed by a colon (if present)Æ@øÆ

ÁXXÁPathname$ÂøøøÂPath name, beginning and ending with a foreslash
(\), if presentÆ@øÆ

ÁXXÁTheName2$ÂøøøÂFILENAME.EXT, if presentÆ@øÆ

à ÃÃÃNotesÄ ÄÄÄ

Converts the regular slash (/) to a foreslash (\), in case user
enters the wrong one.

If an invalid file name is entered (for example, more than eight
characters in the name or more than three characters in the
extension) then TheName2$ is returned as a blank string.

The original file name, TheName$, is not changed so that if there
is an error it can be given to the user for editing again.§ÚÔ$°°€%€%È°°€%€%P °%$Ô
Ù ÙÔ0à*0*H&H&èè„°°%O*0Ԍà ÃPctDoneÄ ÄÁ`@€%8ÁPctDone Percent%, title$ƒ
Ú¡#Ð À°°ÈÈPPØàddÄE+ÈhÿÿDisplays a graph of percentage completion in a small box on the
screen. If the process takes longer than 20 seconds a count©down
timer will appear below the graph.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁPercent%ÂøøøÂPercentage to draw on the graph. The first time
PctDone is called a small window is drawn. When
Percent% is 100 the window is erased.Æ@øÆ

ÁXXÁtitle$ÂøøøÂA short title (10 chars max) to display over the
progress bar.Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁNothing

à ÃÃÃNotesÄ ÄÄÄ

à ÃYou must call PctDone with 100 to clear itÄ Ä or the next time you
call it it will think the window is still on the screen...

à ÃÃÃExampleÄ ÄÄÄ
ÁXXÁFor Sort%=0 to Y%
ÁXXÁ if 100 * Sort% \ Y% < 100 then
ÁXXÁ PctDone(100 * Sort% \ Y%,"Sorting")
ÁXXÁ endif
ÁXXÁ do something...
ÁXXÁ next Sort%
ÁXXÁPctDone 100,"" 'Close the window/reset the routineÚÔ$°°€%€%È°°€%€%p ¡°%$Ô
Ù Ù
à ÃPrintRptMsgÄ ÄÁ`€%@ÁPrintRptMsg Msg$ƒ
ÚHÁ#Ð °xÈÈPPØ°ddÄE+hhÿÿDisplays a window saying "Printing "+Rpt$+" Press Esc to cancel."
I use this on every report so I made it into a routine.

à ÃÃÃExampleÄ ÄÄÄ
ÁXXÁRpt$ = "Stock Status Report"
ÁXXÁPrintRptMsg Rpt$HÚÔ$°°€%€%°°€%€%@ Á°%$Ô
Ù ÙÔ@˜!+0*H&H&èè!„°°%o¡+„°x%$Á+@Ԍà ÃPtrReady%Ä ÄÁ`0€%:Áok% = PtrReady%(Port%)ƒ
Ú¦á#Ð x °°ÈÈPP°˜ddÄE,ÈhÿÿChecks if printer on LPT[Port%] is on©line.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁPort%ÁøøÁPrinter port (1, 2, or 3)

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁTRUE if ready, FALSE if not

à ÃÃÃNotesÄ ÄÄÄ
ÂXXXÂIt doesn't matter whether or not you have opened a channel to
the printer before calling this routine.¦ÚÔ$°°€%€%È°°€%€%(
 á°%$Ô
ÙÙ
à ÃQSortÄ ÄÁ`è€%ÁQSort Wrk%(), Arr1$(), Arr2$(), NoDims%, NoItems%, SortField%ƒ
Ú?#Ð È°0ÈÈPPØèddÄE,hhÿÿA good public domain sorting method. Used by ChooseFile$ to sort
the file list.

See the source code in QSORT.SUB. This is not my code ©© I'm not
selling it, I just use it and pass it on to you...?ÚÔ$°°€%€%H
°°€%€%x °%$Ô
ÙÙ
à ÃRepl$Ä ÄÁ`€%/Ácmd$ = Repl$(St$, Target$, Item$)ƒ
Ú!#Ð ˜ °ÈÈPPظ ddÄE,ÈhÿÿReplaces occurence of Target$ in St$ with Item$. Good for laser
printer codes.

à ÃÃÃPassÄÄÄ Ä
ÁXXÁSt$ÁøøÁComplete string

ÁXXÁTarget$ÁøøÁThe part of St$ to be replaced

ÁXXÁItem$ÁøøÁThe replacement for Target$

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁThe modified string with trailing spaces & nulls truncated.

à ÃÃÃExampleÄ ÄÄÄ
ÁXXÁRepl$("&a#V ","#","500") will return "&a500V"ÚÔ$°°€%€%°°€%€%H
 !°%$Ô
ÙÙÔP(#,0*H&H&èè1„°°%'á,„°0%÷,„°%—%!,PԌà ÃSayOkÄ ÄÁ`¨€%;ÁSayOk Row%, Col%, ms%ƒ
ÚA#Ð ð°°ÈÈPPØddÄE-hhÿÿPuts an "Ok" button centred at position {Row%, Col%} and an "Enter
/ Continue" message at the bottom of the screen, flushes keyboard
buffer, then waits for mouse or keyboard to exit.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁRow%ÂøøøÂRow on which to place buttonÆ@øÆ
ÁXXÁCol%ÁøøÁMiddle of button
ÁXXÁms%ÂøøøÂUse mouse support? (True/False)Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁNothing

à ÃÃÃNotesÄ ÄÄÄ
ÁXXÁScans screen at {Row%©1, Col%} and inverts the colours found
there À"À the idea being to make the button stand out from the lines
above it.
ÁXXÁIf ms% is non©zero (True) then the mouse must be initialized
but invisible.ÚÔ$°°€%€%È°°€%€%  A°%$Ô
ÙÙ
à ÃSearchPath$Ä ÄÁ`Ø€%5Áa$ = SearchPath$(FileName$)ƒ
ÚTa#Ð `
°¨ÈÈPPØ€ ddÄE-hhÿÿSearches the DOS PATH environment variable for a file.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁFileName$ÂøøøÂName of file for which to search (file name à ÃonlyÄ Ä;
no drive or path)Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁIf file is found, DOS path with trailing foreslash (\)
ÁXXÁIf file is à ÃnotÄ Ä found, returns blank string ("")

ÃÃÃ ÃExampleÄ ÄÄÄ
ÁXXÁAssuming you have C:\ in your search path...

ÁXXÁA$ = SearchPath$("Config.sys")

ÁXXÁwill set A$ = "C:\"TÚÔ$°°€%€%À°°€%€% a°%$Ô
Ù)ÙÔ@˜!-0*H&H&èè!„°°%ŸA-„°¨%$a-@Ԍà ÃSelectFont%Ä ÄÁ`¸ €%Áok% = SelectFont%(m$,path$,PtrNo%,Pts%,Ext$,SFdir$,ms%)ƒ
ڝ#Ð È°°ÈÈPPØèddÄE.hhÿÿDisplays a scrollable list of soft fonts in a window and waits for
user to select one or press Esc. List will show DOS file name,
font name (if present in header) and point size (if present in
header).

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁm$ÂøøøÂPurpose of font, displayed at top of window
(e.g., "Printing", "Reports", "Titles", etc.)Æ@øÆ

ÁXXÁpath$ÂøøøÂFile specification for PRINTER.DAT file. path$
may contain a drive, path, and/or file name. If
no file name is given, PRINTER.DAT is used. If
no drive & path are given, the current drive &
path are used.Æ@øÆ

ÁXXÁPtrNo%ÁøøÁThe printer's record number in PRINTER.DAT

ÁXXÁExt$ÂøøøÂSoft font file extension (e.g., "SFP" for
portrait fonts, "SFL" for landscape fonts)Æ@øÆ

ÁXXÁSFdir$ÁøøÁDefault soft font directory (e.g., "C:\Fonts")

ÁXXÁms%ÁøøÁMouse support: 0=no mouse, 1=use mouse

à ÃÃÃReturnsÄÄÄ Ä
ÂXXXÂFunction returns font's record number in PRINTER.DAT or zero
if user presses EscÆ@XÆ

ÁXXÁm$ÂøøøÂChanged to soft font file name (including path)
if soft font selectedÆ@øÆ

ÁXXÁPts%ÁøøÁChanged to point size if scalable font

ÁXXÁSFdir$ÁøøÁSoft font directory with any user modifications

à ÃÃÃNotesÄ ÄÄÄ
ÁXXÁMouse must be initialized but turned OFFÚÔ$°°€%€%È°°€%€%x °%$Ô
ÙÙ
à ÃSelectFonts%Ä ÄÁ`@ €%Áok% = SelectFonts%(m$,path$,PtrNo%,Pts%,Ext$,SFdir$,ms%)ƒ
ÚÖ¡#Ð p°€%ÈÈPPؐddÄE.hhÿÿSame as SelectFont%() function except that it uses ChooseFileS$()
(instead of ChooseFile$()).ÖÚÔ$°°€%€%˜!°°€%€%  ¡°%$Ô
ÙÙÔ@€%.0*H&H&èè!„°°%w".„°€%%ï'¡.@Ԍà ÃSelectFontSize%Ä ÄÁ`Ѐ%&ÁPts% = SelectFontSize%(Font$, IsPts%, ms%)ƒ
ڍÁ#Ð H°°ÈÈPPØhddÄE/hhÿÿThis routine gets the user's choice for font size in a window.
This routine is called whenever a scalable font is selected in
SelectFont% (I don't ever use this routine directly).

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁFont$ÂøøøÂThe font name (for displaying on the screen).
For example, CG Times.Æ@øÆ

ÁXXÁIsPts%ÂøøøÂLogical flag to indicate whether point size is
needed (versus character pitch). If true
"points" is displayed; otherwise (if zero)
"character pitch" is displayed on screen.Æ@øÆ

ÁXXÁms%ÂøøøÂMouse flag: 0=no mouse, 1=use mouseÆ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÂXXXÂFont size (integer) or zero if user presses Esc.Æ@XÆ

à ÃÃÃNotesÄ ÄÄÄ
ÁXXÁThis routine is called by SelectFont%. Mouse must be
initialized but turned OFF (invisible cursor).ÚÔ$°°€%€%È°°€%€%ø Á°%$Ô
ÙÙ
à ÃSelectSoftFont$Ä ÄÁ`H€%'ÁFont$ = SelectSoftFont$(Path$, Ext$, ms%)ƒ
ÚÌá#Ð ¸°ÈÈPPØØddÄE/hhÿÿThis routine presents a scrollable list of soft fonts in a window.
It is called by SelectFont% if the user selects a soft font (as
opposed to a font built into the printer).

à ÃÃÃPassÄÄÄ Ä
ÁXXÁPath$ÂøøøÂPath to soft fontsÆ@øÆ

ÁXXÁExt$ÂøøøÂExtension to be included in the list (e.g., "SFP"
for portrait fonts)Æ@øÆ

ÁXXÁms%ÁøøÁMouse support (0=no, 1=yes)

à ÃÃÃReturnsÄ ÄÄÄ
ÂXXXÂName of chosen font, including drive & path, if necessary.Æ@XÆ

ÁXXÁPath$ÁøøÁPath as modified by user

à ÃÃÃNotesÄ ÄÄÄ
ÁXXÁUses ChooseFile$() functionÌÚÔ$°°€%€%°°€%€%h á°%$ÔÔ@€%/0*H&H&èè!„°°%÷Á/„°%·(á/@ԌÙٙà ÃSelectSoftFonts$Ä ÄÁ`Ѐ%&ÁFont$ = SelectSoftFonts$(Path$, Ext$, ms%)ƒ
ÚÔ#Ð p°°ÈÈPPؐddÄE0hhÿÿSame as SelectSoftFont$() except this routine uses ChooseFileS$()
instead of ChooseFile$().ÔÚÔ$°°€%€%È°°€%€%  °%$Ô
ÙÙ
à ÃStrFmt$Ä ÄÁ`€%-Áph$ = StrFmt$(Mask$, St$, reverse%)ƒ
Ú·!#Ð  °(
ÈÈPPØÀddÄE0hhÿÿFormats a string according to a given mask. I use this to format
phone numbers, zip codes, etc.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁMask$ÂøøøÂMask: "#" is a digit or a space; "9" is a digit
or a zero; "*" is a digit or an asterisk;
everything else is treated as a literalÆ@øÆ
ÁXXÁSt$ÂøøøÂString to formatÆ@øÆ
ÁXXÁreverse%ÂøøøÂFlag: if TRUE formatting is done from right to
left; if FALSE (0) formatting is done from left
to right. TRUE is the most common setting.Æ@øÆ

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁFormatted string

à ÃÃÃExamplesÄ ÄÄÄ
ÂXXXÂa$ = StrFmt$("8052662574","(###) ###©####",©1)Æ@XÆ
ÁXXÁreturns a$ = "(805) 266-2574"

ÁXXÁa$ = StrFmt$("2726893","(###) ###©####",©1)
ÁXXÁreturns a$ = "( ) 272©6893"

ÁXXÁa$ = StrFmt$("$*****","15",©1)
ÁXXÁreturns a$ = "$***15"·ÚÔ$°°€%€%@°°€%€%P !°%$Ô
ÙÙ
à ÃStripSymbols$Ä ÄÁ`P€%6Ánew$ = StripSymbols$(Old$)ƒ
Ú¤A#Ð °Ð ÈÈPPØ@ddÄE0hhÿÿThis strips any symbols from a string of numbers. I use it to
strip the parenthesis, etc. from phone numbers, etc. Returns the
string St$ stripped of its parenthesis, dashes, and commas.

à ÃÃÃExampleÄ ÄÄÄ
ÂXXXÂa$ = StripSymbols$("(805) 272©4923")Æ@XÆ

ÁXXÁreturns a$ = "8052724923"¤ÚÔ$°°€%€%è°°€%€%Ð A°%$Ô
ÙÙÔP€%00*H&H&èè1„°°%0„°(
%Ç!0„°Ð %ï'A0PԌà ÃTrim$Ä ÄÁ`ð€%BÁb$ = Trim$(a$)ƒ
ÚHa#Ð °°ÈÈPPØ ddÄE1hhÿÿTrims leading & trailing spaces and trailing chr$(0)'s from a
string (using LTRIM$/RTRIM$ will remove spaces but not nulls). I
use this to test the length of static strings, which are padded
with CHR$(0)'s.HÚÔ$°°€%€%È°°€%€%° a°%$Ô
ÙÙ
à ÃZipFmt$Ä ÄÁ``€%4Áa$ = ZipFmt$(TheZip$, Intl%)ƒ
Ú[#Ð `
°¸ ÈÈPPØ€ ddÄE1hhÿÿFormats a zip code according to Intl% flag.

à ÃÃÃPassÄ ÄÄÄ
ÁXXÁTheZip$ÂøøøÂUnformatted Zip/Postal codeÆ@øÆ

ÁXXÁIntl%ÂøøøÂÁøøÁ1 = USAÆ@øÆ
ÁXXÁÁøøÁ2 = Canada
ÁXXÁÁøøÁ3 = USA plus Canada
ÁXXÁÁøøÁ4 = Canada plus USA
ÁXXÁÁøøÁ5 = All others (no formatting)

à ÃÃÃReturnsÄ ÄÄÄ
ÁXXÁFormatted zip
ÁXXÁÁøøÁUSA ©© #####©####
ÁXXÁÁøøÁCanada ©© A#A #A#
ÁXXÁÁøøÁOther ©© No formatting[ÚÔ$°°€%€%а°€%€% °%$Ô
ÙÙ
à ÃzTrim$Ä ÄÁ`x€%AÁb$ = zTrim$(a$)ƒ
ÚM¡#Ð ° ÈÈPPØ ddÄE1hhÿÿThis routine à ÃonlyÄ Ä trims trailing nulls [chr$(0)] from the string.
Good for trimming fixed©length file fields which are padded with
nulls when you don't want to remove any spaces [chr$(32)] from the
string.MÚÔ$°°€%€%8°°€%€%° ¡°%$ÔÔPè10*H&H&èè1„°°%¯a1„°¸ %1„° % ¡1PÔ Ã Ã××Ø XII.ØÁÁUSING PRINTER FUNCTIONSÄ Ä××

ÁÁIn order to use the printer functions, you will need to include
the data structures definition file PtrRec.DEF in your source code.
Place the line à Ã'$INCLUDE: 'PtrRec.DEF'Ä Ä near the beginning of your
code.

ÁÁNext, you will need to dimension the variables to hold the
records. I use both local and the global (common) variables; either
will work fine unless your programme is strapped for memory one way or
the other. For local variables use DIM; to make the variables global
use DIM SHARED. The record types are:

ÁÁLaserPtrRec ÀÀ Control codes which are not font©specific
ÁÁLaserFontRec ÀÀ Font©specific control codes
ÁÁDMPtrRec ÀÀ Dot matrix codes which are not font©specific
ÁÁDMFontRec ÀÀ Font©specific dot matrix control codes

ÁÁThe records are all the same length so that the single file,
PRINTER.DAT, can contain all four record types. Laser printer records
start with a greater©than (>) sign (for example, ">Panasonic KXªP4450"). Dot matrix printer records start with a dot (for example,
".NEC P5300"). Both record types (dot matrix and laser) begin with a
Model field, so you can use a LaserPtrRec variable to read a dot
matrix record, then, if the Model begins with a period, re©read the
record as a DMPtrRec variable.
ÐÐÜ| ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°
È
¸ ¨ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ „°ÐÐ
ÁÁHere are the steps your programme will need to take to set
everything up:
ÁÁ1.ÂQ  ÂUse the ChoosePtr% function to get and save the user's
choice for a printerƀ% Æ
ÁÁ2.ÂQ  ÂUse SelectFont% to get the user's font choice(s).ƀ% Æ
ÁÁ3.ÂQ  ÂSave printer & font choices in a configuration file.ƀ% Æ
ÁÁ4.ÂQ  ÂEither at programme start©up or before printing read the
printer control codes into memory. For example:ƀ% Æ

ÁÁÁÁÁ  ÁDIM SHARED Lz as LaserPtrRec
ÁÁÁÁÁ  ÁDIM SHARED DM as DMPtrRec
ÁÁÁÁÁ  ÁPtrFile% = FREEFILE
ÁÁÁÁÁ  ÁÂP

ÂÁ€  ÁOPEN HomePath$ + "Printer.DAT" FOR RANDOM ACCESS READ SHARED
ÁÈ
È
ÁAS PtrFile% LEN = LEN(Lz)ƀ%
Æ
ÁÁÁÁÁ  ÁGET #PtrFile%, PtrRec%, Lz
ÁÁÁÁÁ  ÁIF LEFT$(Lz.Model, 1) = "." THEN
ÁÁÁÁÁ  ÁÁ

ÁGET #PtrFile%, PtrRec%, DM
ÁÁÁÁÁ  ÁÁ

ÁEND IF

ÁÁ5.ÂQ  ÂAt programme start©up or before printing read the printer
font codes into memory (like the example below)ƀ% Æ
Ô€%20*H&H&èèԌDIM LF as LaserFontRec
DIM DF as DMFontRec
ÂXÂÁ€°°
Á' Normally you would already have PtrFile% open from theƀ%Æ
' above routine (to read the printer codes). If not, you
' would need to open the file as in the above routine.
m$ = "Reports": Ext$ = "SFP"Á`¨€%;Á'Portrait fonts (SFP)ƒ
FontRec%=SelectFont%(m$, PtrRec%, Pts%, Ext$, SFdir$, ms%)
SELECT CASE FontRec%Á`h€%CÁ'Check resultƒ
ÁÁCASE 0Á` €%<Á'User hit Escape keyƒ
ÁÁÁÁEXIT SUB
ÁÁCASE -1Á`¨€%;Á'User chose soft fontƒ
ÁÁÁÁPRINT #PrintFile%, zTrim$(Lz.Init);Á`à€%DÁ'Reset laserƒ
ÁÁÁÁDone% = FontDL(SFont$, FPts%, PtrPort%, 400)Á`ð€%BÁ'Download fontƒ
ÁÁÁÁIF NOT Done% THENÁ`˜
€%Á'User aborted download; flag routine as 'cancelled'ƒ
ÁÁÁÁÁ  ÁEXIT FUNCTION or SUB
ÁÁÁÁÁ  ÁEND IF
ÁÁÁÁIF FPts% > 0 THENÁ`˜€%=Á'FontDL got a size?ƒ
ÁÁÁÁÁ  ÁÁ

ÁFcpi% = 120 \ FPts%Á`€%.Á'Cvt points to rough CPI for calcsƒ
ÁÁÁÁÁ  ÁELSEÁ` €%<Á'No size in font hdrƒ
ÁÁÁÁÁ  ÁÁ

ÁFcpi% = 10Á``€%4Á'Assume 12pt/10cpi for calcsƒ
ÁÁÁÁÁ  ÁEND IF
ÁÁÁÁPRINT #PrintFile%, CHR$(27); ")400X";Á`˜€%=Á'Secondary, ID #400ƒ
ÁÁCASE ELSE
ÁÁÁÁIF Ptr$ = "D" THENÁ`˜€%=Á'DOT MATRIX PRINTERƒ
ÁÁÁÁÁ  ÁÁ

ÁGET #PtrFile%, FontRec%, DF
ÁÁÁÁÁ  ÁÁ

ÁPRINT #PrintFile%, zTrim$(DM.Init);Á`°"€%JÁ'Resetƒ
ÁÁÁÁÁ  ÁÁ

ÁPRINT #PrintFile%, zTrim$(DF.Select);Á`à€%DÁ'Select fontƒ
ÁÁÁÁÁ  ÁÁ

ÁT$=Trim$(DM.HTab) + CHR$(2 * Fcpi) + CHR$(0)Á`h€%CÁ'Set tab @ 2"ƒ

ÁÁÁÁÁ  ÁELSEÁ`ð€%BÁ'LASER PRINTERƒ
ÁÁÁÁÁ  ÁÁ

ÁGET #PtrFile%, FontRec%, LF
ÁÁÁÁÁ  ÁÁ

ÁPRINT #PrintFile%, zTrim$(LF.SymSet2);Á`x€%AÁ'Make secondaryƒ
ÁÁÁÁÁ  ÁÁ

ÁPRINT #PrintFile%, zTrim$(LF.Select2);Á`€%@Á'Use SymSet1 etcƒ
ÁÁÁÁÁ  ÁÁ

ÁPRINT #PrintFile%, zTrim$(LF.Spacing);Á`€%@Á'to make Primaryƒ
ÁÁÁÁÁ  ÁÁ

ÁIF VAL(LF.Pitch) = 0 THENÁ`x€%AÁ'Scalable font?ƒ
ÁÁÁÁÁ  ÁÁ

ÁÁÈ
È
ÁPRINT #PrintFile%,LTRIM$(STR$(Pts%));Á`X €%EÁ'Point sizeƒ
ÁÁÁÁÁ  ÁÁ

ÁÁÈ
È
ÁEND IFÁ`˜€%=Á'(from SelectFont%)ƒ
ÁÁÁÁÁ  ÁÁ

ÁPRINT #PrintFile%, zTrim$(LF.Pitch);Á`ˆ€%?Á'Pitch select cmdƒ
ÁÁÁÁÁ  ÁÁ

ÁPRINT #PrintFile%, zTrim$(LF.Slant);Á`x€%AÁ'Upright/italicƒ
ÁÁÁÁÁ  ÁÁ

ÁPRINT #PrintFile%, zTrim$(LF.Weight);Á`x€%AÁ'Light/Med/Boldƒ
ÁÁÁÁÁ  ÁÁ

ÁPRINT #PrintFile%, zTrim$(LF.Number);Á`€%@Á'PCL font numberƒ
ÁÁÁÁÁ  ÁÁ

ÁIF RIGHT$(zTrim$(LF.Pitch), 1) = "h" THENÁ`h€%CÁ'Mono©spaced?ƒ
ÁÁÁÁÁ  ÁÁ

ÁÁÈ
È
ÁÁ¸ ¸ ÁFcpi% = VAL(LF.Pitch)Á`Ð €%FÁ'Store cpiƒ
ÁÁÁÁÁ  ÁÁ

ÁÁÈ
È
ÁÁ¸ ¸ ÁFPts% = 120 \ temp1%Á``€%4Á'Cvt cpi to rough pts if necƒ
ÁÁÁÁÁ  ÁÁ

ÁÁÈ
È
ÁELSE
ÁÁÁÁÁ  ÁÁ

ÁÁÈ
È
ÁÁ¸ ¸ ÁFPts% = VAL(LF.Pitch)Á`h€%CÁ'Store pointsƒ
ÁÁÁÁÁ  ÁÁ

ÁÁÈ
È
ÁÁ¸ ¸ ÁFcpi% = 120 \ TPts%Á``€%4Á'Cvt pts to rough cpi if necƒ
ÁÁÁÁÁ  ÁÁ

ÁÁÈ
È
ÁEND IF
ÁÁÁÁÁ  ÁEND IFÔ€%30*H&H&èèԌÁÁEND SELECT
CLOSE #PtrFile%

ÁÁNow you have the printer ready to go and you have the variables
Fcpi% and Fpts% to work with in calculating TAB locations, line
length, etc.

ÁÁYou will notice that I use zTrim$() rather than just printing a
variable. This is because BASIC pads TYPE fields with nulls ÀÀ
CHR$(0)'s. The zTrim$() function removes CHR$(0)'s but leaves
trailing spaces (which may be part of the command string).

ÁÁThere are some things that you must know, such as that the pitch
command for a PCL (laser) printer ends in "h" if it is mono©spaced
(cpi) and "v" if it is proportionally©spaced (points). Also, in
setting a TAB string in the above example I used the Epson©standard
which terminates the setting of TABs with a CHR$(0). This is the best
solution I have come up with, and every printer I've seen in the past
five years uses Epson codes anyhow, so I figure this technique will
work 90% of the time or better.

ÁÁYou can make your own PRINTER.DAT file or modify the one supplied
just by using the PtrRec.DEF file. Someday soon I will make a
programme for modifying the PRINTER.DAT file, but for now it will have
to be done manually. I would really appreciate it if you would share
with me any new printers you install by sending me your modified
PRINTER.DAT file.


  3 Responses to “Category : BASIC Source Code
Archive   : ANGELLIB.ZIP
Filename : ANGELIB.WP

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/