home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
ENTERPRS
/
CPM
/
UTILS
/
F
/
LUALL.ZIP
/
LU300.DOC
< prev
Wrap
Text File
|
1989-10-07
|
35KB
|
927 lines
Documentation for LU.COM and LRUN.COM
| This document applies to version 3.00 of LU.COM and version
2.0 of LRUN.COM.
Copyright (c) 1982, 1983 by Gary P. Novosielski
All rights reserved.
Permission is hereby granted to copy and distribute this
document for any non-commercial purpose. Any use of this
material for commercial advantage without prior written
consent of the author is prohibited.
INTRODUCTION
Library Utility (LU) is a program to allow combining of
multilple files into one larger file. It requires CP/M
version 2.0 or higher to run.
| Version 3.00 replaces version 2.11. The major revisions are
| the addition of the -b, and -n operators, and the addition
| of CRC calculation and checking to improve reliability.
| Error reporting has also been improved. Major revisions are
| marked with a vertical bar (|) in the left margin.
The directory information in an LU style library is
contained in the same file as the data files, or members.
The amount of space to be allocated to the directory must be
specified by the user when a new library is created, but can
be changed when the file is reorganized. The size of each
directory entry is 32 bytes, which means each four directory
entries take up one sector of the library file. Currently
| only 18 bytes of each entry are used, with 14 bytes being
reserved for use with possible future enhancements. The
directory itself uses one entry for control information, so
the number of directory sectors needed for a library of m
members is (m + 1) / 4, rounded up to the next whole number.
The user need not be concerned with this discussion, as
directory size is calculated by the program. All directory
sizes are input and output in terms of entries, each entry
being a potential member file. The program adjusts directory
size to an integral number of sectors.
LRUN.COM is a small program which allows running a .COM
(object code) file member directly from any library, without
having to extract it to a separate disk file.
Page 1 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
WHY USE LIBRARIES?
First, a library file usually takes up less space than
the total of the individual member files which went into it.
The reason for this is that CP/M allocates disk space in
fixed blocks or groups, typically 2k bytes each. Any space
after the last sector of a file up to the next 2k block
boundary is wasted. The same files in a library use only the
number of sectors they actually need, and though the library
itself may have a partially wasted block at the end, and
requires some space for directory information at the
beginning, the net effect is usually a saving of total
space. The best results are seen when many small files are
combined into one library.
Second, a library file makes most efficient use of the
CP/M disk directory, since it is treated as only one file by
CP/M regardless of how many members it contains.
Third, libraries can aid in transferring packages of
software from one system to another using XMODEM. Only one
file is transferred, eliminating the need to run the XMODEM
transfer program several times, the chance of overlooking a
needed file, and the problems of naming conflicts, (such as
READ.ME files) among unrelated packages.
WHY NOT USE LIBRARIES?
There are some very good reasons for not using
libraries.
For one thing, files within a library are not available
to most "normal" programs. If a frequently accessed file is
placed in a library, it will have to be extracted from the
library to its free-standing counterpart before it can be
used by most programs. (.COM files are a notable exception
to this, because of the availability of the LRUN command,
covered later.)
Libraries can actually waste disk space. When a disk
file is erased, CP/M returns the space formerly used by the
file to the free space pool for use by new files. When a
member file is deleted from a library however, the space
previously occupied by the file is not useable. The library
must be reorganized to make this space available to CP/M.
While this is easy to do with the LU program, it is not
automatic, and if the situation is ignored, large areas of
disk can be tied up as unproductive "dead space".
Page 2 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
HOW TO USE THE LIBRARY UTILITY
LU has two main methods of operation: interactive, and
parameter driven. In parameter driven mode, the program
takes its command inputs from the command line when it is
first invoked, and when the entire line has been processed,
execution ends.
In interactive mode, the program takes its command
inputs from one or more input lines from the standard input
device (typically the console). When all the command inputs
have been processed, the program reads another line. This
process can be repeated as long as necessary.
Input from disk files, C program "pipes", and the XSUB
facility are also supported for more advanced applications.
Interactive mode is probably the best way to get to
know the program, because the effect of each action can be
immediatley seen.
To start an interactive library maintenance session,
just type LU on the command line with no parameters after
it.
All the methods make use of similar syntax:
Each input line, regardless of its source, is scanned
left to right. All alphabetic characters are converted to
upper case. If the line contains any blanks it is separated
into multiple individual input strings.
These input strings are divided into two classes:
operators (sometimes called tags, or options) and operands.
An operator is defined as any two character string
where the first character is a minus sign. Operators tell
the program what to do. Valid operators are -a, -b, -c, -d,
-e, -l -n, -o, -r, -u and -x. Anything else with the same
form is an operator too, but an invalid one.
Operands are any other input string.
| The most common operand strings are names of files
| which are to be acted upon by the previous operator, for
| instance, added to or extracted from a library file. These
| are called filespec operands, and have the following general
| form:
[u/][d:][filename][.[ext]]
where u is an optional user area prefix. It is a
decimal number from 0 to 31, and if present, must be
followed by a slash (/) character. User areas greater than
15 should be used with care, as they cannot be accessed by
any of the resident CCP (Console Command Processor) commands
of CP/M, such as USER, TYPE or ERA.
d is an optional drive designator. It is a
single character in the range of A to P, and if present,
must be followed by a colon (:).
filename is a string of 0 to 8 characters,
following the standard CP/M conventions for filenames
ext is a string of 0 to 3 characters,
Page 3 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
following the standard CP/M naming conventions for filetype
extensions.
The period (.) after filename is manditory if ext is
specified, and optional otherwise. The names "xyz" and
"xyz." are equivalent.
Ambiguous operands are those which contain the characters
"*" or "?" in the filename or extension fields. Examples of
| valid filespec operands are:
foo.bar
3/b:test.fil
3/test.fil
b:test.*
test.fil
test.
test
z
-z.
comm?nd
0/
b:
5/a:
Note in the example "-z." the period, though not required by
the syntax of a filename, is essential to prevent the
operand from being mistaken as the invalid operator "-z".
What action is taken upon the operand depends upon
which operator most recently preceded it. If no operator was
entered, or an invalid one, or one that expects no operands,
the operand will draw an error message, but will otherwise
be ignored.
When running interactively, LU prompts for the
operators and operands. You can type as many inputs as will
fit on the line, separating them with spaces. The end of an
input line has no special significance. The most recent
operator remains in effect, and the next line can begin with
additional operands for it.
The prompt displayed for each input line has this form:
-m u/d:>
where m is the current operator in effect
u is the current user number in effect
d is the current default drive
For example the prompt might be "-E 0/A:>". This
indicates that the -e operator is in still in effect; if an
operand is entered it will be interpreted as the name of a
member file to be Extracted from the library. It also shows
that the current user number is 0, and the current drive is
A:. Any operands which are entered without an explicit user
or drive will use these defaults. The defaults can be
changed at any time with the -u operator, discussed below.
Page 4 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
When the program first starts up, the prompt begins
with "-?", which means no operator is currently in effect.
In this case, the only valid input is an operator. Any
operand will be rejected.
Page 5 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
SUMMARY OF OPERATORS
In this discussion, the "open library" refers to the library
name specified as the current library by using the -o
operator discussed below. The default name LIBRARY.LBR is
used whenever an operator needs an open library, but none is
currently open.
-a add files to library. -a causes subsequent
operands to be treated as the names of files to be added to
the open library. Ambiguous operands match all disk files
which qualify according to normal CP/M wild-card
conventions, except those with a filetype of .LBR. Explicit
user or drive specification on an operand causes that area
to be searched for the file(s) instead of the defaults.
| -b Buffer size set. -b reads the subsequent operator
| as the size (in sectors) to allocate for a disk I/O buffer.
| Normally, this operator need never be used, since a 64
| sector buffer is assumed if not specified. A full discussion
| of buffer size considerations, and their relation to disk
| access speed is beyond the scope of this document.
| Generally, a larger buffer will increase the speed of
| adding, extracting and reorganizing, but this widely
| variable with different hardware.
| Bear in mind that a large I/O buffer will decrease the
| size of the largest library directory which can be processed
| by the program, since the directory buffer competes for
| system memory with the I/O buffer. Conversely, setting the
| buffer to a value less than 64 will increase the maximum
| directory size. This operator can only be used at program
| startup, before the first library is open. Its operands are
| not filespec operands, but simple integer numbers in the
| range 1...255.
-c close the open library. If a library has been
opened with the -o operator, or if the default library
LIBRARY.LBR has been opened by some other operator, -c
causes it to be closed. Otherwise, it has no effect.
Normally this operator need never be entered, since any open
library is automatically closed at the end of the session or
when another one is opened. It is provided for situations
where it is desired to change disk volumes without ending
the LU program. Before removing the disk containing the
library file, it must be closed. After mounting a new
volume, the -U operator (see below) should be used. The -c
operator expects no operands.
-d delete files from library. -d causes subsequent
operands to be treated as the names of members to be deleted
from the open library. Ambiguous names match all members
which qualify. User and drive specifications on operands are
ignored, since the library members are obviously in
whichever area contains the open library.
-e extract files from library. -e causes subsequent
operands to be treated as the names of members in the open
Page 6 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
library to be extracted to normal free-standing CP/M files.
The original copy is not deleted, and remains in the
library.
Ambiguous operands extract all members which qualify. User
or drive specifications on member names cause the output
file(s) to be placed in the specified area rather than the
default. Any existing file with the same name will be
overwritten unless it is protected by having its Read/Only
attribute set on.
-l list current library map. -l causes the directory
of the open library to be listed on the console. The member
names are displayed, along with their index (starting record
within the library) their size in sectors, and the
| internally calculated CRC value.
Also, information is displayed about the number of sectors
in the library, and how much space is used and unused
(wasted). The number of active entries (members) in the
directory is also displayed, as well the number deleted,
free for future use, and the total number. This helps
determine whether the library needs to be re-organized to
free unused space and deleted entries. The operator -l
expects no operands, so the next input should be another
operator.
| -n Name a member. -n causes each subsequent operand
| to be treated as a request to change the name of a member in
| the open library. Since both the new and old names of the
| member must be given, a special double operand format is
| used. It is essentially two filespec operands "glued
| together" with an equals sign. For example:
| newname.typ=oldname.typ
| would cause the member OLDNAME.TYP to have its name changed
| to NEWNAME.TYP. If the old name is not found in the open
| library, or if the new name is that of an existing member,
| no rename takes place, and an appropriate message is
| displayed. Operands which do not conform to the special
| <new>=<old> syntax will also draw an error message.
-o open a library. -o causes the following operand to
be treated as the name of a library file to be opened for
use with subsequent operators. If there is already an open
library, it is first closed, and the new one opened. If the
new library does not exist, it is created with no members.
Ambiguous names are not allowed. User and drive
specification can be used to override the current area.
The file type may be specified, but if not entered,
defaults to .LBR which is strongly suggested as the file
type for all library files. You will recall that files of
type .LBR are ignored by the wildcard matching of the -a
(add) operator. This prevents libraries from being
accidentally added to other libraries, or to themselves; a
situation not unlike trying to drive a truck up its own
Page 7 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
tailpipe.
If for some reason you want to add one library to
another, be my guest, but you will have to specify the name
without * or ? characters when adding it.
-r reorganize library. -r causes the currently open
library to be reorganized. First, the directory is sorted
into alphabetical order, and then all active members are
copied to a work library which is opened on the default
user/drive. The size of the directory may be changed at this
point by specifying a greater or smaller number of entries
than were present the old library. The directory will always
be made large enough to contain all the active members of
the old library, so it is safe to enter a size of "1" to
make the directory as small as possible. (See Specifying
Directory Sizes below.)
When reorganization is complete, the old library is
deleted from its user/drive area, and the work library in
the default area is renamed to the name of the old library.
No backup copy is retained. The newly reorganized library
remains open for use with subsequent operations.
| Note that although the newly reorganized library always
| ends up in the default area, the default area can be changed
| with the -u operator. (Do this first, before using -o.)
| Also, the old library can be opened in any area, by using
| explicit user/drive specifications. The net result is that
| it is possible to reorganize a library from any desired area
| to any other area. Reorganizing a library to a different
| drive is usually a much faster operation, and is manditory
| if the current disk does not contain enough free space for
| the old and work libraries at the same time.
-u Use new default area. The -u can be used to change
the default value for user number or drive. It causes the
user prefix and drive spec of the following operand to be
used as the new default area. If the following operand has
no user prefix, or no drive spec, the corresponding default
is not changed. (The filename and ext sections of the
operand must be absent.) If a change is made, any open
library is first closed, and the disk system is reset. Thus
feature allows newly mounted disk volumes to be accessed for
writing; CP/M causes new volumes to be Read Only until the
program performs a disk system reset. The -u operator also
affects which area will be used for the work library during
reorganization. See the -r operator above.
Note: If directed I/O is active (See advanced features
below) the -u operator is treated as invalid. Due to some
unfortunate assumptions in the C run-time package, the
default drive cannot be safely changed while directed I/O
files are open, and the BDOS gets confused by the disk reset
under these conditions.
-x eXit program. -x causes the interactive mode to be
turned off, which means that the input line containing it
will be the last line scanned by the program. It does not
Page 8 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
cause immediate program termination, and if any more
operators follow it on the same line, they will be processed
normally. The program terminates only after the current line
is fully processed. Any open library is then closed, and the
user number and default drive are reset to the values they
had when the program was originally invoked. To preserve
compatability with earlier versions, the program will also
end if an empty input line (carriage return alone) is typed.
SPECIFYING DIRECTORY SIZE
Whenever an old library is opened, the directory size
is displayed as follows:
Old library LIBRARY.LBR has 32 entries, 5 free.
This means that 5 more members may be added before the
directory becomes full. When the directory is full, -a
becomes an invalid operator, and the library must be
reorganized to add any more members.
When a library is created for the first time, the user
is prompted like this:
New library COMMAND.LBR. Allow how many entries?_
Any number from 1 to 65535 is valid. The actual maximum
is determined by the amount of free memory available on the
system in use. Directory size will be rounded up to the next
whole sector necessary to contain the number of entries
requested. This number will remain in effect until the
library is reorganized. Since the directory itself counts as
an entry, one entry is added to your response before the
size is calculated. Therefore just enter the maximum number
of member files you want the library to be capable of
holding.
The maximum number of member files is also constrained
by the amount of available disk space. If the disk space
runs out during an add, the name is not added to the
directory. If a multiple add is in progress, due to an
ambiguous operand, the remaining qualifying files are still
added if possible. If any of them is small enough to fit in
the remaining disk space, it will be added. If any sectors
were written by a failed add attempt, and then never
utilized, they remain as unused sectors, and the library
should be reorganized.
PARAMETER DRIVEN METHOD
All of the information needed for a maintenance run may
be specified on the command line. The operators and operands
are entered, separated by spaces, after the LU command, and
the operations will take place without console intervention,
except in the case where the directory size for a new
library is requested. The syntax is:
Page 9 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
LU <opr> [<opd> [<opd> ...]] [<opr> [<opd> ...]...
where square brackets indicate optional parameters, and:
<opr> is any operator.
<opd> is any operand.
... indicates that the preceding parameter may occur
multiple times.
Any names occurring prior to the first operator, or
following an operator which does not expect operands, are
ignored.
| CRC CHECKING
|
| Whenever a new member is added to a library, a value
| called the CRC (Cyclic Redundancy Check) word is calculated
| and stored in the member's directory entry. When the member
| is extracted from the library, the calculation is done
| again, and compared with the saved value. If the two values
| do not match, it is an indication that the member was
| damaged in some way while it was in the library. The extract
| will still be performed, but a message warning that the
| extracted copy is questionable will be displayed.
| This feature is especially valuable for libraries which
| have been created on another system and transmitted by phone
| (possibly several times) before you receive them. It helps
| insure that the extracted files are faithful reproductions
| of the files originally inserted before transmission.
| Members added by LU versions prior to 2.20 do not have CRC
| words. The CRC check will be bypassed when one of these is
| extracted.
| The CRC word of the directory itself is checked when
| the library is opened. A message warning of a CRC error will
| be displayed at that time. Libraries modified by LU versions
| prior to 2.20 have no directory CRC word, and the CRC check
| will usually be bypassed. If a warning does occur, it will
| not adversely affect operation.
| When a library is reorganized, CRC words will be added
| to all members, if not present. CRC errors which occur
| during reorganization will cause the program to abort. The
| damaged member must be deleted before the library can be
| reorganized.
| Libraries created by this version of LU can be read by
| all previous versions. The CRC values inserted will simply
| be ignored by early versions of the program.
Page 10 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
ADVANCED FEATURES
Input from BDS C "pipes" or ordinary sequential files
is also possible. The filename is specified on the command
line preceded by a "<" character and no intervening blank.
Example:
LU <CONSOL.DUP
reads the contents of the file CONSOL.DUP and uses each
line of the file as if it had been typed at the normal
console by the interactive method. In this case, no
operators or operands may be present. Console output may
also be redirected by specifying an output file on the
command line after the character ">". This applies to
parameter driven as well as interactive (including "piped")
input. Examples:
LU -O 3/SPECIAL -A B:ZOT.COM >20/C:LOGFILE.OUT
would add the file zot.com from drive b, current user
area, to the library special.lbr, in user area 3 on the
default drive. Console output would be written to a file
called logfile.out in user area 20 on drive c. The placement
of the output name on the line does not matter and except
for turning on redirected output, it is ignored by all
operators.
LU <BATCH.IN >B:RECORD.DOC
would take interactive commands from the file batch.in
and write console output to a file called record.doc on
drive B.
Normally, console file output is also echoed on the
real console, except when input is also redirected, as in
the last example. To force visible console output when both
an input and output file are used, the ">" character
preceding the output file name may be changed to a "+" like
this:
LU +RECORD.DOC <BATCH.IN
This would have the same effect as the previous
example, except that message output would also be visible on
the console.
CAUTIONS
The importance of keeping backup copies of all disk
files, and especially libraries, cannot be overemphasized.
By using library files, the user is exposed to the dreaded
all-the-eggs-in-one-basket syndrome. That is, if something
happens to the library file, particularly the directory, it
may be beyond the capabilities of even a CP/M wizard to
restore the member files. The situation is made particularly
sticky by the fact that the the directory must be updated in
Page 11 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
place as members are added or deleted.
Precautions have been taken to minimize this risk. For
one thing, the directory is read into memory when the
library is first opened, and is only written back if it
differs from the copy on the disk. Operations which change
the directory are: adds, deletes, and the sort operation
which is done before reorganization. If only extracts (or
LRUN executions) are done, the directory is never rewritten,
and the .LBR file may be write protected if desired, by
using the CP/M STAT command. When a read-only library is
| open, all LU operators except -l, -b, and -e become invalid.
As another precaution, the entire empty directory is
allocated and written to disk when a new library is first
created. This insures that there will always be enough space
on disk for the number of directory entries requested at the
time of creation. The disk space may run out while adding
member files, but there will always be enough room on disk
to update the directory once it is successfully created.
The fact that only the memory copy of the directory is
modified until the file is closed may come in very handy if
you mistakenly delete a member file and recognize it right
away.
For example, suppose you make the mistake of typing "-d
*.*". Briefly, your heart sinks, as the "Deleting:" messages
are displayed and all the member names zip into oblivion.
Don't panic. Only the memory copy of the directory has been
modified. When the -D 0/A:> prompt returns, do not hit
RETURN. Instead, abort the program with Control-C. This will
cancel the program without updating the directory, and the
original members will still be present.
Here is another caution. Since the entire directory
must fit in memory for a library to be successfully opened,
it is possible that a huge directory created on a your
system will be too large to fit in memory if read on another
system will less memory. This should not be a problem with a
library of under a hundred entries.
To give you an idea of how much elbowroom you have to
work with, LU displays the highest memory location used each
| time it terminates. This will vary depending on the size of
| the disk I/O buffer, as well as the largest directory used
| during operation, and will be slightly higher if interactive
operation was used, since a console buffer must be
allocated.
It does not include the stack, which grows down from high
memory, and is allowed about a thousand bytes of space for
subroutine parameters and temporary work areas.
Page 12 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
THE LRUN COMMAND
The LRUN command was created for those of us who have
lots of command files we like to keep on line all the time.
We all have some favorite little .COM files are very small
programs, but having a lot of them on disk eats up file
space at an alarming rate due to the fixed CP/M block size.
Put them all into a library called COMMAND.LBR using LU. You
can then run any .COM file directly from the library by
saying:
LRUN <followed by normal command line just like always>
The full syntax of LRUN is:
LRUN [-<lbrfile>] <commember> [<parameters>]
Where:
<lbrfile> is the library to be searched. The square
brackets around -<lbrfile> indicate it is optional. The -
character tells LRUN that what follows is a library name. It
is not an actual part of the name. Don't leave a space after
the -. If the first parameter doesn't begin with - then the
default library COMMAND.LBR is used. If a drive spec is
given, such as B:, then only that drive is searched for the
library. If no drive spec is given, the current area is
searched first, and if no library of that name is found, the
default area is searched before giving up. The default area
is set to 0/A: in the distribution object code, but this can
be changed to something more appropriate for your system by
changing two equates in the source program and reassembling.
LRUN does not otherwise support user numbers, and will not
recognize the "u/" syntax on its parameters.
If a name, but no type is entered, .LBR is assumed.
<commember> is the name of the command to be run. No
drive spec is used here. The type defaults to .COM and need
not be entered.
<parameters> is a the normal (possibly empty) list of
parameters which the .COM file expects to find on the
command line when it is run. This list is parsed to the
required file control blocks and command line area before
execution begins, so the program will not be aware that
anything cute is going on. (Thanks to Ron Fowler for
supplying the code which makes this possible.)
LRUN EXAMPLES
LRUN ED FOO.BAR
the file ED.COM is searched for in COMMAND.LBR on the
current drive, or the A: drive. If found, ED.COM is loaded
from the library, and FOO.BAR is passed to it as a
parameter.
Page 13 of 14 83-08-16
Documentation for LU.COM and LRUN.COM
LRUN -C:SPECIAL LU -O COMMAND -A A:*.COM
the file LU.COM is searched for in SPECIAL.LBR on the C
drive. If found, LU.COM is loaded, and the strings -O,
COMMAND, -A, and *.COM are passed to it as parameters.
LRUN - -ZIP
the file -ZIP.COM is searched for in COMMAND.LBR on the
current drive, or the A: drive. If found, -ZIP.COM is loaded
and executed with a blank parameter list. Since -ZIP.COM
begins with a -, the extra - followed by a space was needed
to act as a place-holder for the library name. Compare with:
LRUN -ZIP
the library -ZIP.LBR is looked for, but nothing else
happens, because no command was specified.
LRUN
with no parameters at all, causes a screen of help
information to be displayed as a memory refresher.
Please report any problems or suggestions for
enhancement to me via CompuServe CP-MIG or EMAIL, user
number 70160,120; or by phone at (201) 935-4087, voice,
evenings (eastern time) or weekends.
Gary P. Novosielski
Page 14 of 14 83-08-16
to find on the
command line when it is run. This list is parsed to the
required file control blocks and command