@database KingFisher2.guide
@index MAIN
@author "Udo Schuermann"
@(c) "Copyright © 1992-1995 Udo Schuermann"
@$VER: KingFisher-Guide/Documentation 2.10 (4.7.95)
@wordwrap
@font CGTriumvirate.font 18

@node MAIN "KingFisher Release 2"
@{B}KingFisher Release 2@{UB}
@{B}Copyright © 1992-1995 Udo Schuermann@{UB}
@{B}All rights reserved@{UB}

@{fg back}This document is formatted with AmigaDOS 3.x in mind.  Please excuse what display problems you may encounter when running under AmigaDOS 2.x!@{fg text}
	@{B}@{I}Table of Contents @{UI}@{UB}

1	@{" INTRODUCTION " link INTRODUCTION}
1.1		@{" Components " link COMPONENTS}
1.2		@{" Distribution rights " link DISTRIBUTION}
1.3		@{" Registration and updates " link REGISTRATION}
1.3.1			@{" Why you should register KingFisher " link REGISTRATION1}
1.3.2			@{" What you get for registering KingFisher " link REGISTRATION2}
1.3.3			@{" How to register KingFisher " link REGISTRATION3}
1.3.4			@{" How to obtain updates and developer kits " link REGISTRATION4}
1.4		@{" Installation " link INSTALLATION}
1.5		@{" Uninstalling KingFisher " link UNINSTALL}
1.6		@{" Technical support " link TECHSUPPORT}

2	@{" CONCEPTS " link CONCEPTS}
2.1		@{" Origin and history " link HISTORY}
2.2		@{" Client-Server technology " link CLIENTSERVER}
2.3		@{" Search expressions " link EXPRESSIONS}
2.4		@{" Search sets " link SEARCHSET}
2.5		@{" Custom formats " link CUSTOMFORMAT}
2.6		@{" KFServer and Databases" link KFSERVER}
2.7		@{" Product-Info Specification " link PRODUCTINFOSPEC}
2.7.1			@{" Body and miscellaneous " link PRODUCTINFOBODY}
2.7.2			@{" Available fields " link FIELDS}
2.7.3			@{" Starter .Product-Info " link PRODUCTINFOSTARTER}
2.8		@{" KingFisher tooltypes " link TOOLTYPES}
2.9		@{" Differences from KingFisher 1.40 " link KF140}
2.10		@{" Special Features " link SPECIAL}

3	@{" MENUS " link MENUS}
3.1		@{" Project " link MENU-PROJECT}
3.2		@{" Edit " link MENU-EDIT}
3.3		@{" Search " link MENU-SEARCH}
3.4		@{" Preferences " link MENU-PREFERENCES}
3.5		@{" Help " link MENU-HELP}

4	@{" GADGETS " link GADGETS}

5	@{" REXXFISHER " link REXXFISHER}

6	@{" TROUBLE SHOOTING " link TROUBLE}

7	@{" THE FUTURE " link FUTURE}

8	@{" THANKS " link THANKS}
@endnode



@node INTRODUCTION "1 INTRODUCTION"
@prev MAIN
@next CONCEPTS
KingFisher Release 2 is a special purpose database tool designed for the storing and retrieving of information about software.

It is fully compatible with Fred Fish's @{" Product-Info Specification v6 " link PRODUCTINFOSPEC} (which I helped design.)  Ideally, information in the database is broken up into a large number of distinct fields, each of which has a specific meaning and can be examined individually.

The benefit of this storage method is greater flexibility: you can search for software by a specific author, for programs that have at least reached version 2, or for software that is not commercial or has been released after a certain date.  Furthermore, how information is formatted can also be specified on a field-by-field basis, and tied to individual databases, providing you with the means to produce custom databases for other applications.

An ARexx interface is also provided, which supports the same formatting capabilities and same advanced search capabilities as the GadTools (GUI) interface.  It provides a perfect interface between the databases and any application wishing to retrieve information from them.

KingFisher Release 2 is a complete revision of the original KingFisher.  It no longer aimed only at Fred Fish's AmigaLibDisks ("Fish Disks"), but is meant to index also the Aminet, other CD-ROMs, as well as your club's software collection.

Based on @{" Client-Server technology " link CLIENTSERVER}, KingFisher Release 2 allows more than one user to simultaneously access a database without the possibility of data corruption occurring.  Even if you have no apparent need for this power, you can make use of it by starting multiple copies of KingFisher Release 2, one to search with, another to browse, a third to print, etc.
@endnode

@node COMPONENTS "1.1 Components"
@prev INTRODUCTION
@next DISTRIBUTION
KingFisher Release 2 consists of multiple components that work together:

@{I}KingFisher @{UI}is the name of the @{B}entire package@{UB}, and also the name of the GadTools (GUI) interface portion.

Behind the scenes operates the @{I}KingFisher Database Server @{UI}(click @{" here " link CLIENTSERVER} for a brief discourse on Client-Server technology) to which @{I}KingFisher @{UI}connects.

Instead of (or in addition to) KingFisher, you could use @{I}RexxFisher @{UI}to access the databases (using ARexx.)

The programming interface to the @{I}KingFisher Database Server @{UI}is available to developers.  Click @{" here " link REGISTRATION4} for information on how to obtain the developer kit.
@endnode


@node DISTRIBUTION "1.2 Distribution rights"
@prev COMPONENTS
@next REGISTRATION
KingFisher Release 2 is a Shareware product made available in two versions¹:

(1)	A freely distributable version, available in archived form, which may be distributed for a price of no more than $3 (US) per disk or equivalent in foreign currency, and

(2)	An unrestricted version, available only to registered users and available only from the author or authorized distribution sites.

Distribution of any portion of KingFisher Release 2 as part of a software or hardware product, including CD-ROM, where KingFisher is stored in ready to use form, such as a CD-ROM index/search tool, is not permitted without a prior license agreement with the author of KingFisher Release 2 for such use.

Such a license agreement shall cost the equivalent of 10 (ten) registered copies of KingFisher Release 2 and grants you the right to duplicate unlimited @{B}unregistered@{UB} copies of KingFisher Release 2 ready to use with all your or your company's hardware or software products.

@{B}Registered copies of KingFisher may not ever be distributed by anyone except the author and licensed distribution sites.@{UB}

__________
¹ A third form are beta test copies of KingFisher, but these are not distributable at all!
@endnode


@node REGISTRATION "1.3 Registration and Updates"
@prev DISTRIBUTION
@next INSTALLATION
@{B}If you have already registered KingFisher, my thanks for your support!  If not, please read the following important sections:@{UB}

The unregistered, freely distributable version of KingFisher Release 2 bears some restrictions.  At present, the unregistered version allows only two simultaneous connections to the KFServer (KingFisher Database Server), meaning that you could run two copies of the KingFisher GadTools (GUI) interface, but not a third.

The registered version has no such limitations, making it the search tool of choice for multi-user bulletin board systems!

Please explore the following items:

1.3.1		@{" Why you should register KingFisher " link REGISTRATION1}

1.3.2		@{" What you get for registering KingFisher " link REGISTRATION2}

1.3.3		@{" How to register KingFisher " link REGISTRATION3}

1.3.4		@{" How to obtain updates and developer kits " link REGISTRATION4}
@endnode


@node REGISTRATION1 "1.3.1 Why you should register KingFisher"
You received KingFisher for free.  You may have downloaded it from Aminet or from a BBS.  You may also have paid for a package, such as one of Fred Fish's CD-ROMs, but KingFisher came free with the package.  This is because Fred and I have a deal: he gets to distribute KingFisher as part of his great CD-ROMs, and you get a program with both a past and a future.

But what do I, the programmer, get for all the time I spent on KingFisher?  I cannot live off thank-you notes (although I appreciate all I get) and CD-ROMs make a poor diet (even when served with wine and cheese ;-) so you can imagine that I am hoping for something more substantial to reward me for my efforts, and I am hoping that you will show your appreciation for my work!

Now, why should you register a program that came to you free?  It's simple: You get to use and evaluate it at your own pace, on your own Amiga at home, not some store's machine.  You are under no pressure to buy.  When you feel that you want to keep the program, you simply send me the registration fee.  This registration fee is lower than what a commercial product would cost you, because you are not being charged for dealer overhead, distribution costs, or fancy packaging (every part of KingFisher is fully recyclable and wastes no natural resources :)

The original KingFisher was my return of favors to the Amiga Community.  It was free, it was fun, it taught me a lot.  But best of all (for you) it was free.  KingFisher Release 2 is no longer free.  You really should register the program.

If you live in Europe, you can @{" register " link REGISTRATION3} with someone I know in Germany!  In North America, you can register with me directly.  Those of you in other parts of the world get to choose the site most convenient to you.  I will support you anywhere within the bounds of our Solar System. :)  @{" Here " link REGISTRATION3} is how to register.
@endnode


@node REGISTRATION2 "1.3.2 What you get for registering KingFisher"
Here is what you get for registering:

@{fg back}@{bg text} × @{bg back}@{fg text}	A KFServer that is able to allow an unlimited number of clients to connect.  For you BBS operators, that means you can serve dozens, hundreds, thousands(!) of users!  (Billions and billions! ;-)

@{fg back}@{bg text} × @{bg back}@{fg text}	You can receive Programming Documentation so your own programs can connect to the KingFisher Release 2 Database Server.  Are you the author of BBS software?  Would you like to write a "Door" or other interface, rather than going through RexxFisher?  Do you want to try your hand at writing a (gasp!) better GUI?

@{fg back}@{bg text} × @{bg back}@{fg text}	Technical Support via electronic mail and an electronic KingFisher Mailing List.  You will also be the first to receive new versions of the included software (even maintenance releases which won't always make it to the general public.)

@{fg back}@{bg text} × @{bg back}@{fg text}	My pledge that as long as there is demand for KingFisher, I will continue to support it, regardless of where the Amiga is going.

@{fg back}@{bg text} × @{bg back}@{fg text}	Your conscience will let you sleep better at night, knowing that you are really supporting your favorite computer.  What good is your Amiga if nobody wrote software for it anymore?  Support your software authors @{B}today@{UB}, because tomorrow it may be too late!


As a final word of encouragement, should you feel hesitant about registering KingFisher: With the original KingFisher I hope to have established that quality software and quality support are important to me.  You will receive nothing less from me in the future.  KingFisher Release 2 is my first attempt to get some return on my investment of time through the good-will of you, the appreciating user.  With your support, KingFisher Release 2 will grow far beyond what you see before you today.
	@{B}Consider your registration a vote.  Vote for the Amiga's growth!  WITHOUT your support it may never achieve its full potential.  Don't take that chance.  Register today and support your existing investment!@{UB}  @{" Here " link REGISTRATION3} is how to register.
@endnode


@node REGISTRATION3 "1.3.3 How to register KingFisher"
There are two sites to receive your registration fee.  If you live anywhere in Europe, you should use the site in Germany.  Anywhere else in the world, such as Australia, Japan, or places even further away than that ;-) should register directly with the author, in the United States.

@{B}United States:@{UB}
	Send $20 (US) in the form of a personal check drawn on a U.S. bank or money order or similar form of payment to:

	Udo Schuermann
        7022 Hanover Parkway, Apt. C2
        Beltsville, MD  20770
	USA

NOTICE: The old address (6000 42nd Avenue, Apt. 405; Hyattsville, MD 20781-1518) remains active until July 15, 1995.  Do not use it after that date, as no guarantee can be made that mail forwarding will be reliable ("disgruntled postal workers"...)


@{B}Europe:@{UB}
	Send DM30 in the form of a EuroCheque or check drawn on a German bank.  Direct bank transfers (Überweisungen) are also available.

	Uwe Schürkamp
	Jöllenbecker Weg 4
	32051 Herford       
	GERMANY


Members of User Groups:  You get a 20% discount when you register and provide the name and address of your user group.  This means you get KingFisher Release 2 for either US$16 or DM24.  Pass the word!

Sending cash is discouraged for reasons that it's untracable.  In the event that it gets lost in the mail, the loss would be yours to carry.  If you live in a land far, far away from either Europe or the USA, then your best bet may be to send cash, as many (international) banks do not cater to the exchange of small sums.  If you decide to send cash in the mail, make sure that your letter in no way reveals its contents to someone peering at it against the light, or feeling the bank notes through the envelope.


@{B}Please do @{U}not@{UU} ask for @{" technical support " link TECHSUPPORT} from any site but the author!@{UB}

The European registration site is a good friend of mine, but he does not know enough about KingFisher to offer technical assistance.  Also, if you absolutely must talk to him and look up his telephone number, please do him and his family the courtesy of calling only during regular daytime hours.  Thanks!
@endnode


@node REGISTRATION4 "1.3.4 How to obtain updates and developer kits"
@{U}Updates@{UU}

Updates to newer versions are available free on Aminet¹ ftp sites (requires Internet access) and, for a nominal fee, at the same addresses as listed @{" here " link REGISTRATION3}.  You may want to specify how you want the update to be processed.  Examples are:
	the latest version (we keep on record the latest version you received from one of the registration sites), or the next available version within a certain time frame (say four weeks; I might be close to releasing a new version shortly and you might be happy to wait a little longer to get that, instead of the soon-to-be outdated one.  We're human beings, we read your request and do our best to listen.  If you are in a hurry to get the latest version, please say so.

The cost of obtaining an update:

	$5.00 (US)	if sent to the United States address (author.)

	DM10.00		if sent to the European address.

Updates may also be available electronically on Aminet (and eventually on BBSs.)  These will be patch files applicable only to the original and unmodified binaries of specific versions of KingFisher.  Keep your original disk!

@{B}If you wish to obtain the Developer Package, you must specifically state this when you request an update.@{UB} There is no additional cost involved for you, but the Developer Package will be included only if you ask for it².  Click @{" here " link CS-IMP} for a bit more information.

__________
¹Aminet is a world-wide cooperative system of ftp sites that mirror each other's disk contents to reduce the need for some people to ftp halfway around the planet to retrieve information.  KingFisher's update patches are stored on Aminet in the @{B}biz/dbase/@{UB} directory, in a file named @{B}KF-REGS-pch-XX.lha@{UB} where the @{B}XX@{UB} represents the latest version number (i.e. v2.9 is represented as @{B}29@{UB}.)

²It is not cost-effective at this time to include a 2nd disk for every distributed copy of KingFisher, as only a small number of people actually make use of the developer information.  You may obtain the developer kit (225K of information compressed to ~90K) either on disk as part of an upgrade (does not include the "1000 Fish Disks" database, which you have already), or free by electronic means (email: walrus@wam.umd.edu; WWW: http://www.wam.umd.edu/~walrus/)
@endnode



@node INSTALLATION "1.4 Installation"
@prev REGISTRATION
@next UNINSTALL
KingFisher Release 2 is best installed from the distribution disk with the standard @{I}Commodore Installer @{UI}by double-clicking on the Install-KingFisher icon.  This is because the full distribution version of KingFisher expands to 2MB on your harddisk, and fitting it all on a single floppy disk requires nearly everything on the disk to be compressed.  The Install-KingFisher script knows how to uncompress and install the software for you, and it handles updates as well.

If you choose novice mode, KingFisher will be installed to a drawer named @{B}SYS:KingFisher2/@{UB}, otherwise you get a choice.  You must have 2MB of space on the disk where you install the program.

Should something go awry with the installation, it is possible to install KingFisher manually, but this requires some effort and attention to detail, as you'd need to uncompress the files on the disk yourself.

@{B}Running KingFisher Release 2 merely requires double clicking on the KingFisher icon, or typing KingFisher at the CLI when your default directory is the installation directory.@{UB}

@{" Uninstalling " link UNINSTALL} the program is even easier than installation.
@endnode


@node UNINSTALL "1.5 Uninstalling KingFisher"
@prev INSTALLATION
@next TECHSUPPORT
KingFisher is installed into a single directory (and subdirectories of that.)  No files are placed elsewhere in the system unless some change to the basic setup is made or you do not have amigaguide.library installed and ask the Install-KingFisher script to install it for you.

This organization makes uninstallation as easy as dragging KingFisher's drawer into the trashcan (using the Workbench), or deleting the subdirectory and all its contents (from the CLI.)
@endnode


@node TECHSUPPORT "1.6 Technical support"
@prev UNINSTALL
The quickest way to get technical support is through electronic mail.  This requires that you have an account with @{U}reliable@{UU} Internet access.  In the past, I've tried to help some people and my replies "bounced."  I feel bad that my answers never made it back to them (and they may be waiting yet) but there really is nothing I can do.

	Email:	walrus@wam.umd.edu
	WWW:	http://www.wam.umd.edu/~walrus/

Postal mail is another way to get in touch with me.  I've tried to be good in the past about replying to all letters, especially those that asked for some sort of response, but I confess that I have a problem allocating space on my desk and as a result things have gotten lost.  8-(

	Udo Schuermann
        7022 Hanover Parkway, Apt. C2
        Beltsville, MD  20770
	USA

NOTICE: This postal address is going to change as of August 1, 1995.  The new address is not yet known; please inquire by email!

NOTICE:	KingFisher's status as a shareware product means that my first priority for technical support is towards registered users.  If you are not a registered user, I will still try to help you, but if your problem is complex and requires too much of my time ...  well, you can probably imagine how these things go.
@endnode


@node CONCEPTS "2 CONCEPTS"
@prev INTRODUCTION
@next MENUS

2.1	@{" 2.1 Origin and history " link HISTORY}
	Fred Fish, Aquarium, and KingFisher -- Sound "fishy" to you?

2.2	@{" Client-Server technology " link CLIENTSERVER}
	A powerful multiuser database concept

2.3	@{" Search expressions " link EXPRESSIONS}
        How to formulate expressions to search for exactly what you want

2.4	@{" Search Sets " link SEARCHSET}
        Saving and restoring the results of previous searches

2.5	@{" 2.5 Custom Formats " link CUSTOMFORMAT}
        Customizing visual, printed, and exported presentation of data

2.6	@{" KFServer " link KFSERVER}
        The most important, though least visible, part of KingFisher Release 2

The Product-Info Specification:
2.7.1		@{" Body and Miscellaneous " link PRODUCTINFOBODY}
2.7.2		@{" Available Fields " link FIELDS}
2.7.3		@{" Starter .Product-Info " link PRODUCTINFOSTARTER}
        Everything you need to properly describe your own projects!

2.8	@{" KingFisher Tooltypes " link TOOLTYPES}
	Overriding .prefs defaults with CLI or TOOLTYPE parameters

2.9	@{" Making the transition from KingFisher 1.40 " link KF140}
	Helping users of KingFisher 1.40 make the transition to Release 2

2.10	@{" Special Features " link SPECIAL}
	All the little known facts!
@endnode


@node CS-IMP "Implementation of Client-Server Architecture"
The Amiga's multitasking Exec (the software that handles all aspects of multitasking, including interprocess communication) provides a highspeed method of passing large amounts of information from one task to another.

The KFServer creates a message port, a rendezvouz, to which clients deposit requests for processing.  The KFServer processes these requests one after another (first come, first served) and returns the results to the sender.

And that, my friends, is all there is to it!  Quite simple, really.  :)

Naturally, the protocol of how exactly to ask the KFServer for information requires some attention to detail.  If you are interested in writing client software for KFServer and you are a registered user, you are eligible for a nearly free package¹ to help you get started.  This package includes source code, extensive documentation on the KFServer API (Application Programming Interface) and source code to isolate you from the grueling details of setting up messages with parameters for every single request sent to the server.

All code supplied with the developer package is written for and compiles with SAS®/C 6.55.

References:
	AMIGA ROM Kernel Reference Manual: Libraries.  Exec Chapter.
	COMMODORE-AMIGA "C" include files: exec/ports.h

__________
¹ The KingFisher Developer Pack costs the same as an upgrade but you also get the most recent version of KingFisher "thrown in" as a bonus.  If you ask for only an upgrade, you get the upgrade.  If you ask, instead, for the KingFisher Developer Pack, you'll get both, regardless if the upgrade will actually upgrade your current version.  Of course, you could always explain that you're willing to wait some amount of time for the latest release.
       The KingFisher Developer Pack is available free via email directly from the author at the address walrus@wam.umd.edu
@endnode


@node HISTORY "2.1 Origin and History"
@prev CONCEPTS
There are many terms used by KingFisher and by this documentation which revolve around the concept of those strange dwellers in the water:  fish.  The reason for this is that in late 1985, a fellow named Fred Fish began to collect freely distributable software, put it all on disks and distributed these in a coherent and reliable manner.  The concept of "Fish Disks" was born.  To date, Fred has released a grand total of 1000 of these disks, containing over 4500 programs.

To provide some means of wading through the ever-growing pond of "Fish Disks," (grown into a veritable ocean by this time) a man named B.  Lennart Olsson created the first widely distributed tool for storing and searching the contents of Fred Fish's disk library.  Compared to KingFisher, Aquarium was somewhat primitive, yet it served the Amiga community admirably for a number of years.

Around the time that the 400th Fish Disk appeared, I had become the self-appointed keeper of the Aquarium Database, and I spent quite some time every month updating the database, the flags that Aquarium needed to find information, and distributing updates to the database so that not everyone had to do the same thing over again.  The frustrations of this job led me to design the tool that became KingFisher.  Its first release, on December 1, 1992 was quickly followed by several more versions until it arrived after seven public updates at version 1.40.

But KingFisher 1.40 still fell short of what I wanted to accomplish.  A lot of people wanted features that I couldn't comfortably patch into the code, and it was a hopelessly single-minded system, unable to work with anything but a single database and a single user.  Those who are using KingFisher 1.x as a BBS support tool will be especially aware of its shortcomings in this area.  All this, the feedback from hundreds of users, and Fred Fish's need for an effective database tool to support his move to a CD-ROM distribution led me to design what you have in your hands now: KingFisher Release 2.

KingFisher Release 2 serves multiple databases to multiple users in any configuration, fully supports Fred Fish's @{I}Product-Info Specification @{UI}v6 (which I helped design), and offers practically every feature of KingFisher's first release that can be properly supported.  The databases can be accessed through an ARexx interface and a resizable and proportional font aware GadTools window that opens on the default public screen.  And @{" more is on the way " link FUTURE} ...
@endnode

@node CLIENTSERVER "2.2 Client-Server technology"
@next SEARCHSET
Client-Server architecture is a database concept whereby one unique portion of the software, called the @{B}server@{UB}, is responsible for controlling access to data, while one or more @{B}clients@{UB} talk to the server and request data.  It is the clients that are responsible for presenting the data, perhaps alter it and then handing it back to the server for storage.

The Client-Server model provides for efficient, successful, and safe multiuser arbitration and is widely used in the computer industry.

KingFisher implements this same powerful concept to provide you with safe access to one or more databases, and to extend this access, if you wish, to a number of simultaneous users that may have access to your system through BBS software.

KingFisher's server software is the @{" KFServer " link KFSERVER}.

KingFisher itself is "merely" a GadTools (GUI) client that talks to this server.

RexxFisher, also, is a client that talks to the server.

And so is ReOrder, a little tool available in source form, meant more as examples than useful programs.

@{B}All of these together form the product named @{I}KingFisher. @{UI}@{UB}

@{fg highlight}@{B}If you wish to learn a little bit about how the client-server architecture is implemented in KingFisher, then click @{" here " link CS-IMP}.@{UB}@{fg text}
@endnode

@node EXPRESSIONS "2.3 Search Expressions"
@{B}NOTE:	If you have the @{" Simple substrings " link PREFSSEARCHSIMPLESUBSTRINGS} option selected, then KingFisher will accept a simplified version of the expression syntax described here.  Watch for the symbol @{fg fill}@{bg highlight} × @{bg back}@{fg text} to to point out important sections pertaining to this topic!@{UB}

To check the status of the Simple substrings option, check the following menu:

	|@{fg back}@{bg text} Preferences @{fg text}@{bg back} |
	| Global		» |
	| Display		» |
	| Printing		» |
	| Exporting	» |
	|@{fg back}@{bg text} Searching @{fg text}@{bg back}	   |________________
	|	|     Stop on each match	|
	|	|     Case sensitive			|
	|___	|     Trim blanks			|
		|@{fg back}@{bg text}     Simple substrings @{fg text}@{bg back}		|
		|     Use search masks		|
		|___________________________|
	

@{B}@{U}Part I.  A basic expression@{UU}@{UB}

An @{I}expression @{UI} tells KingFisher exactly what you are looking for.  An expression takes the form

	@{I}field @{UI}	@{I}comparison @{UI}		@{B}@{I}value @{UI}@{UB}

@{fg fill}@{bg highlight} × @{bg back}@{fg text}	When the Simple substrings option is selected, only the @{I}value @{UI}portion is used, and KingFisher automatically substitutes a @{B}*@{UB} (all) for the @{I}field, @{UI}and @{B}$@{UB} (substring search) for the comparison operator.

Choices for...

@{B}@{fg highlight}field@{fg text}@{UB}			the name of any @{" database field " link FIELDS}.  An example of this would be name, description, version, or author.  You may use a @{B}*@{UB} instead of a specific name to indicate that you wish KingFisher to search all existing fields in the records.

@{B}@{fg highlight}comparison@{fg text}@{UB}	one or two character symbol.  The following are valid:
	=   or  ==	The field contents are equal to the value
	<>  or  !=	The field contents are not the same as the value
	<=			The field contents are alphabetically less than or equal to the value
	>=			The field contents are alphabetically greater than or equal to the value
	<			... alphabetically less
	>			... alphabetically greater
	$			The field contents contain the substring given by the value
	#			The field contents are compared to the given @{I}DOS Pattern.@{UI}

@{B}@{fg highlight}value@{fg text}@{UB}		a string of characters.  If the string contains any of the special symbols, such as: ( ) & | ^ or blank spaces, it becomes necessary to enclose the string in single or double matching quotes: "" or ''

Examples:
	name=kingfisher
	version  >=2
	author  $  "matt dillon"

Notice that spaces surrounding the three parts of the expression (field, comparison, and value) are unimportant.


@{B}@{U}Part II.  Composite expressions@{UU}@{UB}

Let us now combine two expressions to form a more complex one:

	name = kingfisher   &   version >= 2

Notice the new symbol, @{B}&@{UB}, that we used.  This is a boolean operator that you can use to connect two expressions.  The following boolean operators are valid:

	@{B}@{fg highlight}&@{fg text}@{UB}	Logical AND
	Both the expression on the left and on the right side of the operator must evaluate to TRUE, or else the combined expression formed from the two will evaluate to FALSE.

	@{B}@{fg highlight}|@{fg text}@{UB}	Logical OR
		Inclusive OR
	If either or both of the expressions on the left and on the right side of the operator evaluate to TRUE, then the combined expression also evaluates to TRUE.

	@{B}@{fg highlight}^@{fg text}@{UB}	Logical XOR
		Exclusive OR
	Either one, but NOT both expressions on the left and on the right side of the operator must evaluate to TRUE, otherwise the combined expression is FALSE.

The expression above, therefore, means: if the name equals 'kingfisher' AND the version is (alphabetically) greater than '2', then we have found a record that might be interesting.


Test your new-found understanding:  What does the following mean?

		name $ 'aquarium'  |  name = kingfisher

It means if the string 'aquarium' appears as a substring in the name field, OR the name equals 'kingfisher' then this is a match.


@{B}@{U}Part III.  Sequence of evaluation@{UU}@{UB}

Let us examine a more complex expression.  Assume we want to find all the records with 'aquarium' part of the name, OR all the ones named kingfisher which have a version of at least 2.  Does the following expression work?

		name$aquarium   |   name=kingfisher   &   version>=2

@{B}The answer is no!@{UB}  KingFisher uses left-to-right evaluation, meaning that the expression first evaluates

		name$aquarium

then it evaluates

		name=kingfisher

and then checks if EITHER is true.  @{B}Only then@{UB} will it proceed to test the version.  If we use parentheses to demonstrate how KingFisher actually evaluates the expression, you'll notice immediately that we had something else in mind:

		@{B}(@{UB} name$aquarium | name=kingfisher @{B})@{UB} & version>=2

But KingFisher does understand parentheses, so we can easily fix the expression to do what we meant it to do in the first place.  We just have to remember to use them:

		name$aquarium | @{B}(@{UB} name=kingfisher & version>=2 @{B})@{UB}

@{B}@{fg highlight}You can use many levels of nested parentheses, and it is always safer to "overdose" on parentheses than to assume that the expression really means what you hope to express.@{fg text}@{UB}


@{B}@{U}Part IV.  Negation@{UU}@{UB}

Any part of the expression can be negated.  If you wish to find all software in which Udo Schuermann had no part, you would begin by entering the following:

		name$"udo schuermann"

and then @{I}negating @{UI}the expression by placing the negation operator in front of it:

		@{B}~@{UB}name$"udo schuermann"

KingFisher recognizes both the ~ and the ! symbols as negation operators.  Which one you use depends entirely on your preference.

@{B}@{U}Part V.  Expression Shortcuts@{UU}@{UB}

To make a variety of comparisons to a single field a little easier, an expression shortcut represents enhanced ease of entry and formulation; it does not affect the speed of searches in any way.  Expression shortcuts are not available when the @{" Simple Substring " link PREFSSEARCHSIMPLESUBSTRINGS} is active.

Let us assume that you are looking for a large number of programs by name.  You could enter the following expression:

		name$post | name$music | name$fish | name$king | name$aqua

You will quickly come to the point where typing "name$" over and over becomes rather tedious.  KingFisher now allows you to enter the same expression this way:

		name$(post|music|fish|king|aqua)

Observe that the expression in parentheses consists only of values and boolean operators (the | symbol in our example, signifying an OR-expression.)  The field identifier ('name' in our example) and how this field is treated (as a substring, see the $ symbol) is a constant and does not change for the values given.

Consider:

		name="kingfisher" | name$"post"

This expression cannot be converted to a shortcut because in one portion we test for equality (=) and in the other we test for a substring ($).

In order to impose an evaluation order, the portion in ()'s may contain multiple levels of parentheses to prioritize the evaluation order:

		name$(fish&@{B}(@{UB}king|net|sticks@{B})@{UB})

represents:

		name$fish & @{B}(@{UB} name$king | name$net | name$sticks @{B})@{UB}

@{B}@{U}Part VI.  DOS Patterns@{UU}@{UB}

The special comparison symbol '#' serves to identify the following string as a DOS Pattern.  In case you are not familiar with these, look in your AmigaDOS manual (the AmigaDOS 3.1 manual describes these in Chapter 3, pp. 16-18) under the heading Pattern Matching and/or Wildcards.

Consider:

		name#"#?king#?"

This pattern is the exact same thing as

		name$"king"

except that the former uses the dos.library's pattern matching, whereas the latter uses a simpler, but faster substring comparison.  Note especially the difference between the '#' vs. the '$' operator to tell KingFisher how you want the string treated.

The example above is probably as unexciting as a slice of stale bread, but if you are familiar with DOS Patterns, you should have already realized that they can help you build some powerful expressions.  You must understand, however, that the dos.library matches the @{B}entire@{UB} expression against the field contents, whereby you will usually want to surround the string with the "0-or-more-characters" wildcard: #?
	The expression @{i}name#"king" @{ui}will NOT find "kingfisher", nor will it match any program that is not exactly named "king".  Read the DOS documentation for more details.  Enough said.

NOTE:	The @{" Trim Blanks " link PREFSSEARCHTRIMBLANKS} option will affect the search string, unless it is enclosed in quotes.  @{B}@{U}You are strongly urged to always enclose your DOS Patterns in quotes!@{UU}@{UB}

NOTE:	If you specify a DOS Pattern that contains no wildcards, in other words it is a simple string constant, then KingFisher will convert the expression to an equality search.  Example:

		name # "kingfisher"

will not use the dos.library for pattern matching, but rather convert the expression to

		name = "kingfisher"

and evaluate the equality directly and without assistance from DOS.


And that concludes the overview on expressions.
@endnode


@node SEARCHSET "2.4 Search Sets"
Search sets represent one of KingFisher's newest, and perhaps most useful features.  Before searching, you must select whether or not you wish to make this an interactive or a non-stop search by checking or unchecking the PREFERENCES/Searching submenu item.  Only when the @{" Stop on each match " link PREFSSEARCHSTOPONEACH} item is not checked, will KingFisher produce search sets that you can examine at your leisure.  The value of both choices is discussed there.

Search sets need not be saved to be useful, although you can save yourself much time if you save the results of oft-repeated searches.  Search sets do not require much diskspace: approximately 5 bytes per record.  A thousand records, which is nearly ¼ of Fred's 1000 Fish Disks, would require about 5K on disk.

When a search set is loaded, regardless if it is shown in the listview, the gadget with representations of @{" Fred's Fish Logo " link THANKS} will become active.  You can click on this to open and close the Search Set window.  Clicking on the Search Set window's close gadget will also close the window.  Neither of these actions will destroy the current Search Set!

The Search Set is only cleared from memory by one of the following actions:

	Quitting KingFisher

	Beginning another search

	Loading a new Search Set

Loading a Search Set will, if necessary, switch to the database to which the Search Set applies, and will position you at the first record listed in the Search Set.  The current Search Expression is also remembered to remind you what the Search Set represents.
@endnode

@node CUSTOMFORMAT "2.5 Custom Formats"
@next KFSERVER
The format that KingFisher uses to display, print, and export fish is programmable!  This means that you can customize the display just about any way you like to!  This may require some persistent trial-and-error, but the results may be worth the effort if your needs are not served by the default format.  Here is what the default format looks like:

	\@{name}\@{version| }\@{date| (|)}\\n
	\@{fullname|\\t|\\n}
	\@{short|\\t|\\n}
	\@{author|\\tBy\\>|\\n}
	\\n
	\@{description}\\n
	\\n
	\@{requirements|Requirements:\\n\\>|\\n}
	\@{restrictions|Restrictions:\\n\\>|\\n}
	\\N
	\@{address|Author's Address:\\n\\>|\\n}
	\@{phone|Phone:\\>|\\n}
	\@{fax|Fax:\\>|\\n}
	\@{email|Email:\\>|\\n}
	\\N
	\@{distribution|Distribution:\\>|\\n}
	\@{price|Price:\\>|\\n\\n}
	\@{installsize|Installs:\\>|\\n}
	\@{source|Source:\\>|\\n\\n}
	\@{exectype|ExecType:\\>|\\n}
	\@{construction|Construction:\\>|\\n}
	\@{tested|Tested:\\>|\\n\\n}
	\@{docs|Docs:\\n\\>|\\n\\n}
	\@{references|References:\\n\\>|\\n\\n}
	\@{reference|References:\\n\\>|\\n\\n}
	\@{keywords|Keywords:\\>|\\n\\n}
	\@{described-by|Described-by:\\>|\\n}
	\@{submitted-by|Submitted-by:\\>|\\n}
	\@{submittal|Submittal:\\>|\\n}
	\@{stored-in|Stored-In:\\>|\\n}

Looks gruesome, doesn't it?  I agree, but computers are just so good at making sense of gruesome things, and they're terrible at working with things that we humans have no trouble understanding.  This is why the formatting is described by a gruesome mess: KingFisher understands this stuff a lot easier.  The bottom line is that it can display things much quicker this way, and in the end that's probably more important than a pretty behind-the-scenes format file.

So, how can we make sense of this gruesome mess?

It's actually less gruesome (nice word, eh?) than you might think.  First, you may have already noticed (you're pretty quick, aren't you?) that almost everything begins with the symbols @{B}\@{@{UB} followed by something gruesome and is terminated with a @{B}}@{UB} Coincidence?  Definitely not!

Let's look at the @{U}first line@{UU} and show all four elements on that line, one at a time, underlined:

	@{U}\@{name}@{UU}\@{version| }\@{date| (|)}\\n

	\@{name}@{U}\@{version| }@{UU}\@{date| (|)}\\n

	\@{name}\@{version| }@{U}\@{date| (|)}@{UU}\\n

	\@{name}\@{version| }\@{date| (|)}@{U}\\n@{UU}

You will notice that the first item is @{B}\@{name}@{UB} which looks simple enough.  It displays the contents of the @{I}name @{UI}field!

The @{U}second line@{UU}, @{B}\@{version| }@{UB} looks a little stranger: there is a @{B}|@{UB} symbol stuck in there, along with a blank space.  Let me quickly point out that the gruesome mess between @{B}\@{@{UB} and @{B}}@{UB} symbols can contain more than only a field name.  The complete format (without the blank spaces!) is:

		\@{ @{I}field @{UI}| @{I}prefix @{UI}| @{I}suffix @{UI}}

The | symbol is a separator, and the blank space is the value of the prefix portion.  But what, you may ask, is the point of this weird concoction?  Why not put the space outside the whole \@{} construct?

The reason is that when the specified field is missing from the database or contains no information, then neither the prefix nor the suffix, if any are given, will be processed.  This neat trick is used extensively and permits us to print something additional before and/or after the field contents if the field contains data, and do absolutely nothing if the field is empty.

Let's look at the @{U}third line@{UU} item, @{B}\@{date| (|)}@{UB} which contains both prefix and suffix strings.  If a @{I}date @{UI}field does not exist in the database, there won't be a non-sensical " ()" shown.  A content sensitive display format!

The @{U}fourth item@{UU} is one that will be quite familiar to C programmers: \\n is a newline.  KingFisher begins the following text on a new line.  This allows you to break up things into more readable sections.  The end of line in the file is actually considered merely a blank space by KingFisher so that you can break things up into a more readable form.

Here is a listing of the special formatting symbols.  They may be used both inside a @{B}\@{}@{UB} construct and outside:

@{fg highlight}\\.@{fg text}	A single . (dot) especially useful if/when such a dot is found (against normal practice) at the very beginning of a line of text and where it would then be misunderstood to represent a field-name.

@{fg highlight}\\@@{fg text}	An @ symbol.

@{fg highlight}\\n@{fg text}	A newline, an end-of-paragraph.
@{fg highlight}\\N@{fg text}	A conditional newline (end of paragraph), inserted only if the previous line is not already a blank line.

@{fg highlight}\\t@{fg text}	A tab, which is equivalent to approximately 5 spaces.

@{fg highlight}\\>@{fg text}	A paragraph indent, which allows you to create hanging indentations of text.  The indentation will remain in effect throughout the contents of a field, so it is, in effect, a temporary change of margins.  Newlines embedded in a field's data will only reset back to approximately the same column as the field's first character.

@{fg highlight}\\-@{fg text}	Adds a line of dashes (------...) up to the end of the line.  Makes for nice dividers!

All other text encountered is transferred verbatim to the display.


@{U}@{B}Field Option Sets@{UB}@{UU}

One or more options for a field can now be specified by placing them within []'s immediately @{U}before@{UU} the field name.  At this time the number of available options is quite small, but may grow in the future.  Here is an example of an option set in use:

	\@{@{B}[f]@{UB}author|\\tBy\\>|\\n}

Notice that there are no spaces added, and that a '[' cannot, therefore, be the first character of a field name, unless you @{B}also@{UB} specify an option set.  The following specification is legal:

	\@{@{B}[]@{UB}@{U}[funnyfield]@{UU}}

This specifies an empty option set and a field [funnyfield].  The empty option set keep the parser from thinking that the first character of the fieldname begins an option set.

Here is a list of the available options:

	f,v	Force FLOW or VERBATIM mode..
		In Flow mode, the presence of a newline in the database record is treated as a blank space would, and only a \\n sequence is regarded as a real newline (paragraph break.)  In Verbatim mode, a newline in the database record is treated the same as a forced paragraph break.

	0,1	Forces either 1 or no extra lines to be inserted between forced paragraphs.  By default, '1' is used for the @{I}description @{UI}field, which is also handled in Flow mode.

	|,>	Disables or forces paragraph-level indentation on a field.  Indentation is never turned on, but may be desirable for the @{I}description @{UI}field, for example, especially if no extra lines are inserted between paragraphs (see 0,1 above.)

You could alter the display of the @{I}description @{UI}field by adding an option set @{B}[0>]@{UB} (or @{B}[>0]@{UB}) to it.  Try it, you might like it!

The following fields are usually handled in Verbatim mode:  reference, address, email, docs, run, stored-in, and author.
All other fields are handled in Flow mode.

For descriptions on format and purpose of available fields, please refer to the Product-Info specification from Fred Fish.  The following is a list of the fields referenced in the @{" Product-Info Specification v6 " link FIELDS}:

	name
	fullname
	type
	short
	description
	version
	date
	author
	restrictions
	requirements
	reference
	distribution
	price
	address
	email
	exectype
	installsize
	source
	construction
	tested
	run
	docs
	described-by
	submittal
	stored-in

Click @{" here " link CUSTOMFORMATEXAMPLES} for some example custom formats!
@endnode

@node CUSTOMFORMATEXAMPLES "Examples of Custom Formats"
@font Topaz.font 11
Example1:
	\@{name}\\n
	\\>\@{description}\@{author|  Author: }\\n
	\@{version|\\>This is version |\\n}

Output:
	MonkeyCommand
		Lure the lovestruck monster ape back to
		his island. Tools include Fay Wray's torn
		nightgown, a Fokker airplane (you get to
		pilot it), a compass and a map.  Author:
		KingKong Industries
		This is version 1.0


Example2:
	\@{name}|\@{version}|\@{author}|\@{price}|\@{short}\\n

Output:
	MonkeyCommand|1.0|KingKong Industries|||


Example3:
	\@{name}\\>\@{description}
	\@{version|  This is version |.}
	\@{author|  Author: |.}\\n\\n

Output:
	MonkeyCommand	Lure the lovestruck monster ape back
			to his island.  Tools include Fay
			Wray's torn nightgown, a Fokker
			airplane (you get to pilot it), a
			compass and a map.  This is version
			1.0.  Author: KingKong Industries.


Example4:
	PROGRAM NAME:\\t\@{name}\\n
	VERSION:\\t\@{version}\\n
	AUTHOR:\\t\@{author}\\n
	RELEASE DATE:\\t\@{date}\\n
	\\n
	\@{[0>]description}\\n
	\\n
	\\-\\n

Output:
	PROGRAM NAME:	MonkeyCommand
	VERSION:	1.0
	AUTHOR:	KingKong Industries
	RELEASE DATE:	

	Lure the lovestruck monster ape back to his island.
	Tools include Fay Wray's torn nightgown, a Fokker
	airplane (you get to pilot it), a compass and a map.

	----------------------------------------------------

@endnode

@node KFSERVER "2.6 KFServer and Databases"
@prev CUSTOMFORMAT
Without the KingFisher Database Server, KingFisher is little more than gerupftes Federvieh (a plucked bird, in English, but it sounds much funnier in German :)

KFServer is the all-important portion of the software.  Regardless how you access the database, through KingFisher's GadTools GUI, RexxFisher's ARexx interface, through 3rd party client software, or something you wrote yourself, @{U}KFServer will always come into play!@{UU}

Both KingFisher and RexxFisher know how to start the KFServer if it is not already running.  KingFisher is, at this time, somewhat better at this because it can be told to start KFServer from a directory other than the one in which KingFisher starts itself.


@{U}The KFServer.prefs file@{UU}

For the KFServer to successfully start, it must be able to read its .prefs file.  This file is named "KFServer.prefs" and must contain at least the following information.  All blank lines or line beginning with a hash (#) mark are considered comments:

	@{B}default-database@{UB}=@{U}1000Fish.kfdb@{UU}

This line specifies the so-called "Default Database" which is the database KFServer will always open.  Any client connecting to KFServer will have this database made the initial database until it selects a different one.  In the case of KingFisher, you may not realize this happening, because KingFisher remembers the last used database and automatically switches to that before displaying the first record.

Notice that the filename, 1000Fish.kfdb, has a .kfdb extension.  It stands for "KingFisher Database."  The contents of a .kfdb file will be described below.  First, let's examine what optional items you can place into the KFServer.prefs file:

	@{B}maxclients@{UB}=@{U}5@{UU}

This line specifies that KFServer will not allow more than 5 simultaneous clients to connect at one time.  This value must be at least 1, and cannot exceed KFServer's maximum.  Unregistered versions of KingFisher have limit of 2.  Registered versions have a limit which you will never be able to exceed unless you have too much time on your hands and you are ridiculously rich and can afford 256MB of RAM for your Amiga to run hundreds of millions of copies of KingFisher.

	@{B}verbosity@{UB}=@{U}MUTE@{UU}

The verbosity value specifies how talkative you want the KFServer to be.  Ordinarily you will want to set this value to MUTE to make the KFServer shut up as much as possible.  Only real problems will be reported, things you should be aware of (like a database being unavailable.)  If you find that something is not working, you might want to try a higher verbosity value, until you either can no longer stand the amount of output or you find the problem.  The following values are available, and you can specify them in upper, lower, or mixed case:

mute	Cries out in only terribly critical situations
terse	Hardly sends any messages to the output window
quiet	Sends occasional messages of interest to the output window
chatty	Rather talkative with lots of status information
debug	Produces a nearly continuous stream of information

	@{B}loadindex@{UB}=@{U}DefaultInRAM@{UU}

Determines how a database main index is handled.  In particular, it can override the INDEX entry in .kfdb files:

AlwaysInRAM		Regardless of what .kfdb files specify, the main index is always loaded into memory for maximum speed.
AlwaysOnDisk		Regardless of what .kfdb files specify, the main index is always kept on disk for minimal use of RAM.
DefaultInRAM		If a .kfdb file fails to specify an INDEX entry, the index is then loaded into RAM.  This is the default.
DefaultOnDisk	If a .kfdb file fails to specify an INDEX entry, the index is then maintained on disk.

	@{B}sanity-check@{UB}=@{U}InRAM@{UU}

Controls the server's sanity check operation, which is performed whenever a database is first opened.

InRAM	Performs the operation only on an index that is loaded into memory (default)
OnDisk	Performs the operation only on an index that is maintained on disk (this can be rather slow!)
Always	Performs the operation on every index, no matter if it is an InRAM or OnDisk index.

	@{B}keep-running@{UB}=@{U}yes@{UU}

By default, KFServer will automatically exit when the last client program detaches, requiring to be started again if another client then wants to use the KFServer.  By setting the keep-running value to "yes" (instead of "no", or omitting it altogether) the KFServer will remain running even after no more clients seem to need its services.  This behavior is best suited for situations where clients start and quit frequently, such as with a BBS.

NOTE:	Earlier releases of KFServer kept running unless keep-running was set to a value of "no."  This behavior has now been altered for less confusing single-user operation.

	@{B}window@{UB}=@{U}CON://640/480/KingFisher Release 2 Server Messages/AUTO@{UU}

The output file to which KFServer writes all error messages should be set to a console window (such as given above) rather than a file, although reason could certainly be found where a file would be desirable.  KFServer does not care where you send output, so long as you specify a valid file.

	@{B}suppress-requesters@{UB}=@{U}yes@{UU}

By default, KFServer will not produce requesters asking the user to insert a required disk.  Instead, the server returns the database selection request with an explanation added, thereby allowing the client to retry the operation based on possible user-feedback.  This prevents the server from blocking when serving multiple users, which could cause serious problems in a multi-user environment.  It is not recommended to turn requester suppression off.


@{U}The .kfdb files@{UU}

The KingFisher Database file must have an extension of .kfdb, otherwise KingFisher will not be able to list them to a client, should the client wish to know what databases are available.  Furthermore, the .kfdb files must be located in the same directory where KFServer is started.  The following are absolutely required in all .kfdb files.  All blank lines and those beginning with a hash (#) mark are considered comments:

	@{B}database-name@{UB}=@{U}1000 Fish Disks@{UU}

Specifies the descriptive name of the database.  This is the name presented by KingFisher to the user when using the Open Database command.  Keeping this name relatively short is a virtue.  The example is about as long as you would ordinarily want to make it.

	@{B}section@{UB}=@{U}00000@{UU},@{U}02500@{UU},@{U}MyFish:Fish01.data@{UU}
	@{B}section@{UB}=@{U}02501@{UU},@{U}05000@{UU},@{U}MyFish:Fish02.data@{UU}

One (or more) sections must be specified.  Unlike the original KingFisher, which used a format strikingly similar, the two numeric values (0 and 2500, as well as 2501 and 5000 in our two examples) are not disk, but record numbers.  The above values work for my own copy of the database used by KingFisher 1.40, but it may not work for you.  As KingFisher Release 2 ships with a functional database of all 1000 Fish Disks, I do not expect this to be an issue.

The three portions of each section value are:

	@{fg highlight}beginning record@{fg text}	The first record in the database is 0, not 1.  KingFisher always adds 1 to the record numbers because that is how most people view a database.

	@{fg highlight}ending record@{fg text}		The last record in this section of the database.

	@{fg highlight}storage filename@{fg text}	The exact name of the file where you wish to store a portion of the database.  If the datafiles are stored in the same directory as the .kfdb file, then a specific path to the files is not required.  If, however, the data and index files are located elsewhere (such as on a CD-ROM or floppy disk) then a complete path to the files is @{B}essential@{UB}!

Note, that you can break up the database into as many section as you wish, or keep it all in one contiguous chunk.  The organization of a new database is entirely up to you.  The CLI tool 'ReOrder' can be used to effectively change these values by copying all records from one .kfdb file to a new .kfdb file with different ordering, then removing the original .kfdb file and all related files.

	@{B}index-name@{UB}=@{U}MyFish:1000Fish.index@{UU}
	
The index-name specifies the name of the main index.  This file will be recreated whenever something about the index changes, such as new records are added, or the database is truncated, or you alter any of the flags that are part of each record.  KFServer updates this index file on disk whenever the database is closed.

The following are optional values you can place into the .kfdb file to determine how KFServer is to treat this database:

	@{B}index@{UB}=@{U}inram@{UU}

The current implementation of KFServer loads an index file into memory, whereby the index is said to be "INRAM."  While an "ONDISK" index has not been tested enough for me to make the claim that this will work, enough of it has been tested that it may actually be usable and even error free.

@{B}Please be advised that an ONDISK index may seem functional, but is not yet officially supported.@{UB}  If you wish to experiment with this option, feel free to do so, but please understand that the results may range anywhere from index-related access errors to a corrupted index file.  Even if something goes wrong with the index, delete the index files, switch back to an INRAM index, and reindex the database.  Another way to experiment safely is to make backup copies of your index files.

	@{B}index-increment@{UB}=@{U}100@{UU}

This value defines by how many records at a time KFServer should expand an inram index whenever you add records to the database and the index need to grow.  It is more efficient to grow the index in large leaps at a time, but can waste memory if, for example you are growing the index in step of 1000 index records, and after 1000 records, you merely add one additional record to the database.  KFServer will then have allocated 2000 records but is only using 1001 of them.

Do not be overly concerned about this, however.  The initial index size when KFServer opens a database, is always exactly what is needed, no more.  Only adding to the database will bring the index-increment value into play.

	@{B}keep-open@{UB}=@{U}yes@{UU}

With the exception of the Default Database specified in the KFServer.prefs file, KFServer will always close a database (and all its files) when no client remains that is using it.  If, for some reason, you rather have the files, as well a the database index, remain open and loaded, you can set this behavior for each database with this value.

	@{B}read-only@{UB}=@{U}yes@{UU}

Marking a database read-only signifies to the client program that certain operations, such as the adding of new records or the alteration of flags, is not permitted.  The server may still accept such commands if they are not disabled by the client, but if a database can truly not be modified, because the index is located on read-only or write-protected media, then the server may produce error messages to this effect when a change needs to be written back to disk.

	@{B}field-index-name@{UB}=@{U}MyFish:1000Fish-@{I}Name.@{UI}index@{UU}

The name of the database file that will store the @{" QuickIndex " link REINDEX}.  As a convention, you might want to use the value of the @{B}index-name@{UB} entry but add '-name' (for the name field's QuickIndex, see below) before the .index file extension.  This permits easy upgrades in future versions when multiple QuickIndexes may become available.

	@{B}field-index-field@{UB}=@{U}name@{UU}

Specifies the database field to which the QuickIndex applies.  You should always use the 'name' field here because some functions (such as @{" Build VersionLinks... " link REBUILDLINKS}) require a QuickIndex on that field.  KingFisher will be able to make use of a QuickIndex on another single-line field for searching, but @{B}does not (and will not) support multi-line fields.@{UB}  Use of multi-line fields may cause undefined behavior.  Unless you have @{U}very@{UU} good reason to do otherwise, set this entry to @{U}name@{UU}.
@endnode


@node PRODUCTINFOSPEC "2.7 Product-Info Specification"
@next TOOLTYPES
A rough framework of the requirements, which eventually became the @{I}Product-Info Specification @{UI}, was originally started by Fred Fish and his brother.  Basing my work upon their original efforts, and then relying on their feedback as well as that of a number of other people, the @{I}Product-Info Specification @{UI} is meant to address the following basic issues:

1. A text-only format makes it possible to easily create and modify these files without special software.  This makes them portable between computer systems, easily transmitted, and more resilient to minor damage,

2. Aside from defining characteristics for some specifically named fields, the files are freely extensible by users to suit their individual requirements; in addition, the ordering of fields is (almost) completely irrelevant,

   @{" Main text of the Product-Info Specification       " link PRODUCTINFOBODY}

   @{" Fields defined by the Product-Info Specification  " link FIELDS}

   @{" Starter file for a .Product-Info file of your own " link PRODUCTINFOSTARTER}
@endnode

@node PRODUCTINFOBODY "2.7.1 Product-Info Specification: Text"
@{I}This is a partial text of the 6th draft of the Product-Info Specification.  This text details how database records can be transported by email to allow their easy extraction from within unrelated text.@{UI}


The purpose of @{I}Data Transport Markers @{UI}is to provide explicit delimiters for data that is surrounded by non-database records.  The original KingFisher contained a very complex finite state automaton (sic) to extract data out of email and news files.  This FSA relied on certain conventions and would fail to work if those conventions were not followed.

@{B}In order to enforce a more reliable means to encapsulate and transport data surrounded by irrelevant information, KingFisher Release 2 supports no other format for importing data but that which conforms to the Product-Info specification.@{UB}

Records must be enclosed by special markers, such as shown in bold in the example below:

	@{B}.BEGIN-FISH-DESCRIPTION@{UB}
	.name
	MonkeyCommand
	.author
	KingKong Industries
	.description
	Lure the lovestruck monster ape back to his island.
	Tools include Fay Wray's torn nightgown, a Fokker
	airplane (you get to pilot it), a compass and a map.
	.path
	FishROM001:games/MonkeyCommand/
	@{B}.END-FISH-DESCRIPTION@{UB}

Furthermore, the data enclosed must consist of one or more actual database records, and specification for these requires the first field of every record to be the @{I}name @{UI}field as shown above.

KingFisher will read files without Data Transport Markers, such as #?.pi, .Product-Info, or Product-Info files, but no guarantee can and will be made that it can successfully do so with files that start with data not relevant to the desired information.
	This represents an added flexibility of KingFisher's parser, not an implied extension to the Product-Info Specification.

According to this Product-Info Specification, KingFisher Release 2 will extract the relevant information from the following sample file (and it does!):

	Hi Tom,

	Remember that monkey game you told my about?

	@{B}.BEGIN-FISH-DESCRIPTION
	.name
	MonkeyCommand
	.author
	KingKong Industries
	.description
	Lure the lovestruck monster ape back to his island.
	Tools include Fay Wray's torn nightgown, a Fokker
	airplane (you get to pilot it), a compass and a map.
	.path
	FishROM001:games/MonkeyCommand/
	.END-FISH-DESCRIPTION@{UB}

	Well, seems that one wasn't enough and they released
	another one.  We'll have to figure out how to finally
	beat the first one, it seems, before they let us play
	the next.  Maybe we can look through the binary to find
	that code phrase.  Here's the text:

	@{B}.BEGIN-FISH-DESCRIPTION
	.name
	MonkeyCommand II
	.author
	KingKong Industries
	.description
	Keep the captured ape from breaking through the defenses
	of the prison that was erected at the conclusion of
	MonkeyCommand I.  The game consists of coordinating the
	actions of four native tribal leaders and their vassals
	in repairing the damage done by the angry beast.
	.restriction
	You need the secret code from the first MonkeyCommand
	which you can only get if you won the game.
	.path
	FishROM002:games/MonkeyCommand2/
	.END-FISH-DESCRIPTION@{UB}

	(=:Joe:=)

NOTE:	When copying data to the Clipboard, KingFisher supplies these markers for you!
@endnode

@node FIELDS "2.7.2 Product-Info Specification: Fields"
@font Topaz.font 11
The following are the fields defined by the Product-Info Specification v6 as designed by Fred Fish and Udo Schuermann.

.name
	PURPOSE:	The program's name
	FORMAT:		1 line only
	EXAMPLE:	KingFisher
	EXAMPLE:	HomeBase VI
	EXAMPLE:	AIBB
	EXAMPLE:	gcc
	----------------------------------------------------------------
.fullname
	<<<OPTIONAL>>>
	PURPOSE:	The program's full (or complete) name
	FORMAT:		1 line only
	EXAMPLE:	Amiga Intuition Based Benchmarks
	EXAMPLE:	GNU C Compiler
	NOTES:		If the .name is not an abbreviation then omit the
			.fullname.  No sense in giving the name twice!
	----------------------------------------------------------------
.type
	PURPOSE:	A keyword that describes the nature of the program
	FORMAT:		Preferably a single word or two.
	EXAMPLE:	Database
	EXAMPLE:	Spreadsheet
	EXAMPLE:	Animation Player
	EXAMPLE:	Animation Tools
	EXAMPLE:	Communications
	EXAMPLE:	Display Commodity
	EXAMPLE:	Mouse Commodity
	NOTES:		Avoid abbreviations.  Refer to the list below for
			suggestions.
	----------------------------------------------------------------
.short
	<<<OPTIONAL>>>
	PURPOSE:	A one-line description, preferably not exceeding
			40 characters in length.  This description is to
			give a single-glance insight into the program's
			purpose.
	FORMAT:		1 line only.
	EXAMPLE:	Software catalog/search/maintenance tool, multi-user.
	----------------------------------------------------------------
.description
	PURPOSE:	A full-text description of your program, containing
			anything that is NOT ALREADY available through the
			other fields (see above and below.)  The reader
			should gain a good understanding what your program
			can and cannot do.  If you mention other programs
			please do not forget to provide a .reference field
			for each such mention.
	FORMAT:		Any number of lines, treated as one line.
			Formatting is permitted, but generally discouraged.
	NOTES:		Do not indent your text if you choose to format
			your text into multiple paragraphs.  Do not use \\t
			as a tab.  Leave paragraph formatting to KingFisher.
	----------------------------------------------------------------
.version
	PURPOSE:	The program's version number
	FORMAT:		MAJOR.MINOR
			1 line only
	EXAMPLE:	37.100
	NOTES:		Please note that the Commodore guidelines specify
			that the number after the period is NOT a FRACTION
			but rather a WHOLE NUMBER!  Thus, the following is
			a valid progression:
				37.1  37.17  37.39  37.100  37.170
			The following are all vastly different versions:
				37.1  37.10  37.100  37.1000
	NOTES:		The format given for this field is really more of a
			SUGGESTION rather than a RULE.  There is no reason
			why you can't store "Today's Version" or "v940205"
			instead of 18.173.  In an ideal world everyone
			would use Commodore guidelines, but there are
			enough exceptions.
	----------------------------------------------------------------
.date
	PURPOSE:	The program's official release date; not the date
			it made it into the database.
	FORMAT:		year.month.day
			1 line only
	EXAMPLE:	1993.09.27
	NOTES:		The date format is chosen to be easily sortable.
			Note the use of leading zeros in month and day.
			The full year is to be given in anticipation of
			the coming change to a new millennium.
	----------------------------------------------------------------
.author
	PURPOSE:	Any and all authors who have a part in the program
	FORMAT:		Any number of lines, treated as one line (\\n in the
			text will "break up" the line into multiple visual
			lines.)
	EXAMPLE:	Joe R. User, Tea Rexx.
	EXAMPLE:	J. Jones\\n
			Random Hacker\\n
			B. Clinton
	NOTES:		Addresses should be placed in the .address field.
			There should be only one .address field for each
			.author field.
			If more than 1 .author field is specified, then the
			same number of .address and .email fields must also
			be given in a 1-to-1 relationship (i.e. the 3rd
			.author field must be associated with the 3rd
			.address, and the 3rd .email field.)
			EX: see the example "Joe R. User, Tea Rexx" above;
			Assume that Joe R. User has long vanished and no
			known address, but that Tea Rexx has supported the
			program for a while.  If an .address and/or .email
			field is available for Tea Rexx, then you must
			specify EMPTY .address and/or .email fields for the
			author listed BEFORE the ones for Tea Rexx.
			Likewise, if the two authors names were reversed,
			you would NOT have to specify blank .address and/or
			.email fields for the second author.  I hope that
			makes sense.
	----------------------------------------------------------------
.restrictions
	PURPOSE:	List restrictions placed upon this program.  These
			should indicate in which way this program has been
			made dysfunctional (for demo purposes), problems
			(bugs) known to exist with this program, or any
			other thing that lets the user know that this
			program, as seen in this distribution, may not
			fully satisfy the user in some form.
	FORMAT:		Free form; see .description for more info.
	EXAMPLE:	Demo version has SAVE and PRINT options disabled.
	EXAMPLE:	The ReadOperatorsMind command fails to work with
			CDTV units.  Incompatible with the Discus Ejector
			utility.
	EXAMPLE:	Crashes if iconified while loading a sample or
			image larger than 64K.
	EXAMPLE:	Requires a PAL display.
	EXAMPLE:	The program is in German but the documentation
			offers translations into English and Swahili on
			a menu-by-menu and gadget-by-gadget basis.
	NOTES:		Do NOT use this field for things like "won't work
			with KS 1.3" or "won't run with less than 2 Megs
			of RAM."
	----------------------------------------------------------------
.requirements
	PURPOSE:	List requirements for your program.  These should
			give the reader enough information to determine if
			the software will run on his/her system or not.
			Be sure to specify operating system versions,
			(hard)disk space requirements, etc.  If your
			program requires any external libraries that are
			not part of the system software, it would be nice
			to list them here and comment on whether or not
			they are included in the archive.
			If your program is known to run on every existing
			(Amiga) platform, state this in this field!
	FORMAT:		Free form; see .description for more info.
	EXAMPLE:	68020, 68030, or 68040 CPU; 3M free RAM; 18M disk
			space; at least 640x480 display capabilities!
	EXAMPLE:	Requires WB2.1 (V38)
	EXAMPLE:	Requires 1024x768 (or larger) display capability.
	EXAMPLE:	Works only with 4096-channel, 230db BLAZETHUNDER
			Audio board.
	EXAMPLE:	Requires MUI (MagicUserInterface) version 5.
	----------------------------------------------------------------
.reference
	<<<OPTIONAL>>>
	PURPOSE:	Full path to where this program's files are stored,
			as well as the version that is stored there.
	FORMAT:		2 lines per reference:  the first line specifies
			the full path (with trailing slash) and the second
			line, the version.
	NOTES:		Multiple such fields may be provided to reference
			previous versions of this program, as well as
			other programs that might be of interest.  The
			versions should be listed in reverse chronological
			order and SHOULD include the CURRENT entry.
			Please note that it is VERY VERY VERY important
			that you specify the CORRECT PATH!  Without a
			correct path, this entry will be nearly useless!
			SPECIFY THE PATH WITH A NEW SUBMISSION ONLY IF YOU
			KNOW WHERE IT IS STORED; NEW SUBMISSIONS WILL HAVE
			A PATH ASSIGNED HERE AUTOMATICALLY.  YOU SHOULD
			PROVIDE THE PROPER PATHS TO KNOWN AND EXISTING
			SOFTWARE.
	EXAMPLE:	FishROM-0002:Productivity/Databases/HomeBase VI/
			417.0
			FishROM-0001:Productivity/Databases/HomeBase VI/
			415.12
----------------------------------------------------------------
.distribution
	<<<OPTIONAL>>>
	PURPOSE:	Describes the distribution and ownership status
			of this software.  Please see below for a list of
			common (and recommended!) terms to use.
	FORMAT:		1 line
	EXAMPLE:	Shareware
	NOTES:		Please see the table below for descriptions of the
			recommended terms.
	----------------------------------------------------------------
.price
	<<<OPTIONAL>>>
	PURPOSE:	Describes the cost of this program to the user.
	FORMAT:		Any number of lines, treated as one line.
	EXAMPLE:	$50(US), DM75.
	NOTES:		In order to make this field more useful, it is
			STRONGLY recommended that the FIRST currency
			listed is United States Dollars as shown in the
			EXAMPLE above.  This allows a search to be limited
			to a common price base.  If you charge no money
			for this program, omit this field!
	----------------------------------------------------------------
.address
	<<<OPTIONAL>>>
	PURPOSE:	Describe a full postal address of the author, to
			be used if it becomes necessary or desirable to
			contact the author.  Do not specify the author's
                        name, as this is already in the .author field.
	FORMAT:		Multiple lines; formatting symbols \\n are not
			required, as physical line breaks are equivalent.
	NOTES:		SEE THE .author FIELD FOR IMPORTANT INFORMATION
	----------------------------------------------------------------
.email
	<<<OPTIONAL>>>
	PURPOSE:        Describe a full electronic mail address.  Make
			sure that this address is complete and reachable
			even from less well-connected sites.  The author
			of KingFisher, for example, can be reached as
			walrus@wam.umd.edu
			It would be an error to specify only "walrus" or
			"walrus@wam" even though these will work within
			the particular organization where this address
			is valid.
	FORMAT:		Multiple lines; formatting symbols \\n are not
			required, as physical line breaks are equivalent.
			Do not specify more than one email address per
			line.  The more you abide by RFC-822 specifications
			the better.
	EXAMPLES:	walrus@wam.umd.edu (Udo Schuermann)
			Udo Schuermann <walrus@wam.umd.edu>
			"Udo Schuermann" <walrus@wam.umd.edu>
			<walrus@wam.umd.edu> Udo Schuermann
	NOTES:		You may specify multiple electronic mail addresses
			in order of decreasing reliability and permanence,
			each on its own line.
			SEE THE .author FIELD FOR IMPORTANT INFORMATION
	----------------------------------------------------------------
.exectype
	<<<OPTIONAL>>>
	PURPOSE:	Describe the type of executable(s) that make up
			your program.  Examples:  68xxx, AMOS, Script,
			ARexx, Compiled basic, Amigabasic, etc.
	FORMAT:		Free form; see .description for more information.
	EXAMPLE:	AMOS
	EXAMPLE:	68000, 68020, and 68040.
	EXAMPLE:	Compiled BASIC
	EXAMPLE:	Compiled ARexx
	NOTES:		AMOS-based software has been said to not work on
			some systems at all; this entry allows a user to
			determine if the software is worth obtaining in the
			first place. 
	----------------------------------------------------------------
.installsize
	<<<OPTIONAL>>>
	PURPOSE:	Indicate the minimum and maximum sizes of the
			executable as it is installed.  The minimum size
			should give an indication of how much diskspace
			is required for a minimal installation (perhaps
			lacking help files and miscellaneous tools) while
			the maximum size should indicate the absolutely
			highest amount of diskspace required by the
			program.
	FORMAT:		1 or more lines; Only the first line has a fixed
			format, the rest are free-form.  See examples.
			Always indicate the number scales with a capital
			K (for kilobyte) or M (for megabyte)
	EXAMPLE:	220K - 2M
			Most of the database files can be kept on floppy
			disks, so valuable harddisk space is not wasted.
	EXAMPLE:	18K
	EXAMPLE:	38K - 500K
			Lots of documentation and example scripts make up
			the bulk of the installation.
	----------------------------------------------------------------
.source
	<<<OPTIONAL>>>
	PURPOSE:	Describe what source code is available with this
			program.  If source code is not available then
			omit this field.  The .construction field often
			helps further identify the type of source if you
			omit details here.  How large is the source?
	FORMAT:		Free form; see .description for more information.
	EXAMPLE:	SAS/C,Manx,DICE source (750K) available for $15
	EXAMPLE:	Oberon source included.  85K
	EXAMPLE:	Limited C source (15K) included.
	EXAMPLE:	All source plus custom libraries, included: 12MB
	----------------------------------------------------------------
.construction
	<<<OPTIONAL>>>
	PURPOSE:	Describe the type of language(s) used to create
			this program and the methods used to build the
			final executable.  If possible, include the
			compiler version(s) and possibly important
			options, such as optimization.
	FORMAT:		Free form; see .description for more information.
	EXAMPLE:	SAS/C++ 6.5 with full optimization.
	EXAMPLE:	AdaEd.
	EXAMPLE:	Fortran with self-made compiler.
	EXAMPLE:	AMOS
	NOTES:		This is usually closely related to the .exectype
			field but differs from it in that the .exectype
			might be "Compiled C" but the compiler used was
			"RottenC 0.97"
	----------------------------------------------------------------
.tested
	<<<OPTIONAL>>>
	PURPOSE:	Give an indication of which configurations have
			served as test environments.
	FORMAT:		Free form; see .description for more information.
	EXAMPLE:	A500(512K Chip, 0K Fast, 1 Floppy), A2000(1M Chip,
			2M Fast, 40M HD, 1 Floppy); not tested on 68020+
			CPUs.
	EXAMPLE:	A1000, A500, A600, A2000, A2000/30, A3000, A1200,
			A4000/30, A4000/40 with various amounts of Chip
			and Fast RAM, with and without MMU or FPU.  Found
			to be free of Enforcer hits and able to work with
			virtual memory products; compatible with Retina,
			EGS/Spectrum, and Picasso software.  Also tested
			under V33 through V40 system software.
	----------------------------------------------------------------
.run
	<<<OPTIONAL>>>
	PURPOSE:	Specifies how to start the program.
	FORMAT:		visible=type,command
			Where 'type' is either WB or CLI to indicate the
			required startup environment.
	EXAMPLE:	HomeBase VI=WB,HomeBase VI
			HomeBase VI=CLI,ExecuteMe.HB6
			HomeBase VI Fixer=CLI,ExecuteMe.HB6Fixer
	EXAMPLE:	FishTub=WB,ExecuteMe
	NOTES:		KingFisher requires that this entry strictly
			follows the above format.
			The user is shown all text up to the first equal
			sign (the 'visible' portion.)  The 'type' portion
			must be terminated with a comma (,) and following
			it will be the command to be executed.
			Selecting it will either invoke the program from
			the Workbench (invoking it as if double clicked on
			its icon (if the .info file exists), or execute the
			indicated shell command line as if it has been
			typed at an open console window.
	----------------------------------------------------------------
.docs
	<<<OPTIONAL>>>
        PURPOSE:        List all documentation files, possibly for viewing
                        from within KingFisher for more detailed info.
        FORMAT:         1 line per file
        EXAMPLE:        HomeBase.guide
                        HomeBase.dvi
                        HomeBase.doc
        NOTES:          KingFisher examines the EXTENSION and invokes the
                        appropriate viewing tool: MultiView/AmigaGuide for
                        .guide files, ShowDVI for .dvi files, more for
                        anything else.  These files can also be sent to the
			printer via KingFisher (i.e. print .ps or .doc
			files.)  KingFisher will honor the PAGER
			environment variable (defaults to 'more') to
			display standard text.
	NOTES:		Omit any path to these files, unless it is a
			relative path from within the program's CD-ROM or
			disk directory.  Do not specify these files if
			they are located within archive files; remember:
			the files must exist as they are given here!
	----------------------------------------------------------------
.described-by
	<<<OPTIONAL>>>
	PURPOSE:	Specifies who created the description (Product-Info
			file) for the program.
	FORMAT:		Free form; should include an electronic mail
			address, too, if available.
	EXAMPLE:	Fred Fish (fnf@fishpond.cygnus.com)
	EXAMPLE:	Udo Schuermann <walrus@wam.umd.edu>
	----------------------------------------------------------------
.submittal
	<<<OPTIONAL>>>
	PURPOSE:	Identifies who submitted the program to Fred or
			else how this program came to be on the reference
			disk.
	FORMAT:		Free form; usually one line.
	EXAMPLE:	Submitted on disk directly by the author.
	EXAMPLE:	Downloaded from wuarchive.wustl.edu in pub/aminet/util/misc
	----------------------------------------------------------------
.stored-in
	PURPOSE:	Specifies where and especially HOW the application
			is stored.  This field should specify EITHER the
			name of a directory (ending with a : or a /) OR the
			name of a file (one that does NOT end with : or /)
	FORMAT:		1 or more lines.
	EXAMPLE:	FF1000:Disks701-1000/Disks941-960/Disk950/Enforcer/
			FF1000:BBS/Disks501-1000/Disks941-960/Disk950/Enforcer.lha
	NOTES:		It is up to the particular application to decide
			how to handle this information.  If the extension
			on the file is .lha, .lzh, .Z, .zoo, .pak, .zip,
			etc. then you could, for example, call upon the
			archiver of choice to unpack the application into a
			temporary directory and let the user run the
			program or list the files, or whatever.
@endnode

@node PRODUCTINFOSTARTER "2.7.3 Starter .Product-Info"
INSTRUCTIONS: Using MultiView/AmigaGuide's SAVE AS command (menu), write this page to a file.  Call it @{I}.Product-Info.@{UI}  Fill in what you need based on the description of @{" Fields " link FIELDS} given in the previous section.  Not all fields are required, and some may need special formatting.

Ship the resulting file with your product!

Acceptable names for the file (in increasing order of desirability) are:

	.Product-Info
	Product-Info
	@{I}myproject.@{UI}pi
-------------------(Delete this line and all text above)-------------------
.name
Program's Name
.fullname
Long/full name, if any
.type
Type of program (see below)
.short
Short (40 character) description, à la Aminet
.description
Long, possibly quite verbose description
.version
Release.Version
.date
Release date (yyyy.mm.dd)
.author
Author's name
.restrictions
Restrictions (perhaps crippleware info)
.requirements
Special requirements (such as MUI)
.reference
Reference to other related programs, two lines each (1: path, 2:version)
.distribution
Distribution type (see below)
.price
Price (if any)
.address
Author's postal address (not including author's name)
.email
Author's email address
.exectype
ARexx, shell script, binary, interpreted BASIC, ...
.installsize
How big is this thing, approximately?
.source
Type (language) of source code, if any
.construction
How built?  AMOS, SAS/C, DICE, Modula-2, Oberon, Assembler, ...
.tested
Tested on what type of systems
.run
See above
.docs
Filenames of documentation
.described-by
Who wrote this description?
-------------------(Delete this line and all text below)-------------------

Suggested keywords for the TYPE field:

	Action Game		Animation		Animation Player
	Animation Tool		Archiver		CLI Tool
	Communications		Compiler		Compression
	Database		Disk Tool		Display Commodity
	Drawing			Image Conversion	Image Processing
	Library			Mouse Commodity		Music Composition
	OS Utility		Painting		Picture
	Printing		Sound Analysis		Sound Editing
	Sound Playing		Spreadsheet		Strategy Game
	Text			Text Editing		Text Viewer
	Thinking Game		Word Processing		Workbench Tool

Keywords for the DISTRIBUTION field:

	Commercial	Commercial software is owned and distributed
			through licenses.  It costs money to individual
			end-users and is not freely distributable.
			SUCH PIECES SHOULD NOT APPEAR ON DISKS THAT ARE
			MEANT FOR FREELY DISTRIBUTABLE SOFTWARE!

	Commercial Demo		Represents a demonstration of a commercial
			package.  As such, commercial demos are freely
			distributable and may have limitations as
			described in the .limitations field.

	Shareware	Such software is owned and copyrights are
			held by the author(s).  The software may be
			distributed freely, but not sold for profit,
			of course.  Shareware often specifies a limit
			of some time after which you are requested or
			required to register the software (i.e. pay
			for it.)  This provides you with the means to
			evaluate the software thoroughly before paying
			for it.

	Freeware	Such software is owned and copyrights are
			held by the author(s).  The software may be
			distributed freely, but not sold for profit,
			which would mean the software is no longer
			FREEware.  No payments are required for such
			software.

	Public Domain	Software labeled PD (Public Domain) belongs to
			the public, i.e. ANYONE.  Some people release
			their software into the public domain with the
			mistaken idea that they can continue to own
			and control the program.  Not so.  Software
			that is labeled Public Domain (or said by the
			author to be released into the public domain)
			truly belongs to anyone and everyone.  It is
			quite legal for someone to take such a program
			and sell it for profit as is.  Likewise, it
			it perfectly acceptable to modify public domain
			software to build a better product (or whatever)
			out of it and then sell it for profit.

	GNU Public License	The terms and conditions of this license
			are long and not easily reproduced here.  Suffice
			to say that software released under the GNU Public
			License cannot be sold for profit and must be
			distributed with source code.  They are not
			public domain, however.
@endnode

@node TOOLTYPES "2.8 KingFisher Tooltypes"
@prev PRODUCTINFOSPEC
KingFisher first processes the contents of the KingFisher2.prefs file for which it looks in the current directory first, then in ENV:KingFisher/ and last in S:

Once this file has been processed, KingFisher will process command line arguments (if invoked from the CLI) or Icon Tooltypes (if invoked from the Workbench.)  The format of both tooltypes and CLI arguments are the same, and can be anything you find in the KingFisher2.prefs file (which is written each time you quit KingFisher.)  You may also use the following:

@remark SETTINGS=@{I}settingsfile@{UI}
@{fg highlight}SERVERNAME=@{I}volume:path/KFServer @{UI}@{fg text}
	If the @{" KFServer " link KFSERVER} is not currently running, KingFisher will attempt to start it by running "KFServer" in the current directory.  If this is not how you have configured your system (the installation script set up things this way, so you ordinarily should not have to worry about this) then you must specify the full path and filename of the KFServer executable.

@{fg highlight}NOOUTPUT@{fg text}
	A flag that tells KingFisher not to print the initial copyright and welcome banner.  When invoked from the Workbench this banner causes a console window to open, which may well be undesirable.  This option is set by default in the icon supplied with KingFisher.
@endnode


@node KF140 "2.9 Differences from KF 1.40"
With this section I hope to present some information that will help you if you are a user of KingFisher 1.40 or earlier.  There are some important changes that may not be always apparent:


@{U}The obvious:@{UU}
KingFisher Release 2 requires at least V37 (KS 2.04); V38 (KS 2.1) is recommended because you get faster ASL requesters and, more importantly, a Screen Mode requester, without with the selection of custom screens may be a difficult undertaking.  KingFisher will @{B}not@{UB} work with V36 (early KS 2.0) software, nor will it function with KS 1.3.  KingFisher 1.40 is the latest version that will work with those earlier operating system releases.

KingFisher Release 2 opens on a resizable window on the default public screen (usually the Workbench) and can be placed on a public screen if you so desire.  It uses the screen's default font (although a different one can be selected) for all text, gadgets, and menus.

KingFisher Release 2 provides distinct browse and search gadgets.  The search gadgets have arrows as well as question marks imprinted on them.


@{U}The not-so-obvious:@{UU}
When used with CD-ROM databases, all items are indicated to reside on "Disk 1," and all gadgets referring to motion from disk-to-disk are disabled.  This behavior comes from the fact that CD-ROMs are rather large and not broken into hundreds of disks, such as the 1000 Fish disks that Fred Fish has released over the years.  The default @{" Display Format " link CUSTOMFORMAT} includes a STORED-IN field, which will allow you to determine where on a CD-ROM the software is stored.  If it references data that is part of Fred's Fish Disk collection, then you will notice a path similar to ...f9/ff951/... which references Fish Disk 951.

@{" Search expressions " link EXPRESSIONS} have a new syntax so you can reference information from individual database fields.  Briefly, this requires you to specify the name of the field plus an operator symbol (such as =, !=, $, etc) before the operational value.  If you find this format too cumbersome and its functionality more than you need, you can switch KingFisher to use the older KingFisher 1.40 expression syntax with the Search Preferences menu item @{" Simple substrings " link PREFSSEARCHSIMPLESUBSTRINGS}.

Instead of a fixed number (6) of Search Expression gadgets, KingFisher now maintains a behind-the-scenes history of expressions from which you can select with the @{" Search Expression History " link GAD_HISTORY} gadget.  The maximum size of this list (initially 20 entries) can be altered by modifying the KingFisher2.prefs file.

KingFisher Release 2 will no longer recognize the old "Add Fish" format used by Release 1.  Instead it recognizes only the format specified by the new @{" Product-Info Specification v6 " link PRODUCTINFOSPEC} which has specific provisions for storing database records so that they can be extracted from within other text.  KingFisher's @{" Export " link EXPORT} command can be configured to either use the Export Format (to be used in a document or letter, for example) or this re-importable format which is recognized by any Product-Info compliant software.  The @{" Use importable raw format " link PREFSEXPORTMARKERS} Export Preferences menu permits this switch.

KingFisher Release 1 would highlight the keywords in the displayed text when a search found a record.  As Release 2 now uses standard GadTools gadgets rather than a "home-cooked" listview (with all its limitations) this functionality has been lost.  I cannot project if and when it will be implemented again. :(

Further details are treated in the @{" Concepts " link CONCEPTS} section.
@endnode


@node SPECIAL "2.10 SPECIAL"

1. KingFisher (the GadTools interface) operates through the KFServer program which it starts in the background.  If the KFServer is already running, KingFisher will simply attach to the server swiftly; otherwise it will start the server.

2. You can force the KFServer to keep running even after the last client has detached.  This dramatically speeds up the time needed to connect to the server in a future session, as the server needs not be loaded, and needs not initialize its databases.  See the @{B}keep-running@{UB} preference option in the @{" KFServer.prefs " link KFSERVER} file for more information.

3. The KFServer performs a "sanity check" on any INRAM database it loads.  It can do this very quickly, with little or no noticable delay.  It will not by default perform this operation on an ONDISK index, however, for two reasons:  the time to perform the needed disk I/O could take a great deal of time, and if you choose an ONDISK index over a faster INRAM index, you are probably doing this for the reason that the index is rather large to begin with.  If you absolutely must perform the sanity check on an ONDISK index, too, you can set the configuration option "sanity-check=always.

@endnode



@node MENUS "3 MENUS"
@prev CONCEPTS
@next GADGETS

NOTE:  Most, if not all menu items support pressing the HELP key while pointing at the menu item to obtain assistance on the indicated menu item.

	@{" Project " link MENU-PROJECT}

	@{" Edit " link MENU-EDIT}

	@{" Search " link MENU-SEARCH}

	@{" Preferences " link MENU-PREFERENCES}

	@{" Help " link MENU-HELP}
@endnode


@node MENU-PROJECT "The Project Menu"
@prev MAIN
@next MENU-EDIT

	@{" About KingFisher " link ABOUT}
	@{" Server status     " link STATUS}
	@{" Open database " link OPENDATABASE}
        @{" Install database " link INSTALLDATABASE}
	@{" Define database " link DEFINEDATABASE}
	@{" Print " link PRINT}
	@{" Release printer " link PREFSPRINTRELEASE}
	@{" Export " link EXPORT}
	@{" Close export file " link PREFSEXPORTCLOSE}
	@{" Quit " link QUIT}
@endnode

@node MENU-EDIT "The Edit Menu"
@prev MENU-PROJECT
@next MENU-SEARCH

	@{" Append fish from file " link APPENDFILE}
	@{" Append fish from tree " link APPENDTREE}
	@{" Delete fish " link DELETEFISH}
	@{" Reconstruct database index " link REINDEX}
	@{" Build VersionLinks " link REBUILDLINKS}
	@{" Edit expression " link EDITEXPRESSION}
	@{" Edit search masks " link EDITMASKS}
	@{" Edit version links " link EDITLINKS}
@endnode

@node MENU-SEARCH "The Search Menu"
@prev MENU-EDIT
@next MENU-PREFERENCES

	@{" Select expression " link SELECTEXPRESSION}
	@{" Search backward " link SEARCHBACKWARD}
	@{" Search forward " link SEARCHFORWARD}
	@{" Load search set " link LOADSEARCH}
	@{" Save search set " link SAVESEARCH}
@endnode

@node MENU-PREFERENCES "The Preferences Menu"
@prev MENU-SEARCH
@next MENU-HELP

   Global
	@{" Auto-save on exit " link PREFSAUTOSAVE}
	@{" Confirm quit       " link PREFSCONFIRMQUIT}

   Display
	@{" Load custom display format " link PREFSDISPLAYLOAD}
	@{" Show all fields in record " link PREFSSHOWALLFIELDS}
	@{" Drop custom display format " link PREFSDISPLAYRESET}
	@{" Custom screen " link PREFSDISPLAYCUSTOM}
	@{" Default public screen " link PREFSDISPLAYPUBLIC}
	@{" Center main window " link PREFSDISPLAYCENTER}
	@{" Frame groups " link PREFSDISPLAYFRAME}
	@{" Sticky result window " link PREFSDISPLAYSTICKY}
	@{" Display database title " link PREFSDISPLAYDBTITLE}
	@{" Smart refresh " link PREFSDISPLAYREFRESH}

   Printing
	@{" Load custom print format " link PREFSPRINTLOAD}
	@{" Drop custom print format " link PREFSPRINTRESET}
	@{" One fish per page " link PREFSPRINTONEPERPAGE}
	@{" Avoid page breaks " link PREFSPRINTAVOIDBREAKS}
	@{" Add index info " link PREFSPRINTADDINFO}

   Exporting
	@{" Load custom export format " link PREFSEXPORTLOAD}
	@{" Drop custom export format " link PREFSEXPORTRESET}
	@{" Choose export file " link PREFSEXPORTFILENAME}
	@{" Use importable raw format " link PREFSEXPORTMARKERS}
	@{" Add index info " link PREFSEXPORTADDINFO}

   Searching
	@{" Stop on each match " link PREFSSEARCHSTOPONEACH}
	@{" Case sensitive " link PREFSSEARCHCASESENSITIVE}
	@{" Trim blanks " link PREFSSEARCHTRIMBLANKS}
	@{" Simple substrings " link PREFSSEARCHSIMPLESUBSTRINGS}
	@{" Use search masks " link PREFSSEARCHUSEMASK}

   @{" Save Preferences " link PREFSSAVE}
@endnode

@node MENU-HELP "The Help Menu"
@prev MENU-PREFERENCES
@next MENUS

	@{" Help (index) " link MAIN}
	@{" Using KingFisher " link HELPUSINGKF}
	@{" Searching " link HELPSEARCHING}
	@{" Printing " link HELPPRINTING}
	@{" Exporting " link HELPEXPORTING}
	@{" Databases " link HELPDATABASES}
@endnode



@node ABOUT "PROJECT/About KingFisher"
Presents an image of the KingFisher logo as well as copyright information for the software.  Also given will be the @{" registration site " link REGISTRATION3} most likely to apply to you and an email address where to obtain technical support.

The same window will always appear when you first start KingFisher.  It will go away by itself only if it is not deactivated.

@{U}Language translations:@{UU}

	Dansk		(Danish)		Finn Kettner <flynn@scala.ping.dk>

	Deutsch		(German)		Uwe Schürkamp <hoover@mathematik.uni-bielefeld.de>

	Nederlands	(Dutch)		Marcel Offermans <marcel@dutw30.tudelft.nl>

	Español		(Spanish)		Eduardo Delgado <tdatos@cpd.uva.es>

@remark	Français		(French)		Florent Monteilhet <florent.monteilhet@ramses.fdn.org>
	Suomi		(Finnish)		Janne J Kalliola <plastic@vipunen.hut.fi>

	Svenska		(Swedish)	Jan Simonson <Jan_Simonson@augs.se>
@endnode


@node STATUS "PROJECT/Status"
Requests from the server some information, which includes an estimate of what percentage of the server's total time your client has taken.  It also informs you of which database you have open.

If you issue this command with a shift key or the middle mouse button (MMB) held down, you will receive the same listing as KFServer would produce when invoked with the STATUS parameter.
@endnode


@node OPENDATABASE "PROJECT/Open Database"
Requests from the server a list of all available databases.  This is a list of the descriptions in all files with the extension .kfdb that the server knows about.  The server can see these files only in its default directory.

You get to select one of these databases based on the description for the database as stored in the .kfdb files.  KingFisher will save the position in your current database and activate the newly selected database, moving to the most recently visited record in that database.

The window that lists you all the available databases becomes far more useful when you have more than one or two databases available to you.

You can cancel the selection by closing the window.
@endnode


@node INSTALLDATABASE "PROJECT/Install Database"
Allows you to select a .kfdb file from another disk volume (such as a CD-ROM or floppy disk) and install this in the server's directory, thereby making the database available for immediate use.

There are some points of which you should be aware:

   · Only the .kfdb file is copied, no index or data files.  Very little space is used by the .kfdb file:  only ½KB on average!

   · If the .kfdb file does not specify complete paths to its data and index files, then KingFisher will add the path where the .kfdb file was copied from.  In most cases this will make the database available for immediate use!

   · If installing a CD-ROM database, you may wish to manually copy the index files to a writable volume and adjust the .kfdb file to reflect this.  Although KingFisher will think you can then add records to the database when you cannot actually do this¹, you will still be able to make changes to the index (i.e. version links and flags can be modified!)

__________
¹ A future version of KingFisher may distinguish between the index being writable but not the database.
@endnode


@node DEFINEDATABASE "PROJECT/Define Database"
NOTE:	This command is not yet available.  The following is what you need to know to setup your own database, manually:

KFServer can only serve databases that are defined by the contents of files with a .kfdb extension.  The exact name of this file is immaterial but it is always a good idea to use a sensible name.  Let us setup a database for your Amiga Club, using a single file to store all the information, named ClubDisk:Club.data, an index file for it named ClubDisk:Club.index, and a QuickIndex file based on the @{I}name @{UI}field that is stored in ClubDisk:Club-name.index:

The name of the KingFisher Database file shall be @{B}AmigaClub.kfdb@{UB}

Let us create this file with the following contents.  You can use any standard text editor for this task:

	database-name=Our Outstanding Amiga Club's Own Software Collection
	section=00000,99999,ClubDisk:Club.data
	index=inram
	index-increment=100
	index-name=Club.index
	field-index-field=name
	field-index-name=ClubDisk:Club-name.index
	keep-open=no
	read-only=no

For more information on these individual items, please see the last portion of the @{" KFServer " link KFSERVER} section.
@endnode


@node PRINT "PROJECT/Print"
Using the currently active print format (default or custom), KingFisher will print data to the printer.  If you print from the main window's menu, KingFisher will print only the current record.  If you print from the "Caught Fish" window that displays all matching records in the @{" Search Set " link SEARCHSET}, then KingFisher will print all records in the search set.

Notice that printing is configurable with the options of the @{" Printing " link PREFSPRINT} Preferences menu.
@endnode


@node PREFSPRINTRELEASE "PROJECT/Release printer"
This entry is active only when KingFisher has printed something, after which it will retain "ownership" of the printer device awaiting more print commands.  Using the Release printer command returns the printer to the system and tells KingFisher that you are done with printing for the moment.

The current page in use will be ejected by this command.
@endnode

@node EXPORT "PROJECT/Export"
Using the currently active export format (default or custom), KingFisher will write data to the export file.  If you export from the main window's menu, KingFisher will write only the current record.  If you export from the "Caught Fish" window that displays all matching records in the @{" Search Set " link SEARCHSET}, then KingFisher will write all records in the search set.

Notice that exporting is configurable with the options of the @{" Exporting " link PREFSEXPORT} Preferences menu.

If exporting is set to @{" Use importable raw format " link PREFSEXPORTMARKERS}, then neither the default, nor the custom format will be used, and instead KingFisher will write a file that can be re-imported through the @{" Append fish from file " link APPENDFILE} command.
@endnode

@node PREFSEXPORTCLOSE "PROJECT/Close export file"
This entry is active only after KingFisher has exported something and is keeping the file open and ready for further additions through the Export command.  Using the Close export file command closes the file and allows you to access it through other software.
@endnode

@node QUIT "PROJECT/Quit"
The Global Preferences submenu item @{" Confirm quit " link PREFSCONFIRMQUIT} allows you to specify whether or not you wish KingFisher to ask you if you really want to quit.  If you find yourself frequently quitting KingFisher without meaning to, you should turn that option on.  If the "Really quit KingFisher" requester goes on your nerves, turn the option off.

If you also have the @{" Auto-save on exit " link PREFSAUTOSAVE} option disabled, you must make this change permanent by selecting @{" Save Preferences " link PREFSSAVE}.
@endnode

@node APPENDFILE "EDIT/Append fish from file"
The file you specify may contain one or more records.  The records must conform to the @{" Product-Info Specification v6 " link PRODUCTINFOSPEC}

All valid records from the given file will be appended to the database.  The index is automatically updated (and saved to disk when the database is closed.)
@endnode

@node APPENDTREE "EDIT/Append fish from tree"
Scans a directory tree for #?.pi, .Product-Info, and Product-Info files and adds their contents to the database.  A status window keeps you informed of progress.  You can interrupt the scan by closing the status window; you must confirm such an action before the scan is actually aborted.

The index is automatically updated (and saved to disk when the database is closed.)
@endnode

@node DELETEFISH "EDIT/Delete fish"
Truncates the database by deleting the current fish (record) and all that follow.  You must confirm the action before it will take place.

That database files themselves are not (at this time) physically altered.  Only the index is altered (and this change made permanent when the database is closed.)

@{B}Please note that if you use the "EDIT/Reconstruct database index" command after deleting records from the database, KingFisher may get confused about where the last record in the database actually ends.  In the best of cases, you will simply "recover/undelete" the deleted records; much of the time, however, you may end up with junk at the end of the database which can cause a wide variety of problems.  If this occurs, your first action should be to delete those junk records that lie beyond the actual end of the database.@{UB}
@endnode

@node REINDEX "EDIT/Reconstruct database index"
This command asks the server to throw away all indexing information on the current database and scan the database file(s) in an effort to reconstruct the information necessary to access individual records.

Both the standard index, and the QuickIndex is rebuilt by this command.  The QuickIndex is usually built on the 'name' field, which makes certain other operations (such as building of version links) possible.

@{B}WARNING:	The index stores the version links (previous and following version) as well as the flags (deleted, hidden, owned, marked, etc.)  If you reindex a database you will lose both of these sets of information!@{UB}  Use the @{" Build VersionLinks " link REBUILDLINKS} command to rebuild the version links, too.

A database can be reindexed only if you are the only client using it, and if the database is writable.
@endnode

@node REBUILDLINKS "EDIT/Build VersionLinks"
Cross-references all programs in the currently selected database and builds links between those programs that have the same names.  This permits you to skip from one release of a program to another, using the Version Browsing gadgets.

This command requires that a @{" QuickIndex " link REINDEX} on the 'name' field exists.

Available options¹ are:

	[x]  Clear existing links
		Removes all previously set links rather than adding to and overwriting them.  This option is checked by default only if it makes sense to remove old versions.  You are encouraged to accept this default!

	[x]  Eliminate (Roman) numeric additions
		Programs such as "bBaseII" and "bBaseIII" or "DiskSalv" and "DiskSalv2" are considered the same.

	[x]  Double-check by authors²
		A program "MonkeyCommand" by Antonio Spaghetti, and "MonkeyCommand" by "Ricky Rocket" are considered distinctly different.

	[x]  Sort links by version
		CD-ROM disk's databases may not necessarily list software in version order.  This will examine the 'version' fields and order the links so that earlier versions (even if stored later in the database) are at the start of the version list.
		Sorting links depends heavily on correct version numbers in the database (i.e. the .version field must be correctly formatted, according to the Commodore Style Guide) and is not available with a older Release 1 databases (the option will be disabled in that case.)

VersionLinks can be build only if you are the only client using this database, and if it is writable.

NOTE: In versions earlier than 2.10, KingFisher relied on an O(n²) algorithm to perform this operation.  A vastly superior algorithm was created for KingFisher 2.10 which rebuilds the links in O(n) time!
__________
¹ Some or all of these options may be unavailable until implemented in later releases.

² Use of this option will slow down processing dramatically!
@endnode

@node PACK "EDIT/Pack database"
This command doesn't exist yet.
@endnode

@node EDITFORMAT "EDIT/Edit custom format file"
Use of this command will suspend KingFisher until you are finished with the program it invokes.  Selecting an existing (or new) .format file will then load this file into your favorite text editor and allow you to alter it.

If the environment variable EDITOR is not set (i.e. 'ENV:EDITOR' does not exist) then KingFisher will use 'c:ED' instead to edit the .format file.

If you are running KingFisher on a custom screen instead of the default public screen, then you should look for the editor's window on the default public screen.

NOTE:	If you edit the display format file currently in use by KingFisher, you must manually reload this file.  A future release of KingFisher will use file notification to assure that any alteration to the file (even when not modified with KingFisher's knowledge) will automagically update the display.
@endnode

@node EDITEXPRESSION "EDIT/Edit search expression"
Edit the current search expression.
@endnode

@node EDITMASKS "EDIT/Edit Masks"
Search Masks allow you to explicitly exclude certain records, depending on what "Flag Bits" they have set.  The Search Masks are used only if you have selected the @{" Use Search Masks " link PREFSSEARCHUSEMASK} option.

There are two separate Search Masks:

@{B}@{U}Avoid Mask@{UU}@{UB}
	This mask is used to completely eliminate a record from the search.  Any record (fish) that has any of these flags set, will be excluded.  By default this includes all records with the Deleted (D), Owned (O), and Hidden (H) flags.

@{B}@{U}Match Mask@{UU}@{UB}
	This mask is used to choose from those records not already eliminated by the Avoid mask.  Only records are chosen which have one or more of these flags set.

NOTE:	Fish (records) without any flags set cannot be located with a Search Mask in use!

@{B}@{U}Why two search masks?@{UU}@{UB}
	The Avoid mask allows you to specify which records you definitely don't want to see, while the Match mask handles the remainder.  This provides greater flexibility.  If KingFisher had only the Match mask, you would not be able to eliminate records from your search which have been marked for deletion, been marked hidden, or those you marked as already in your collection (owned.)

Click @{" here " link GAD_FLAGS} to learn about the meaning of each flag.
@endnode

@node EDITLINKS "EDIT/Edit Links"
This command directly modifies the Version Links that KingFisher uses when you click on one of the @{" Version Browse " link GAD_VERSBROWSE} gadgets.  The window that opens up contains two numeric gadgets, one for the preceding, and another for the following link.

1.	Select this command for the program whose Version Links you wish to modify.

2.	Use any other function in KingFisher to locate the matching preceding or following version to the current program,

3.	Press the "Set" gadget or enter the appropriate record number,

4.	Repeat steps (2) and (3) for the other link (if necessary)

5.	Click on "Accept" to write the selections to the database or "Cancel" to not keep the changes you made.

The Edit Links command is not available when the current database cannot be modified (stored on read-only media or the index is write protected.)
@endnode

@node COPYCLIP "EDIT/Copy to clipboard"
Copies the current record in its raw, re-importable format to the clipboard.  This creates an IFF FTXT in unit 0.  The next 'Copy to clipboard' operation will overwrite the previous clipboard contents.

Multiple records can be saved to the clipboard from the Search Result window.
@endnode

@node APPENDCLIP "EDIT/Append from clipboard"
The contents of each IFF FTXT found in the clipboard's unit 0 is sent to the KFServer for processing.  If it contains a valid record, then it is appended to the current database as a new record.
@endnode

@node SELECTEXPRESSION "SEARCH/Select Expression"
If one or more Search Expressions have been used before, you can select one of them to be placed into the Search Expression gadget and used for the next search you begin.
@endnode

@node SEARCHBACKWARD "SEARCH/Search backward"
Begins a search in reverse direction.  The @{" Stop on each match " link PREFSSEARCHSTOPONEACH} option determines if the search will stop as soon as a match is found, or if it should continue to build up a Search Set consisting of all fish (records) that match the expression.

You can interrupt a search by closing the Search Status window.

Notice that you can press the "<" key as a short cut for this command.
@endnode

@node SEARCHFORWARD "SEARCH/Search forward"
Begins a search in forward direction.  The @{" Stop on each match " link PREFSSEARCHSTOPONEACH} option determines if the search will stop as soon as a match is found, or if it should continue to build up a Search Set consisting of all fish (records) that match the expression.

You can interrupt a search by closing the Search Status window.

Notice that you can press the ">" key as a short cut for this command.
@endnode

@node LOADSEARCH "SEARCH/Load search set"
Loads a new @{" Search Set " link SEARCHSET}.  Any Search Set that you have currently loaded will be cleared and is lost if it has not been saved.

When a Search Set is loaded, KingFisher may switch to the database to which the search set applies, and will also store the Search Expression to the Expression gadget to give you an idea what the Search Set means.

While loading the Search Set, KingFisher will retrieve some information from the appropriate database to be shown to you in the Search Set Window.  This process requires KingFisher to read from the database.  Larger Search Sets may not, therefore, seem to load instantly.

If your Search Sets are not given the extension @{U}.search@{UU} on disk, then you must alter the ASL File Requester's Pattern field from the default pattern @{U}#?.search@{UU} to something closer to your needs.
@endnode

@node SAVESEARCH "SEARCH/Save search set"
Saves the current @{" Search Set " link SEARCHSET} to a file on disk so it can be retrieved later, thereby saving you the time and effort of executing another search and having to wait for the result again.  Search Sets require approximately 5 bytes per record on disk, so that 100 matching records will not require more than approximately 500 bytes on disk.

If you give you search sets the extension @{U}.search@{UU}, then KingFisher will automatically show you existing Search Sets when you load a Search Set!
@endnode

@node PREFSGLOBAL "PREFERENCES/Global"
This submenu allows you to somewhat alter KingFisher's behavior:

	@{" Auto-save on exit " link PREFSAUTOSAVE}
	When checked, automatically saves all settings when you exit.

	@{" Confirm quit " link PREFSCONFIRMQUIT}
	When checked, requires confirmation before actually quitting.
@endnode

@node PREFSAUTOSAVE "PREFERENCES/GLOBAL/Auto-save on exit"
If you enable this option, then KingFisher will automatically store all settings to the KingFisher2.prefs file in the default directory, or the file named by the SETTINGS @{" tooltype " link TOOLTYPES}, or the first file named @{B}KingFisher2.prefs@{UB} it finds while looking in the default directory, then ENV:KingFisher/, and then S:

If you turn off this option and wish this change to become permanent, then you must use the @{" Save Preferences " link PREFSSAVE} command, otherwise your change will not be saved when KingFisher exits!
@endnode

@node PREFSCONFIRMQUIT "PREFERENCES/GLOBAL/Confirm quit"
Do you hate software that just always asks you if you really want to quit, and you hear yourself mumbling "Of course, I'm sure!"

Or do you tend to click on the close gadget and then find yourself saying "oops!" but it's too late?

Whichever of these describes you, with the "Confirm quit" option you can get KingFisher to behave the way you want it to!
@endnode

@node PREFSDISPLAY "PREFERENCES/Display"
This submenu allows you to define display-related things:

	@{" Load custom display format " link PREFSDISPLAYLOAD}
	Loads a display format that you have defined and stored in a file.

	@{" Show all fields in record " link PREFSSHOWALLFIELDS}
	Displays all, even empty and non-standard fields, part of each record.

	@{" Drop custom display format " link PREFSDISPLAYRESET}
	Reverts to the internal default display format.

	@{" Custom screen " link PREFSDISPLAYCUSTOM}
	Opens KingFisher's window on a custom screen of your own choosing.

	@{" Default public screen " link PREFSDISPLAYPUBLIC}
	Opens KingFisher's window on the default public screen.

	@{" Center main window " link PREFSDISPLAYCENTER}
	KingFisher keeps the main window always centered on the screen.

	@{" Frame groups " link PREFSDISPLAYFRAME}
	Nicely frames related groups of gadgets.

	@{" Sticky result window " link PREFSDISPLAYSTICKY}
	Search Result Window "sticks" to edge of main window.

	@{" Display database title " link PREFSDISPLAYDBTITLE}
	Current database title is added to top of main window.

	@{" Smart refresh " link PREFSDISPLAYREFRESH}
	Windows are handled in Intuition's faster SmartRefresh mode.
@endnode

@node PREFSDISPLAYLOAD "PREFERENCES/DISPLAY/Load custom display format"
The internal default display format is merely one way of displaying the information in the database.  Different types of databases, in fact, may require different display formats.

Custom display formats are kept in files on disk, and KingFisher remembers the display format in use for every database.

To remove a custom display format and revert to the builtin default, select the @{" Drop custom display format " link PREFSDISPLAYRESET} command.

To create or edit a custom format, use @{" Edit custom format file " link EDITFORMAT}.
@endnode

@node PREFSSHOWALLFIELDS "PREFERENCES/DISPLAY/Show all fields in record"
Creates a custom display format based on each record's own fields and uses that to create the display of information.  If you have a custom display format selected, it will be replaced by this command.  To return to the default display format, select the @{" Drop custom display format " link PREFSDISPLAYRESET} command; to return to a custom display format, select a new custom display format.

Notice that this command will display non-standard fields as well as fields ordinarily suppressed because they are empty.
@endnode

@node PREFSDISPLAYRESET "PREFERENCES/DISPLAY/Drop custom display format"
This command is available only when a custom display format has been loaded.  It removes a previously selected custom display format and reverts back to the builtin default.
@endnode

@node PREFSDISPLAYFONT "PREFERENCES/DISPLAY/Font"
You may select any font for KingFisher to use.  Be advised that KingFisher cannot yet fall back to a smaller font if you select an unreasonably large font.

The font you select may be either fixed or proportional.
@endnode

@node PREFSDISPLAYCUSTOM "PREFERENCES/DISPLAY/Custom screen"
This option will only work if you are running Kickstart 2.1 (V38) or later because it uses the Screen Mode Requester from the V38+ ASL Library.  If you are still running Kickstart 2.04 (V37) click @{" here " link CUSTOM37} for assistance in building getting KingFisher Release 2 to open on a custom screen.
@endnode

@node CUSTOM37 "Getting KingFisher to open on a custom screen under V37"
First of all, quit all copies of KingFisher so that your changes to the KingFisher2.prefs file are not accidentally overwritten again when you later quit the program.

You need to edit the KingFisher2.prefs file and locate the "Screen" item, which should be one of the very first ones listed.  The following example uses a PICASSO:1024x768 screen with 256 colors:

	Screen=CUSTOM:40020006,1024w,768h,8d,1

Notice that the first portion of the Screen specification is "CUSTOM:" If anything else shows up in the first 7 characters, then KingFisher assumes that you are actually specifying the name of a specific public screen, rather than a custom screen specification.

The next item, "40020006" is a hexadecimal representation of the screen mode ID from the Display Database.  The following are standard values that you can use as a starting point.

        Mode ID			Resolution  (PAL)		Description
       -----------------		-----------------			----------------------
       00008000		  640 x 200  (256)		Hires
       00008004		  640 x 400  (512)		Hires-Interlace
       00008020		1280 x 200  (256)		SuperHires
       00008024		1280 x 400  (512)		SuperHires-Interlace
       - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
       00039020		  640 x 480			Productivity
       00039024		  640 x 960			Productivity-Interlace
       - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
       00041000		1008 x 800 (1024)		A2024-10Hz
       00049000		1008 x 800 (1024)		A2024-15Hz
       ----------------			----------------			----------------------

The next three items, "1024w", "768h", and "8d" are probably quite obvious to you: they are the width, height, and depth of the screen.  The letters that follow the numbers are stored in the file only to more easily describe their purpose.  The trailing "1" indicates that autoscrolling is enabled for the screen ("0" disables it.)

Here is an entry for an 800x600 Hires-Interlace NTSC screen using 4 colors (2 bitplanes) and with autoscroll enabled:

	Screen=CUSTOM:00008004,800,600,2,1
@endnode

@node PREFSDISPLAYPUBLIC "PREFERENCES/DISPLAY/Default public screen"
Choosing this item causes KingFisher to open on the default public screen.  If you have no public screens open, then the Workbench is the default public screen.

If you select a different screen to be your public screen, then this command will cause KingFisher to jump to the new public screen.
@endnode

@node PREFSDISPLAYCENTER "PREFERENCES/DISPLAY/Center main window"
Ordinarily, KingFisher opens its window always in the same position where you had it last open, meaning that you can arrange your desktop in some way for KingFisher to fit in nicely.

You may, however find that it would be more convenient for KingFisher to be always available in the very center of the screen, regardless of the screen's current resolution and KingFisher's window size.

With the 'Center main window' option, KingFisher makes an effort to always place the window in the center of the display.  And if you resize the window, KingFisher will automatically recenter the window for you!  If, however, you then move the window by dragging it to a new position, KingFisher will turn off the 'Center main window' option to accommodate your desire to place the window in a specific position.
@endnode

@node PREFSDISPLAYFRAME "PREFERENCES/DISPLAY/Frame groups"
When this option is selected, KingFisher will place "recessed" frames around groups of related gadgets to more clearly denote their relationships to each other.  This will cause a somewhat more "cluttered" display and may not be pleasing to everybody, which is why it has been made an option.
@endnode

@node PREFSDISPLAYSTICKY "PREFERENCES/DISPLAY/Sticky result window"
When this option is selected and a Search Result window is open (see @{" Stop on each match " link PREFSSEARCHSTOPONEACH}) then moving or resizing the @{B}main window@{UB} causes the Search Result window to be reposition, too.  In effect, the Search Result Window "sticks" to the right edge of the main window as much as possible.
@endnode

@node PREFSDISPLAYDBTITLE "PREFERENCES/DISPLAY/Display database title"
When this option is selected, the title of the current database is displayed above the main text display area of the main window.  If you rarely work with multiple databases and you are running on a relatively small display screen, you may wish to leave this option disabled to preserve valuable screen space.
@endnode

@node PREFSDISPLAYREFRESH "PREFERENCES/DISPLAY/Smart refresh"
When this option is selected, KingFisher's windows will (whenever needed) be refresh by Intuition's own buffers.  This can be significantly faster on screens with little depth, but on deep screens (such as a large 256 color Workbench) this not only slows down the refreshing but also requires Intuition to set aside enough memory for the refreshing operation to work.

Although the display may not always be updated at once when portions of the window are "damaged" by obscuring windows, turning this option off can significantly improve the display's performance and reduce the program's memory requirements.  Experiment!
@endnode

@node PREFSPRINT "PREFERENCES/Printing"
This submenu allows you to define printing-related things:

	@{" Load custom print format " link PREFSPRINTLOAD}
	Loads a print format that you have defined and stored in a file.

	@{" Drop custom print format " link PREFSPRINTRESET}
	Reverts to the internal default print format.

	@{" One fish per page " link PREFSPRINTONEPERPAGE}
	Prints no more than one fish (record) per page.

	@{" Avoid page breaks " link PREFSPRINTAVOIDBREAKS}
	Starts a new page if a record no longer fits on the current page.

	@{" Add index info " link PREFSPRINTADDINFO}
	Adds information from the index to each printed record.
@endnode

@node PREFSPRINTLOAD "PREFERENCES/PRINTING/Load custom print format"
The internal default print format is merely one way of formatting the information in the database for the printer.  Different types of databases, in fact, may require different print formats.

Custom print formats are kept in files on disk, and KingFisher remembers the print format in use for every database.

To remove a custom print format and revert to the builtin default, select the @{" Drop custom print format " link PREFSPRINTRESET} command.

To create or edit a custom format, use @{" Edit custom format file " link EDITFORMAT}.
@endnode

@node PREFSPRINTRESET "PREFERENCES/PRINTING/Drop custom print format"
This command is available only when a custom print format has been loaded.  It removes a previously selected custom print format and reverts back to the builtin default.
@endnode

@node PREFSPRINTONEPERPAGE "PREFERENCES/PRINTING/One fish per page"
By enabling this command, each record (fish) is printed beginning at the top of a new page.

This command is unavailable while the printer is in use by KingFisher.  You need to first @{" Release printer " link PREFSPRINTRELEASE} before you can change these settings.
@endnode

@node PREFSPRINTAVOIDBREAKS "PREFERENCES/PRINTING/Avoid page breaks"
@font Topaz.font 11
The effect of this command is, perhaps, most easily described at hand of a little diagram to compare the effect visually.  The idea is to prevent descriptions from being broken up by page breaks, forcing a record which will not fit on the current page to begin at the top of the next page:


          NO  Avoid page breaks         YES Avoid page breaks
          _____________________         _____________________
         |Name: KingFisher     |       |Name: KingFisher     |
         |Vers: 2.0            |       |Vers: 2.0            |
         |Text: blah blah blah |       |Text: blah blah blah |
         |      blah blah blah |       |      blah blah blah |
         |      blah blah.     |       |      blah blah.     |
         |                     |       |                     |
         |Name: MonkeyCommand  |       |Name: MonkeyCommand  |
         |Vers: 1.0            |       |Vers: 1.0            |
         |Text: blah blah blah |       |Text: blah blah blah |
         |      blah.          |       |      blah.          |
         |                     |       |                     |
         |Name: MonkeyCommand  |       |                     |
         |Vers: 2.0            |       |                     |
         |Text: blah blah blah |       |                     |
         |---------------------|       |---------------------|
         |      blah blah blah |       |Name: MonkeyCommand  |
         |      blah blah blah.|       |Vers: 2.0            |
         |                     |       |Text: blah blah blah |
         |Name: B5-Images      |       |      blah blah blah |
         |:::::::::::::::::::::|       |      blah blah blah.|
                                       |                     |
                                       |Name: B5-Images      |
                                       |:::::::::::::::::::::|
                                
This command is unavailable while the printer is in use by KingFisher.  You need to first @{" Release printer " link PREFSPRINTRELEASE} before you can change these settings.
@endnode

@node PREFSPRINTADDINFO "PREFERENCES/PRINTING/Add index info"
Index information is added to the printout for each record in the following format:

	.INDEXINFO=|DISK=1|FISH=17|FLAGS=8001|

This format will become a standard for a future Product-Info Specification and will be recognized by KingFisher's "Add Fish..." command.

This command is unavailable while the printer is in use by KingFisher.  You need to first @{" Release printer " link PREFSPRINTRELEASE} before you can change these settings.
@endnode

@node PREFSEXPORT "PREFERENCES/Export"
This submenu allows you to define exporting-related things:

	@{" Load custom export format " link PREFSEXPORTLOAD}
	Loads an export format that you have defined and stored in a file.

	@{" Load custom export format " link PREFSEXPORTRESET}
	Reverts to the internal default export format.

	@{" Export filename " link PREFSEXPORTFILENAME}
	Specifies a (new) file to which exported records are written.

	@{" Use importable raw format " link PREFSEXPORTMARKERS}
	Uses a format which the @{U}Append fish from file@{UU} command understands.

	@{" Add index info " link PREFSEXPORTADDINFO}
	Adds informaiton form the index to each exported record.
@endnode

@node PREFSEXPORTLOAD "PREFERENCES/EXPORTING/Load custom export format"
The internal default export format is merely one way of formatting the information in the database for export files.  Different types of databases, in fact, may require different export formats.

Custom export formats are kept in files on disk, and KingFisher remembers the export format in use for every database.

To remove a custom export format and revert to the builtin default, select the @{" Drop custom export format " link PREFSEXPORTRESET} command.

To create or edit a custom format, use @{" Edit custom format file " link EDITFORMAT}.

Note that the @{" Use importable raw format " link PREFSEXPORTMARKERS} option, overrides the custom export format completely.
@endnode

@node PREFSEXPORTRESET "PREFERENCES/EXPORTING/Drop custom export format"
This entry will only be available if you have a custom export format loaded.  It will drop the custom format and revert back to the default.  Note that the use of the @{" Use importable raw format " link PREFSEXPORTMARKERS} option overrides the use of custom or default formats entirely.
@endnode

@node PREFSEXPORTFILENAME "PREFERENCES/EXPORTING/Export filename"
By default, the export filename, if you never specify a different name, is t:KF2.output.  If you prefer a different filename, this command will let you do so, and KingFisher will remember the name between sessions.  An implicit @{" Close export file " link PREFSEXPORTCLOSE} will be issued for you.
@endnode

@node PREFSEXPORTMARKERS "PREFERENCES/EXPORTING/Use importable raw format"
Forces the output to be in a special, re-importable format.  The file can be transmitted via electronic mail (although national characters may not be preserved by the email transmission!) and can be added to any KingFisher Release 2 database through the Edit menu's @{" Add fish from file " link APPENDFILE} command.

Notice that while this option is selected any custom export format is effectively disabled.
@endnode

@node PREFSEXPORTADDINFO "PREFERENCES/EXPORTING/Add index info"
Index information is added to the export file for each record in the following format:

	.INDEXINFO=|DISK=1|FISH=17|FLAGS=8001|

This format will become a standard for a future Product-Info Specification and will be recognized by KingFisher's "Add Fish..." command.
@endnode

@node PREFSSEARCH "PREFERENCES/Searching"
This submenu allows you to define searching-related things:

	@{" Stop on each match " link PREFSSEARCHSTOPONEACH}
	When checked, stops on each match; otherwise builds a Search Set.

	@{" Case sensitive " link PREFSSEARCHCASESENSITIVE}
	When checked, upper and lower case characters become distinct.

	@{" Trim blanks " link PREFSSEARCHTRIMBLANKS}
	When checked, will remove trailing blanks from search strings.

	@{" Simple substrings " link PREFSSEARCHSIMPLESUBSTRINGS}
	When checked, uses the simpler KingFisher 1.x expression syntax.

	@{" Use Search Masks " link PREFSSEARCHUSEMASK}
	When checked, uses the search masks defined by @{U}Edit Search Masks@{UU}

From here, you can also learn more about @{" Search Expressions " link EXPRESSIONS}.
@endnode

@node PREFSSEARCHSTOPONEACH "PREFERENCES/SEARCHING/Stop on each match"
When you begin a search, KingFisher examines this option to see if you wish it to stop immediately whenever it finds a match.  If this option is not enabled, KingFisher will build a @{" Search Set " link SEARCHSET} instead, presenting you with the final list of all matches, which you can save permanently, and from which you can choose randomly.
@endnode

@node PREFSSEARCHCASESENSITIVE "PREFERENCES/SEARCHING/Case sensitive"
When this option is enabled, upper and lower case letters are treated as distinct symbols, so that "a" is not the same as "A".  If, for example, you are looking for references to Kickstart and your search string consists of "KS" (abbreviation for Kickstart) you might be looking explicitly for only the all upper case version, and have no desire to locate words like these, too: tic@{U}ks@{UU} or pac@{U}ks@{UU}.
@endnode

@node PREFSSEARCHTRIMBLANKS "PREFERENCES/SEARCHING/Trim blanks"
When blank spaces are typed into a string gadget, at the end of a string, they are usually quite invisible and difficult to detect.  Their presence, however, can produce rather puzzling results because they may end up being considered part of a string constant in your expression!

Enabling this command will guard against such troubles by removing all blank spaces from the end of your expressions.  This option will NOT affect quoted strings, such as "fred    ".)
@endnode

@node PREFSSEARCHSIMPLESUBSTRINGS "PREFERENCES/SEARCHING/Simple Substrings"
If the Simple Substrings option in the Searching Preferences is selected, KingFisher will automatically supply a field and operator selection of "*$" to your search strings, so that the substrings you provide in the style of KingFisher release 1 expressions are treated as substrings and scanned for in every available field of the database records that will be examined during a search.
@endnode

@node PREFSSEARCHUSEMASK "PREFERENCES/SEARCHING/Use search masks"
Enabling this option causes searches to use the masks defined by the @{" Edit Search Masks " link EDITMASKS} command in order to eliminate certain types of records from the search.
@endnode

@node PREFSSAVE "PREFERENCES/Save Settings"
Saves all settings to a file of your choosing.  Unless given a specific filename with the SETTINGS @{" tooltype " link TOOLTYPES} at startup, KingFisher for the following files from which to read its settings:

     KingFisher2.prefs                     (in the current directory)
     ENV:KingFisher/KingFisher2.prefs
     S:KingFisher2.prefs

If it finds one of these files, it will attempt to writes its settings back to this file when you exit (provided the @{" Auto-save on exit " link PREFSAUTOSAVE} option is enabled) or to the first file in that list (i.e. in the default directory when none of these files have been found.

You can save settings with this command to any file of your choosing but KingFisher will not be able to find and actually use the file unless you are saving it according to the above specifications.
@endnode

@node HELPUSINGKF "HELP/Using KingFisher"
KingFisher uses a Graphic User Interface (GUI) to allow you to easily browse through one or more databases.  The individual gadgets are usually referred to by a name which is most easily presented at hand of a picture which you can view by clicking @{" here " link KF-GUI.iff/main} or by viewing the @{U}KF-GUI.iff@{UU} image with an external viewer.

The gadgets in the upper left corner allow you to select a particular record in the database (if the cycle gadget is set to "Fish") or jump to the first record on any particular disk.  Notice that the database must actually contain multiple disks.  A CD-ROM is a single disk and rarely organized into multiple disks, so the Disk number will never change from 1, which also affects some other functions of KingFisher.

The gadgets in the upper right corner are @{" flags " link GAD_FLAGS} which are particular to each record in the database.  The first row of these gadgets is defined by KingFisher, to provide you with flags to mark records as DELETED, OWNED, or HIDDEN, or MARK them for later retrieval.  The gadgets with numbers in them are for you to define.

The three pairs of gadgets in the lower left are the browsing gadgets that permit you to jump through the database either from one disk to the next (unavailable if the database records the contents of only a single disk) or by record (fish.)  The pair between these two are the VersionLink gadgets, which allow you to select previous or later versions of the displayed entry if such version links have been set in the database.

If a record has no previous or following versions stored in its internal version link fields, then these gadgets will be unavailable (ghosted.)  A future version of KingFisher will allow you to edit the links directly, and you can use the @{" Build VersionLinks... " link REBUILDLINKS} command to create links automatically.

The lower right corner has search tools at your disposal.  The Expression gadget stores the currently active @{" Search Expression " link EXPRESSIONS} which is compiled when you select one of the two Search Gadgets (the arrow gadgets that also have question marks in them) to initiate a search.

KingFisher maintains a history of the most recently used search expressions.  You can select from this list by pressing on the gadget with the artistically deficient image of a scroll.  This will open a little window with previously used search expressions.  Click on one of these to have it automatically placed into the Expression gadget.  You can press the Escape key to cancel the selection window.

Whenever you initiate a search, KingFisher examines the state of the @{" Stop on each match " link PREFSSEARCHSTOPONEACH} Search Preferences menu to determine if you want KingFisher to stop immediately when it finds a match or instead scan the whole database before presenting you with a window from which you can select from among multiple matches.  When the "Stop on each match" entry is not checked, such a @{" Search Set " link SEARCHSET} is built.  These Search Sets can be stored on disk and later retrieved to save you the time to perform the same search over and over again.  To open and close the Search Result window, which contains a representation of the Search Set, click on the gadget with the images of @{" Fred Fish's Fish Logo " link THANKS} (fish bones.)

The center piece of the GUI is a so-called "listview" which is a scrolling display of text, describing the current fish (record.)  The vertical slider at the right edge lets you scroll through the text.


@{U}Here are some neat things you may not realize at first:@{UU}

You can resize KingFisher's window to make it as large as you like or as small as various GUI elements allow.

You can run multiple copies of KingFisher, perhaps two or three to search with, and another to continue browsing through the database.

Each copy of KingFisher can access a different database.  You could run two copies of KingFisher to search two different databases, and scan a third with yet another copy of KingFisher.

You are not restricted to the display, print, and export formats that KingFisher uses by default.  You can define your own @{" Custom Format " link CUSTOMFORMAT} in a file and KingFisher will remember which database uses which custom formats!
@endnode

@node HELPSEARCHING "HELP/Searching"
The simplest way to search the database is by browsing through it one record at a time.  Unless you are exceedingly patient and have too much time on your hands, you are best served by expressing to KingFisher what you are looking for:

1.	In the lower right corner of KingFisher's window you will find a string gadget.  Into this string gadget you should enter a @{" Search Expression " link EXPRESSIONS}.
	By altering the @{" Simple Substrings " link PREFSSEARCHSIMPLESUBSTRINGS} option, you can make KingFisher use the older and simpler substring expressions.  These, however, do not offer you the same flexibility as the new expressions.
	Instead of entering an expression, you can also click on the gadget that is supposed to look like an scroll, provided that this gadget is not ghosted.  This will open a listing of previously used expressions from which you may select one by clicking on it.

2.	Once you have an expression typed into the Search Expression Gadget, you should click on one of the directional gadgets that have a question mark (?) as part of the design.  This initiates a search.
	If you receive an error requester instead, examine the message and make what corrections are necessary to produce a syntactically correct search @{" expression " link EXPRESSIONS}.

3.	You can search for one matching record at a time or have KingFisher scan the entire database and collect all matching records into a list that it then presents to you.  If you expect many records to match your criteria you may wish to disable the @{" Stop on each match " link PREFSSEARCHSTOPONEACH} option.
	The great advantage of not stopping on each match but instead building a @{" Search Set " link SEARCHSET} is that you can click on each item in the list to instantly view the record.  In addition, you can save the Search Set to a file on disk and retrieve it later, thereby saving yourself the time required to search the database once again.

4.	@{" Other options " link PREFSSEARCH} are available to alter the behavior of a search.
@endnode

@node HELPPRINTING "HELP/Printing"
When you print with KingFisher, the printer device is kept open so that you may add further records to the printout without having another program intersperse its output.  This causes other programs to be unable to open the printer device, however, meaning that they cannot print until you quit KingFisher or use the @{" Release printer " link PREFSPRINTRELEASE} command from the Project menu.

You can specify a different print format through the @{" PREFERENCES/Printing " link PREFSPRINT} menu, as well as dictate how records are broken up over page boundaries.
@endnode

@node HELPEXPORTING "HELP/Exporting"
Exporting records with KingFisher can mean two similar, but distinct operations:  you may write records to a file the same way you might wish to print them on paper, or you export them so that they may be read back into KingFisher.  Which way the Export command is to be used depends on how you configure the command through the @{" PREFERENCES/Exporting " link PREFSEXPORT} menu.

The file to which you export can also be selected from that menu.  Selecting a new file will automatically close the previously used file (if it was open.)  The file to which KingFisher exports records is kept open much like the printer device is kept open between print operations.  Use the @{" Close export file " link PREFSEXPORTCLOSE} command from the Project menu when you are finished with the file.
@endnode

@node HELPDATABASES "HELP/Databases"
If you wish to make an existing database available to KingFisher, you have two options:

1. @{" Install database... " linke INSTALLDATABASES} through KingFisher's menu command (see PROJECT menu) which handles the installation of a database fully automatically, even adjusting filename references to included the proper disk volume labels!

2. @{" Perform the step manually " link TROUBLE_NEWDB} -- this section also offers information on what changes may be needed to a .kfdb file to make it work when KingFisher itself fails to handle step (1) properly on its own, @{B}or when you need to create a new database.@{UB}
@endnode


@node MENU-RESULT "CAUGHT FISH"
This page unintentionally left blank.  Please try the Index.
@endnode

@node CLOSE "CAUGHT FISH/Close window"
This will merely close the Search Set window.  It will not lose the current Search Set.  To open the Search Set window again, click on the icon which contains the "boney fish" symbols.
@endnode

@node APPLYMASK "CAUGHT FISH/Apply Mask"
This command applies a new mask to all fish in the Search Result window.  More flexibility will be offered to this function in the future.
@endnode

@node ERROR_OPEXPECTED "SEARCH EXPRESSION ERROR: Logical Operator Expected"
You failed to provide a legal operator, meaning that KingFisher could not figure out in which way you want to combine two or more @{" expressions " link EXPRESSIONS}.

Valid logical operators are:

	&	Logical AND (as in "if this AND that is true, then ...")

	|	Logical OR (as in "if either this OR that is true, then ...")

	^	Exclusive OR (as in "if either this OR that is true, but NOT BOTH, then ...")

A unary operator may be used to reverse the value of an expression:

	!	Logical NOT.  You may use the ~ character instead; your choice.
@endnode

@node ERROR_CMPEXPECTED "SEARCH EXPRESSION ERROR: Comparison Operator Expected"
You failed to provide a comparison operator, meaning that KingFisher could not figure out in which way you wish to apply a value to a field.

Valid comparison operators are:

	=	Equality (as in "if the field contains exactly this value, then ...")  You can also use two equal signs, which is what the C programming language uses for equality tests.  The choice is yours.

	ex: name = 'kingfisher'

	>=	Alphanumerically greater than or equal.

	ex: version >= '2.0'

	<=	Alphanumerically less than or equal.

	ex: date <= '1994.08.31'

	>	Alphanumerically greater than.

	<	Alphanumerically less than.

	<>	Not equal.  This is the exact opposite of the '=' operator.  You may use != instead, which is what the C programming language uses to test for inequality.

	$	You should read this symbol as "contains the substring" so that the @{" expression " link EXPRESSION}
	ex: name$fish
	This reads "If the name field contains the substring 'fish' then ..."
@endnode

@node ERROR_INVALIDCMP "SEARCH EXPRESSION ERROR: Invalid comparison operator"
The symbols you used do not make a valid comparison operator.  Please note that the following are NOT valid:

	><	=>	=<	!<	!>	>$

Click @{" here " link ERROR_CMPEXPECTED} for a list of valid comparison symbols.

Click @{" here " link EXPRESSIONS} for detailed information about creating a search expression.
@endnode

@node ERROR_MISMATCH "SEARCH EXPRESSION ERROR: Mismatched Parentheses"
Each open parentheses must be matched by exactly one closing parentheses.  You have either used too many ( symbols or too many ) symbols.  You may have forgotten to enclose in quotes the ( or ) symbols meant to be part of a string constant.
@endnode

@node ERROR_FLDEXPECTED "SEARCH EXPRESSION ERROR: Field identifier expected"
@next ERROR_INCOMPLETE
KingFisher requires you to provide the name of a field in the database before you can give it a comparison or logical operator.  If you need help constructing a legal search expression, click @{" here " link EXPRESSIONS}.
@endnode

@node ERROR_UNSUP "SEARCH EXPRESSION ERROR: Unsupported Feature"
You have hit upon an as-yet unsupported feature of the expression parser.  This feature may become operational in the future to allow you to build more complex expressions with fewer symbols.
@endnode

@node ERROR_INTERNALERR "SEARCH EXPRESSION ERROR: Internal Error"
An internal error has occurred in the expression parser.  Please write down the exact expression (with spaces and all characters trailing) to write to the @{" author of KingFisher " link TECHSUPPORT} with this bug report!
@endnode

@node ERROR_INCOMPLETE "SEARCH EXPRESSION ERROR: Incomplete Expression"
@prev ERROR_FLDEXPECTED
The @{" expression " link EXPRESSIONS} is incomplete.  You must provide additional components before KingFisher can process the request.
@endnode



@node GADGETS "4 GADGETS"
@prev MENUS
@next TROUBLE
@font Topaz.font 11
The following is an approximate layout of KingFisher's display.  The buttons below are placed to correspond with gadgets in the display.  Choose any of them for explanations of their functions, or press the HELP key while the mouse pointer is over the gadget in the real window.
  _____________________________________________________________________
 |                                                                     |
 | @{" Fish/Disk " link GAD_FISHDISKCYCLE} @{" Number " link GAD_FISHDISKNUM}                                 @{" Flag Gadgets " link GAD_FLAGS} |
 |  _____________________________________________________________  _   |
 | |                                                             || |  |
 | |                                                             || |  |
 | |                                                             || |  |
 | | @{" Description of record contents " link GAD_DESCRIPTION}                            || |  |
 | |                                                             ||_|  |
 | |                                                             ||_|  |
 | |_____________________________________________________________||_|  |
 |  ___  ___   ___  ___   ___  ___   _______________________________   |
 | |   ||   | |   ||   | |   ||   | |                               |  |
 | |@{" < " link GAD_DISKBROWSE}||@{" > " link GAD_DISKBROWSE}| |@{" < " link GAD_VERSBROWSE}||@{" > " link GAD_VERSBROWSE}| |@{" < " link GAD_FISHBROWSE}||@{" > " link GAD_FISHBROWSE}| | @{" Search Expression " link GAD_EXPRESSION}           |  |
 | |___||___| |___||___| |___||___| |_______________________________|  |
 |  Disk       Version    Fish       ____  ____   ___   ___            |
 |                                  |    ||    | |   | |   |           |
 |                                  |@{" <? " link GAD_SEARCH}||@{" ?> " link GAD_SEARCH}| |@{"   " link GAD_HISTORY}| |@{"><>" link GAD_CHOOSEFISH}|           |
 |                                  |____||____| |___| |___|           |
 |_____________________________________________________________________|
NOTE: yes, this looks a bit messed up, but I'll try to fix it soon... --Udo
@endnode



@node GAD_FIRSTLAST "GADGET: Home/End of Database (Buttons)"
These gadgets immediately jump to the first or last record in the database.  They are ghosted if you are already located on the first and/or last record.
@endnode

@node GAD_DISKBROWSE "GADGET: Browse across Disks (Buttons)"
These gadgets jump over one or more fish (records) if the database index defines them to be located on multiple disks.

The original Fish Disks database that ships with KingFisher Release 2 defines 1000 such disks, but a CD-ROM usually consists of no more than a single disc, wherefore the distinction of separate disks is less clear, if even meaningless.  In these cases you will find that all functionality referring to multiple disks becomes unavailable.
@endnode

@node GAD_VERSBROWSE "GADGET: Browse across Versions (Buttons)"
These gadgets jump to previous or later releases of the same program, provided that information is recorded in the database index.  If no such data is recorded, KingFisher has at the moment no way to provide you with this functionality.

The original Fish Disks database that ships with KingFisher Release 2 defines over 1000 linked versions, but with CD-ROM databases, KingFisher can no longer rely on quite the same format and usually has no such links available.

A future release of KingFisher will introduce more powerful VersionLink handling than earlier releases had.  For the moment, you will find the links ready-set only in the original Fish Disks database.

One or both of these gadgets will be ghosted if a link in that direction is not available.
@endnode

@node GAD_FISHBROWSE "GADGET: Browse from Fish to Fish (Buttons)"
These gadgets permit you to browse through the database one fish (record) at a time.  These gadgets will be ghosted if you are at one end of the database and cannot move in that direction any further.
@endnode

@node GAD_FLAGS "GADGET: Flag Gadgets (Toggle Buttons)"
Each fish (record) in a KingFisher database has 16 special purpose flags associated with it.  These are represented by two rows of 8 flags each.  Their layout and appearance resemble the following diagram:

	D	_	_	_	_	O	H	M

	8	7	6	5	4	3	2	1

The top row represents pre-defined flags; do not assign a different meaning to these flags than is given below:

	D	Deleted.  This record is marked to be deleted from the database.  A command available in a future version of KingFisher will use this flag to physically remove fish (records) from the database, thereby allowing you to eliminate unwanted records and recovering disk storage.

	_	(undefined at this time; reserved for future use)

	O	Owned.  You already own this item.

	H	Hidden.  You do not wish to have this item appear in your searches (provided you set this flag in the Avoid mask and turn on the use of @{" Search Masks " link EDITMASKS}.

	M	Marked.  You could use this as a "bookmark" to quickly find records you wish to come back to later.

	8 - 1	These are @{B}your own flags@{UB} to define and use in any way that you may wish.  KingFisher will never assign special meaning to these flags.  You could use these flags as "bookmarks" in addition to the "M" flag, for example.

@{B}NOTE:@{UB}	These flags will be ghosted (i.e. unavailable for changes) if the index of the current database is located on R/O media, such as a CD-ROM or the media or file is for some other reason not writable.

@{B}NOTE:@{UB}	The implementation of these gadgets will change in the future to be more in line with the general appearance of KingFisher and the Style Guidelines set forth by Commodore.  They are fixed, internal images at the moment but will be made user-definable in the future.

Any alteration to these flags causes an immediate change in the database index.  When the database is closed, KingFisher writes the index back to disk.
@endnode

@node GAD_DBNAME "GADGET: Current Database Name"
With the @{" PREFERENCES/DISPLAY/Show Database Title " link PREFSDISPLAYDBTITLE} command, the display of the current database title can be toggled on and off.

If you routinely work with multiple databases and frequently switch between them, this gadget will help you keep track of which database is the current.  On the other hand, if your screen is of relatively small size, you may wish to turn off the display of this gadget to make the the central listvew larger.
@endnode

@node GAD_HISTORY "GADGET: Search Expression History (Button ==> ListView)"
Despite my obvious lack of artistic skill I hope that this gadget somewhat reminds you of a scroll.  The idea is that you can choose an expression from a list of previously used expressions that has been recorded for this purpose.

Clicking on this gadget will open up a listview from which you can select a new expression by clicking on it.  The window will go away immediately.  Pressing the Escape key or closing the window will cancel the action.
@endnode

@node GAD_CHOOSEFISH "GADGET: Search Result Window (Button ==> ListView)"
If ghosted, a @{" Search Set " link SEARCHSET} has not been @{" loaded " link LOADSEARCH} or generated.

This gadget opens and closes the Search Result window from which you can select individual matches, jumping immediately to the requisite database record to view the item's information.  Closing this window will @{B}not@{UB} lose the search set.

My thanks go to Fred Fish for his kind permission to use his "fish bones" Fish Logo!  :-)
@endnode

@node GAD_SEARCH "GADGET: Search Gadgets (Buttons)"
These gadgets initiate a search either in reverse or forward direction.  If you are creating a @{" Search Set " link SEARCHSET} the current fish is included in the search, otherwise it is skipped.  The Search Expression string gadget must contain a valid @{" Search Expression " link EXPRESSIONS}; if it does not, you will receive a diagnostic error message.
@endnode

@node GAD_FISHDISKCYCLE "GADGET: Disk/Fish(record) Selector (Cycle)"
Depending on the state of this gadget, the numeric gadget to its right will accept and show either the Disk number or the Record (fish) number of the currently presented record.
@endnode

@node GAD_FISHDISKNUM "GADGET: Disk/Fish(record) (Integer)"
Depending on the state of the cycle gadget to the left of this integer gadget, you are expected either to enter a fish (record) number in this gadget, or a disk number.

Notice that a CD-ROM consists only of one disk, which means that the disk gadget will always show a disk number of 1 and you cannot select a disk other than that.

The "Fish Disk" collection, however, consists of 1000 disks and over 4500 fish (records) so you can quickly jump to these positions in the database.
@endnode

@node GAD_EXPRESSION "GADGET: Search Expression (String)"
The search expression in this gadget is the expression that is used when you start a search.  You may select another expression from the list of previously used expressions by clicking on the gadget beneath the search expression string gadget, that looks like a scroll.

Need help with constructing search expressions?  Click @{" here " link EXPRESSIONS}.
@endnode

@node GAD_DESCRIPTION "GADGET: Fish Description (ListView)"
This gadget is sized to fit in the available space in the window and the textual description for each fish (record) is word-wrapped within it.  You can scroll this gadget with the up and down arrow gadgets.

The layout of the displayed text is defined by the @{" Display Format " link CUSTOMFORMAT} option.
@endnode


@node REXXFISHER "5 REXXFISHER"
RexxFisher is a Client application that attaches to and provides an ARexx interface to the KFServer.  By invoking RexxFisher with the name of a port on the command line you can assure that any application can make use of the KFServer databases.  RexxFisher defaults to a port name of REXXFISHER1.  The second invocation will use REXXFISHER2, and so forth.  Invoke RexxFisher with a parameter on the command line to select an exact portname.  If a specific portname conflicts, RexxFisher will fail.

Results are returned in 'result' (use "say result" to display a value returned by RexxFisher) and errors are returned in the @{B}PORTNAME@{UB}.LASTERROR variable, where @{B}PORTNAME@{UB} does not include the increment number (1, 2, 3, etc.) added when RexxFisher is invoked without a specific portname.  I.e. If RexxFisher's port happens to be 'REXXFISHER4' then the error variable is REXXFISHER.LASTERROR, without the '4'.

All commands sent to RexxFisher have an RF_ prefix to prevent confusion with standard ARexx commands.  I think QUIT is a normal ARexx command, and so might be a few others here or there.  You can use these commands in any mix of upper and lower case letters that you like.  RexxFisher 1.10 and later will also understand the commands without the RF_ prefix.

The only commands you can execute WITHOUT a prior RF_HELLO command are the following; they do not access the database and in fact do not even require that KFServer is running!

	@{" RF_DISABLE " link RFDISABLE}
	Disables a command.

	@{" RF_HELP " link RFHELP}
	Returns a list of acceptable commands.

	@{" RF_QUIT " link RFQUIT}
	Tells RexxFisher to shutdown.

	@{" RF_VERSION " link RFVERSION}
	Returns RexxFisher's version tag string (without $VER:)

	@{" RF_LOCK " link RFLOCKING}
	@{" RF_UNLOCK " link RFLOCKING}
	Prevent other connections from interfering.

The following command is used when trying to connect to the KFServer; it will start the server software if it is not already running:

	@{" RF_HELLO " link RFHELLO}
	Establishes a connection to the KFServer.

The following commands can be issued only if you have issued a successful RF_HELLO command:

	@{" RF_ADDFISH " link RFADDFISH}
	Adds all fish from file to current database.

	@{" RF_BYE " link RFBYE}
	Terminates a connection to the KFServer.

	@{" RF_FIND " link RFFIND}
	Searches the database.

	@{" RF_GETFISH " link RFGETFISH}
	Retrieves (and optionally formats) a database record.

	@{" RF_LIST " link RFLIST}
	Obtains a list of available databases.

	@{" RF_OBTAIN " link RFOBTAIN}
	Obtains specific record information.

	@{" RF_SELECT " link RFSELECT}
	Selects (without retrieving actual text of) a specific record

	@{" RF_SET " link RFSET}
	Sets some of the current fish's data

	@{" RF_STATUS " link RFSTATUS}
	Requests client status from server.

	@{" RF_USE " link RFUSE}
	Selects a particular database for use.

A demonstration script, @{" RexxDemo.kfrx " link RexxDemo.kfrx/main}, is supplied for your enjoyment.  This script assumes that you have started KFServer and RexxFisher and that they are running in the background.  Enter "rx rexxdemo.kfrx" to run the demo script.

Bugs:	If RexxFisher tries to startup the KFServer and this fails (because the KFServer cannot be made to startup for one reason or another) then RexxFisher may crash the system with an Illegal Instruction.  This problem will be taken care of in a future release!
@endnode

@node RFVERSION "ARexx: RF_VERSION"
Usage:
	RF_VERSION

	Returns RexxFisher's version tag, without the $VER: portion, of course.  This will ALWAYS use the standard Style Guide compliant format such as:

	RexxFisher 1.5 (8.5.94)

Example:
	RF_VERSION
	say "Welcome to" result
@endnode

@node RFHELP "ARexx: RF_HELP"
Usage:
	RF_HELP

	Returns a list of all acceptable commands as well as some sort of command template to help you figure out what sort of parameters you might be able to get away with.

Example:
	say "These commands are available to you:"
	RF_HELP
	say result
@endnode

@node RFQUIT "ARexx: RF_QUIT"
Usage:
	RF_QUIT

	Tells RexxFisher to shutdown.  In a real environment, you might want to issue a command such as "RF_DISABLE RF_QUIT" to prevent the QUIT command from being recognized.  This will also suppress the command from being listed by RF_HELP.

	Despite a disabled RF_QUIT, RexxFisher will respond to a CTRL_C signal such as those sent by the c:BREAK command.

Example:
	RF_QUIT
@endnode

@node RFDISABLE "ARexx: RF_DISABLE"
Usage:
	RF_DISABLE command

	Disables a command so that RexxFisher will no longer be able to execute it.  This prevents accidental shutdown of RexxFisher, for example by a "rogue script."  Disabled commands will not be part of the RF_HELP listing.

Example:
	RF_DISABLE RF_QUIT
@endnode

@node RFHELLO "ARexx: RF_HELLO"
Usage:
	RF_HELLO "arbitrary identification"

	Needs no previous login and will establish a connection to the KFServer.  If the KFServer is not running, RexxFisher will attempt to start it in the exact same way that KingFisher (the GadTools client) tries to start KFServer.  The only problem is that RexxFisher cannot (yet) be told to look in a place OTHER than the default directory for the KFServer.  Start RexxFisher in the same directory where KFServer is located and all will be fine.

	You should give a nice and descriptive name along with the RF_HELLO, such as:

	RF_HELLO "BLAZEFISHER ARexx Script"
					(my apologies, Dan! :^)

	If you issue RF_HELLO when already connected, then RexxFisher will issue an implicit @{" RF_BYE " link RFBYE} command to the server to disconnect you.  RexxFisher will also do this when it is made to shutdown (either with RF_QUIT or through a c:BREAK signal.)

Example:
	RF_HELLO "test script"
@endnode

@node RFBYE "ARexx: RF_BYE"
Usage:
	RF_BYE

	Sign off from the KFServer.  This terminates your access to the server.  If you forget this, then RexxFisher keeps the connection active for the next script, which may be confusing.  RexxFisher has no idea, of course, if your script has terminated or is just idling around for no particular reason.

Example:
	RF_BYE
@endnode

@node RFLIST "ARexx: RF_LIST"
Usage:
	RF_LIST

	This obtains a list of all available databases from the server.  The format of this list is as follows:

	"Description@{B}\\1@{UB}database.kfdb@{B}\\n@{UB}
	 Description@{B}\\1@{UB}database.kfdb@{B}\\n@{UB}"

	Which means that there are one or more lines of text each of which begins with a nice descriptive text for the database followed by a @{B}\\1@{UB} character (which is an ASCII 1, ^A symbol) and followed then by the .kfdb name which you would need to give to the server through the @{" RF_USE " link RFUSE} function to make a selection.

Example:
	RF_LIST
@endnode

@node RFUSE "ARexx: RF_USE"
Usage:
	RF_USE database

	This selects a database by giving it the name of a .kfdb file.  Please see @{" RF_LIST " link RFLIST} above for more information.

Example:
	RF_USE "Miniature.kfdb"
@endnode

@node RFFIND "ARexx: RF_FIND"
Usage:
	RF_FIND "expression"
	RF_FIND AGAIN
	RF_FIND OPTION @{B}@{I}x @{UI}@{UB}

	This command initiates, continues, or configures a search operation:

	RF_FIND "expression"
		Allows the use of the same @{" expression syntax " link EXPRESSIONS} as KingFisher.  The expression is compiled and the function begins a search at once.  If you receive an error, the result string is in the format "Error X in column Y" where the error value X is one of these:

		@{U}X@{UU}	@{U}Meaning@{UU}
		1	Comparison Expected ($ = != < > >= <=)
		2	Operator Expected (AND, OR, XOR)
		3	Invalid Comparison (ex: <! >< ... are bogus)
		4	Mismatched Parentheses
		5	Field Expected (must use "field op value")
		6	Unsupported Feature (no hints yet :)
		7	Internal Error
		8	Incomplete Expression

		Example:
			RF_FIND "name$kingfisher|name$aquarium"

	RF_FIND AGAIN
		Search onward with the previously used expression.  You must have an expression compiled with a previous @{I}RF_FIND "expression" @{UI}command, otherwise this will not work.

		Example:
			RF_FIND AGAIN

	RF_FIND OPTION @{B}@{I}x @{UI}@{UB}
		Alter the behavior of the next FIND command according to the option @{B}x@{UB}:

		FORWARD				Search forward
		BACKWARD				Search backward
		CASEIGNORE			Upper/lower case ignored
		CASEEXACT				Upper/lower case important
		TRIMBLANKS			Trim trailing blanks off search-strings
		NOTRIMBLANKS			Do not trim blanks
		SIMPLEEXPRESSION		Uses original KF1.40 expressions
		COMPLEXEXPRESSION	Uses new KF2.0 expressions
		SHOW					List current options

		Example:
			RF_FIND OPTION FORWARD
			RF_FIND OPTION CASEIGNORE
			RF_FIND OPTION TRIMBLANKS
			RF_FIND OPTION COMPLEXEXPRESSION
			RF_FIND OPTION SHOW
			say result

	NOTE:	There is no way to interrupt a search in progress.  Depending on user-feedback, a future version of RexxFisher may accept a break signal to interrupt a search.
@endnode

@node RFGETFISH "ARexx: RF_GETFISH"
Usage:
	RF_GETFISH fishnum
	RF_GETFISH fishnum width
	RF_GETFISH fishnum width displayformat

	Retrieve a specific fish by record number.  The command has a second, optional parameter that determines if the resulting string is formatted or retrieved in raw form.  A positive number for the 2nd parameter indicates the column width of the display that the text should fit.  The resulting text, when formatted, will have an appearance much like that in KingFisher's ListView.

	A 3rd parameter specifies a @{" display format " link CUSTOMFORMAT} other than the default.

	Notice that a record number of 0 retrieves the most recently retrieved record.  It is best not to rely on this functionality, especially after a search operation but may be useful in some cases:

Example:
	RF_GETFISH 3693

		Retrieves record 3693 without special formatting.

	RF_GETFISH 3693 75

		Retrieves record 3693 without special formatting, but wordwraps the buffer to fit within 75 columns of non-proportional text.

	RF_GETFISH 0 75 "NAME=\@{name}\\nAUTHOR=\@{author}\\nDESCRIPTION=\@{description}"

		Retrieves the last used record (0 has that special meaning), wordwraps the buffer to fit within 75 columns of non-proportional text, and uses a special custom format (the strange mess in ""'s) to determine what is included and how it is formatted.
@endnode

@node RFADDFISH "ARexx: RF_ADDFISH"
Usage:
	RF_ADDFISH "filename"

	Adds all fish from the indicated file to the current database.

Example:
	RF_ADDFISH 't:new-fish.txt'
@endnode

@node RFOBTAIN "ARexx: RF_OBTAIN"
Usage:
	RF_OBTAIN what

	Obtains a variety of information from the server, according to the parameter given:

	DISK	The current disk number.

	FISH	The current fish number, usable as the 1st parameter to the @{" RF_GETFISH " link RFGETFISH} command.

	FLAGS	The flag bits of the current fish; the values currently defined, although not necessarily setup for each fish, are:

		0x0100  Marked for retrieval
		0x0200  Marked for ownership
		0x0400  Marked to stay hidden in searches
		0x8000  Marked to be deleted

		Bits in the range 0x0001 through 0x0080 are user defined.

	PVER	The fish number of the PREVIOUS VERSION; the value 0 is returned if no previous version exists.

	NVER	The fish number of the NEXT VERSION; the value 0 is returned if no next version exists.

	DBNAME	The descriptive name of the database in use.

	DBFILE	The filename (ending with .kfdb) of the database in use.  Such a filename can be passed to the @{" RF_USE " link RFUSE} command.

	DBSIZE	The number of records in the current database, which is also the highest fish number you can pass to the @{" RF_GETFISH " link RFGETFISH} command.

Example:
	RF_OBTAIN DISK
	RF_OBTAIN FISH
	RF_OBTAIN FLAGS
	RF_OBTAIN PVER
	RF_OBTAIN NVER
	RF_OBTAIN DBNAME
	RF_OBTAIN DBFILE
	RF_OBTAIN DBSIZE
@endnode

@node RFSELECT "ARexx: RF_SELECT"
Usage:
	RF_SELECT fishnumber

	Selects a specific database record, but does not actually retrieve information.  This is faster if all you need is use the RF_OBTAIN command next, perhaps to locate a record with specific flags, or to follow a list of records along the VersionLinks.
@endnode

@node RFSET "ARexx: RF_SET"
Usage:
	RF_SET PVER fishnumber
	RF_SET NVER fishnumber
	RF_SET FLAGS flags

NOTE:   In prior versions this command was RF_SETVLINK.

	Sets the previous or next version link for the current fish.  A value of 0 for the fishnumber indicates no previous or next version.  It is up to you to assure that records are properly linked in both directions, as the KFServer will not interfere with your selections.  Furthermore, if a record already has a link number set, this value will be replaced with the new selection.

Example:
	/* link record 17 to 76 and vice versa */
	RF_SELECT 17
	RF_SET NVER 76

	RF_SELECT 76
	RF_SET PVER 17

NOTICE: In older versions of this example, we used RF_GETFISH instead of @{" RF_SELECT " link RFSELECT} for improved speed.
NOTICE: Links need not be sequential.  Thus, record 17 may have record 76 as its predecessor.  Versions of KingFisher before 2.9 do not properly handle such cases, however.
@endnode

@node RFSTATUS "ARexx: RF_STATUS"
Usage:
	RF_STATUS

	Retrieves status information from the server.  This is effectively the same as what KingFisher displays in the Status command (rightAmiga-I) except that it applies to RexxFisher.

Example:
	RF_STATUS
	say result
@endnode

@node RFLOCKING "ARexx: RF_LOCK and RF_UNLOCK"
Usage:
	RF_LOCK
	RF_UNLOCK key

	Locking RexxFisher may be necessary to prevent other programs for inadvertently connecting to it and fouling up the current status while your ARexx script is passing information to another program, thereby having relinquished access to RexxFisher (i.e. ADDRESS REXXFISHER1; ... ; ADDRESS VLT ; ...)

	RF_LOCK returns (in the Rexx RESULT variable) a unique value which you should store.  Pass this value to the RF_UNLOCK command to unlock RexxFisher again.  Without this key, RexxFisher will remain locked.  ALWAYS call RF_UNLOCK before exiting your script, else the key is (probably) lost and RexxFisher must be shutdown with a CTRL-C signal and restarted!

Example:
	OPTIONS RESULTS
	ADDRESS REXXFISHER1
	RF_VERSION
	say RESULT
	RF_LOCK
	myKey = RESULT
	ADDRESS VLT
	. . .
	. . .
	ADDRESS REXXFISHER1
	RF_UNLOCK myKey
	. . .
	. . .
	RF_BYE
	
@endnode


@node TROUBLE "6 TROUBLE SHOOTING"
This section is woefully incomplete, and I apologize.  If you experience a problem of any kind with KingFisher, please write me (by postal or email) and I'll try to help.  Your suggestions will make their way into this section as I learn more about what to expect and what doesn't work.  Of course, bugs and conceptual problems will be fixed and smoothed out to make KingFisher easier to install and operate.

If you find that KingFisher is deficient in some way that prevents you from getting something done, or you find yourself frustrated and wish an easier way existed, or you come across a serious problem with KingFisher, please attempt to resolve the problem with me first before crying out in public.  A reputation for quality is difficult to build and easy to lose.  I have made every effort to assure that KingFisher Release 2 is as stable and bugfree as can be expected of a product as complex (and new!) as this.  If, however, you experience a problem, allow me the chance to help!

6.1	@{" Making a new (CD-ROM) database available to KingFisher " link TROUBLE_NEWDB}

6.2	@{" KingFisher is losing memory! " link TROUBLE_AMNESIA}

6.3	@{" KingFisher 1.40 was so much easier to use! " link TROUBLE_NEWWAY}

6.4	@{" The search window pops up far too briefly " link TROUBLE_USEMASK}

6.5	@{" Why don't my search expressions work? " link TROUBLE_EXPR}
@endnode

@node TROUBLE_NEWDB "6.1 Making a new (CD-ROM) database available to KingFisher"
It is the @{I}KingFisher Database Server @{UI}(KFServer) which is responsible for actually reading and writing databases on disk.  KFServer knows only about databases for which a file exists whose name ends with @{I}.kfdb @{UI}.  This file must exist in KFServer's default directory, i.e. the directory where the KFServer is located.  @{B}KFServer will not recognize @{I}.kfdb @{UI}files that are stored in any other place.@{UB}

It is the purpose of these @{I}.kfdb @{UI}files to describe all components of a database, i.e. what the name of the index file is, which records are stored in which data files, and less importantly the complete name of the database to be presented to the user.  More detail on the contents of these @{I}.kfdb @{UI}files is given @{" here " link KFSERVER}.

In most cases it may be sufficient to copy an existing @{I}.kfdb @{UI}file from a CD-ROM to the directory where the KFServer program resides (most likely the same as where KingFisher is installed.)  You need not restart the Server when you add a new database.
@endnode

@node TROUBLE_AMNESIA "6.2 KingFisher is losing memory!"
I am aware of the problem but have only been able to determine that it is the KFServer that is losing about 20K of memory, apparently through uncontrolled creation of an additional console task that never gets removed.  The solution to the problem is still eluding me, as it is not my code that seems to be creating this console task... :(

If you are in the habit of starting and stopping KingFisher frequently, you may wish to change the value of "keep-running" (in KFServer.prefs) to "yes" to prevent the server from shutting down when the last client detaches.  You can always shutdown the server with a CTRL_D or CTRL_C signal (see the AmigaDOS 'break' command.)
@endnode

@node TROUBLE_NEWWAY "6.3 KingFisher 1.40 was so much easier to use!"
Only a very few concepts have actually changed, and if you pretend to be color-blind for a moment, then the interface isn't actually all that much different either:

1. Instead of 6 search expression gadgets you now have only one.  But the last 20 entries¹ are remembered and can be recalled by clicking on the gadget that is hoped to resemble a scroll.  The list is sorted in order of the most recently used.

2. @{" Search expressions " link EXPRESSIONS} now come in two flavors: the original KingFisher 1.40 expressions and the new KingFisher Release 2 expressions, which allow you to limit their search scope to specific fields.  You can use the old format by making sure you have the "PREFERENCES/Searching/Simple substrings" entry checked.

3. Instead of activating a search gadget with the yellow checkmarks, you get a dedicated set of search gadgets (they have the big question marks (?) on them.)


A more detailed discussion of differences is presented @{" here " link KF140}.

__________
¹ This value (MaxHistory) is adjustable in the KingFisher2.prefs file.
@endnode

@node TROUBLE_USEMASK "6.4 The search window pops up far too briefly"
Most likely you have forgotten to turn off the use of @{" Search Masks " link PREFSSEARCHUSEMASK}.  When this option is selected, KingFisher ignores all records that do not match the selected Search Mask.  If no records match (such is @{B}always@{UB} the case when @{B}none@{UB} of the records in the database have any flags set) then the search will be over almost as quickly as you can blink your eyes!

Use of the Search Mask will do you no good unless at least some of the records in your database have one or more flags set.
@endnode

@node TROUBLE_EXPR "6.5 Why don't my search expressions work?"
KingFisher Release 2 uses a new expression syntax, which is an extension of the one used by KingFisher 1.40 and earlier.  The extension involves having to specify to which field a value is to be applied.  This gives you the ability to search for "all database programs released in 1993 or later (provided a date is available)":

		type$database & (date>=1993.01.01 | date="")

You can force KingFisher to drop back to the original expression syntax by selecting the @{" Simple substrings " link PREFSSEARCHSIMPLESUBSTRINGS} option from the PREFERENCES/Searching menu but that will effectively search @{U}all@{UU} database fields, thereby eliminating KingFisher's ability to make use of the QuickIndex for ultra fast searches.
@endnode


@node FUTURE "7 THE FUTURE"
Numerous enhancements are already planned for KingFisher Release 2, changes to the interface, additions to functionality, and improvements in speed.  The following is a brief list of only some of the features you can expect to see in a future release, and if you wish to cast your vote for others, feel free to drop me a line:

@{fg back}@{bg text} × @{bg back}@{fg text}	VersionLinks will be editable on an individual scale or by performing algorithmic scans on the database,

@{fg back}@{bg text} × @{bg back}@{fg text}	A database may be reorganized, duplicated, or packed (deleted records removed),

@{fg back}@{bg text} × @{bg back}@{fg text}	Support for various alerts (i.e. "search done") and iconification,

@{fg back}@{bg text} × @{bg back}@{fg text}	The keyboard, including menu shortcuts, will become customizable.

And lots more...

As always, if you have requests or suggestions, please let me know!  KingFisher is a user/need-driven project.  Without your support and your feedback, I am simply left to implement things at my own pace, as my own priorities dictate.
@endnode


@node THANKS "8 THANKS"
I would like to extend my thanks to the following people whose feedback, help, input, criticism, requests, and support have helped grind the rough edges off KingFisher and have helped make the program a more polished product than it otherwise would have been:

@{fg highlight}@{B}@{I}AMIGA @{UI}@{UB}@{fg text}
	@{I}"Baby, you were born to run!" @{UI}

@{fg highlight}@{B}Dan Barrett@{UB}@{fg text}
	My favorite Amiga humorist (and discriminating beta-tester, too!)  BLAZE on, Dan!

@{fg highlight}@{B}Olaf "Olsen" Barthel@{UB}@{fg text}
	For the code that I had hoped to use for recoloring an image to match a rastport's existing colors.

@{fg highlight}@{B}Fred Fish@{UB}@{fg text}
	For his many years of service to the Amiga community, and especially for the collection of software that has come to be known as the "Fish Disks," and his recent step up to a CD-ROM distribution which has been one of the reasons I have created KingFisher Release 2.  Fred's efforts have set him apart as one of the Amiga Community's most important people.

	With his kind permission, a representation of Fred's Fish Logo is used in one of the gadgets.  Thanks, Fred!

@{fg highlight}@{B}Dave Haynie@{UB}@{fg text}, formerly Commodore-Amiga
	For his work on my favorite computer and for DiskSalv 2 which has pulled my a** out of a sling when that disconnected organ in my skull failed to shut down the system before lightning knocked out the building's power supply and my file system was badly corrupted.

@{fg highlight}@{B}Jay Miner@{UB}@{fg text}, "The Father of the Amiga"
	For his vision, his dedication, and for everything!  IN PACE REQUIESCAT.

@{fg highlight}@{B}Dean Ridgway@{UB}@{fg text}
	For his continued help (beta-)testing KingFisher and helping me find and kill some rather elusive bugs.

@{fg highlight}@{B}Bill Sorenson@{UB}@{fg text}
	For that great walrus!  :-)

@{fg highlight}@{B}Uwe "Hoover" Schürkamp@{UB}@{fg text}
	For his past and present help testing KingFisher and for acting as my European registration site.  Thanks also for making some rather major corrections to my initial German catalog file, and for being a great friend for all these years. :)

@{fg highlight}@{B}Mike Schwager@{UB}@{fg text}
	For his past maintenance of a major Fish Disk ftp site and more recently for his input as a beta tester.

@{fg highlight}@{B}Michael Sinz@{UB}@{fg text}, formerly Commodore-Amiga
	For Enforcer 37.xx (a truly wonderful debugging tool!) and his help (during development of KingFisher 1.x) with regard to using SimpleRexx, which is now part of RexxFisher.

@{fg highlight}@{B}Michael B. Smith@{UB}@{fg text}
	For posting code on how to use the ASL Screen Mode Requester, part of which found its way into KingFisher.

@{fg highlight}@{B}Jure Vrhovnik@{UB}@{fg text}
	For his link library routines to recolor images (see dev/c/SupraLib.lha on Aminet.)

@{fg highlight}@{B}Jochen Wiedmann@{UB}@{fg text}
	For his excellent tool FlexCat and his consistent responsiveness to my suggestions and needs to improve FlexCat.



And big thanks go to all of my @{B}active@{UB} beta testers, some of whom have really gone out of their way (and are still doing it!) to make sure things are working well:

	Dan Barrett,
	George Gibeau,
	Jeff Hanna,
	Richard Hartmann,
	Dean Ridgway,
	Nick Ridley,
	Mike Schwager,
	Jim Ventola.

And thanks, also, to the efforts of my translators, by whose efforts you can (hopefully) enjoy KingFisher in your native language:

	Eduardo Delgado (Español/Spanish),
	Janne J Kalliola (Suomi/Finnish),
	Finn Kettner (Dansk/Danish),
@remark	Florent Monteilhet (Français/French),
	Marcel Offermans (Nederlands/Dutch),
	Uwe Schürkamp (Deutsch/German),
	Jan Simonson (Svenska/Swedish)

@{B}And last, but not least, my thanks to you who have registered KingFisher and shown your very real support for my efforts.  You know who you are.  Cheers!@{UB}

 .__.  Udo Schuermann
 (    )  walrus@wam.umd.edu
@endnode
