Citadel+ User's Guide and Reference Manual
Draft Version/065
March 12, 1995
By Anticlimactic Teleservices


Table of Contents

Introduction                                               v
  What we want from you                                   v
  Typographic conventions                                 v
  Style conventions                                       v
Section I: Quick Setup                                     1
  System requirements                                     1
  Choosing the correct version                            1
  Setting Citadel up                                      1
Section II: User's Guide                                   3
 Basic Usage                                              4
 Message Editor                                           6
 Groups                                                   9
  Boolean group expressions                              10
 Accounting                                              11
 Message Censoring                                       12
 ANSI Colors                                             13
 Message Command Interpreter (MCI) Commands              15
  Variables                                              15
  The commands                                           15
  Examples                                               19
 Applications                                            22
  General format                                         22
  Special command-line variables                         23
  Defining applications                                  24
  The input and output data files                        25
 Help Files                                              27
  Blurbs                                                 27
  Menus                                                  31
  Help files                                             34
 Networking                                              36
  General information                                    36
  DragCit 1.0/1.1: The oldest and slowest                36
  DragCit 1.5/1.6: Faster, but still messy               38
  Net 6.9: Citadel networking at its best (so far)       39
  Citadel-86 compatible networking                       43
 Time and Date Formatting                                44
  The TZ environment variable                            44
  Time/date format strings                               44
 Scroll-Back Buffer                                      46
 Spell Checker                                           48
 Status Line and Screen                                  49
  The standard status line                               49
  The second status line                                 50
  The help window                                        50
  The status screen                                      50
 User Configuration                                      52
 Room Editing                                            61
 User Editing                                            65
Section III: Command Reference                            67
  Common single-key commands                             67
  Less common single-key commands                        68
  Multiple key (extended) commands                       69
  .Read (.R...) commands                                 70
  .Sysop (.S...) commands                                72
  .Aide (.A...) commands                                 76
  .Chat (C) command                                      78
  .Download (.D...) command                              78
  .Enter (.E...) commands                                79
  .Goto (.G...) command                                  80
  .Help (.H...) command                                  80
  .Jumpback (.J) command                                 80
  .Known (.K...) commands                                80
  .Login (.L...) command                                 81
  .Mail search (.M) command                              82
  .Bypass (.B...) command                                82
  .Terminate (.T...) commands                            82
  .Upload (.U...) command                                82
  .Invite (.I...) commands                               82
  .Expert toggle (.X) command                            82
  .Queue (.Q...) commands                                82
  .Menu (.?) command                                     83
  Message Editor Commands                                83
  Output commands                                        85
  Console-only commands                                  85
  Dial-out commands                                      88
  Window commands                                        88
Section IV: Configuration Files                           91
 CONFIG.CIT                                              92
  Required                                               92
  Optional                                               93
  Paths and filenames                                    93
  Console Attributes (Colors)                            95
  System Size                                            95
  Modem                                                  97
  System Settings                                       100
  Auxiliary Memory                                      107
  Configuration                                         107
  System Personality                                    108
  Accounting                                            111
  Security                                              112
 EXTERNAL.CIT                                           118
 NODES.CIT                                              121
 CRON.CIT                                               128
 GRPDATA.CIT                                            131
  Sample Entry                                          132
 DEFUSER.CIT                                            134
 HARDWARE.CIT                                           142
 PROTOCOL.CIT                                           143
  Command line variables and flags                      144
 MDMRESLT.CIT                                           146
 ROUTE.CIT                                              148
 MAILLIST.CIT                                           149
Section V: Citadel Script Files                          151
 Overview                                               152
  How script files are called                           152
 Variables                                              153
 Functions                                              154
 Script keywords                                        155
 Debugging                                              160
 Citadel internal functions by name                     162
 Citadel internal functions by function                 247
  Configuration                                         247
  Debugging                                             247
  Files                                                 247
  Messages                                              247
  Networking                                            247
  Users                                                 247
  Rooms                                                 247
  Halls                                                 247
  Groups                                                247
  User interaction                                      247
  String duplication checking                           248
  Miscellaneous                                         248
Appendix A: Customization                                249
  The CTDL.DAT File                                     249
  Using CTDLDAT.EXE                                     250
  The CTDLDATA.DEF file                                 250
  What Citadel expects                                  251
  The ENG-AM.DAT File                                   259
Appendix B: External drivers                             261
Appendix C: FOSSIL support                               275
Appendix D: Sound Blaster                                277
Appendix E: Citadel BBSes                                279
Appendix F: Credits                                      281
Appendix G: Data Files                                   283
  The userlog files                                     283
  The room files                                        289
  The hall files                                        290
  The group file                                        291
  The borders file                                      291
  The message file                                      291
Appendix H: Other files                                  295
  Queued file transfers                                 295
  Abnormal termination                                  295
  Networking files                                      299
  The NETID.CIT file                                    299
  Net 1.0/1.1 network packets                           299
  Net 1.5/1.6 network packets                           299
  Net 6.9 network packets                               299
  MSG.69 format                                         300
  MESG.TMP format                                       300
  ROOMREQ.(alias) format                                300
  FILE69.(alias) format                                 300
Appendix I: Legal                                        313
Index                                                    315
IIntroduction

Citadel+ is the most configurable, most powerful, most
supported, and all-around best variant of Citadel there is.
If you have doubts about this, point us in the direction of
a better Citadel and reasons why it is better; we will
quickly incorporate any missing features into future
versions of the software.

The software is free for anyone to use for any use. This
does not, of course, mean that you should expect any less
from Citadel than from any commercial product; Citadel is
fully tested and supported software. If you have any
problems with the software, report them to The Anticlimactic
Teleservice at (206)562-9792 for a quick fix. The same
applies to new features: we will implement almost any new
feature requested of us.


What we want from you
What we want most from our users is feedback. Even if you
decide not to use Citadel, it would be nice to hear from
you; tell us why you did not like Citadel so we can improve
the software for future releases.


Typographic conventions
There are a few typographic conventions used in this manual
that, if understood, help readability. They are as follows:

     Courier   This is used when showing text as it would be
               entered into a text file.
               
     Italics   This is used in two places: subheadings
               within a section and user input into the
               keyboard when running Citadel. Subheadings in
               italics are referenced in the table of
               contents.
               

Style conventions
Most references on written American English style will claim
that all punctuation belongs inside quotation marks.
However, this can lead to confusing text, especially when
dealing with a computer: when listing possible words to
enter in a configuration file, for example, the "correct"
method would be to list them with the commas inside the
quotes: "Setting1," "Setting2," or "Setting3." However, as
the comma is not really part of what you should enter into
the file, and the computer will not recognize what you want
it to do if you do, this manual adopts a style of including
only what is really being quoted inside the quotation marks:
"Setting1", "Setting2", or "Setting3". This is just a
warning to those of you who expect strict conformity to all
style rules, even the silly and counterproductive ones.

Another problem arises that English has no neuter pronoun
that is acceptable for referring to people: people are
always "he", "she", "him", or "her". The neuter pronoun
("it") is not used to refer to people. The problem is that
in most cases, we do not know what sex the person we are
referring to is. The solution to this problem that some
people prefer is to use text like "he or she" whenever using
a pronoun to refer to a person of unknown sex. The problem
with this method is that it leads to longer, more confusing
sentences. The purpose of a reference manual is to clearly
state what it is trying to communicate, so adopting this
style would cause the manual to suffer in quality. Another
solution some people use is to alternate: sometimes use "he"
and sometimes use "she". The problem that I have with this
method is that it seems to turn into a quota system: after
revising any section of the manual, I would have count "he"s
and "she"s, to ensure that I used an equal amount of them.

So, even though this may annoy some people, this manual uses
"he" and "him" as the neuter pronoun. While this may not be
fair in that it implies that the person being referred to is
male, this is a problem with the language we speak. I don't
feel that there is any good solution to this problem.
(Introducing a new word, or making "it" acceptable when
referring to people, would be nice, but we would have to
convince several hundred million other people who speak
English of this.) So, if you are female and reading some
section that applies to you, please regard all occurrences
of the word "he" as typographical errors for the word "she",
all occurrences of the word "him" as typographical errors
for the word "her", and all occurrences of the word "his" as
typographical errors for the word "hers".



_Section I: Quick Setup

Citadel is a complex program with many features. It includes
defaults that work well for most settings, but it can still
take a while to set up a Citadel. Because of the number of
manufacturers and models of modems in the world, setting the
modem parameters can be especially difficult. If you have
problems, call The Anticlimactic Teleservice at (206)562-
9792. This is the main distribution and support site for
Citadel, so it carries the latest version of the program and
related utilities and is a good place to ask questions or
link into the Citadel network.


System requirements
     Citadel requires the following to run:
           Hard disk
           512K RAM (perhaps less)
           MS-DOS version 3.30 or later
           IBM PC Compatible computer
          
     The following is recommended:
          
           Modem
           640K RAM
           IBM AT Compatible computer
          
     The following is nice to have, as well:
           Even more RAM
           Even faster computer
          

Choosing the correct version
There are two versions of Citadel: the Regular version and
the Auxmem version. The Auxmem version can store much of its
data in either EMS or XMS memory, or in disk-based virtual
memory. Because of this, the Auxmem version can handle a
larger system than the Regular version. But, even if you
don't have a large system, the Auxmem version may be the
correct one for you. It requires less conventional memory
when running a moderately sized system than the Regular
version, which gives you more room to use other features of
Citadel. The disadvantage to the Auxmem version is that it
is slightly slower than the Regular version. This slow-down
is not noticeable if you are using an AT-class machine or
faster, and is only slightly noticeable on an XT-class
machine with EMS memory.

If you only have conventional memory (up to 640K), then you
should probably use the Regular version of Citadel. However,
if you have any EMS or XMS memory, you should probably use
the Auxmem version of Citadel. Also, if you have extended
memory but no XMS driver, you can configure it as a RAM
disk, so the Auxmem version of Citadel can indirectly access
the memory by placing its swap file on the RAM disk.


Setting Citadel up
The first thing to do is make a directory for Citadel on
your hard disk. If you don't have a hard disk, get one. (If
you really want to run on a floppy-only system, request a
floppy version of Citadel+ on The Anticlimactic Teleservice,
and we will try to comply. It might be possible to make the
software run on such a system by removing enough features to
make the executable file small enough. Then again, it might
not: it has been a couple of years since this was
attempted.)

Copy CTDL.EXE into this directory, then run it with the -C
command-line parameter. (-C tells Citadel to configure
itself. If you omit this, Citadel will alert you that it
needs to be configured, and to run it with the -C
parameter.)

When first run, Citadel will prompt for some information
that it needs to know to get started, such as the name of
the BBS and its phone number, then create all its data files
(room, message, user, etc.) and directories. Citadel will
use default values for the size of the system and other
options. Section IV contains full information on the
configuration options, which you might want to change at a
later time.

Once Citadel has configured itself, it will present you with
a room prompt for the Lobby. At this time, it is ready for
use. Create an account with the Login (L) command by
pressing L then coming up with new initials and password.
Use the F6 key to access the sysop functions. You can press
? at any prompt to get a menu, or H for help. Now is a good
time to read the "Basic Usage" topic in the next section.

SSection II: User's Guide

Citadel has many features, not all of which are used by all
users. This section describes all features of the software,
on a topical basis.

This section does not explain specific commands; Section III
is a command reference. This section also does not go into
detail about setting configuration options in files (Section
IV has detailed information about these); it merely tells
you which options apply to the feature being described.

The following topics are discussed in this section:

Basic Usage
Message Editor
Groups
Accounting
Message Censoring
ANSI Colors
Message Command Interpreter (MCI) Commands
Applications
Help Files
Networking
Time and Date Formatting
Scroll-Back Buffer
Spell Checker
Status Line and Screen
User Configuration
Room Editing
Hall Editing.
User Editing
Basic Usage

Citadel contains many rooms, which are grouped together in
halls. When in a certain room, the message retrieval
commands (such as the New messages (N) command) are used to
read messages in that room and the Enter message (E) command
is used to enter a message into that room. Individual
pointers are kept for the last message read in each room, so
there is no need to visit every room with new messages every
call: new messages in rooms not visited will still be new
during the next call. Additionally, Citadel allows more
structure by grouping rooms in halls. This way, similar
rooms (such as those dealing with technical topics) can be
grouped together.

Because of the simplicity of the room concept, only a few
commands are needed to use Citadel effectively. These are
the commands to enter and read messages and change rooms and
halls. This makes Citadel easy for new modem users: there is
no need to memorize a large command set to use the program
well, and it is easy to get at the messages as there are no
sub-menus to navigate (and potentially get lost in).

After a user logs on, Citadel displays all new messages in
the Lobby, then gives a room prompt, meaning that it is
ready for user commands. There are two commonly used
commands at this point: the Enter message (E) and Goto new
messages (G)  commands.

To respond to something in the Lobby, press E to invoke the
Enter message (E) command. This brings up Citadel's message
editor. This is an easy editor to use for entering text, and
fairly simple for editing text as well. To enter text, just
start typing. Everything typed gets entered into the message
buffer. To bring up the message editor's command prompt,
press Enter on a blank line.

The most common mistake that new users make when using the
message editor is that they forget that Citadel
automatically formats messages for each caller's screen-
width. Because of this, pressing the Enter key will not
force Citadel to start on a new line when it displays the
message. To force Citadel to start a new line, press the
Enter key then the space bar, so it thinks that you are
starting a new paragraph.

The commands most used from the message editor's command
prompt are Save (S) , Abort (A), Continue (C), Print
formatted (P), and Replace (R). Save, Abort, Continue, and
Print do the obvious thing. Replace starts its search at the
end of the text, going backwards, and only replaces one
occurrence. An alternate text replacement command is Find
and replace (F). This command displays the text it is going
to replace before doing it. It takes a bit longer to use,
but is good for users not totally familiar with Citadel's
message editor.

Another useful command of the message editor is Verify
spelling (V). This checks the spelling of the words in the
message, and gives suggestions for correcting those words it
cannot find. The spell checker has many options, and is
fully explained in the spell checker section.

It is a good idea, especially when new, to use the Print
formatted (P) command of the message editor before saving
the message. This gives you a chance to see what Citadel's
formatting does to a message, so it can be revised before
saving it.

Usually, the Goto new messages (G)  command is used after
entering a message in Lobby. This moves to the next room
with new messages in the current hall. Once there, use the
New messages (N) command to read the messages in the room.
Then, either post a message with the Enter message (E)
command or go to the next room with the Goto new messages
(G) command.

When the Goto new messages (G) command returns you to the
Lobby, use the Next hall (>) command to go to the next hall
and repeat the Goto/New/Enter loop. After you have visited
all the halls, use the Terminate (T) command to log off the
BBS and let others call.

Other useful commands are the file transfer commands: Upload
(U), Download (D), .Read Directory (.RD), and .Read Info
file (.RI). More information is available with the .Read
Directory (.RD) and .Read Info file (.RI) commands by adding
the Verbose modifier: .Read Verbose Directory (.RVD), and
.Read Verbose Info file (.RVI).

These commands only work in directory rooms, which are rooms
with a ] character at the end of the room prompt. The file
transfer protocols available on the board are up to
individual sysops to configure, using the PROTOCOL.CIT
configuration file. The ones set up are available when
either the Upload (U) or Download (D) commands are used.

In addition, Xmodem, 1K Xmodem, Xmodem CRC, and Zmodem are
always available through the .Enter With protocol (.EW...)
and .Read With protocol (.RW...) commands.

Message Editor

Citadel's message editor allows for quick entering of
messages, and effective editing of them. Enter text by just
typing; Citadel takes care of word wrap. The message
formatting that Citadel performs may be confusing to a new
user: Citadel tries to word wrap messages to the caller's
screen width, which can cause columnized messages (such as
tables) to be displayed incorrectly.

There are two ways around this formatting: one that is
compatible with all software on the network, and one that is
specific to Citadel+. If you want to ensure that the message
will be easily readable by all software, just start every
line with a space. This will make Citadel think that you are
starting a new paragraph, so it will not word wrap the line
to join with the previous. To be able to start typing in the
left column, enter a Control+A5 before the text. This will
tell Citadel to turn off its formatting. This only works
with Citadel+ BBSes, though, so your message might be
displayed incorrectly on another BBS on the network. If you
want to turn formatting back on, use Control+A6. Citadel
turns formatting back on after it is done with each message,
so a message with a Control+A5 in it does not have to
include a Control+A6.

To exit text entry mode, and go into text editing mode,
press Enter on a blank line. Citadel will respond with an
"Entry Command:" prompt. The following commands are active
at this prompt:

     A    Abort. This aborts the message being entered and
          returns to the room prompt. If this command is
          used by accident, the .Enter Old (.EO) command
          will revive the aborted message. By default,
          Citadel asks for confirmation when aborting a
          message. However, this can be overridden with the
          Confirm Abort (A)  option of the Message Editor
          options (E) sub-command of the .Enter
          Configuration (.EC) command.
          
     C    Continue. This returns to the text entry mode. By
          default, Citadel displays the last 100 characters
          of the message before returning to text entry
          mode. To have Citadel display the whole message,
          use the Verbose Continue (V)  option of the
          Message Editor options (E)  subcommand of the
          .Enter Configuration (.EC) command.
          
     D    Delete buffer. This deletes all of the message
          text that has been entered, and returns to the
          text entry mode. Citadel asks for confirmation
          when using this command, as there is no way to
          undo it.
          
     E    Encrypt message. This asks for a key to use to
          encrypt the message. The key is case sensitive,
          and you must remember it if you want to be able to
          read the message in the future: the key is needed
          to decrypt the message when reading it. By
          default, only mail may be encrypted, but the sysop
          has control over which types of messages may be
          encrypted with the #ALLOWCRYPT keyword in
          CONFIG.CIT. He may choose to allow all messages to
          be encrypted, or no messages to be encrypted.
          
     F    Find and replace. This prompts for text to
          replace, then finds the most recent occurrence of
          it, starting with the end of the message. It then
          asks if you want to replace this text. If you
          answer no, Citadel finds the next matching text,
          and prompts to replace it. This continues until
          you answer yes, when it asks for the text to
          substitute, or until no more matches are found.
          
     I    Signature. This lets you change the user signature
          of the message. The _ key can also be used to
          change the signature.
          
     L    Location. This displays the current room and hall.
          
     P    Print formatted. This displays the message as it
          would appear when read. This is a good way to
          ensure that your message is formatted the way you
          want.
          
     R    Replace. This operates as Find and replace (F),
          but is more of an expert-level command: you are
          not prompted for the occurrence to replace.
          Citadel finds the last occurrence of the text in
          the message, and replaces it with what you
          specify. Use this with caution, especially as a
          new user.
          
     S    Save. This saves the message and returns to the
          room prompt. By default, Citadel does not ask for
          confirmation when saving messages. However, this
          can be overridden by using the Confirm Save (S)
          option of the Message Editor options (E)  sub-
          command of the .Enter Configuration (.EC) command.
          
     U    Subject. This lets you change the message's
          subject.
          
     V    Verify spelling. This runs the spell checker on
          the message. Citadel's spell checker has many
          options, which are described in the Spell Checker
          topic.
          
     W    Word count. This counts the characters, words, and
          lines (as Citadel thinks) of the message.
          
     !    Link application.  This is available only to
          sysops on console. It links the message to an
          application (see the "Applications" topic in this
          section) to the message, so that the application
          is run every time the message is read, after the
          message is displayed. If the message is
          transferred to another board on the network, this
          link is lost.
          
     ~     Allow ESC. This toggles whether Citadel will save
          the Escape character (ASCII 27) to the message or
          not. By default, it strips this character, to
          avoid confusing people who try to use the arrow
          keys for message editing. However, some people
          might want to include ANSI sequences in their
          messages; they must use this command to tell
          Citadel to save the Escape character to do so.
          
     @    Address message. This lets you change the address
          of the message, for sending mail to other users.
          
     #    Special delivery options. This sets special
          delivery options for mail. The only one currently
          implemented is receipt confirmation requested. If
          a message is marked as such, then Citadel
          generates a message addressed to you confirming
          that the message was received when it is read by
          the recipient for the first time. Note that if the
          message is networked mail destined to software
          other than Citadel+ on the network, then the
          confirmation will not be sent. Also, if the
          message passes through some other software that
          does not pass the special delivery information,
          the response will not be sent.
          
     <    Insert file. This command is available only to
          sysops on console. It reads the contents of any
          file on disk and appends it to the message, up to
          Citadel's 8K message limit.
          
     *    Change name. This lets users change their title
          and surname for this message only. Sysops have the
          added capability to change their name for this
          message only.
          
     ?    Menu. This displays a list of available commands.
          
Groups

Access to different areas of the board can be limited by
using groups. For example, if a room is group-only, only
users who are members of the group can get to the room to
read the messages in it. In addition to rooms, halls,
messages, and doors can be made group-only.

Groups are created with the .Sysop Group New (.SGN) command,
edited with the .Sysop Group Edit (.SGE) command, and killed
with the .Sysop Group Kill (.SGK) command. Once a group is
created, aides can usually add and remove people and rooms
from the groups. To make a group more secure, it can be
locked from aides, which means that only sysops can add and
remove people from it. For even greater security, a group
can be hidden, which means that only current members of the
group or a sysop on console can even know of the group's
existence. A low-security group can be made auto-add, which
means that all new users are added to it when they log in
for the first time.

Groups are also used for accounting: different time limits
and upload/download charges can be assigned to different
groups. Citadel's accounting is powerful and adaptable. The
Accounting section explains it in full.

Only aides and sysops may add or remove people from groups.
For a list of all groups on the system that you can add or
remove users from, use the .Aide List group (.AL) command,
and don't specify a group. If a group is specified, the
command will list all users, rooms, and halls belonging to
the group. The .Sysop Group List (.SGL) command operates
identically.

To add or remove users to or from a group, use the .Aide
Group (.AG) command, the .Sysop Group Group-specific
membership (.SGG) command, the .Sysop Group User-specific
membership (.SGU) command, or the .Sysop Group Operator-
specific membership (.SGO) commands. The .Aide Group (.AG)
command works on one user and one group at a time. The
.Sysop Group Group-specific membership (.SGG) command
operates on one group, but goes through the whole userlog,
prompting to add or remove each user or not. The .Sysop
Group User-specific membership (.SGU) command operates on
one user, but goes through the group list, prompting to add
or remove the user to or from each group on the system. The
.Sysop Group Operator-specific membership command (.SGO)
command lets you add users to a group based on their
membership in another group, or their access to the system.
This is done by specifying a Boolean expression, as
described below.

A rooms can be made group-only by setting its access with
the .Aide Edit room (.AE) command. A room can also have a
privileges group, also set by the .Aide Edit room (.AE)
command. Users not in the privileges group can access the
room, but have fewer privileges than members of the
privileges group. The privileges can be upload or download
ability in directory rooms, or message entry or moderating
in any room. Alternatively, a room can be made group-only
when it is being created, by adding the Group-only modifier
to the .Enter Room (.ER) command: .Enter Group-only Room
(.EGR).

Halls can be made group-only by setting the group with the
.Sysop Hall Edit (.SHE) command. Also, when a new hall is
being created with the .Sysop Hall New (.SHN) command,
Citadel allows the hall to be made group-only.

Messages can only be made group only when being created, by
adding the Group-only modifier to the .Enter Message (.EM)
command: .Enter Group-only Message (.EGM). Sysops have the
added ability to send mail to every member of a group by
using the .Enter Group-only Exclusive message (.EGE)
command.

Two groups are automatically created by Citadel: Null and
Reserved_2. Everybody is added to Null when logging in new
(Null is always auto-add). The Reserved_2 group is used when
something needs to be made group-only, but there is no
defined group for it, such as when mapping unknown group-
only messages coming in over the network, or creating an
Aide room message for a room with a Boolean group expression
(see below).


Boolean group expressions
Citadel allows you to use Boolean expressions to control
group-access to halls and rooms. By using these, you have a
large amount of control over who may access a room or hall.
They can also be used for the .Sysop Group Operator-specific
membership (.SGO) command and the .Read Group-only...
(.RG...) commands.

When entering a Boolean expression, you may use the
operators OR, AND, NOT, and XOR, in addition to the grouping
symbols "(" and ")". If the group name you are specifying
contains more than one word, you must enclose the name in
quotations. You must also put a space before and after the
grouping symbols "(" and ")" so Citadel does not try to
interpret them as part of the group name. For example,
suppose you have three groups on your system: Group 1; Group
2; and Group 3. If you want to make a room accessible to
members of Group 1 or Group 2, but who are not in Group 3,
then you would enter the following expression: ( "Group 1"
or "Group 2" ) and not "Group 3". Note that as Citadel has
partial group-name recognition, you could also enter that
expression as: ( 1 or 2 ) and not 3, assuming that you have
no other groups that Citadel would find first.

When using the .Sysop Group Operator-specific membership
(.SGO) command and .Read Group-only... (.RG...) commands,
Citadel provides the meta-groups *SYSOP, *AIDE, *NODE,
*UNLISTED, *TWIT, *PERMANENT, *NETWORK, and *NOMAIL to allow
you more power when choosing a group expression. These are
used like actual groups, with membership based on access.
Most of these are not available in the .Read Group-only
(.RG) commands to users who are not Aides, for security
reasons. Also, these don't make sense with the .Read Group-
only Messages (.RGM) commands, because messages don't have
these access levels.

Accounting

Citadel accounting is based on groups. When a user logs in,
Citadel assigns accounting information to him based on which
groups he is in, picking the best deal for him if he is a
member of two or more conflicting groups.

For each group, you can limit the times (days and hours) it
can call, its maximum time limit, the number of minutes
granted to members per day, the cost of uploads and
downloads, and hours of the day that the group is not
charged any time.

To turn on accounting, you must edit CONFIG.CIT and
sometimes DEFUSER.CIT. At the minimum, you must set the
#ACCOUNTING keyword in CONFIG.CIT to 1. This is enough to
turn on accounting, but you may want to change some of the
defaults. The default time limit for unlogged-in users is
five minutes. If you want to give them more or less time,
set #UNLOGGEDBALANCE in CONFIG.CIT to the number of minutes
you desire. When a new user creates an account, Citadel
assigns 60 minutes to it. If you want to give more or less
time, set #CREDITS in DEFUSER.CIT to the number of minutes
you desire. If you want to rename credits, use the
#CREDIT_NYM keyword in CONFIG.CIT.

Then, set GRPDATA.CIT for your accounting values, as
explained in Section IV.

You can turn off accounting for a specific user by using the
.Sysop Userlog edit (.SU) command. You can also use this
command to change the balance of a user's account. When a
user is logged-in, you can use the PgUp and PgDn keys to
change the account balance by five minutes at a time. The
current account balance is displayed in the status line.

Message Censoring

Citadel provides a method to keep messages on your system
from being too vulgar for your taste. This is done with
message censoring. When a message is censored, it will
always pass through the network. However, you have control
over who reads the message on your system.

In addition to the obvious censoring of message text that
you find objectionable, you can elect to censor any author
who has demonstrated a history of undesirable posts, or any
node with either an undesirable name or with users who
continually post unacceptable messages. You can also choose
to censor (or uncensor) any message that you read as you
read it. Exclusive messages are never censored. If a user on
your system enters a message that Citadel censors, it will
display the file CENSOR.BLB to the user. This is a good
place to insert a warning or tell the user why you chose to
have the message censored.

Each user can be configured to view or not view messages
that are marked "Censored" by Citadel. Sysops can control
this by using the View censored messages (*) option of the
.Sysop Userlog edit (.SU) command. If the #CENSOR keyword in
CONFIG.CIT is set to 1, then users can also control this
with the View censored messages (*) option of the .Enter
Configuration (.EC) command. When viewing is enabled with
this option, the file DISCLAIM.BLB is displayed to. A
carefully worded disclaimer blurb can help keep you out of
prison.

It is easy to enable censoring: just use the #CENSOR_AUTHOR,
#CENSOR_TEXT, and #CENSOR_NODE keywords in EXTERNAL.CIT as
follows:

     #CENSOR_AUTHOR "name"
          Censor all messages from the user name.
          
     #CENSOR_TEXT "text"
          Censor any messages that contain text anywhere in
          the message buffer that might be displayed when a
          user reads the message. This includes titles,
          surnames, signatures, source software field, etc.
          
     #CENSOR_NODE "node"
          
          Censor all messages from the board node.
          
ANSI Colors

Citadel supports both ANSI codes and a Citadel-specific
method of changing colors that is a bit easier to use. To
turn on this support, use the Terminal settings (T)
subcommand of the .Enter Configuration (.EC) command. There
are two choices for turning on ANSI available from this
subcommand: ANSI mode (A)  and ANSI color (C) . Turning on
ANSI mode tells Citadel to display certain things with ANSI
(such as room prompts and message headers). It also tells
Citadel to pass the Citadel-specific Control+A codes (see
below) 0 to 4 to you. Turning on ANSI color tells Citadel to
pass the Control+A codes a-h and A-H to you.

Turning on either also tells Citadel to pass ANSI (ESC[...)
codes to you. Otherwise, it strips these out, in an attempt
to keep the text visible to you. (It works well as long as
the only ANSI codes are color changes, not cursor movement.)

Citadel's Control+A color codes start with a Control+A
(ASCII 1) and then a character that specifies the new color
or other attribute. The available characters are:

          Code   Result
          0      Normal
          1      Blink
          2      Reverse
          3      Bold (high intensity)
          4      Underline
          a      Black foreground
          A      Black background
          b      Red foreground
          B      Red background
          c      Green foreground
          C      Green background
          d      Yellow foreground
          D      Yellow background
          e      Blue foreground
          E      Blue background
          f      Magenta foreground
          F      Magenta background
          g      Cyan foreground
          G      Cyan background
          h      White foreground
          H      White background
          r       Random foreground
          R      Random background
          
You can change the actual ANSI codes that Citadel passes to
your terminal for the codes 0-4 by using the Attributes (R)
choice of the Terminal settings (T)  subcommand of the
.Enter Configuration (.EC) command.

Underline (Control+A4) usually does not appear as an
underline: the text modes of IBM PC video cards that support
color (CGA, EGA, VGA) do not support underlined text. The
ANSI terminal code that enables underlined text on these
cards sets the text color to blue. (Or, more accurately, to
generate underlined text on the MDA, you specify the text
color as blue.)

You can also mix Control+A3 with the a-h codes to make the
colors brighter. To do this, enter the Control+A3 before the
Control+Aletter. Similarly, mixing Control+A1 with the codes
A-H will make the characters blink in the specified color.
Control+A2 (reverse) and Control+A4 (underline) cannot be
mixed with the other colors like this: the color code
entered will override the reverse or underline attribute.

Message Command Interpreter (MCI) Commands

If you have MCI (Message Command Interpreter) turned on with
the #TWIT_FEATURES keyword of CONFIG.CIT, messages can
become much more than just text: they can be interactive
sessions for the user.

Like colors (see the "ANSI Colors" section), MCI commands
all start with Control+A. A few MCI commands are a single
character long, like the colors, but most are multiple
characters. Multiple character commands all start with X and
end with X; the X at the start tells Citadel that this is an
extended command, and the X at the end tells Citadel that it
has reached the end of the command. For example, the command
to display the current connect rate is "^AXcrX". The "^A" is
the Control+A that tells Citadel that a special formatting
code (color or MCI) is next. The first "X" tells Citadel
that this is an extended code. The "cr" stands for "Connect
Rate" and actually tells Citadel what to display. The final
"X" tells Citadel that this is the end of the extended
command.


Variables
There are 10 variables that can hold string values and 10
that can hold character values. The variables holding string
values can also be used to hold numeric values. The
variables are labeled 0 to 9.

To assign a value to a string variable, use the Assign
(^AXas{variable}{value}X) command. To get the output of any
MCI command into a string variable, use the Assign next
(^AXan{variable}X) command. To get user input into a string,
use the Get string (^AXgs{variable}X) command. String
variables can be displayed using the Put string
(^AXps{variable}X) command.

Character variables can only be assigned to a user's
keystroke, with the Get character (^AXgc{variable}X)
command. Character variables can be displayed using the Put
character (^AXpc{variable}X) command.

The value of a variable can be tested with the Compare
(^AXcm{variable}[vflag]{type}{value}X) command, then acted
on with the Equal to (^AXeq{command}X), Greater than
(^AXgt{command}X), and Less than (^AXlt{command}X) commands.


The commands
All commands with an "*" after them are not yet implemented.

     Account balance (^AXabX)
          This displays the current user's account balance.
          
     Add (^AX++{result variable}{variable 1}{variable
          2...}X)
          This command looks at string variables as if they
          were numeric, and adds {variable 1} to {variable
          2} (and to {variable 3}, etc., if present) and
          assigns the value to {result variable}. For
          example, the command "^AX++394123X" would assign
          the sum of string variable 9 plus string variable
          4 plus string variable 1 plus string variable 2
          plus string variable 3 to string variable 3.
          
     Address (^AXad{#}X)
          This displays the current user's address. The
          value of {#} determines which line to display: 1,
          2, or 3. If no user is logged-in, this displays
          "Not logged in" for all three.
          
     Assign (^AXas{variable}{value}X)
          This assigns the value given by {value} to the
          string variable number {variable}.
          
     Assign next (^AXan{variable}X)
          This assigns the output of the next MCI command to
          the string variable number {variable}, instead of
          displaying to the user.
          
     Backspace (^AXbs{#}X)
          This sends backspace (Control+H) characters to the
          user. The value of {#} determines how many to
          send.
          
     Beep (^AXbp{#}X)
          This sends bell (Control+G) characters to the
          user. The value of {#} determines how many to
          send.
          
     Call number * (^AXcnX)
          
          This sends the current call number.
          
     Clear screen *(^AXclX)
          This clears the screen.
          
     Compare (^AXcm{variable}[vflag]{type}{value}X)
          This does a comparison of a variable to {value}.
          The type of comparison is determined by {type}: if
          it is "N" then a numeric comparison between
          {value} and the string variable number {variable}
          is made; if it is "C" then an alphabetic
          comparison between the character variable number
          {variable} and {value} is made; otherwise an
          alphabetic comparison between the string variable
          number {variable} and {value} is made. The
          alphabetic comparisons are not case sensitive: the
          strings "abc" and "ABC" are considered equal.
          
          [vflag] should be set to "V" if you want {value}
          to address a variable, or omitted if you want
          {value} to be treated literally by Citadel. That
          is, the MCI command "^AXcm0S9X" will compare
          string variable 0 to the string "9" and MCI
          command "^AXcm0VS9X" will compare string variable
          0 to string variable 9.
          
          To use the result of a comparison, use the Greater
          Than, Less Than, and Equal To commands, which are
          described below.
          
     Connect rate (^AXcrX)
          This displays the connect rate.
          
     Disk free * (^AXdf{drive}X)
          This shows how much disk space is free on
          {drive}:. For the drive of the current room's
          directory, use "0" for {drive}. For the drive of
          the #HOMEPATH as set in CONFIG.CIT, use "1" for
          {drive}. Otherwise, use a letter from "A" to "Z".
          
     Divide (^AX//{result variable}{variable 1}{variable
          2...}X)
          This command looks at string variables as if they
          were numeric, and divides {variable 1} by
          {variable 2} (and by {variable 3}, etc., if
          present) and assigns the value to {result
          variable}. For example, the command "^AX//394123X"
          would assign the quotient of string variable 9
          divided by string variable 4 divided by string
          variable 1 divided by string variable 2 divided by
          string variable 3 to string variable 3.
          
     Equal to (^AXeq{command}X)
          This executes the MCI command {command} if the
          last Compare (see above) command resulted in
          equivalence. Don't put an "X" at the start of
          {command}. Otherwise, Citadel will interpret this
          as the end of the "eq" command. If you need to do
          a non-extended command in response to an Equal to
          command, you must use the Goto command to go to
          it. For example, this will display the current
          room name (see the Room Name command below) if the
          last Compare command ended in an equivalency:
          "^AXeqrmX". Notice that there is no X before the
          "rm" part of the command, only after it.
          
     First name (^An)
          
          This attempts to display the user's first name. It will
          display full names of users like "The Hidden" who
          have "The", "A", or "An" as their first names.
          
     Get character (^AXgc{variable}X)
          This gets a single character from the user and
          stores it in character variable number {variable}.
          The character is not displayed by Citadel.
          
     Get string (^AXgs{variable}X)
          This gets a string from the user and stores it in
          string variable number {variable}. The string is
          displayed as the user enters it.
          
     Goto label (^AXgo{label}X)
          This makes the output flow jump to the label
          specified by {label}. This command does not work
          if the output is not stoppable by the user (such
          as in a room prompt).
          
     Greater than (^AXgt{command}X)
          This executes the MCI command {command} if the
          result of the last Compare command was greater
          than. The {command} should not start with an "X"
          as that is not part of the MCI command, but a
          special character that tells Citadel where an MCI
          command starts and ends. For example, the command
          "^AXgtgowowX" will transfer the output flow to the
          label "wow" if that last Compare command resulted
          in a greater than.
          
     Hall name (^AXhnX)
          This outputs the name of the current hall.
          
     Initials (^AXinX)
          This outputs the initials the current user uses to
          log into the board.
          
     Label (^AXlb{label}X)
          This is a place holder, used by the Goto label
          command. It does nothing by itself.
          
     Last call time/date (^AXlcX)
          This displays the user's last call time and date,
          using the current verbose time/date format string.
          
     Last name (^AXlnX)
          This attempts to display the user's last name.
          Citadel does this by searching backwards from the
          end of the name for the first space. Anything
          after the first space it finds (or the whole name
          if there is no space) is thought to be the last
          name.
          
     Less than (^AXlt{command}X)
          This executes the MCI command {command} if the
          result of the last Compare command was less than.
          The {command} should not start with an "X" as that
          is not part of the MCI command, but a special
          character that tells Citadel where an MCI command
          starts and ends. For example, the command
          "^AXltgowowX" will transfer the output flow to the
          label "wow" if that last Compare command resulted
          in a less than.
          
     Messages in room (^AXmrX)
          
          This displays the number of messages in the current
          room, as is displayed when going to it.
          
     Multiply (^AX**{result variable}{variable 1}{variable
          2...}X)
          This command looks at string variables as if they
          were numeric, and multiplies {variable 1} by
          {variable 2} (and by {variable 3}, etc., if
          present) and assigns the value to {result
          variable}. For example, the command "^AX**394123X"
          would assign the product of string variable 9
          times string variable 4 times string variable 1
          times string variable 2 times string variable 3 to
          string variable 3.
          
     Node name (^AXnnX)
          This displays the name of the current node.
          
     Node phone number (^AXnpX)
          This displays the phone number of the current
          node.
          
     Non-verbose Time/Date (^At)
          
          This displays the current time/date using the non-
          verbose time/date stamp.
          
     Number read * (^AXnmX)
          This displays the total number of messages read
          this call.
          
     Out special * (^AXos#X)
          Wow. This has not yet been implemented.
          
     Password (^AXpwX)
          This displays the password the current user uses
          to log on.
          
     Phone number (^AXpnX)
          This displays the phone number of the current
          user.
          
     Poopcount (^AP)
          This displays the poopcount of the current user.
          
     Poopuser * (^Ap)
          
          This displays the current poopuser of the board.
          
     Port rate (^AXprX)
          This displays the current port rate.
          
     Put character (^AXpc{variable}X)
          This displays the contents of character variable
          number {variable}.
          
     Put string (^AXps{variable}X)
          This displays the contents of string variable
          number {variable}.
          
     Random number (^AXrd{variable}#X)
          This assigns a random number in the range of 1 to
          # to string variable number {variable}.
          
     Real name (^AXrnX)
          This displays the real name of the current user.
          
     Room name (^AXrmX)
          This displays the current room name.
          
     Slow output * (^AXsl#X)
          Wow. This has not yet been implemented.
          
     Subtract (^AX--{result variable}{variable 1}{variable
          2...}X)
          This command looks at string variables as if they
          were numeric, and subtracts {variable 2} from
          {variable 1} (and {variable 3} from that
          difference, etc., if present) and assigns the
          value to {result variable}. For example, the
          command "^AX--394123X" would assign the difference
          of string variable 9 minus string variable 4 minus
          string variable 1 minus string variable 2 minus
          string variable 3 to string variable 3.
          
     Sysop name (^AXsnX)
          This displays the name of the console sysop, as
          set by #SYSOP in CONFIG.CIT.
          
     User name (^AN)
          This displays the current user's full name.
          
     Verbose Time/Date (^AT)
          
          This displays the current time/date using the verbose
          time/date stamp.
          

Examples
To create complex MCI messages with looping and branching,
you almost need to use a text editor, unless you are really
good about keeping things in your mind. In the following
examples, the character "" is used for Control+A. (Control+A
will show up as a smiley face in your text editor.) Also, as
you often need to enter many characters without pressing the
Enter key to make the formatting come out correctly, each
line is entered with a hanging indent.

The following message would give the user a message based on
his poopcount:

     Hey, n, youXan0XPXcm0N0XXltgonegativeXXcm0N100XXltgosma
                    llXXcm0N1000XXltgomedXXcm0N10000XXltgola
                    rgeX have a lot of poop!XgoendX
     XlbnegativeXr poop comes out backwards!XgoendX
     XlbsmallX should poop more.XgoendX
     XlbmedX just barely poop enough.XgoendX
     XlblargeX are pretty good about pooping.XlbendX
     
This message starts with the text "Hey, n, you", which is
always displayed. This lets the user see that it is directed
at him by including his name in the message. After that,
Citadel does some comparisons and branching to display the
rest of the message based on the user's poopcount. As we
don't want to output a carriage return in the middle of
this, it all has to be on the same line. If your text editor
takes you to the next line when you fill up the first, then
you have word-wrap mode turned on. You should turn it off so
that the message looks correct when it is loaded into
Citadel.

The first thing this message does after printing the
introduction text is use the Assign Next command and the
Poopcount command to assign the user's poopcount to variable
number 0. This is the "Xan0XP" in the message.

After this, the message performs the first comparison:
"Xcm0N0X". This compares the value of variable 0 (which we
just loaded with the user's poopcount) with the number 0.
Then we act on the comparison: "XltgonegativeX" branches to
the label "negative" if the variable 0 contains a value less
than 0. If the value is not less than zero, then display of
the message continues with the next comparison: "Xcm0N100X".
This compares the value of variable 0 with the number 100.
As before, this is acted on with the Less Than command:
"XltgosmallX" branches to the label "small" if the value is
less than 100. This continues similarly, checking for a
value of under 1,000 (which branches to the label "med"),
then a value of under 10,000 (which branches to the label
"large").

If the user's poopcount is 10,000 or greater, then the text
" have a lot of poop!" is displayed. This, when combined
with the "Hey, n, you" that has already been displayed to
the user, creates the full message "Hey, n, you have a lot
of poop!" After the message is displayed, the Goto command
"XgoendX" is used to skip to the end of the message.

At this point in the message, any text entered would never
be displayed. That is because there was an unconditional
Goto just previous: there is no way that this section of the
message will ever be displayed. Because of this, we can
press Enter here and move to the next line (just to keep
things close to readable in the text editor) without having
an effect on the formatted output.

Then we have our first Label: "XlbnegativeX". This gives a
destination to go to when the user's poopcount is less than
0 (remember the first comparison done in the message). This
starts by outputting the text "r poop comes out backwards!"
This, when combined with the first part of the message
already displayed, forms the message: "Hey, n, your poop
comes out backwards!" (You'd understand if your poopcount
was less than 0.) After the message is displayed, the Goto
command "XgoendX" skips to the end of the message.

Again, we are now in a place of the message that will never
be displayed to the user. Because of this, we can start a
new line to keep things close to readable. This new line is
just the label "small" and the rest of the message that
should be displayed to people with a poopcount of less than
100 but not less than 0, followed by a Goto that skips to
the end of the message. This is repeated for people with a
poopcount of less than 1,000 but not less than 100, with the
label "med".

Finally, the label "large" is used for the message to
display to uses with a poopcount of less than 10,000 but not
less than 1,000. At the end of this message, however, we
don't have a Goto command that skips to the end of the
message: we have the "end" Label that we have been skipping
to previously.

At this point, you can enter anything more in the message
that you want to display to all users. However, we just end
the message here, so nothing more is done.

     Wow. More examples.

Applications

You can configure Citadel to make extensive use of
applications (external programs). They can be set up as
doors, which can be accessed through the .Enter Door
(.ED...) command; they can be attached to a room, then
accessed either through the .Enter Application (.EA) command
or automatically when someone enters the room; they can be
accessed through a single-key command from the room prompt,
even overriding internal commands; they can be hooked up to
the message editor menu as external editors or message
filters; they can be used to implement external file
transfer protocols, both for the .Upload (.U...) and
.Download (.D...) commands and for networking; applications
can also be attached to many system events with the #EVENT
keyword in EXTERNAL.CIT.

These applications can be .EXE or .COM programs, DOS batch
files, or Citadel script files. They are set up in different
places, depending on what sort of application they are (file
transfer protocol, door, etc.)


General format
All applications, regardless of where they are set up, have
the same general format: first, 0 or more flags that tell
Citadel how to execute the application, then the file name
for the application, then any command line parameters that
you wish to pass to the application.

The following flags tell Citadel to execute the application
using the following methods:

     !    This tells Citadel to "Super-shell", or swap as
          much of itself as possible out of memory, thus
          giving the application the most memory possible in
          which to run. Citadel leaves less than 1K of
          itself in conventional memory, swapping the rest
          of itself to XMS, EMS, or disk. Swapping to XMS or
          EMS is nearly instantaneous, but swapping to disk
          takes a few seconds.
          
     @    This tells Citadel to not clear the screen before
          running the application, and to not restore the
          screen before returning. This is used to save
          memory if you are not super-shelling and the
          application saves and restores the screen for you:
          an 80x25 text screen takes nearly 4K to save in
          memory. When using the super-shell, this does not
          make any difference, because the memory used to
          save the screen is also swapped out when shelling.
          
     $    This tells Citadel to load COMMAND.COM (or,
          actually, the program pointed to by the COMSPEC
          environment variable) and tell it to process the
          command. This is required to run DOS batch files
          or to redirect program output to a file.
          
     ?    This tells Citadel not to write BBS information
          files (Citadel's native OUTPUT.APL as well as
          CALLINFO.BBS, CHAIN.TXT, DOOR.SYS, DORINFO1.BBS,
          PCBOARD.SYS, TRIBBS.SYS, and USERINFO.DAT) before
          shelling. Writing these files takes some time and
          disk space, but not much. Usually, it does not
          matter if they are written when not needed. But,
          if you are very tight on disk space or running on
          a slow machine, this may make a difference.
          
     *    This tells Citadel that the application is a
          script file, not a program. This overrides all
          other flags. That is, if this flag is present then
          all others are ignored. This is because the other
          flags don't apply to script files. Also, when
          running a script file the command line arguments
          are not passed to it, since script files have no
          command line parameters.
          
After these flags, give Citadel the application file name,
optionally followed by any command line parameters to pass
to the application. For example, the application command to
write the directory listing of your C:\CIT drive to the
C:\LIST.DIR file would be as follows:

     ?$dir c:\cit >c:\list.dir

The "?" flag is included because the DOS DIR command does
not need or use any BBS information files. This is a
performance enhancement only, and is not required. The "$"
flag is used because DIR is a DOS internal command, so it
needs COMMAND.COM to process the command. Even if DIR was an
external command (like CHKDSK), you would need the "$" flag
in this case because COMMAND.COM handles the redirection to
a file specified by the ">c:\list.dir" command line
parameter. Note that this would be entered into a file (such
as CRON.CIT or EXTERNAL.CIT) in quotations, which means that
backslashes would have to be doubled, as explained at the
beginning of Section IV:

     "?$dir c:\\cit >c:\\list.dir"


Special command-line variables
Often, you will want to specify variable information to your
application. For example, the file transfer protocols need
to know which file to send. This is done with command line
variables, which all start with the "%" character. (If you
need to pass the "%" character itself to an application, use
"%%".)

These variables are valid for all applications:

     %a   The application path, as set by the #APPLICPATH
          keyword in CONFIG.CIT. This is the path that
          applications are run from.
          
     %c   The speed of the connection between modems. This
          is a numeric value between 300 and 115200,
          representing the baud rate at which the modems are
          communicating.
          
     %l   The modem port or LOCAL. This is the numeric value
          1-4, depending on which serial port the modem is
          connected to, or the text LOCAL if the current
          user is logged in locally.
          
     %p   The modem port, as set by the #MDATA keyword in
          CONFIG.CIT. This the numeric value 1-4, depending
          on which serial port the modem is connected to.
          
     %s   The speed of the connection to the serial port.
          This is a numeric value between 300 and 115200,
          representing the actual baud rate at which Citadel
          is currently sending data to and receiving data
          from the serial port.
          
     %u   The name of the currently logged-in user, after
          stripping out any color codes. If there is no user
          logged-in, this passes the text "[Not logged in]".
          
If the application is being defined as an external editor,
the following variable applies, in addition to the standard
%a, %c, %l, %p, %s, and %u:

     %f   The file to edit.
          
If the application is being defined as a file transfer
protocol, the following variable applies, in addition to the
standard %a, %c, %l, %p, %s, and %u:

     %f   The file, or files, to transfer.
          
If the application is being defined as an #ARCHIVER in
EXTERNAL.CIT or in a #ZIP line in NODES.CIT, the following
variables apply, in addition to the standard %a, %c, %l, %p,
%s, and %u:

     %f   The name of the archive file.
          
     %d   The name of the file, or files (using wildcards or
          separation by spaces), to extract from the archive
          file. The files should be extracted into the
          current directory.
          
In the preceding three cases, %f may be full path to the
file or just the filename (assumed to be in the current
directory), depending on Citadel's needs at the time. The
application should be able to accept either form.


Defining applications
The following specifies all ways in which an application can
be defined:

     As an #ARCHIVER in EXTERNAL.CIT
          This type of application tells Citadel how to get
          the contents of an archive file, or extract files
          from it. See the EXTERNAL.CIT section in Section
          IV for full information.
          
     As a file transfer #PROTOCOL in PROTOCOL.CIT
          This type of application implements external file
          transfer protocols, such as Kermit, for uploading
          and downloading as well as networking. See the
          PROTOCOL.CIT section in Section IV for full
          information.
          
     As a #DOOR in EXTERNAL.CIT
          This type of application is available as a single
          keystroke from a room prompt, or from the .Enter
          Door (.ED...) command. See the EXTERNAL.CIT
          section in Section IV for full information.
          
     As an #EDITOR in EXTERNAL.CIT
          This type of application implements an external
          message editor or message filter. See the
          EXTERNAL.CIT section in Section IV for full
          information.
          
     As an #AUTO_EDITOR in EXTERNAL.CIT
          This type of application is similar to an #EDITOR,
          but it is always run on every message posted. See
          the EXTERNAL.CIT section in Section IV for full
          information.
          
     As an #EVENT in EXTERNAL.CIT
          This type of application is run every time some
          system event occurs, such as a user logging in or
          uploading a file. See the EXTERNAL.CIT section in
          Section IV for full information.
          
     As a #USERAPP in EXTERNAL.CIT
          This type of application runs every time a
          specific user logs in. See the EXTERNAL.CIT
          section in Section IV for full information.
          
     As a #NEWUSERAPP in CONFIG.CIT
          This type of application is run every time a new
          user logs in. See the EXTERNAL.CIT section in
          Section IV for full information.
          
     As a room application
          This type of application is attached to a room
          with the .Aide Edit room (.AE) command. While in
          the room, the user can use the .Enter Application
          (.EA) command to run the application. Citadel can
          also be told to make the room an auto-application
          room, which means that it will run the application
          every time a user enters the room for the first
          time during a call. See the Room Editing topic in
          this section for full information.
          
     As a #ZIP command in NODES.CIT
          This is used when collecting files together for
          any networking using Net 1.5 or higher. See the
          NODES.CIT section in Section IV for full
          information.
          
     As part of a #LOGIN string in NODES.CIT
          This is used if you want to execute an application
          as part of logging into a remote system during
          networking. See the NODES.CIT section in Section
          IV for full information.
          
     As a SHELL_1 or SHELL_2 #DO type in CRON.CIT
          This is used to execute an application at a pre-
          determined time. See the CRON.CIT section in
          Section IV for full information.
          
     As an application linked to a message
          
          This type of application is attached to a message by
          the sysop-only message editor command Link
          application (!). After Citadel displays a message
          with a linked application, it then runs the
          application.
          

The input and output data files
When Citadel executes an application, it creates BBS
information files in the application directory, unless the ?
or * flags were specified in the application command line.
Citadel creates BBS information files of various standards
to maximize compatibility with doors written for a specific
other BBS program.

The formats created by Citadel are OUTPUT.APL, CALLINFO.BBS,
CHAIN.TXT, DOOR.SYS, DORINFO1.BBS, PCBOARD.SYS, TRIBBS.SYS,
and USERINFO.DAT.

After it is finished executing, it reads in the contents of
INPUT.APL (if such a file exists), and modifies its settings
based on its contents. It then checks for the file
MESSAGE.APL, and uses the information to create a message on
the system. It then displays the contents of README.APL (if
the file exists) to the user of the system, then the
contents of CONSOLE.APL (if the file exists) to the system
console only (not the user on the modem). It then deletes
all above files to clean up.

See Appendix H: Other files for the specifications of these
files, and the values written to various of these files that
are not designed for Citadel.

Help Files

Help files are files that Citadel displays to users to help
them in using the software. Help files fall into three
categories: blurbs, menus, and help files. The blurbs and
menus can only be defined by Citadel, but you can make as
many help files as desired, in addition to those defined by
Citadel. All help files have defaults built into Citadel. If
you want to override the defaults, just create your own
files: Citadel looks for the files on disk before it uses
its built-in files.


Blurbs
If you want to override Citadel's default blurb files, place
them in the directory set by #HELPPATH in CONFIG.CIT. They
all have the extension .BLB and inform the user of
something. Equivalents of these blurbs for users with ANSI
have the extension .BL@. If Citadel cannot find the
appropriate blurb with the .BL@ extension, it uses the .BLB
version. There are no default ANSI blurbs.

If a blurb is said to rotate, then the sequence of rotation
is FILE.BLB, FILE1.BLB, FILE2.BLB, etc. When the next file
in sequence is not found, it is reset to FILE.BLB. You can
have a different number of ANSI (.BL@) and normal (.BLB)
blurbs; they will rotate at their own rate. If you want to
use this feature, you must override the default: if there is
no FILE.BLB, Citadel will just use the default one built
into it, and not even look for FILE1.BLB.

     AD######.BLB
          This is displayed at the room prompt, at times
          defined by the #ADCHANCE and #ADTIME keywords of
          CONFIG.CIT. This is a rotating blurb.
          
     ADDRESS.BLB
          This is displayed when the user presses the ? key
          when Citadel is prompting for his mailing address.
          
     BULLETIN.BLB
          This is displayed after the user logs in and
          before new messages in Lobby are displayed. This
          is a good place to give user important news about
          the BBS. If you have a bulletin menu defined in
          your CTDL.MNU file (see the Menus section below
          for information about menus), then this blurb is
          not displayed.
          
     CALLIMIT.BLB
          This is displayed when the user presses the ? key
          when setting a user's call-per-day limit with the
          .Sysop Userlog edit (.SU) command.
          
     CENSOR.BLB
          This is displayed whenever a message is posted
          that the BBS censors because the sysop has
          specified message censoring in EXTERNAL.CIT; see
          the Message Censoring topic in this section for
          full information.
          
     CHAT####.BLB
          This is displayed when the sysop enters chat with
          the user. This is a rotating blurb.
          
     CHATTED.BLB
          When #CHATMAIL in CONFIG.CIT is set to 2, this is
          displayed when a user who has requested chat
          terminates. After this is displayed, Citadel asks
          if he wants to leave a message to the sysop.
          
     CLOSESYS.BLB
          This is displayed to users requesting access to a
          closed system, as set by "#LOGIN CLOSED_SYSTEM" in
          CONFIG.CIT. After this blurb is displayed, the BBS
          will hang-up on the user. Use this to inform the
          user that you are not accepting new callers.
          
     COLORS.BLB
          This is displayed when the user presses the ? key
          when prompted to enter a color's number.
          
     DIALOUT.BLB
          This is displayed when the console user goes into
          dial-out mode by pressing F8 when the modem does
          not have a connection.
          
     DISCLAIM.BLB
          This is displayed when a user turns on the display
          of censored messages with the .Enter Configuration
          (.EC) command.
          
     ENCRYPT.BLB
          This is displayed when the user presses the ? key
          when prompted to enter a message encryption or
          decryption key.
          
     ENTERNYM.BLB
          This is displayed when the user presses the ? key
          when using the .Enter Name (.EN) command.
          
     ENTRY.BLB
          This is displayed when a user in non-expert mode
          enters a message. This is a good place to inform
          users about the Citadel message editor.
          
     GOODBYE.BLB
          This is displayed when the user runs out of time
          on systems with accounting enabled. After this
          message is displayed, the BBS will hang up on the
          user.
          
     HELLO###.BLB
          This is displayed when the BBS detects carrier,
          before the user logs in. This is a rotating blurb.
          
     JOKE####.BLB
          If present, this is displayed after the bulletin
          blurb, before Citadel builds message counts. If
          there is no JOKE.BLB file, Citadel displays "One
          moment please..." at this time. JOKE.BLB files are
          special in that they are not all output at once:
          before the pause when Citadel builds the message
          counts, Citadel prints out all lines of the file
          up to the first one that starts with the "#"
          character. After the pause, all lines after the
          first one that starts with the "#" character are
          printed out. This gives users something to think
          about while Citadel takes time to count messages.
          This is a rotating blurb.
          
     LENGTH.BLB
          This is displayed when the user presses the ? key
          when setting lines per screen with the .Enter
          Configuration (.EC) command.
          
     LOGOUT##.BLB
          This is displayed when the user issues the command
          to log out, before the BBS hangs up. This is a
          rotating blurb.
          
     MOREPRMP.BLB
          This is displayed when the user presses the ? key
          when setting a more prompt with the .Enter
          Configuration (.EC) command.
          
     MSGNYM.BLB
          This is displayed when the user presses the ? key
          when using the .Aide Name messages (.AN) command.
          
     NETPREFX.BLB
          This is displayed when the user presses the ? key
          when setting a new prefix with the .Enter
          Configuration (.EC) command.
          
     NEWMSG.BLB
          
          This is displayed to new users before they enter a
          message to sysop when "#LOGIN SYSOP_MESSAGE" is
          set in CONFIG.CIT.
          
     NEWQUEST.BLB
          This is displayed to users before asking the
          questions enabled by #NEWUSERQUESTIONS in
          CONFIG.CIT.
          
     NEWROOM.BLB
          This is displayed when a user in non-expert mode
          creates a room.
          
     NOANSWER.BLB
          This is displayed to users who have requested chat
          when the sysop does not respond to the request.
          
     NOCHAT##.BLB
          This is displayed to users requesting chat when
          chat is turned off, either for the system or for
          the user. This is a rotating blurb. The rotation
          is reset when a user logs in, so you can have the
          blurbs in a progressive sequence, hinting that you
          really are not around to chat.
          
     NOLOGIN.BLB
          This is displayed when a user is not able to log
          in for accounting reasons on systems with
          accounting enabled.
          
     NOROUTE.BLB
          This is displayed when Citadel cannot find the
          ROUTE.CIT file when trying to send networked mail.
          Why is this a blurb and not just a simple message?
          I don't know.
          
     NULLS.BLB
          This is displayed when the user presses the ? key
          when setting the number of nulls with the .Enter
          Configuration (.EC) command.
          
     NUMUSERS.BLB
          This is displayed when the user presses the ? key
          when setting the number of users to display on log-
          in with the .Enter Configuration (.EC) command.
          
     PASSWORD.BLB
          This is displayed to new users immediately before
          their name is requested. You can use this to give
          them some information about what you like for
          names: pseudonyms, full names, only first names,
          etc.
          
     PHONENUM.BLB
          This is displayed when the user presses the ? key
          when being prompted for a phone number.
          
     PROMPT.BLB
          This is displayed when the user presses the ? key
          when setting the room prompt format string with
          the .Enter Configuration (.EC) command.
          
     REALNAME.BLB
          This is displayed when the user presses the ? key
          when being prompted for a real name.
          
     RESUME.BLB
          
          This is displayed when a user logs in after losing the
          connection to the BBS while entering a message
          during the previous call: it informs the user of
          the situation so he can decide whether to continue
          entering the message.
          
     TEXTUP.BLB
          This is displayed to users not in expert mode when
          they issue the command to start a text upload.
          
     TIME.BLB
          This is displayed when the user presses the ? key
          when setting a time/date format string with the
          .Enter Configuration (.EC) command.
          
     TOOLOW.BLB
          This is displayed when a connection is made at a
          speed slower than the #MINBAUD setting in
          CONFIG.CIT. The BBS hangs up after displaying this
          blurb.
          
     TOOMANY.BLB
          
          This is displayed to users who have called more times
          in one day than their limit allows, as set with
          #CALLLIMIT in CONFIG.CIT or with the .Sysop
          Userlog edit (.SU) command.
          
     UNLINK.BLB
          This is displayed when the user presses the ? key
          when using the .Aide Unlink (.AU) command.
          
     USERINFO.BLB
          This is displayed to new users as soon as they
          request access. You can give general information
          about your BBS in this blurb.
          
     VERIFIED.BLB
          This is displayed when unverified users try to log
          in.
          
     WCDOWN.BLB
          This is displayed to non-expert users when they
          request a download.
          
     WCUP.BLB
          
          This is displayed to non-expert users when they request
          an upload.
          
     WIDTH.BLB
          This is displayed when the user presses the ? key
          while setting the screen width with the .Enter
          Configuration (.EC) command.
          
     WOWCOUNT.BLB
          This is displayed when the user presses the ? key
          when using the .Wowcount (.W) command.
          

Menus
Citadel's menus are all kept in the file CTDL.MNU in the
path set by #HELPPATH in CONFIG.CIT. An optional file,
CTDL.MN@, can be used to define ANSI menus. If a menu is not
found in CTDL.MN@, Citadel will display the menu from
CTDL.MNU. If the menu is not defined in CTDL.MNU, Citadel
will use a default menu built into the program.

These menu files are text files, with separator lines in
between sections to let Citadel know which section belongs
to which menu. These lines start with the "#" character and
are followed by the menu's name. For example, a line "#AIDE"
starts the Aide section of the menu file. The section ends
when another section begins. The following menus are used by
Citadel:

     #AIDE
          This is displayed when the .Aide Menu (.A?)
          command is used.
          
     #AIDEQUEUE
          This is displayed when the .Aide Queue Menu (.AQ?)
          command is used.
          
     #BULLETINS
          This is an optional menu. If it is not present,
          the BULLETIN.BLB file is displayed when a user
          logs in. If it is present, then it is used instead
          of the BULLETIN.BLB file. Because this is
          optional, there is no default for this menu.
          
          This menu is displayed line-by-line like other
          menus, except for lines that start with the "!"
          character. In this case, Citadel reads the line to
          determine what to do. The format for such lines is
          as follows:
          
               !filename character description show
          
          filename is the name of the file to display for
          this bulletin.
          
          character is the character to use to display this
          bulletin.
          
          description is the name of this bulletin, as shown
          to users.
          
          show can either be 1 or 0: if it is 1, then
          Citadel formats a prompt for this menu
          automatically. If it is 0, then no such prompt is
          formatted, allowing you to make as fancy a menu as
          you desire.
          
          For example, the following line describes a
          bulletin for showing system news:
          
               !news.txt s "System News" 1
          
          Because "show" is set to 1, Citadel will display
          the following:
          
               S> System News
          
          After the menu is displayed to the user, Citadel
          prompts for which bulletin to read.
          
     #CRON
          This is displayed when the .Sysop Cron Menu (.SC?)
          command is used.
          
     #DOOR
          This is displayed when the .Enter Door Menu (.ED?)
          command is used. If this menu does not exist, then
          Citadel creates a menu based on the doors that
          have been set up in EXTERNAL.CIT.
          
     #DOWNLOAD
          
          This is displayed when the .Download Menu (.D?) command
          is used when there is no file queue defined. If
          this menu does not exist, then Citadel creates a
          menu based on the file transfer protocols that
          have been set up in PROTOCOL.CIT.
          
     #EDIT
          This is displayed when the Menu (?) command is
          used at the "Entry Command:" prompt of the message
          editor.
          
     #EDITTEXT
          This is displayed when the Menu (?) command is
          used at the "Entry Command:" prompt of the text
          editor when not entering a message (currently,
          only when editing a finger).
          
     #ENTERWC
          This is displayed when the .Enter With protocol
          Menu (.EW?) command is used.
          
     #ENTOPT
          
          This is displayed when the .Enter Menu (.E?) command is
          used.
          
     #FILEQUEUE
          This is displayed when the .Queue Menu (.Q?)
          command is used, if file queuing is enabled. See
          #PROTOCOL in PROTOCOL.CIT for information
          regarding file queuing.
          
     #FINGER
          This is displayed when the .Finger Menu (.F?)
          command is used.
          
     #GRPGLOB
          This is displayed when the .Sysop Group Group-
          specific membership Menu (.SGG?) command is used.
          
     #HELP
          This is displayed when the .Help Menu (.H?)
          command is used. If this menu does not exist,
          Citadel looks in the path set by #HELPPATH in
          CONFIG.CIT for all files with a .HLP extension,
          and lists these to the user. Citadel will also
          list any help files built into it that are not in
          the help path.
          
     #INVITE
          This is displayed when the .Invite Menu (.I?)
          command is used.
          
     #KNOWN
          This is displayed when the .Known Menu (.K?)
          command is used.
          
     #MAINDOT
          This is displayed when the .Menu (.?) command is
          used.
          
     #MAINOPT
          This is displayed when the Menu (?) command is
          used.
          
     #PERSONAL
          This is displayed when the .Personal hall Menu
          (.P?) command is used.
          
     #PERSONALADD
          This is displayed when the .Personal hall Add Menu
          (.PA?) command is used.
          
     #READOPT
          This is displayed when the .Read Menu (.R?)
          command is used.
          
     #READWC
          This is displayed when the .Read With protocol
          Menu (.RW?) command is used.
          
     #RESPONSEDOWNLOAD
          This is displayed when the .Queue Download Menu
          (.QD?)  command is used, or when the .Download
          Menu (.D?) command is used when a file queue has
          been defined. If this menu does not exist, then
          Citadel creates a menu based on the file transfer
          protocols that have been set up in PROTOCOL.CIT.
          
     #SYSENTER
          
          This is displayed when the .Sysop Enter config file
          Menu (.SE?) command is used.
          
     #SYSGROUP
          This is displayed when the .Sysop Group Menu
          (.SG?) command is used.
          
     #SYSHALL
          This is displayed when the .Sysop Hall Menu (.SH?)
          command is used.
          
     #SYSNET
          This is displayed when the .Sysop 6.9 net command
          Menu (.S6?) command is used.
          
     #SYSOP
          This is displayed when the .Sysop Menu (.S?)
          command is used.
          
     #SYSTABLE
          This is displayed when the .Sysop Table debugging
          Menu (.S+?) command is used.
          
     #TERMINATE
          This is displayed when the .Terminate Menu (.T?)
          command is used.
          
     #UPLOAD
          This is displayed when the .Upload Menu (.U?)
          command is used. If this menu does not exist, then
          Citadel creates a menu based on the file transfer
          protocols that have been set up in PROTOCOL.CIT.
          
     #VOLKSWAGEN
          This is displayed when the .Volkswagen Menu (.V?)
          command is used.
          

Help files
Citadel has several help files built into it, all of which
can be overridden by including a file by the same name in
the path set by #HELPPATH or #HELPPATH2 in CONFIG.CIT. In
addition, you may add as many more help files as you want
just by including files with the .HLP extension in #HELPPATH
or #HELPPATH2. Users may read any of these help files by
using the .Help (.H) command followed by a filename. A list
of help files is available by pressing ? instead of
providing a filename. The following help files are included
in Citadel:

     ACCOUNT.HLP
          The internal version declares that there is no
          accounting enabled on the BBS. If you enable
          accounting on your board, you should create your
          own ACCOUNT.HLP that details what you charge for
          and give time for.
          
     AIDE.HLP
          This explains all Aide-level commands.
          
     ANSI.HLP
          This explains Citadel's support of ANSI and its
          own special color codes.
          
     CONFIG.HLP
          This explains all options available for users to
          configure their userlog entry with the .Enter
          Configuration (.EC) command.
          
     DOHELP.HLP
          This gives a brief overview of the system. It is
          displayed when the user uses the Help (H) command.
          
     DOORS.HLP
          This explains how to access doors.
          
     FILES.HLP
          This explains how to upload and download files.
          
     GROUPS.HLP
          This describes groups and how they are used.
          
     HALLS.HLP
          This describes halls and tells how they are used.
          
     HELP.HLP
          This describes the help system.
          
     INTRO.HLP
          
          This gives an introduction to Citadel. This is also
          displayed when the user uses the Information (I)
          command.
          
     LOGIN.HLP
          This describes logging in.
          
     MESSAGES.HLP
          This describes messages.
          
     NETWORK.HLP
          This describes how to use the Citadel network.
          
     QUEUE.HLP
          This describes how to use file queuing.
          
     ROOMS.HLP
          This describes rooms.
          
     ROOMSYS.HLP
          This explains what a room system is.
          
     SPECIAL.HLP
          
          This explains some special commands. How a command
          comes to be regarded as special is beyond me.
          
     SPELL.HLP
          This describes the internal spell checker.
          
     SYSOP.HLP
          This explains all Sysop-level commands.
          
Networking

Citadels can share messages and files with each other. This
is called networking. Citadel+ can network with many other
versions of Citadel: all versions of Citadel derived from
DragCit share a common networking protocol. Citadel+ also
supports networking with Citadel-86 compatible software that
supports the MSGOUT and MSGADD utilities. In addition,
Anticlimactic Teleservices has significantly enhanced the
networking protocols, so networking with other Citadel+es is
faster, easier, and more reliable than netting in the "old
style" way with the other Citadels. Citadel+ has also added
file transfers to the basic message-only netting provided by
the other Citadels.

You can set up a network with just one or two other boards,
so a few friends can have their own message and file passing
system, or you can hook onto the main network of DragCit-
derived Citadels, which spans the country. Most of the nodes
listed in Appendix E are on this network, so you can check
it for a possible connection to the network. The
Anticlimactic Teleservice at (206)562-9792 is a good place
to pick up a network connection: create a node account, then
leave mail to "Sysop" giving your node's address and request
to be given network access.


General information
Some things are the same across all the network revisions.
Each node has to have an account on all the boards with
which it networks, and at least one of them has to call the
other. Also, a file named NODES.CIT contains additional
information about the remote node that is needed for
networking. Here are the basic procedures to start a network
of any protocol, using two hypothetical BBSes named NODE1
and NODE2.

First, create an account on the remote BBS. That is, create
an account on NODE1 called "NODE2", and create an account on
NODE2 called "NODE1". These are created like any other
accounts: log in with new initials and password.

Second, mark these accounts as Node accounts with the Node
(O)  option of the .Sysop Userlog edit (.SU) command. When
you set the Node option, Citadel requests the node's
address. See Appendix I for information on selecting your
address. Wow. Appendix I has been removed, I think.

Now, decide which node is going to call the other. (Both can
call each other. This makes for the best netting, but if
only one sysop wants to pay for a long distance net, only
one should make the call, of course.) On each BBS that is
going to be calling, add the following line to the file
CRON.CIT:

     #DO  NETWORK "Other Board"
     
"Other Board" is the name of the other BBS (NODE1 or NODE2).

At this point, the procedure differs for each of the
supported network protocols, and is explained in the
appropriate section below.


DragCit 1.0/1.1: The oldest and slowest
Versions 1.0 and 1.1 of the network protocol are essentially
the same. Actually, there is some dispute as to whether
there is any difference, or if 1.1 even exists. Regardless
of its name, it is the original network protocol of DragCit.
As the original, it is the one that is in all DragCit
derived software. However, also because it is the original,
it is the least desirable of the methods. (Other methods
wouldn't be implemented unless they were better.) Only use
it if the other node cannot use anything newer.

To set up this type of networking, add the following lines
to the NODES.CIT file for the remote BBS:

     #NODE          "node_name" "node_region"
     #PHONE         "node_phone"
     #BAUD          300...115200
     #DIAL_TIMEOUT  seconds to wait for CONNECT from modem
     #LOGIN         see below
     #WAIT_TIMEOUT  seconds to wait for a "W" in the #LOGIN
                    string, as explained below.
     #NETWORK       DRAGCIT1_1
     #PROTOCOL      protocol used, as specified in
                    PROTOCOLS.CIT. This must be a batch
                    protocol.
     
The #LOGIN line is a simple script to follow to log into the
remote BBS. The available commands are:

     D "protocol" "path" "file"
          Download. protocol is the file transfer protocol
          to use (as set in PROTOCOL.CIT); path is the path
          that the downloaded file should end up in; and
          file is the name of the file. If protocol is a
          batch protocol, then file is ignored, but it still
          needs to be there.
          
     P "time"
          Pause. time is the number of seconds to pause.
          
     R "text" "send" "tries"
          Repeat. This is a combination of Send and Wait.
          This waits for text to come in over the modem for
          #WAIT_TIMEOUT (as set in NODES.CIT) seconds. If it
          is not received in that time, it sends the text
          send to the modem, and starts waiting again. It
          does this tries times before giving up and
          aborting the script.
          
     S "text"
          Send. text is the text to send to the modem.
          
     U "protocol" "path" "file"
          Upload. protocol is the file transfer protocol to
          use (as set up in PROTOCOL.CIT); path is the path
          that the downloaded file should end up in; and
          file is the name of the file. If protocol is a
          batch protocol, then file may contain wildcards or
          multiple filenames, separated by spaces.
          
     W "text"
          Wait. text is the text to wait to come in over the
          modem. If the text does not appear in
          #WAIT_TIMEOUT (as set in NODES.CIT) seconds, the
          script is aborted.
          
     ! "cmd"
          
          Shell. cmd is the command line to shell to. All
          standard Citadel flags are available here, as
          explained in the Applications section.
          
     @ "script"
          This tells Citadel to read the text file specified
          by "script" and interpret it as more of the #LOGIN
          command. Citadel reads each line in this file, so
          it can have any number of #LOGIN commands.
          
For example, you usually will wait for the prompt
"initials:" and send your node's initials and password. This
would be accomplished by the following line:

     #LOGIN W "initials:" S "initials;password\r"
     
The "\r" is interpreted as a return; see the beginning of
Section IV: Configuration Files for more special characters
you may use.

Then, choose if you want to share any groups between the two
nodes. This is done by adding #GROUP lines to the NODES.CIT
file, as follows:

     #GROUP "name_here" "name_there"
     
If the group is named the same on both nodes, you only need
to supply the name_here field.

Then, choose which rooms you want to share messages in. Each
room must be marked as "shared" on each system, and the node
must be in the proper groups to access the rooms. Then, make
a line for each room as follows:

     #ROOM "name_here" "name_there"
     
As with the #GROUP lines, only one name has to be specified
if the room name is the same on both nodes.

The biggest thing to watch out for with Net 1.0/1.1 is
improper room matching. Make sure both sysops agree which
rooms to net, and make sure to net them both ways. Also,
cross netting is easy to do by accident, and can be quite a
pain to figure out. Make sure you have the room names
correctly entered in the NODES.CIT file.

Wow. Some conclusion.


DragCit 1.5/1.6: Faster, but still messy
One of the biggest bottlenecks in Net 1.0/1.1 is the file
transfer: it transfers each room as a separate file and the
file must be there even if it is zero bytes long. When
netting more than a few rooms, the overhead of sending many
short files is quite large.

Also, there is significant time wasted as each system waits
for the other. One system requests the rooms, then waits for
the other system to prepare the message files to send back.
Once the messages are passed in that direction, the order is
reversed: the second system requests rooms from the first
system and has to wait for it to prepare the message files
to send back.

In addition to all of this, the files are sent in raw ASCII
form, so the files are bigger than they need to be.

Net 1.5 solves these problems by switching the order the
files are sent, and by compressing the message files before
sending them.

The order is switched so that both room requests are sent
first, so both systems are fetching the messages at the same
time. The total time spent fetching messages, therefore, is
the length of time spent by the slower of the two systems,
not the sum of both lengths.

After the message files are created, they are compressed
into one file by some archival program. To tell Citadel
which one to use, add a #ZIP line to the NODES.CIT file as
follows:

     #ZIP "compress_cmd" "decompress_cmd"
     
When creating the command lines, use %d in place of the
resulting file name. For the compress command, use %f for
the original file name. (Make sure the compressor can handle
more than one file name and make use of wildcards: Citadel
will send "room.* mesg.tmp" as the file name.) To use PKZIP,
for example, use the following line:

     #ZIP           "pkzip %d %f" "pkunzip -o %d"
     
Make sure the programs are either in the #APPLICPATH or on
the DOS PATH so Citadel can find the programs to run.

In addition to the #ZIP line in NODES.CIT, the only other
addition to make to distinguish from Net 1.0/1.1 is the
#NETWORK line. Use either:

     #NETWORK DRAGCIT1_5
     
or

     #NETWORK DRAGCIT1_6
     
Net 1.5 and 1.6 are almost identical. 1.6 is a little bit
more robust, so use it if the remote BBS software supports
it.


Net 6.9: Citadel networking at its best (so far)
Wow. More proofreading.

As mentioned earlier, the biggest problem with the network
up to this point is in cross netted and one-way netted
rooms. It was hard to add a room to the network, as every
connection had to add the appropriate #ROOM lines to the
NODES.CIT file on both sides. If only one sysop remembered
to do it, a one-way net would develop. Worse, the room names
are up to each sysop's fancy, so cross-netting could develop
quite easily: it was hard to keep track of what each sysop
has named a room.

Net 6.9 solves these problems by using Net IDs instead of
room names to keep track of netted rooms. Net IDs are
consistent across the network, so there is no possibility of
crossing rooms. Net IDs are kept in the ROOM.DAT file, and
are set with the .Aide Edit room (.AE) command.

When networking, Citadel generates a room request file with
all the Net IDs on the BBS. This eliminates the need for
#ROOM lines in the NODES.CIT file, so networking is much
easier to maintain, and more reliable: there is no
dependence on sysops to verify that all rooms that can
network do network, as it is done automatically by Citadel.

To be able to use Net 6.9, you must first create a "Default"
node in NODES.CIT. This entry sets how packets should be
incorporated that came from nodes that your system could not
identify. (It also sets the defaults for items in NODES.CIT,
which apply to all other nodes in the file if there are no
overrides for them.)

Then set the #NETWORK keyword for the node to NET6_9, and
Citadel will know to use Net 6.9 when networking with that
node. The protocol specified by #PROTOCOL needs to be a bi-
directional protocol. If you need (or prefer) to use a
unidirectional protocol, set #NETWORK to NET6_9a, and make
sure your network partner does so as well.

Several keywords were added to the NODES.CIT file to help
with Net 6.9. Of these, two important ones are #AUTOROOM and
#VERBOSE. The reason for these two is that Citadel will
request all rooms it carries from the remote node whether it
has them or not; it has no way of knowing which rooms are
available. This creates both a problem and an opportunity.

The problem is that the error messages in Aide) can be very
long if the remote node requests many rooms not carried
locally. By setting #VERBOSE, you can specify which error
and status messages are created. Valid values are as
follows:

     All            Show all error and status messages.
                    
     File69In       Tell when an incoming network file
                    transfer is received.
                    
     File69InFull   Tell when an incoming network file
                    transfer is received, and give full
                    information about it.
                    
     NetIDNotFound  Tell when a Net ID is requested that is
                    in NETID.CIT but does not exist on the
                    system.
                    
     NoAccess       Tell when a node attempts to access a
                    room that it cannot.
                    
     NoNetIDOnSystem     I don't know.
                    
     RoomCreated    Tell when a room is created with
                    #AUTOROOM.
                    
     RoomNotCreated Tell when a room could not be created
                    with #AUTOROOM: a room by that name
                    already exists, or there is no more
                    space for new rooms.
                    
Citadel allows you to choose any of these you want.
Additionally, if you choose "All" to turn them all on, you
can then turn any off that you do not want on by placing an
exclamation mark ("!") before it. For example, to turn on
all messages except NetIDNotFound, use:

     #VERBOSE All !NetIDNotFound
     
To turn all messages off, specify #VERBOSE followed by no
options. The default is File69In.

As the both name and some of the settings for #VERBOSE
imply, Citadel can create networked rooms automatically with
#AUTOROOM. If #AUTOROOM is set to 1, any unknown room
requested by another node is first checked against the file
NETID.CIT. If its Net ID is not in this file, then it is
created and placed in the Maintenance hall. The Net ID is
then appended to NETID.CIT. The sysop can then decide
whether to keep the room and add it to an appropriate hall,
or to kill the room. Because the NETID.CIT file is checked
and updated as it is, a room will only be created by
#AUTOROOM once; if the room is killed, it will not be re-
created, as its Net ID is already in the NETID.CIT file.

More control over rooms created by #AUTOROOM is provided by
two more NODES.CIT keywords: #AUTOHALL and #AUTOGROUP. By
setting #AUTOHALL for a node, you can specify a hall you
wish rooms to be placed in, in addition to Maintenance.
Similarly, #AUTOGROUP lets you specify a group to assign to
all rooms created by #AUTOROOM.

Another important new keyword is #REQUEST. If you want to
get all rooms from the other board that you have access to,
set #REQUEST to 0. This will ensure that you always get all
new rooms from the other board. This is most often used by
boards that run as network hubs, to ensure that they get all
rooms. If, as is most often the case, you want to only carry
some of the rooms, set #REQUEST to 1 (this is the default).
This will make Citadel send a room request file to the other
node with each network packet. You can tell Citadel to send
a room request file with every nth packet by setting
#REQUEST to that number, but there really is no good reason
to do that. Just another case of Citadel over-engineering,
really. (Well, there are some extreme cases when this could
be helpful in a minor way, but you would have to be trying
hard to make this the case.)

However, Net 6.9 is more than just a better way to share
messages. One of the added benefits is that of file
transfers, though it is a bit rudimentary. To transfer a
file to another node that you directly net with, create a
file named FILE69.xxx, where xxx is the other node's alias,
and put it in your #TRANSPATH, as defined in CONFIG.CIT.
This file should be created in the same way as network
packets as specified by the #ZIP keyword in NODES.CIT
(usually by using PKZIP.) When Citadel next creates a packet
to send to the other node, it will include this file in the
packet. When the other node receives the packet, it will see
this file and extract it into #DLPATH using the command
specified by the #ZIP keyword. If it sees any FILE69.* files
in #DLPATH after this, it will copy them to #TRANSPATH. In
this way, you can pass files through many boards to get to
your destination.

For example, if you want to get a file to a board ZZZ, but
you don't net with ZZZ, you can send that file to the board
in steps. Assume that you net with board XXX, which nets
with board YYY, which nets with board ZZZ. To transfer the
file, therefore, you will need to send it to XXX, which will
need to send it to YYY, which will need to send it to ZZZ.
To do this, you would do the following:

     1.   Create FILE69.ZZZ, which contains the files you
          want to get to ZZZ.
          
     2.   Create FILE69.YYY, which contains FILE69.ZZZ. You
          can then get rid of FILE69.ZZZ.
          
     3.   Create FILE69.XXX, which contains FILE69.YYY. You
          can then get rid of FILE69.YYY.
          
     4.   Place FILE69.XXX in your #TRANSPATH.
          
Then, when you network with XXX, you will send it
FILE69.YYY, which it will then pass on to YYY, which will
take FILE69.ZZZ out of it and pass it on to ZZZ, which will
then extract the files you wanted to send to it.

Note that not only is this far from easy, it is also far
from fail-safe. Because the file names are not unique, your
transfer might not make it through if another file transfer
comes through and overwrites your file. This is one area
tagged for future improvement.

One of the other benefits of Net 6.9 is that the process of
creating network packets, transferring them, and
incorporating them, is all separate. Usually, you will just
use the default setup, which does it all together as in
previous network protocols. However, there are times when it
is beneficial to take control, and specify that the
networking happens in some other order.

The most common of these is the case of long distance
networking: by the default setup, all message fetching is
done while the BBSes are connected. Usually, this is not
much of a problem. However, when the connection costs money,
things are different.

To facilitate pre-fetching (that is, fetching the messages
before the connection is established), use the NET69_OUT
command in CRON.CIT. Have this event run once every four
hours or so, and there will be a packet waiting to be sent
when the connection to the other BBS is established. If
there are one or more packets waiting to be transferred,
Citadel will not fetch more messages, but instead just send
the packets it has already created. This behavior can be
modified with the #FETCH command in NODES.CIT.

Another reason that you might want to deviate from the
standard networking model is if you have two BBSes running
on the same computer, one as a sub-board of the other, or on
two computers connected by a LAN, or able to transfer files
between the two in some other way. If you have two computers
that each run a BBS that can access a shared directory over
a LAN, for example, an efficient method to network them is
to have the systems share a common #TRANSPATH. Have each
system fetch once every hour or so, which will then have it
dump a packet into the #TRANSPATH. Also have a NET69_IN
command in CRON.CIT that runs once every hour or so, to pick
up packets that are sitting in #TRANSPATH waiting for it.

There are plenty of other reasons that you might want to
create network packets separate from sending them to the
other BBS immediately, some that have been thought of
already and some that have not. Experiment.

In addition to using commands in CRON.CIT to facilitate
networking, the .Sysop 6.9 net command (.S6...) commands let
you do things manually. The available sub-commands of this
command are:

     F    Fetch. This will create a network packet for the
          node you specify.
          
     I    Incorporate.  This will incorporate all incoming
          network packets that are on the local system.
          
     R    Room request.  This will generate a room request
          file for the specified node. You can then read
          through it and see which rooms you are requesting.
          

Citadel-86 compatible networking
Citadel+ can also network with systems that support the
Citadel-86 method of networking. The Citadel-86 (or
compatible system, such as Citadel-68K) needs to use the
utility MSGOUT to create a packet that Citadel+ can read,
and MSGADD to read packets that Citadel+ writes.

     Wow.

Time and Date Formatting

Citadel stores all times internally in Greenwich Mean Time
(GMT). This means that times come over the network correctly
set; if a user on the east coast was to leave a message at
1:00pm, for example, a BBS on the west coast will know that
is 10:00am in its time zone. Citadel also computes daylight
saving time, and adjusts the time zone as appropriate.

Citadel's date stamps can be configured by the user to suit
his preferences. In addition, #DATESTAMP and #VDATESTAMP in
CONFIG.CIT provide date stamps for when there is no user
logged-in. These are also used as defaults for new users,
unless overridden with the #DSTAMP and #VDSTAMP keywords in
DEFUSER.CIT.


The TZ environment variable
Before you run Citadel, you should set your time zone with
the TZ environment variable. Do this from the DOS command
prompt as follows:

     C:\>set TZ=XXX#YYY
     
The meanings of XXX, #, and YYY are as follows:

     XXX  Time zone name.
          
     #    Number of hours difference from GMT when not in
          daylight saving time.
          
     YYY  Daylight saving time zone name.
          
For example, use the following command if you are in the
Pacific time zone (the west coast of the United States):

     C:\>set TZ=PST8PDT
     
This names the time zone as PST, tells Citadel that it is
eight hours behind GMT, and that during daylight saving time
to call the time zone PDT. If there is no TZ environment
variable set, the default is Eastern Time (the east coast of
the United States).


Time/date format strings
When setting #DATESTAMP, #VDATESTAMP, #DSTAMP, or #VDSTAMP,
or when a user sets his date stamp with the .Enter
Configuration (.EC) command, use the following variables:

     %a   abbreviated weekday name (Sun, Mon, Tue...)
          
     %A   full weekday name (Sunday, Monday, Tuesday...)
          
     %b   abbreviated month name (Jan, Feb, Mar...)
          
     %B   full month name (January, February, March...)
          
     %c   standard date and time string. Wow.
          
     %d   day-of-month as decimal (1-31)
          
     %D   day-of-month as decimal (01-31)
          
     %H   hour (00-23)
          
     %I   hour (01-12)
          
     %j   day-of-year as a decimal (001-366)
          
     %m   month as decimal (01-12)
          
     %M   minute as decimal (00-59)
          
     %p   locale's equivalent of AM or PM
          
     %S   second as decimal (00-59)
          
     %U   week-of-year, Sunday being first day of week (00-
          52)
          
     %w   weekday as a decimal (0-6, Sunday being 0)
          
     %W   week-of-year, Monday being first day of week (00-
          52)
          
     %x   standard date string. Wow.
          
     %X   standard time string. Wow.
          
     %y   year in decimal without century (00-99)
          
     %Y   year including century as decimal (1900-)
          
     %Z   time zone name (as set with TZ; see above)
          
     %%   the percent sign
          
If there are any #HOLIDAY lines in the EXTERNAL.CIT file,
they will show up in place of the "%x" variable.

Scroll-Back Buffer

To create a scroll-back buffer, add the following line to
the CONFIG.CIT file:

     #SCROLL_BACK color_flag num_lines time_out
     
     color_flag     This is either 0 or 1. 0 means don't
               save color to the scroll-back buffer and 1
               means to save colors. Saving the color
               information is visually appealing, but takes
               more memory, so you are not able to save as
               many lines.
               
     num_lines This is the number of lines to save. In the
               Regular version with a standard 80-column
               display, you can save 408 lines if color_flag
               is 1 and 818 lines if color_flag is 0. You
               can save fewer lines on a wider (such as 132-
               column) display, but I don't know how many
               right off. Basically (as this is a goofy
               Intel-based segmented architecture machine),
               you get up to 64K to play with. You do the
               math. You can just set this to some
               impossibly high number like 9999 and let
               Citadel compute the maximum for you if you
               want.
               
               The Auxmem version stores the scroll-back
               buffer in EMS, XMS, or virtual memory, so
               this limit does not apply.
               
     time_out  This is the number of seconds you can be idle
               in the scroll-back buffer before you are
               kicked out. While using the scroll-back
               buffer, nothing else works: users cannot log
               in; the screen saver will not turn on; cron
               events won't execute. If you set this to 0,
               you will never time out. This is a good way
               to disable the board if you want...
               
When running Citadel, use the Alt+K key combination to
activate the scroll-back buffer. When the scroll-back buffer
is active, the following commands are available:

     B         Search for text backwards in the buffer from
               the current position.
               
     G         Go to a specified line in the buffer.
               
     S         Search for text forward in the buffer from
               the current position.
               
     W         Write text from the buffer to a file on disk,
               starting at the top of the current screen.
               
     Cursor Up Move one line farther back into the buffer.
               
     Cursor Down    Move one line forward in the buffer.
               
     PgUp      Move one screen farther back into the buffer.
               
     PgDn      Move one screen forward in the buffer.
               
     Home      Move to the beginning of the buffer.
               
     End       Move to the end of the buffer.
               
     Esc       Return to normal operation.
               
Note:     Even when #BIOS is set to 1, the buffer uses
     direct screen writes when being displayed.
     
Spell Checker

Citadel has a spell checker built into its internal message
editor. The default dictionary to use is found in #LEXPATH
and its name is defined by the #DICTIONARY keyword, both set
in CONFIG.CIT, but the name can be overridden on a room-by-
room basis using the .Aide Edit room (.AE) command.

The default #DICTIONARY is ENG-AM.DAT (American English),
which is also the only dictionary that Anticlimactic
Teleservices provides currently. You can create your own
dictionary by using CTDL -O or Control+F6, G and selecting
"Compile dictionary". The input to this function is simply
an alphabetically sorted list of words, one per line.
Citadel reads this file, then writes out an indexed
compressed version of it that it can use as a dictionary.

The Customization Kit comes with the list of words used to
create the default ENG-AM.DAT dictionary; you can add your
own words to this list and use the resulting enhanced
dictionary. You can also create your own dictionaries,
perhaps for languages other than American English. By
attaching one of these dictionaries to a room, you can, for
example, have a French dictionary in a room devoted to
learning and practicing French.

The spell checker is accessed by using the Verify spelling
(V) command of the message editor. It has three modes:
Terse, Regular, and Verbose. In Terse mode, it just lists
the words that it cannot find in its dictionary. In Regular
mode, it lists the words that it cannot find in its
dictionary, and gives some suggestions as to the correct
spelling of the words. In Verbose mode, it enters a dialog
that lets you replace all occurrences of a misspelled word
with the correct spelling, or update your personal
dictionary if the word is spelled correctly.

A special fourth mode, Automatic, operates like Verbose
mode. It is called Automatic, however, because it runs
automatically whenever the message is saved. It is best to
have Citadel confirm the Save command when using the spell
checker in Automatic mode. (This is enabled by using the
Message editor options (E) subcommand of the .Enter
Configuration (.EC)  command.

The current mode can be changed by the Spell checker mode
(P) option of the Message editor options (E)  subcommand of
the .Enter Configuration (.EC) command. This subcommand also
lets you manipulate your personal dictionary: you can add
words to it, remove words from it, or list the words
currently in it. Citadel checks the personal dictionary when
verifying the spelling of a word, but not when looking up
suggestions for an incorrectly spelled word.

Users should choose the mode best suited for their spelling
ability; good spellers might not want to spend the time it
takes Citadel to determine possible correct spellings for a
word that it cannot find in its dictionaries. Average
spellers might like suggestions for correct spellings, but
might not want to enter the full session with the spell
checker that a poor speller might desire. And poor spellers
might appreciate the full spell checker and corrector,
especially when in Automatic mode.

Status Line and Screen

Citadel usually has a single status line at the bottom of
the screen to alert you to what is going on with it. You can
turn this status line off if you want by using the Shift+F10
keystroke. Alternatively, you can turn on a second status
line with the Alt+F10 keystroke. You can also turn on a help
window with the F10 keystroke. If you really want to go into
information overload, turn on the status screen with the F4
keystroke.


The standard status line
The status line is displayed on the last line of the console
screen. This has ten sections that display information about
what the BBS is up to:

In the first section (that is, before the first "|"
character), the name of the currently logged-in user is
displayed. If there is no user logged-in, this is used to
display a clock and calendar.

The second section is used to tell where Citadel thinks the
user is. If this is displayed as "Modem", then Citadel
thinks there is a caller on-line over the serial port. If
carrier is not present, then Citadel resets, logging off the
current user. If this is displayed as "Console", then
Citadel ignores anything commands sent to it over the serial
port. (Except that it will answer the phone if it gets a
call, and switch to Modem mode if it gets carrier.) However,
if carrier is present, then text is output to the serial
port. This is also used to determine where to echo hidden
information (such as mail): either the modem or the system
console. You can use the F5 keystroke to toggle between
these two modes. Be careful if you are logged on locally and
there is no caller on-line, however: if you switch to Modem
mode, then Citadel will check for carrier, see there is
none, and reset itself, thinking the user just dropped
carrier.

The third section is used to report the presence of carrier:
it will contain either the text "CD" (carrier detect) or
"NC" (no carrier).

The fourth section is used to report the speed. If there is
no carrier or you are in dial-out mode, then this is the
port speed between the computer and the modem. If there is a
caller on-line, then this is the speed of the connection
between the two modems. (These are generally the same at
lower speeds.) Speeds of over 9600 baud are abbreviated:
12.0, 14.0, 16.8, 28.8, 57.6, 115K, and 230K. This is
because there is only four characters to display the speed
in. (Would you believe that this status line was designed,
and the space allocated to the speed section, when 9600 baud
was a dream?)

The fifth section is used to report the time left in the
current user's account in minutes. If there is no user on-
line, or accounting is disabled (either for the current user
or for the whole system), then the text "NA" is displayed.
If it is currently special time for the current user, the
text "SpTm" is displayed. If the current user has over 9,999
minutes (6 days, 22 hours, 39 minutes), the text "Lots" is
displayed, as there are only four digits available for the
time.

The sixth section is used to display system status flags:
The first flag is either "E" if the modem is enabled (the
BBS will answer calls) or "D" if disabled (the BBS will now
answer calls); the second flag is either the male symbol (an
"o" with an arrow extending out of it to the upper right) if
there is mail waiting for the sysop and #CHECKSYSMAIL in
CONFIG.CIT is set, or blank if not; the third flag is a
double musical note if bells are turned on, a single musical
note if turned on only to run the chat request, or blank if
bells are turned off; the fourth flag is the Yen symbol (an
upper-case "Y" with an equals sign in the middle of it) if
output filtering (Alt+B) is turned on, or blank if not; the
fifth flag is the Greek letter phi (an upper-case "I" with a
circle in the middle of the vertical part) if debug mode
(Alt+D) is turned on, or blank if not; the sixth flag is a
symbol I don't know the origin of (sort of like a sun) if
the console is locked, or blank if not; and the seventh flag
is the approximately equals symbol (a wavy equals symbol) if
ignore up-time (Alt+U) is turned on, or blank if not.

The seventh section displays the status of the Chat command:
"Chat" if chat is enabled and the current user has not
requested chat; "RCht" if chat is enabled and the current
user has requested chat; "rcht" if chat is disabled and the
current user has requested chat; or blank if chat is
disabled and the current user has not requested chat. The
"RCht" and "rcht" chat-requested messages flash. You can
clear the requested message by pressing F9 twice, which
toggles chat mode.

The eighth section displays "Prt" if output is being trapped
to the printer file (which is toggled with Alt+P) or blank
if not.

The ninth section displays "REQ" if the system has been
requested (F3 or Alt+F3), or blank if not.

The tenth section displays flags that give information about
the current user: "A" if the user is an Aide, "T" if the
user is a Problem-user (twit); "P" if the user is Permanent;
"N" if the user has Network privileges; "U" if the user is
Unlisted; "S" if the user is a Sysop; and "M" if the user
may not leave mail.


The second status line
The second status line has three sections: First, the name
of the current hall; second, the name of the current room;
and third a clock (and calendar if your display is wide
enough).


The help window
The help window displays the function of the 10 function
keys F1 through F10. This stays up for two minutes after it
is displayed. It really doesn't give much help, does it?


The status screen
The status screen gives a quick summary of the status of the
system.

On the top line is the version of Citadel that is running,
the current time and date, and a display of how long the BBS
has been up.

On the next few lines on the left side of the screen is the
name of the current user, room, and hall. On these lines on
the right side of the screen are the command that the user
is using and the length of time that the user has been
logged into the system. If accounting is enabled, this also
shows the time left in the user's account.

On the next few lines are a display of the count of
characters sent and received since the last user logged in,
a display of the count of messages entered and read since
the last user logged in, and a display of the current user's
poopcount if there is a user logged in.

On the next line is a display of memory. In the regular
version, this is the amount of memory free. In the Auxmem
version, there is first a display of the amount of
conventional memory free, followed by a display of the
amount of EMS, XMS, and virtual memory used (note: used, not
free). (If any of these forms of memory is not in use, it
will not appear on the screen.)

On the next line is the current speed of the serial port,
and the speed of the modem-to-modem connection if there is a
connection.

The rest of the screen is devoted to a list of significant
system events that have occurred, along with the time that
they occurred.

User Configuration

One of the strengths of Citadel is that users have a high
degree of control over the appearance of the BBS. Sysops can
configure new users in any way they desire, can edit any
user's configuration, and can control what users can change
to some degree. Users use the .Enter Configuration (.EC)
command to change their configuration. Sysops use the .Sysop
Userlog edit (.SU) command to change the configuration of
users; see the User Editing topic for full information on
this command. The configuration of new users is specified in
the DEFUSER.CIT file, and some options of the .Enter
Configuration (.EC) command can be turned off in the
CONFIG.CIT file with the #ECCOLOR, #ECSIGNATURE, #ECTWIRLY,
and #ECUSERLOG keywords. See Section IV (Configuration
Files) for full information on the DEFUSER.CIT file and the
CONFIG.CIT keywords.

The .Enter Configuration (.EC) command is used for almost
all editing of users' configuration. The only setting that
falls outside of this command is the initials and password
used to log in. Those are set with the .Enter Password
command.

The .Enter Configuration (.EC) command is based on menus,
with various depths of sub-menus. The main menu that appears
when the command is first invoked includes the following
options:

     D    Toggle room descriptions. Room descriptions are
          files that the sysop can attach to a room to give
          some explanation of the room. If this option is
          turned on, then Citadel displays this file to you
          the first time you enter a room during a call. If
          this option is turned off, then Citadel does not
          display the contents of this file.
          
     -    Toggle hall descriptions. Hall descriptions are
          files that the sysop can attach to a hall to give
          some explanation of the hall. If this option is
          turned on, then Citadel displays this file to you
          every time you enter a hall during a call. If this
          option is turned off, then Citadel does not
          display the contents of this file.
          
     +    Toggle room info lines. Room info lines are brief
          (80 characters or fewer) descriptions of rooms,
          which may be created when a room is created or
          changed later by an Aide. If this option is turned
          on, then Citadel displays this line to you every
          time you enter a room. If this option is turned
          off, then Citadel does not display the line.
          
     1    Toggle wide rooms. When you use the Known rooms
          (K) command, Citadel displays the rooms in one of
          two methods, depending on the setting of this
          option. If this option is turned on, then the room
          list is displayed in two columns, making it easy
          to see which rooms are being listed. If this
          option is turned off, then Citadel displays as
          many rooms as it can per line, separating each
          room with a comma, fitting the maximum number of
          rooms per line.
          
     X    Toggle auto next hall. When this is turned on,
          Citadel automatically takes you to the next hall
          on the system when you enter a window room. This
          usually works well to take you through the system
          without every having to manually change halls, but
          it does not work as well if the sysop has created
          an elaborate hall and window scheme.
          
     W    Toggle twirly cursor. When Citadel is waiting for
          user input, it can display a twirly cursor, to let
          you know that it is waiting. Note that the cursor
          pattern is under the sysop's control, so it might
          not actually twirl.
          
     V    Toggle auto verbose. Usually, to get more
          information when reading messages, the Verbose (V)
          modifier is used in the .Read Messages (.RM)
          command. This setting is useful for people who
          always want the full message header, by forcing
          verbose mode to always be on. This also affects a
          few other commands that have a Verbose mode.
          
     L    Toggle verbose logout. This option turns on
          verbose mode for only the .Terminate (.T) command.
          This is useful for people who always want full log-
          out information (such as time on the system,
          number of messages read and entered, etc.), but do
          not want to see everything verbosely. This option
          is not available when Auto verbose (V) is enabled,
          as it would be redundant: this is a subset of that
          option.
          
     U    Toggle list in userlog. Turning this setting off
          makes it so that other users cannot see your entry
          in the userlog, and therefore cannot know when you
          last called, or that you even called at all. This
          does not, however, prevent Aides from being able
          to see your entry.
          
     H    Toggle helpful hints. Helpful hints give you more
          information about what Citadel is doing, or
          expects from you. After a while, these notes
          become more annoying than helpful. When this
          happens, turn them off with this option.
          
     Y    Toggle you are here. For users new to room
          systems, turning this on may help navigating the
          system. When this is on, it presents a list of
          accessible halls and rooms before every room
          prompt.
          
     O    Toggle last old on new. It is often easier to keep
          track of the discussion in a room between calls by
          viewing the last old message when you read the new
          messages in a room. Turning this feature on gives
          you this reminder.
          
     M    Toggle Minibin login stats. When logging on to a
          Citadel, it usually gives you information
          regarding what has happened since your last call:
          the number of callers the system has had since
          then, the number of messages they left on the
          system, etc. If you do not want to see this
          information, turn it off with this option.
          
     J    Toggle display of subjects. Messages may have
          subjects, telling what the message is about.
          However, some users find these to be redundant:
          the subject can be known by reading the message.
          Turning this option off keeps Citadel from
          displaying message subjects.
          
     @    Toggle pause after message. Citadel usually
          displays all messages to the user with no pausing,
          leaving it up to the user to determine when to
          pause the output. However, some users find it
          easier to have Citadel pause after every message
          it displays. Turning this option on makes it do
          that.
          
     G    Toggle display of signatures. Signatures are
          attached to the bottom of messages, and usually
          have no relevance to the message and are quite
          repetitive, and thus often are thought of as
          annoying. Use this option to suppress the display
          of signatures.
          
     C    Toggle clear screen before message. Usually,
          Citadel displays messages one after the other when
          the user is reading them. Some users, however,
          prefer to have each message start fresh at the top
          of a blank screen. Turn this option on to have
          Citadel do this. This is only available if the
          user has ANSI terminal emulation turned on. (See
          Terminal settings (T), later in this list.) Note
          that it is highly recommended that you also turn
          Pause after message (@) on if you choose to use
          this feature.
          
     I    Toggle display of titles and surnames. Citadel
          gives users the ability to add text both before
          their names (titles) and after (surnames). They
          may be informative, humorous, bizarre, or whatever
          else the user wants. If you find them all to be
          just annoying, use this option to suppress the
          display of them.
          
     5    Format strings. This displays a sub-menu that has
          the following options:
          
          B    Back to previous menu. This returns to the
               main menu.
               
          N    Net prefix. When listing rooms, Citadel
               prepends the net prefix to the room name to
               let you know that it is a networked room.
               Additionally, the default room prompt (which
               can be changed by the sysop, or by each user
               individually with the Prompt format (P)
               format string option, described later in this
               list) displays the net prefix before
               networked rooms.
               
          P    Prompt format. This lets the user change what
               the room prompt looks like. It is possible,
               for example, to have Citadel give the current
               time as part of the prompt, or the group the
               current room belongs to, or many other pieces
               of information. For a full explanation of
               what is allowed for a prompt format, press
               the ? key when setting the prompt.
               
          #    Time/date stamp. This lets the user change
               what the time stamp looks like. It is
               possible, for example, to have Citadel give
               the day of the week in numeric form (0 being
               Sunday, 1 being Monday, etc.), in short form
               (Sun, Mon, etc.), or in long form (Sunday,
               Monday, etc.). There are two format strings
               used: regular and verbose. When reading
               messages with Verbose turned on, and most
               other times that Citadel gives a time, the
               verbose format string is used. When reading
               messages without Verbose turned on, the
               regular format string is used. For a full
               explanation of what is allowed for the
               time/date format, press the ? key when
               setting it.
               
     >    Default hall. Usually, Citadel logs all users into
          the Root hall (which the sysop may have renamed).
          Some users wish to start in another hall, which
          may contain the rooms they read most. This can be
          accomplished by setting the default hall to
          whatever is desired.
          
     P    Default protocol. Usually, Citadel waits for the
          user to supply a file transfer protocol when the
          Upload (U) and Download (D) commands are used. If
          a default protocol is specified, Citadel uses that
          instead. The default protocol can be overridden by
          using the .Upload (.U) and .Download (.D)
          commands, which always wait for a protocol.
          
     _    Signature. Messages can have two signatures: one
          for the board and one for the user. The board's
          signature is defined by the sysop. This is used to
          define the user signature you wish to have
          appended to your messages.
          
     F    Forwarding address. You can choose to have
          exclusive messages sent to you to be forwarded to
          another user. This other user can be someone on
          the board, or someone on another board on the
          network. Just enter the user's name and Citadel
          will start forwarding any new messages. By
          choosing this option and selecting no name, you
          can turn off forwarding if it is currently on.
          Note that "forwarding" is not the best term: the
          message is still available to you, so it is more
          of a "cc" function.
          
     &    Address. If you have a hard-to-type name, you may
          want to set an address for your account. Then,
          other users just have to enter your address to
          send mail to you. (For example, a user with the
          name John Quilcene Jackovichsky, Jr. might use his
          initials: JQJ.)
          
     T    Terminal settings. This brings up a sub-menu that
          has the following options:
          
          A    Toggle ANSI mode. Enabling ANSI mode tells
               Citadel to display various messages with
               different attributes, which makes it easier
               to read the board.
               
          C    Toggle ANSI color. Enabling ANSI color tells
               Citadel to interpret the ^A codes that set
               color.
               
          I    Toggle IBM graphics characters. Enabling IBM
               graphics characters tells the board to send
               all characters out without translation. This
               enables users to see IBM extended ASCII
               characters, such as the line drawing symbols.
               Users without IBM PC or compatible computers
               (or some other computer with the same
               character set) would want to turn this option
               off, which tells Citadel to translate such
               characters into the graphically closest
               approximation, using standard seven bit
               ASCII.
               
          W    Screen width. This tells Citadel how wide
               your terminal screen is, which it uses to
               properly word wrap output. Most terminals
               support 80 columns today. Valid values range
               from 10 to 255 columns.
               
          U    Toggle uppercase only. This tells Citadel to
               send all text out mapped to uppercase letters
               only. This is useful for users with older
               terminals that cannot handle lowercase
               letters.
               
          F    Toggle linefeeds. This tells Citadel to send
               a linefeed (ASCII 10) after every carriage
               return (ASCII 13) that it sends. This is
               required to prevent line overwriting for many
               terminals, but double spaces the text on
               others.
               
          T    Toggle tabs. This tells Citadel to send tab
               characters out. If this is turned off,
               Citadel sends enough spaces to simulate eight-
               space tab stops. On terminals that support
               tabs, message reading is slightly faster when
               this option is turned on. (Very slightly,
               since tabs are not used often.)
               
          N    Nulls. This tells Citadel to send out nulls
               as filler between sending a carriage return
               and linefeed (if so configured) to the user.
               This is useful on slower terminals, which
               might not be able to keep up with the baud of
               the connection. If you cannot see the first
               characters of each line, set this to the
               number of missing characters.
               
          M    Music. This tells Citadel that your terminal
               supports music codes. Most terminals do not,
               but users of those that do might want to
               enable this, in case the sysop has put such
               codes into the board.
               
          L    Lines per screen. This sets the number of
               lines after which Citadel should pause the
               display. This screen pause can also be turned
               off with this option by specifying 0 lines.
               
          R    Attributes. This prompts for color numbers to
               send in response to the ^A0 through ^A4
               codes. This is only available if you are
               configured to use ANSI. You will be prompted
               for each color number; enter either the
               number or press the ? key to view a list of
               available colors.
               
          B    Back to previous menu This returns you to the
               main menu.
               
          O    IBM Room prompts. This is only available if
               IBM Graphics characters are turned on. This
               changes the flags at the end of the room
               prompt to use IBM Extended characters.
               
          >    More prompt. This specifies the text to
               display when pausing on a full screen, or
               between messages.
               
     6    Personal information. This option brings up
          another menu, with the following choices:
          
          R    Real name. This lets you set your real name.
               Real names are never displayed to any users
               other than sysops on a Citadel. However, they
               are written to networked messages. If a room
               is networked into some other network that
               requires real names, they may be displayed on
               the other network.
               
          P    Phone number. This lets you set your phone
               number. Phone numbers are never displayed to
               any users other than sysops, and never leave
               the board in networked messages.
               
          1    Address line 1.
               
          2    Address line 2.
               
          3    Address line 3. These let you set your street
               mailing address. Your mailing address is
               never displayed to any users other than
               sysops, and never leave the board in
               networked messages.
               
          B    Back to previous menu. This returns you to
               the main menu.
               
     R    Message read options. This option brings up
          another menu, with the following choices:
          
          A    Author-based exclusions. This option brings
               up another menu, with the following choices:
               
               L    List. This lists your current author-
                    based message exclusions. Citadel will
                    not display any message from an author
                    that you have excluded.
                    
               A    Add. This adds another author-based
                    message exclusion.
                    
               R    Remove. This removes an author-based
                    message exclusion.
                    
               B    Back to previous menu. This returns you
                    to the Message read options menu.
                    
          N    Node-based exclusions. This option brings up
               another menu, with the following choices:
               
               L    List. This lists your current node-based
                    message exclusions. Citadel will not
                    display any message from a node that you
                    have excluded.
                    
               A    Add. This adds another node-based
                    message exclusion.
                    
               R    Remove. This removes a node-based
                    message exclusion.
                    
               B    Back to previous menu. This returns you
                    to the Message options menu.
                    
          T    Text-based exclusions. This option brings up
               another menu, with the following choices:
               
               L    List. This lists your current text-based
                    message exclusions. Citadel will not
                    display any message containing text that
                    you have excluded.
                    
               A    Add. This adds another text-based
                    message exclusion.
                    
               R    Remove. This removes a text-based
                    message exclusion.
                    
               B    Back to previous menu. This returns you
                    to the Message options menu.
                    
          R    Region-based exclusions. This option brings
               up another menu, with the following choices:
               
               L    List. This lists your current region-
                    based message exclusions. Citadel will
                    not display any message from a region
                    that you have excluded.
                    
               A    Add. This adds another region-based
                    message exclusion.
                    
               R    Remove. This removes a region-based
                    message exclusion.
                    
               B    Back to previous menu. This returns you
                    to the Message options menu.
                    
          O    Notify on exclusion. When Citadel excludes a
               message, it can either do it silently, or it
               can tell you that it is skipping the message.
               This option tells it which one to do.
               
          E    Toggle exclude encrypted messages. To keep
               Citadel from displaying encrypted messages,
               turn this on.
               
          M    Message author tags. This option brings up
               another menu, with the following choices:
               
               L    List. This lists your current message
                    author tags. These are extra text after
                    a user's name in a message header. You
                    can set more than one for a user, as
                    well. These can be used as a reminder
                    about who the user is, or any other
                    personal note to yourself.
                    
               A    Add. This adds another message author
                    tag.
                    
               R    Remove. This removes all tags on a
                    specified author.
                    
               B    Back to previous menu. This returns you
                    to the Message options menu.
                    
          B    Back to previous menu. This returns you to
               the main menu.
               
     Z    Pointer edit menu. This option brings up another
          menu, with the following choices:
          
          S    Set all pointers. This sets all message
               pointers in all rooms to a specified value.
               This can be beneficial after returning to a
               board that you have not called for a few
               months; you can set the pointer back by a few
               hundred, so you only have that many new
               messages to read, not a few thousand.
               
          N    Set all pointers to new. This sets all
               message pointers in all rooms to make all
               messages on the system new.
               
          O    Set all pointers to old. This sets all
               message pointers in all rooms to make all
               messages on the system old.
               
          R    Set pointer for a room. This sets the message
               pointer for a specific room to a specified
               message. This is useful if you only read some
               of the messages in a room. You can set the
               message pointer to the last message you read,
               then bypass the room. On the next call to the
               system, only messages newer than the last one
               you read will be new.
               
          D    Display all pointers. This shows the message
               pointer for every room on the system that you
               have access to.
               
          B    Back to previous menu. This returns you to
               the main menu.
               
     E    Message editor options. This option brings up
          another menu, with the following choices:
          
          V    Verbose continue. When using the Continue (C)
               command of the message editor, Citadel can
               either display the whole message to you as it
               has been entered up to that point, or just
               the last 100 bytes. Turning this on tells
               Citadel to display the full message, and
               leaving it off tells it to only display the
               last 100 bytes.
               
          P    Spell checker options. This brings up another
               menu with the following options:
               
               Wow.  All the options.
                    
               P    Spell checker mode. This configures
                    Citadel's spell checker for your
                    preference: Automatic, Verbose, Regular,
                    or Terse modes.
                    
               R    Remove word from dictionary. This
                    removes a word from your personal
                    dictionary.
                    
               A    Add word to dictionary. This adds a word
                    to your personal dictionary.
                    
               L    List words in dictionary. This lists the
                    words in your personal dictionary.
                    
          S    Confirm Save. This tells Citadel to confirm
               your choice to save a message when in the
               message editor.
               
          A    Confirm Abort. This tells Citadel to confirm
               your choice to abort a message when in the
               message editor.
               
          E    Confirm not .EO. This tells Citadel to
               confirm the loss of aborted messages by not
               using the .Enter Old Message (.EOM) command
               when entering a message after aborting the
               last one.
               
          B    Back to previous menu. This returns you to
               the main menu.
               
     S    Save. This asks for confirmation, then (if you
          confirm your choice) saves your configuration as
          you have specified it and returns to the room
          prompt.
          
     A    Abort. This asks for confirmation, then (if you
          confirm your choice) aborts any configuration
          changes you have made and returns to the room
          prompt.
          
Room Editing

Users with Aide access are able to edit most attributes of
rooms. This is done with the .Aide Edit room (.AE) command.
Sysops can use this command to edit the few attributes that
Aides are not allowed to modify. Note that this command does
not change the location of the room in the hall structure:
that is done by editing the halls, and is explained in the
Hall Editing topic.

When the .Aide Edit room (.AE) command is used, Citadel
prompts for a room name, using the current name as a
default. If a valid name is entered, Citadel provides a menu
with the following options:

     N    Name. This changes the name of the room.
          
     I    Infoline. This changes the infoline of the room.
          
     D    Directory. Only Sysops are allowed to pick this
          option. This allows the room to be linked to a
          directory on disk to facilitate uploads and
          downloads. To prevent remote sysops from accessing
          parts of the disk that you want to keep private,
          use the #DIRECTORY keyword in EXTERNAL.CIT.
          
     L    Application. Only Sysops are allowed to pick this
          option. This allows an application to be linked to
          the room. See the Applications topic for more
          information on applications.
          
     F    Description file. Only Sysops are allowed to pick
          this option. A description file is a text file on
          disk that describes the room. Users can configure
          to view this file when they enter the room for the
          first time each call.
          
     G    Access group. This allows the room to be
          restricted to a specific group of users. You can
          use Boolean expressions to assign access to
          groups. For example, you might wish to limit a
          room to "Group 1" AND NOT "Group 2", which would
          cause the room to be only accessible to people in
          Group 1 but not in Group 2. The main sysop set by
          #SYSOP in CONFIG.CIT is always allowed into all
          rooms.
          
     V    Privileges group. This allows a certain group to
          be given more privileges than others. After
          picking a group to give the privileges to, Citadel
          asks what privileges to give to the group. The
          questions it asks are:
          
          Read only? If a room is read-only, then only
               members of the privileges group are allowed
               to enter messages in it.
               
          Group moderates? If a room is moderated, then all
               messages left in it are not visible to
               callers other than the original author and
               the room's moderators. The moderators can
               release the messages for others to read. This
               allows you to let a whole group of people
               moderate the room.
               
          Download-only? If a room is download-only, then
               only members of the privileges group are
               allowed to upload to it.
               
          Upload-only? This question is only asked if you do
               not make the room download-only. If a room is
               upload-only, then only members of the
               privileges group are allowed to download from
               it.
               
     H    Toggle hidden. If a room is hidden, then users
          must know the exact room name to get to it the
          first time. Once they go to it once, Citadel
          remembers that they have found the room, and lets
          them back in as if it was a normal room in the
          future. The main sysop as set by #SYSOP in
          CONFIG.CIT is always allowed into all rooms.
          
     B    Toggle BIO. BIO stands for "By Invitation Only".
          BIO rooms are similar to hidden rooms, but the
          user must be explicitly invited to the room to
          access it: merely knowing the name is not enough.
          (Users are invited with the .Invite... (.I...)
          commands.) The main sysop as set by #SYSOP in
          CONFIG.CIT is always allowed into all rooms.
          
     Y    Toggle anonymous. Citadel does not store any
          information about the authors of messages in
          anonymous rooms. (However, sysops can configure
          Citadel to keep track of anonymous messages in the
          trap file, if they are concerned about security or
          legality.) Only Sysops are allowed to make Lobby,
          Aide, or Mail anonymous.
          
     M    Toggle moderated. If a room is moderated, then all
          messages left in it are not visible to callers
          other than the original author and the room's
          moderators. The moderators can release the
          messages for others to read. Unless the privileges
          group is set to moderate the room, Aides are the
          only moderators. (Unless the sysop has turned off
          Aides' ability to moderate rooms with #MODERATE in
          CONFIG.CIT, in which case only Sysops can moderate
          rooms.)
          
     E    Toggle network/shared. Only Sysops are allowed to
          change this. If a room is marked as
          network/shared, then its messages can be shared
          with the Citadel network.
          
     W    Network ID. The Network ID is used to identify the
          room on the Citadel network when using the Net 6.9
          protocol. Each room shared on the network has a
          unique Network ID.
          
     P    Toggle permanent. Permanent rooms do not appear
          when using the .Sysop Zap empty rooms (.SZ)
          command. Lobby, Mail, Aide, and Dump are always
          permanent.
          
     U    Toggle subject prompt. Citadel can be set to
          prompt for a subject when entering a message in
          the room.
          
     R    Archive. Only Sysops on console are allowed to
          change this. Rooms marked as Archive rooms have
          their messages stored in a text file in addition
          to in Citadel's message base. This allows the
          messages to be stored even after the message base
          scrolls: Citadel never empties the archive file.
          
     X    Toggle Nonexcludable. Rooms marked as
          nonexcludable cannot be excluded with the Exclude
          room (X) command.
          
     C    Dictionary. Only Sysops on console are allowed to
          change this. Citadel allows alternate spell-
          checker dictionaries to be set for each room. This
          allows, for example, rooms dedicated to a foreign
          language to have a dictionary for that language.
          
     S    Save. This saves the changes made, after asking
          for confirmation.
          
     A    Abort. This aborts all changes made, after asking
          for confirmation.
          
Hall Editing

     Wow.

User Editing

Sysops can use the .Sysop Userlog edit (.SU) command to edit
the configuration of other users. When the .Sysop Userlog
edit (.SU) command is used, Citadel asks for the name of the
user to edit, using the current user as the default. If a
valid name is entered, it provides the following menu:

     L    Lock title and surname. If a user's title and
          surname are locked, then he cannot change them
          himself.
          
     K    Lock signature. If a user's signature is locked,
          then he cannot change it himself.
          
     Y    Toggle Sysop. This sets whether the user has Sysop
          privileges or not.
          
     D    Toggle Aide. This sets whether the user has Aide
          privileges or not.
          
     O    Toggle node. This sets whether the user is a node
          on the Citadel network or a person.
          
     P    Toggle permanent. This sets whether the user's
          account is permanent or not. Permanent accounts
          are not removed to make room for new callers.
          
     E    Toggle net user. This sets whether the user's
          messages are sent out on the network always, or if
          an Aide has to release them first.
          
     T    Toggle twit. This sets whether the user's messages
          are visible to other users always, or if an Aide
          has to release them first.
          
     M    Toggle mail. This sets whether the user can send
          mail to other users or not.
          
     V    Toggle verified. This sets whether the user is
          verified or not. Non-verified users are not
          allowed to log in.
          
     4    Toggle enter borders. This sets whether the user
          can change the system's borders with the .Enter
          Border (.EB) command.
          
     H    Lock default hall. If a user's default hall is
          locked, then he cannot set it.
          
     C    Toggle chat. This sets whether the user is allowed
          to use the Chat (C) command or not.
          
     R    Toggle room creation. This sets whether the user
          is allowed to create rooms or not. This is in
          addition to limits set by #ROOMOK in CONFIG.CIT.
          
     3    Toggle 300 baud output. This sets whether the user
          is presented with a simulated 300 baud connection
          or not. This is meant as a method to discourage
          the user from using the board much.
          
     1    Toggle psycho chicken. This sets whether the BBS
          switches to psycho chicken mode when the user
          calls.
          
     U    Toggle upload. This sets whether the user is
          allowed to upload files.
          
     5    Toggle download. This sets whether the user is
          allowed to download files.
          
     F    Toggle trap to print file. This sets whether the
          printfile set by the #PRINTER keyword in
          CONFIG.CIT is opened when the user logs on.
          
     N    Name. This allows you to change the user's name.
          
     2    Calls per day. This lets you limit the number of
          times a user can call in a day. (Midnight to
          midnight.)
          
     .    User configuration. This presents the same menus
          available with the .Enter Configuration (.EC)
          command, except Save and Abort are replaced with B
          for Back to previous menu.
          
     S    Save. This asks for confirmation, then saves the
          data entered if confirmation is given.
          
     A    Abort. This asks for confirmation, then aborts the
          data entered if confirmation is given.
          
SSection III: Command Reference

The Citadel command structure is quite powerful. It has been
designed to make the most common commands quickly
accessible. Most commands that are used during a call to a
Citadel are a single keystroke. The less common, and more
dangerous, commands take at least two keystrokes. This lets
new users quickly remember all they need to know for using
the system, while protecting them from accidentally doing
something they did not want to do.

The multiple keystroke commands are usually forms of the
single-key commands that include command modifiers. That is,
the command to enter a message is just E for "Enter". To
enter an exclusive message (a message that can only be read
by one other person), the command is .EE for "Enter
Exclusive". The period tells Citadel that you are starting
an extended command. All multiple keystroke commands start
with a period. (You can also use the comma (,), slash (/),
or space ( ) characters to invoke an extended command. This
makes it easier to start such a command: use whichever key
you find easiest to use. For simplicity and clarity, only
the period key is mentioned in the documentation.)


Common single-key commands
The following commands are the ones most often used while
logged into a Citadel. They only require a single keystroke.

     B    Bypass. This command works like the Goto (G)
          command, but it does not update the new pointer
          for the current room. That is, messages that were
          new when you entered the room are still considered
          new when you exit the room. This is a good way to
          skip a room so you can come back to it on a later
          call, and not miss any new messages. Unless the
          room being bypassed is the Lobby, Citadel will not
          take you back to this room during the current
          call.
          
     C    Chat.  This command rings the console speaker to
          page the sysop. If the sysop is around, he can
          enter chat mode, where the user and the sysop can
          type to each other in real-time. The console page
          can by turned off by the sysop with the F9 key, in
          which case Citadel will display NOCHAT.BLB to the
          user.
          
     E    Enter message.  This command lets the user enter a
          message in the current room.
          
     F    Forward messages.  This command displays all
          messages in the current room, from the oldest to
          the newest.
          
     G    Goto.  This command goes to the next room in the
          current hall with unread messages. It may also go
          to the next window room, depending on the setting
          of #SUBHUBS in CONFIG.CIT.
          
     H    Help.  This command prints out help information to
          the user.
          
     J    Jumpback.  This command returns to previously
          visited rooms, in reverse order of leaving them.
          
     K    Known rooms.  This command lists all known rooms
          in the current hall, telling the user which ones
          do and which ones don't have new messages.
          
     N    New messages.  This command displays all new
          (unread) messages in the current room, from the
          oldest to the newest. This is the most common way
          to read messages.
          
     O    Old messages.  This command displays all old
          (read) messages in the current room, in reverse
          order from the newest to the oldest. This command
          is a good way to check up on what was recently
          said in the room.
          
     R    Reverse messages.  This command displays all the
          messages in the current room in reverse order,
          from the newest to the oldest.
          
     T    Terminate.  This asks for confirmation, then
          terminates the connection between the user and the
          board.
          
     >    Next hall.  This command takes the user to the
          next hall that a window room has access to. This
          is usually used after rooms with new messages in
          the current hall have been visited. The ] key can
          be used instead of the > key.
          
     <    Previous hall.  This command takes the user to the
          previous hall that a window room has access to.
          The [ key can be used instead of the < key.
          
     ?    Menu.  This displays a list of available commands.
          
Often, the only commands that are used during a call to a
Citadel are the New messages (N), Goto new messages (G),
Enter message (E), and Next hall (>) commands, followed by a
Terminate (T) command at the end.

When the user logs in, he is shown all new messages in
Lobby, the first room. He can then post a message with the
Enter message (E) command. After finishing with Lobby, he
can use the Goto new messages (G) command to go to the next
room with new messages, and then the New messages (N)
command to read them. He can then choose to enter a message
in this room with the Enter message (E) command before using
the Goto new messages (G) command to go to the next room
with new messages. When he is done with the first hall, he
can use the Next hall (>) command to go to the next hall,
where the Goto new messages (G)/New messages (N)/Enter
messages (E) loop starts up again. After visiting all halls,
he can use the Terminate (T) command to end the call.


Less common single-key commands
The following commands are also single-key commands, but are
not as commonly used.

     A    Aide edit room.  To use this command, the user
          must be an aide. This lets the user edit the
          attributes of a room, such as its name and access
          group.
          
     D    Download.  This command lets the user download
          from the current room if it is a directory room.
          (Directory rooms end with a "]" character.)
          
     I    Introduction.  This command displays INTRO.HLP as
          an introduction to the BBS.
          
     L    Login.  This logs the user onto the board. This
          command is usually only used on console; most
          boards are set up to automatically log callers on
          when they first connect by setting #FORCELOGIN in
          CONFIG.CIT to 1.
          
     M    Enter exclusive (Mail).  This sends an exclusive
          message to another user on the board, or possibly
          on the network if the board is connected to the
          network.
          
     U    Upload.  This command lets the user upload to the
          current room if it is a directory room. (Directory
          rooms end with a "]" character.)
          
     V    Auto verbose toggle.  When verbose mode is on,
          more information is displayed as you use Citadel.
          
     X    Exclude.  This command excludes the current room
          from being visited by the Goto new messages (G)
          and Bypass (B) commands. The room is still
          accessible by the user if he uses the .Goto (.G),
          .Bypass (.B), Next room (+), or Previous room (-)
          commands. When not in expert mode, Citadel asks
          for confirmation when excluding a room. To
          unexclude a room, go to it then use this command
          again. It is impossible to exclude the Lobby, or
          any other room that has been set as non-excludable
          with the .Aide Edit room (.AE) command.
          
     +    Next room.  This command goes to the next room on
          the system. This is not usually used, because the
          Goto new messages (G) command goes to the next
          room with new messages, which is usually the only
          type of room users want to visit anyway. As "+" is
          often a special character for modems, the = key
          will do the same thing.
          
     -    Previous room.  This command goes to the previous
          room on the system. This is not usually used,
          because the Goto new messages (G) command goes to
          the next room with new messages, which is usually
          the only type of room users want to visit anyway.
          The backspace key also moves the user to the
          previous room.
          
     ;    Small chat.  This gives users and sysops a quick
          way to communicate with each other. After the ;
          key, up to 255 characters can be entered, which
          Citadel ignores but can be seen by the user of
          either computer.
          

Multiple key (extended) commands
Multiple key, or extended, commands all start with a period
followed by one or (usually) more keystrokes. The subsequent
keystrokes sometimes set an option of another command. For
example, the .Read (.R) family of commands usually are used
to read messages. If you want to read only messages from one
user, you would use the .Read By-user (.RB) command. At this
point, you can still choose more qualifiers, such as .Read
By-user Keyword search (.RBK) to search for messages that
the user left containing a certain word or phrase. When you
have picked enough qualifiers, you then invoke the command.
In this case, you would use the M key or the Enter key
(Enter because Messages is the default) to finish off the
command: .Read By-user Keyword search Messages (.RBKM) or
.Read By-user Messages (.RBM).

These qualifiers could, however, have been applied to
another command. In the previous example, .Read By-user was
applied to the .Read Messages (.RM) command. It could also
have been applied to the .Read Userlog (.RU) command, as
.Read By-user Userlog (.RBU).

Not all qualifiers can be used with all commands, of course.
For example, the Keyword-search option means nothing to the
.Read Userlog (.RU) command. Don't worry about hurting
anything, though. If you enter .Read Keyword-search Userlog
(.RKU), Citadel will just ignore the Keyword-search option
and do a standard .Read Userlog (.RU) command.

Following is a list of all multiple key commands and
qualifiers in Citadel.


.Read (.R...) commands
     ##   Number of messages. Just enter a number after
          .Read, such as ".R10" to read that number of
          messages. This also works with the .Read Userlog
          (.RU) command.
          
     A    All. This reads all messages in all rooms on the
          system. It is good to combine with the Keyword
          search (K) or By-user (B) option to search for
          messages.
          
     M    Messages.  This tells Citadel to start reading
          messages with the currently defined options. You
          can also use the Enter key to start reading
          messages.
          
     #    By message number.  This tells Citadel where to
          start reading. For example, to read all messages
          numbered under 100, use .Read Reverse By message
          number Messages (.RR#M) and Citadel will ask for
          which message number. Enter 100, and it will
          display all messages with a number under 100. To
          read all messages over 100, use "Forward" instead
          of "Reverse" (.RF#M).
          
     &    By date.  This tells Citadel that you want to read
          only messages after or before a certain date. When
          you start the command, Citadel will ask for the
          date, then whether you want to read messages
          before or after that date. Enter B or A to specify
          which. Messages on the date specified are always
          include.
          
     !    Header scan.  This tells Citadel that you only
          want to display message headers, and not read the
          actual message text. This is a good way to quickly
          scan messages.
          
     K    Keyword search.  This prompts you for a keyword to
          search for when reading messages. Only messages
          containing the keyword are displayed. The *
          keystroke can be used for K if desired.
          
     B    By-user.  This searches for messages by user,
          using wildcards if desired. This also searches
          node names, so you can read all messages posted on
          a certain node with the command. By-user also
          affects the .Read Userlog (.RU) command.
          
     C    Configuration.  This displays the configuration of
          the currently logged-in user.
          
     D    Directory.  This displays the contents of the
          directory for directory rooms. (Directory rooms
          end with the "]" character.)
          
     E    Exclusive.  This searches only for exclusive
          messages.
          
     F    Forward.  This reads messages in the forward
          direction.
          
     G    Group-only.  This reads only messages posted in a
          certain group. This command also affects the .Read
          Userlog (.RU) command.
          
     H    Halls.  This lists all hallways that the current
          room is in.
          
     I    Info file.  This displays file information for
          files in directory rooms. (Directory rooms end
          with the "]" character.)
          
     L    Local.  This reads only messages that did not come
          in over the network.
          
     N    New.  This reads only messages that have been
          posted since the last time you were in the current
          room. This also affects .Read Directory (.RD),
          .Read Info file (.RI), and .Read Archive file
          (.RZ) commands. For these commands, Citadel asks
          which date to consider "new" files to be after. It
          also affects the .Read Userlog (.RU) command, by
          listing only those users who have called since
          your last call, or the last time somebody logged-
          in on console if there is nobody currently logged-
          in.
          
     O    Old.  This reads only messages that were posted
          before the last time you were in the current room.
          This also affects .Read Directory (.RD), .Read
          Info file (.RI), and .Read Archive file (.RZ)
          commands. For these commands, Citadel asks which
          date to consider "old" files to be before. It also
          affects the .Read Userlog (.RU) command, by
          listing only those users who have not called since
          your last call, or the last time somebody logged-
          in on console if there is nobody currently logged-
          in.
          
     P    Public.  This reads only non-exclusive, non-group-
          only messages.
          
     R    Reverse.  This reads the messages in reverse
          order, from newest to oldest. This also affects
          the .Read Userlog (.RU) command.
          
     S    Status.  This displays the current system status,
          including such things as how much memory is free,
          how many messages are on the system, etc.
          
     T    Text file.  This displays the contents of a file
          in a directory room to the user. (Directory rooms
          end with the "]" character.)
          
     U    Userlog.  This displays a list of users who
          currently have accounts on the system.
          
     V    Verbose.  This tells Citadel to display more
          information when reading. It affects the following
          commands as follows:
          
               Messages    All information in the message
                      header is displayed.
                      
               Text file   The text file is passed through
                      Citadel's word wrapping code, making
                      many text files look better to the
                      user.
                      
               UserlogDisplays the last call time and date
                      and number for the users, and their
                      titles and surnames.
                      
               Status Shows more information.
                      
               Directory   Shows file dates, sizes, and
                      approximate download times.
                      
               Info file   Shows file uploaders, dates and
                      times, sizes, and approximate
                      download times.
                      
          Additionally, users can use the Auto verbose (V)
          command to turn on auto verbose mode. In this
          mode, all commands are treated as if they have the
          Verbose modifier.
          
     W    With Protocol.  This downloads files from
          directory rooms. Use the .Read With protocol Menu
          (.RW?) for a listing of available file transfer
          protocols. (Directory rooms end with the "]"
          character.)
          
     Z    Archive file.  This views the contents of archived
          files. Citadel relies on external archiver viewers
          to be set up with #ARCHIVER in EXTERNAL.CIT to
          view these files. A list of which ones have been
          set up is available with the .Read Archive file
          Menu (.RZ?) command.
          
     ?    Menu.  This displays a list of available commands.
          

.Sysop (.S...) commands
These commands are only available to people with sysop
accounts. In addition, anybody at console can use these
commands by using the F6 key, unless the console has been
locked with #F6PASSWORD in CONFIG.CIT.

     >    Create PATH.DAT.  This command creates a file
          containing all paths of all networked messages on
          the system. This can then be used by a network map
          generator.
          
     A    Abort.  This returns to the room prompt.
          
     1    Reset Maintenance hall.  This command puts all
          rooms in Maintenance.
          
     C    Cron.  This provides another choice of commands,
          as follows:
          
               A    All done.  This sets the last try and
                    last succeeded times of all events to
                    the current time.
                    
               D    Done.  This sets the last try and last
                    succeeded time of a certain event to the
                    current time.
                    
               E    Enter.  This reads CRON.CIT, replacing
                    all information in memory. This is the
                    same as the .Sysop Enter CRON.CIT (.SET)
                    command.
                    
               F    Force.  This lets you force the
                    execution of a specific cron event.
                    
               L    List.  This lists all cron events in
                    memory.
                    
               N    Next event set.  This sets the next cron
                    event for Citadel to try to execute.
                    
               P    Pause.  This toggles cron pause. When
                    cron pause is turned on, no cron events
                    execute.
                    
               R    Reset event.  This resets a cron event
                    to the "never-done" state and unzaps it.
                    
               S    Set success time.  This lets you set the
                    "last succeeded" time of a cron even to
                    any date and time desired.
                    
               Z    Zap event toggle.  If an event is
                    zapped, then it will not execute
                    automatically: you could still force it
                    with the .Sysop Cron Force (.SCF)
                    command.
                    
               ?    Menu.  This displays a list of available
                    commands..
                    
     O    Off hook.  This takes the modem off hook. This
          only works if logged-in on console.
          
     D    Date set.  This sets the time and date.
          
     E    Enter config file.  This provides a choice of
          which files to reload, as follows:
          
               A    All.  All files are reloaded.
                    
               C    CONFIG.CIT.
                    
               E    EXTERNAL.CIT.
                    
               G    GRPDATA.CIT.
                    
               I    MCI.CIT
                    
               M    MDMRESLT.CIT]
                    
               P    PROTOCOL.CIT
                    
               T    CRON.CIT.
                    
               ?    Menu.  This displays a list of available
                    commands.
                    
     F    Aide function.  This operates exactly the same as
          the .Aide (.A...) command.
          
     G    Group.  This provides another choice of commands,
          as follows:
          
               E    Edit.  This lets you change the
                    attributes of a group, such as its name
                    and whether aides are locked from it.
                    Although you can also use the R (for
                    "rename") key for this, don't: this
                    ability may not exist in future versions
                    of Citadel.
                    
               G    Group-specific membership.  This lets
                    you add or remove every user on the
                    system from a specified group. Citadel
                    prompts for each user.
                    
               K    Kill.  This lets you kill a group.
                    
               L    List.  This works the same as the .Aide
                    List group (.AL) command.
                    
               N    New.  This creates a new group.
                    
               O    Operator-specific membership.  Wow.
                    
               U    User-specific membership.  This lets you
                    add or remove a user from every group on
                    the system. Citadel prompts for each
                    group.
                    
               ?    Menu.  This displays a list of available
                    commands.
                    
     H    Hall.  This provides another choice of commands,
          as follows:
          
               F    Force access.  This moves you into a
                    specified hall.
                    
               K    Kill.  This removes a hall.
                    
               L    List.  This lists all halls on the
                    system.
                    
               N    New.  This lets you create a new hall.
                    
               E    Edit.  This lets you change the
                    attributes of a hall, such as its name
                    or group. The R key can also be used.
                    
               G    Global room.  This lets you add or
                    remove every room on the system from a
                    hall.
                    
               -    Move hall backward.  This moves the
                    current hall back one in the hall file.
                    
               +    Move hall forward.  This moves the
                    current hall forward one in the hall
                    file.
                    
               ?    Menu.  This displays a list of available
                    commands.
                    
     I    Info file reset.  This packs FILEINFO.DAT, the
          file that Citadel uses to keep track of files for
          upload and download, which users can see with the
          .Read Info file (.RI) command. Over time, this
          file gets fragmented and full of extra
          information. This command just reorders it for
          quicker lookups. Because the file is reset every
          time Citadel is started, the only time this
          command should be used is if the board has lots of
          file moving, deleting, or uploads without being
          taken down.
          
     J    Journal room.  This command copies all messages in
          a room from a specified number onward into a file.
          It is a shortcut to using the Alt+P command to
          capture messages to a file.
          
     K    Kill user.  This command removes a user's account
          from the system.
          
     L    Login enable.  This enables a single remote new-
          user login when "#LOGIN CLOSED_SYS" is entered
          into CONFIG.CIT. (If it is not a closed system,
          remote new-user logins are always allowed).
          
     M    Mass delete.  This command kills all messages from
          a specified user.
          
     N    New user verify.  This command prompts you for
          each unverified or problem user on the system,
          asking if you want to give the user regular access
          or not. If you choose not to do so, you are then
          given the option to kill the user's account.
          
     P    Purge userlog.  This command goes through all
          users in the userlog, asking if you want to remove
          the user. This is good for corrupted userlogs,
          when there may be many users you want to remove
          but cannot even type their names, or if someone
          tries to scroll your userlog by logging in with
          many false accounts. This starts with the last
          user in the userlog, and works backwards.
          
     R    Run script file.  This command runs a Citadel
          script file.
          
     S    Show user.  This command shows the current
          configuration of a user, as if the user had used
          the .Read Configuration (.RC) command.
          
     U    Userlog edit.  This command lets you edit the
          userlog entry of a user.
          
     X    Exit Citadel.  This command takes the board down
          and exits to the operating system. It can only be
          used on console.
          
     Z    Zap empty rooms.  This command goes through all
          unused rooms (those with no messages in them) and
          asks if it should delete each one.
          
     !    Shell to DOS.  This command invokes a copy of the
          DOS command shell, letting you run other programs
          or DOS commands.
          
     @    Super-shell to DOS.  This command invokes a copy
          of the DOS command shell, letting you run other
          programs or DOS commands. It also removes most of
          Citadel from conventional memory, giving you a
          large amount of free conventional memory. On
          systems with no free EMS or XMS memory, Citadel
          needs to write a large amount of information to
          disk for this to work, which takes some time.
          Therefore, only use this command on such systems
          if you need the extra memory for what you plan to
          do while shelled out of Citadel.
          
     +    Table debugging. This provides another choice of
          commands, as follows:
          
               M    Message. This displays what is in the
                    message table, which can be useful for
                    debugging.
                    
               R    Room. This displays what is in the room
                    table, which can be useful for
                    debugging.
                    
     6    6.9 Net command.  This provides another choice of
          commands, as follows:
          
               F    Fetch.  This fetches messages for a node
                    and generates an outgoing network
                    packet.
                    
               I    Incorporate.  This incorporates any
                    incoming network packets that are found
                    in the #TRANSPATH.
                    
               R    Generate room request.  This generates a
                    room request file for a node, but does
                    not send it out to the node.
                    
               @    Build address.  This reads MSG.DAT and
                    builds addresses in ROUTE.CIT.
                    
               <    Wow.
                    
               >    Wow.
                    
               ?    Menu.  This displays a list of available
                    commands.
                    
     ^    Auxmem memory status.  This command lists EMS,
          XMS, and swap file usage for the Auxmem version of
          Citadel. This command does not exist in the
          Regular version.
          
     #    Read by message number.  This command reads
          messages specified by message number. Messages
          that the current user does not have access to (for
          example, mail between other users) cannot be
          viewed with this command.
          
     %    Full path file download.  This command lets you
          download any file on the system, restricted by any
          #DIRECTORY keywords in EXTERNAL.CIT.
          
     ?    Menu.  This displays a list of available commands.
          

.Aide (.A...) commands
These commands are only available to people with aide
accounts. In addition, anybody at console can use this
command by using the F6 key and the Aide function (F)
subcommand, unless the console has been locked with
#F6PASSWORD in CONFIG.CIT.

     A    Attributes.  This can be used to change the DOS
          attributes (read-only and hidden) of a file in a
          directory room. (Directory rooms end with the "]"
          character.)
          
     C    Chat.  This works similarly to the Chat (C)
          command, but is active even when the sysop has
          toggled chat off with the F9 key. The sysop can
          use #AIDECHATHRS in CONFIG.CIT to disable this
          command during specific hours of the day (or, more
          often, night).
          
     E    Edit room.  This command can be used to change the
          attributes of a room, such as its name or owning
          group. This is the same as the Aide edit room (A)
          command.
          
     F    File set.  This command asks for file comments for
          all files in a directory room without comments.
          (Directory rooms end with the "]" character.)
          
     G    Group.  This command adds users to and removes
          them from groups.
          
     H    Hall.  This command adds rooms to and removes them
          from halls. This can be limited to sysops by
          setting #AIDEHALL in CONFIG.CIT to 0.
          
     I    Insert message.  This command inserts the
          currently marked message into the current room.
          
     J    Jump to Aide) and Maintenance.  This command takes
          the user to the Aide) room and Maintenance hall,
          if he has group access to them.
          
     K    Kill room.  This command removes a specified room
          from the system.
          
     L    List group.  This command can either list groups
          on the system, or which users, rooms, and halls
          belong to a certain group. To get a list of groups
          on the system, don't provide a group when asked.
          To get a list of what belongs to a certain group,
          provide a group when asked.
          
     M    Move file.  This moves a file from one directory
          room to another. (Directory rooms end with the "]"
          character.)
          
     N    Name message.  This lets you change what messages
          are called on the system. To work, message nyms
          have to be enabled with the #TWIT_FEATURES keyword
          in CONFIG.CIT.
          
     Q    Queue.  This provides another choice of commands,
          as follows:
          
               A    Auto mark/kill/censor toggle.  When
                    these are enabled, you are asked if you
                    want to mark, kill, or censor each
                    message that you read.
                    
               C    Clear.  This clears the message queue.
                    
               I    Insert.  This copies all messages in the
                    queue into the current room.
                    
               K    Kill.  This kills all messages in the
                    queue.
                    
               L    List.  This lists all messages in the
                    queue.
                    
               M    Move.  This kills all messages in the
                    queue and then copies them into the
                    current room, as if the user used the
                    .Aide Queue Kill (.AQK) command followed
                    by the .Aide Queue Insert (.AQI)
                    command.
                    
               R    Room mark.  This puts every message in
                    the current room into the queue.
                    
               S    Sort.  This sorts the queue by message
                    number, either ascending or descending.
                    
               V    Verbose.  This turns on verbose mode,
                    which affects the Insert, Kill, List,
                    and Move commands. In non-verbose mode,
                    these commands print out the message
                    numbers of the messages affected. In
                    verbose mode, these commands print out
                    the headers of the messages affected.
                    
               ?    Menu.  This displays a list of available
                    commands.
                    
     R    Rename file.  This can be used to rename a file in
          a directory room. (Directory rooms end with the
          "]" character.)
          
     S    Set file information.  This can be used to change
          file the description of a file in a directory
          room. (Directory rooms end with the "]"
          character.)
          
     U    Unlink file.  This can be used to unlink (delete)
          a file in a directory room. Sysops can use this
          command to unlink multiple files in a directory
          room by specifying wildcards. (Directory rooms end
          with the "]" character.)
          
     W    Window room.  This changes whether a room is a
          window into a specific hall. This can be limited
          to sysops by setting #AIDEHALL in CONFIG.CIT to 0.
          
     -    Move room back.  This moves a room back in the
          list of rooms, to before the previous room in the
          current hall. Note that there is only one list of
          rooms, so any change in one hall affects all other
          halls that the room is in.
          
     +    Move room forward.  This moves a room forward in
          the list of rooms, to after the next room in the
          current hall. Note that there is only one list of
          rooms, so any change in one hall affects all other
          halls that the room is in.
          
     <    Copy message to old-buffer.  This can be used to
          copy the contents of any visible message on the
          system and into the "old-buffer". The user can
          then use the .Enter Old (.EO) command to re-post
          the message.
          
     ?    Menu.  This displays a list of available commands.
          

.Chat (C) command
This operates identically to the Chat (C) command.


.Download (.D...) command
     Wow.


.Enter (.E...) commands
     A    Application.  This is used to run the room's
          application, if any has been specified with the
          .Aide Edit room (.AE) command.
          
     B    Border.  This lets the user modify borders, if
          borders are turned on for the board and the user
          has border modification access.
          
     C    Configuration.  This lets users change their
          configuration. See the "User Configuration" topic
          in Section II for full information regarding this
          command.
          
     D    Door.  This lets users run a door that has been
          set up in EXTERNAL.CIT with the #DOOR keyword.
          
     E    Exclusive message (Mail).  This enters a message
          that can be read by only one other user.
          Additionally, sysops can add the Group-only
          modifier to this command to leave mail to every
          member of a group: .Enter Group-only Exclusive
          message (.EGE).
          
     G    Group-only.  This is used to create Group-only
          messages and rooms by adding it to the .Enter
          Message (.EM) and .Enter Room (.ER) commands:
          .Enter Group-only Message (.EGM) and .Enter Group-
          only Room (.EGR). A Group-only message can only be
          read by members of the group, and a Group-only
          room can only be visited by members of the group.
          Citadel will ask for the group's name.
          
     H    Hall.  This moves to any hall that the current
          room windows into and that the user has access to.
          This is an alternative to the Next hall (>) and
          Previous hall (<) commands.
          
     L    Local.  This is used to create Local messages by
          adding it to the .Enter Message (.EM) command:
          .Enter Local Message (.ELM). Local messages never
          network off of the system they were entered on.
          
     M    Message.  This enters a message in the current
          room, using any modifiers (such as Group-only)
          that have been used. The Enter key can also be
          used for this.
          
     N    Name.  This is used to change the color and case
          of the current user's name. Additionally, sysops
          can use this command to completely change their
          name.
          
     O    Old.  This is used to revive the contents of an
          aborted message: .Enter Old Message (.EOM) will
          place the text of the aborted message into the
          message editor and let the user continue editing
          the message.
          
     P    Password.  This is used to change the user's
          password.
          
     R    Room.  This is used to create a new room.
          
     S    Surname / Title.  If allowed by #TWIT_FEATURES in
          CONFIG.CIT, this can be used by users to change
          their title and surname.
          
     T    Text file.  This is used to create a text file in
          a directory room. (Directory rooms end with the
          "]" character.)
          
     W    With protocol.  This is used to upload files into
          directory rooms using an internal file transfer
          protocol. Use the .Enter With protocol Menu (.EW?)
          command to list available protocols. (Directory
          rooms end with the "]" character.)
          
     X    Exclude room.  This is identical to the Exclude
          room (X) command.
          
     *    File-linked.  This is used to create File-linked
          messages: .Enter File-linked Message (.E*M). File-
          linked messages have no message text of their own;
          they just point to a file on the disk to display
          as message text. If the file specified is not
          present, then Citadel displays an error message
          stating this. Only sysops can create File-linked
          messages. When file-linked messages network off
          the board, only the first 8K of the file is sent
          out, as the limit on normal Citadel messages is
          8K.
          
     ?    Menu.  This displays a list of available commands.
          

.Goto (.G...) command
This prompts for a room to go to, then takes you to that
room. This will only allow you to specify rooms in the
current hall. If a room with the exact name you specify is
not found, Citadel will then look for rooms that start with
what you specify. If it still cannot find any matches, it
checks for any room that contains what you entered anywhere
in its name. If there are still no matches, it says it
cannot find a room, and stays in the current room.


.Help (.H...) command
     Wow.


.Jumpback (.J) command
This command is identical to the Jumpback (J) command.


.Known (.K...) commands
Most of these commands are modifiers to the .Known Rooms
(.KR) command, which lists rooms in the current hall. Any
number of these modifiers can be used together, though some
cancel others out (such as Local and Shared). If you specify
two such mutually-exclusive options, the last one specified
is used, and the first one ignored.

     A    Application.  This lists only rooms with room
          applications.
          
     Y    Anonymous.  This lists only anonymous rooms.
          
     P    Permanent.  This lists only permanent rooms.
          
     D    Directory.  This lists only directory rooms.
          
     H    Halls.  This lists all halls that the room is
          contained in that the user has group access to.
          
     G    Group-only.  This lists only rooms that have a
          group, or that belong to a specific group. When
          you use this command, Citadel asks for a group;
          just press Enter to list all rooms that belong to
          any group, or specify a group to list all rooms
          belonging to that group.
          
     L    Local.  This lists only rooms that are not shared
          on the network.
          
     N    New.  This lists only rooms that have new messages
          in them.
          
     O    Old.  This lists only rooms that have no new
          messages in them.
          
     E    Exclusive-message.  This lists only rooms that
          have unread mail in them. M can also be used for
          this.
          
     S    Shared.  This lists only rooms that are shared on
          the network.
          
     I    Room information.  This lists information about
          the current room, such as which halls it is in,
          what group owns it, etc.
          
     R    Rooms.  This lists rooms in the current hall.
          Enter can also be used for this.
          
     V    Verbose.  This performs a verbose listing, which
          shows more information about what is being listed.
          
     T    This hall only.  This lists rooms that are in no
          other halls. This is generally used only in
          Maintenance, to see which rooms have been created
          by #AUTOROOM recently when #AUTOHALL is not
          specified in NODES.CIT.
          
     W    Window.  This lists all rooms that exit to other
          halls.
          
     X    Excluded.  This lists only rooms that have been
          excluded by you.
          
     0    Empty.  This lists only rooms that have no
          messages in them.
          
     )    Hidden.  This lists only hidden rooms that you
          have found.
          
     B    BIO.  This lists only BIO rooms.
          
     #    Number of messages.  This lists the number of
          messages in all rooms that are listed.
          
     ?    Menu.  This displays a list of available commands.
          

.Login (.L...) command
This is similar to the Login (L) command, but does not
display system information (such as the node's name, etc.),
and accepts the initials and password immediately.


.Mail search (.M) command
This skips to the next room on the system with unread
exclusive messages. It checks rooms in all halls the current
user has access to.


.Bypass (.B...) command
This prompts for a room to go to, then takes you to that
room, without updating the message pointers for the current
room. This will only allow you to specify rooms in the
current hall. If a room with the exact name you specify is
not found, Citadel will then look for rooms that start with
what you specify. If it still cannot find any matches, it
checks for any room that contains what you entered anywhere
in its name. If there are still no matches, it says it
cannot find a room, and stays in the current room. Once a
room is bypassed, Citadel will not take you to it with the
Goto new messages (G) command or the Bypass (B) commands for
the rest of the call.


.Terminate (.T...) commands
     Q    Quit-also.  This logs the user off of the board
          and hangs up. Y can also be used for this.
          
     S    Stay.  This logs the user off of the board, but
          does not hang up.
          
     V    Verbose.  This lists information about the call
          when logging off, such as the number of messages
          entered and read.
          
     ?    Menu.  This displays a list of available commands.
          

.Upload (.U...) command
     Wow.


.Invite (.I...) commands
     L    List users.  Wow.
          
     R    Room list.  Wow.
          
     U    User.  Enter Wow.
          
     ?    Menu.  This displays a list of available commands.
          

.Expert toggle (.X) command
This provides a quick way to toggle helpful hints on and
off.


.Queue (.Q...) commands
These only work if file queuing has been enabled on the
system with #RESPONSEDOWNLOAD in PROTOCOL.CIT.

     A    Add.  This adds a file in the current room to the
          queue.
          
     C    Clear.  This clears the queue by removing all
          files from it.
          
     D    Download.  This downloads all files in the queue.
          
     L    List.  This lists all files in the queue.
          
     R    Remove.  This removes a specified file from the
          queue.
          
     ?    Menu.  This displays a list of available commands.
          

.Menu (.?) command
This displays a list of all available commands.


Message Editor Commands
When entering text into a message, press Enter on a blank
line to bring up the "Entry Command:" prompt of the message
editor. At this point, the following commands are available:

     A    Abort.  This aborts the message being entered and
          returns to the room prompt. If this command is
          used by accident, the .Enter Old (.EO) command
          will revive the aborted message. By default,
          Citadel asks for confirmation when aborting a
          message. However, this can be overridden with the
          Confirm Abort (A)  option of the Message Editor
          options (E)  subcommand of the .Enter
          Configuration (.EC) command.
          
     C    Continue.  This returns to the text entry mode. By
          default, Citadel displays the last 100 characters
          of the message before returning to text entry
          mode. To have Citadel display the whole message,
          use the Verbose Continue (V)  option of the
          Message Editor options (E)  subcommand of the
          .Enter Configuration (.EC) command.
          
     D    Delete buffer.  This deletes all of the message
          text that has been entered, and returns to the
          text entry mode. Citadel asks for confirmation
          when using this command, as there is no way to
          undo it.
          
     E    Encrypt message. This asks for a key to use to
          encrypt the message. The key is case sensitive,
          and you must remember it if you want to be able to
          read the message in the future: the key is needed
          to decrypt the message when reading it. By
          default, only mail may be encrypted, but the sysop
          has control over which types of messages may be
          encrypted with the #ALLOWCRYPT keyword in
          CONFIG.CIT. He may choose to allow all messages to
          be encrypted, or no messages to be encrypted.
          
     F    Find and replace. This prompts for text to
          replace, then finds the most recent occurrence of
          it, starting with the end of the message. It then
          asks if you want to replace this text. If you
          answer no, Citadel finds the next matching text,
          and prompts to replace it. This continues until
          you answer yes, when it asks for the text to
          substitute, or until no more matches are found.
          
     I    Signature. This lets you change the user signature
          of the message. The _ key can also be used to
          change the signature.
          
     L    Location. This displays the current room and hall.
          
     P    Print formatted. This displays the message as it
          would appear when read. This is a good way to
          ensure that your message is formatted the way you
          want.
          
     R    Replace. This operates as Find and replace (F),
          but is more of an expert-level command: you are
          not prompted for the occurrence to replace.
          Citadel finds the last occurrence of the text in
          the message, and replaces it with what you
          specify. Use this with caution, especially as a
          new user.
          
     S    Save. This saves the message and returns to the
          room prompt. By default, Citadel does not ask for
          confirmation when saving messages. However, this
          can be overridden by using the Confirm Save (S)
          option of the Message Editor options (E)  sub-
          command of the .Enter Configuration (.EC) command.
          
     U    Subject. This lets you change the message's
          subject.
          
     V    Verify spelling.  This runs a spell checker on the
          message. Citadel's spell checker has many options,
          which are described in the Spell Checker topic.
          
     W    Word count.  This counts the characters, words,
          and lines (as Citadel thinks) of the message.
          
     !    Link application.  This is available only to
          sysops on console. It links the message to an
          application (see the "Applications" topic in this
          section) to the message, so that the application
          is run every time the message is read, after the
          message is displayed. If the message is
          transferred to another board on the network, this
          link is lost.
          
     ~     Allow ESC. This toggles whether Citadel will save
          the Escape character (ASCII 27) to the message or
          not. By default, it strips this character, to
          avoid confusing people who try to use the arrow
          keys for message editing. However, some people
          might want to include ANSI sequences in their
          messages; they must use this command to tell
          Citadel to save the Escape character to do so.
          
     @    Address message.  This lets you change the address
          of the message, for sending mail to other users.
          
     #    Special delivery options.  This sets special
          delivery options for mail. The only one currently
          implemented is receipt confirmation requested. If
          a message is marked as such, then Citadel
          generates a message addressed to you confirming
          that the message was received when it is read by
          the recipient for the first time. Note that if the
          message is networked mail destined to software
          that is not Citadel+ on the network, then the
          confirmation will not be sent. Also, if the
          message passes through some other software that
          does not pass the special delivery information,
          the response will not be sent.
          
     <    Insert file.  This command is available only to
          sysops on console. It reads the contents of any
          file on disk and appends it to the message, up to
          Citadel's 8K message limit.
          
     *    Change name. This lets users change their title
          and surname for this message only. Sysops have the
          added capability to change their name for this
          message only.
          
     ?    Menu. This displays a list of available commands.
          

Output commands
Citadel lets you enter certain commands while it displays
text, depending on what is being displayed. The possible
commands are:

     P    Pause.  This works almost all the time. It pauses
          the output of text until another key is pressed.
          Control+S also works for this.
          
     N    Next.  This works when displaying text files, help
          files, or messages. It skips to the next text
          file, help file, or message.
          
     S    Stop.  This works almost all the time. It stops
          the output flow.
          
     J    Jump.  This works when displaying messages, and a
          few other times. It jumps to the next paragraph or
          section of what is being displayed. If there is no
          next paragraph or section, this operates the same
          as the Next (N)  command.
          
     K    Kill.  This works when reading your own message,
          or any message if you are an aide. It lets you
          kill the message.
          
     !    Header scan.  This works when reading messages. It
          toggles header scan mode.
          
     R    Reverse.  This works almost all the time (often
          times, when you don't think it will). It reverses
          the output flow.
          
     V    Verbose toggle.  This works often. It toggles
          verbose mode on and off.
          
     M    Mark.  This works for aides reading messages. It
          marks a message to insert later with the .Aide
          Insert (.AI) command.
          

Console-only commands
There are also commands that only work on console. These use
the IBM extended keys, such as those generated by Alt with
another key or the function keys. These keys are only active
when there is no window currently displayed on the screen
that has the input focus.

     F1     Shutdown.  This disables the modem, and Citadel
            stops answering the phone. This is only
            temporary, and is usually used to hang up on
            the current user. When Citadel next
            reinitializes the serial port (which it does
            periodically to ensure that it is still
            active), the system will start answering the
            phone again.
            
     Ctrl+F1Speech toggle.  If an external sound driver is
            loaded that has support for speech synthesis,
            this will toggle whether Citadel uses it or
            not.
            
     Alt+F1 Clear screen.  This clears the console screen
            and places the cursor in the top left corner.
            This is available even when the console is
            locked with #F6PASSWORD in CONFIG.CIT, unless
            #FULLCONLOCK in CONFIG.CIT is specified.
            
     F2     Reset.  This re-initializes the serial port.
            Like F1, this hangs up on the current user.
            However, it immediately starts answering the
            phone again.
            
     Ctrl+F2Toggle input focus.  This switches the input
            focus from the TTY interface to the last
            focused window, if there are any windows
            currently displayed. If not, this does nothing.
            
     F3     Request.  This tells Citadel to wait until the
            current user terminates, then alert you and
            wait for you to log on or turn off request
            mode. This lets you log onto the system after
            the current caller.
            
     Alt+F3 Request with an attitude.  Wow.
            
     F4     Status screen.  This switches from the terminal
            screen to a status screen, which displays some
            information about the system. This screen is
            updated in real time while the user operates
            the board. The update is quick enough that the
            status screen can be left up all the time, even
            on a slow computer. The user will not notice a
            difference.
            
     F5     Console / Modem mode.  If a user is logged on
            via modem, you can take control of the call by
            switching to Console mode. While you can always
            enter commands while a user is logged-in,
            switching to Console mode keeps the remote user
            from being able to do anything. If a user is
            logged in on console, switching to Modem mode
            make Citadel think that a user on the modem
            hung up the phone, and logs the console user
            off.
            
     F6     Sysop function.  This has the same effect as
            the .Sysop (.S...) command, but is available
            even if the currently logged-in user is not a
            sysop.
            
     Alt+F6 Aide toggle.  This toggles the aide status of
            the currently logged-in user.
            
     Sft+F6 Sysop toggle.  This toggles the sysop status of
            the currently logged-in user.
            
     Ctrl+F6Console sysop.  This brings up a windowing
            interface to the sysop functions.
            
     F7     Bells toggle.  This changes the current bells
            setting: whether Citadel rings the computer's
            bell any time it encounters a Control+G, only
            when the Control+G is part of the chat page, or
            never.
            
     F8     Chat mode.  This brings the user into chat mode
            the next time he encounters a prompt. Alt+C can
            also be used to bring the user into chat mode.
            If there is no user on, this enters dial-out
            mode.
            
     F9     Chat toggle.  This toggles whether the system
            rings the chat bell when a user requests chat
            with the Chat (C) command, or if it just
            displays NOCHAT.BLB to the user.
            
     F10    Help.  This displays a little help window at
            the bottom of the screen, explaining what
            function keys do what. Alt+H will also show
            this help window.
            
     Sft+F10Status line toggle.  This turns off the status
            line at the bottom of the screen.
            
     Alt+F10Second status line toggle.  This toggles
            between single and double line status line
            modes.
            
     Alt+A  Accounting toggle.  This turns accounting on
            and off for the currently logged-in user.
            
     Alt+B  Filter toggle.  This toggles the output filter
            as set by #FILTER in CONFIG.CIT.
            
     Alt+D  Debug toggle.  This toggles Debug mode. In
            Debug mode, Citadel gives extra information
            about what it is doing, to help track down
            problems.
            
     Alt+E  Event time-out.  This executes the next cron
            event that is ready to be executed, if any.
            
     Alt+F  Force event.  This executes the current cron
            event, even if it is not time to execute it.
            
     Alt+K  Scroll-back buffer.  This brings up Citadel's
            scroll-back buffer, if it has been defined with
            #SCROLL_BACK in CONFIG.CIT.
            
     Alt+L  Console lock toggle.  If there is a #F6PASSWORD
            defined in CONFIG.CIT, this will let you lock
            and unlock the console keyboard.
            
     Alt+P  Printing toggle.  This will turn on and off the
            print file.
            
     Alt+R  Repeat event.  This executes the current cron
            event, and does not set the cron event pointer
            to the next event until it is successful.
            
     Alt+S  Screen saver.  This activates the screen saver.
            
     Alt+T  Twit toggle.  This toggles the problem user
            status of the currently logged-in user.
            
     Alt+U  Ignore up-time toggle.  This ignores the
            #UP_DAYS and #UP_HOURS in CONFIG.CIT and lets
            the board answer the phone at any time.
            
     Alt+V  Verified toggle.  This toggles the verified
            status of the currently logged-in user.
            
     Alt+X  Exit.  This exits from Citadel. The Alt+F4
            keystroke can also be used to exit.
            
     Alt+Z  Time-out.  This forces a time out of the
            currently logged-in user. This is a somewhat
            more "polite" way to take over the computer, as
            compared to using the F1 or F2 keys.
            
     PgUp   More time.  This places five minutes in
            currently logged-in user's account, if
            accounting is turned on.
            
     PgDn   Less time.  This removes five minutes from the
            currently logged-in user's account, if
            accounting is turned on.
            

Dial-out commands
When in dial-out mode, the following console commands are
available:

     Alt+D  Debug toggle.  This is the same as Alt+D
            outside of dial out mode.
            
     Alt+E  Shell. This shells to DOS, leaving all of
            Citadel in memory.
            
     Alt+H  Hang-up.  This hangs up the phone.
            
     Alt+K  Scroll-back.  This is the same as Alt+K outside
            of dial-out mode.
            
     Alt+P  Duplex toggle.  This toggles between full and
            half duplex.
            
     Alt+Q  Exit dial-out mode.  This returns to normal
            mode.
            
     Alt+S  Super-shell.  This shells to DOS, swapping most
            of Citadel out of memory.
            
     Alt+V  Status screen.  This is the same as F4 outside
            of dial out mode.
            
     PgUp   Speed up.  This increases the current baud
            rate.
            
     PgDn   Slow down.  This decreases the current baud
            rate.
            
     FKeys  Macros.  All function keys, shifted function
            keys, controlled function keys, and Alted
            function keys are reserved for macros when in
            dial out mode. Use the #DIALMACRO keyword in
            CONFIG.CIT to defining them.
            

Window commands
When a window has the input focus, the following commands
are available, in addition to any specified by that window
(the window can also disable any of these commands, though
none does currently):

     Ctrl+F2Switch to TTY mode.  Wow.
            
     Alt+F4 Close window.  Wow.
            
     F5     Move window.  Wow.
            
     Ctrl+F5Resize window.  Wow.
            
     F6     Switch to next window.  Wow.
            
     Sft+F6 Switch to previous window.  Wow.
            
_Section IV: Configuration Files

Citadel configures itself based on the settings it finds in
various configuration files, all of which have the extension
.CIT. The CONFIG.CIT file must be in the same directory as
the CTDL.EXE file, and the rest should be in the #HOMEPATH
defined in CONFIG.CIT. These are just text files, listing
the variables and their desired values, one line for each
variable. All variable names start with a "#" character,
which must be in the first column of the line. Any line not
starting with "#" is considered a comment by Citadel and is
ignored.

String values must be in double quotes ("") if there is any
space in the string. Single-word strings can be in quotes,
but it is not required. If a string value is in quotes, the
"^" and "\" characters are special. The "^" character
signifies control. That is, "^A" in a string would be
interpreted by Citadel as Control+A (ASCII 1). The "\"
character is used to signify special characters, as in the C
programming language. The following special characters are
recognized by Citadel:

          Code   Resulting character
          \n     Line feed (ASCII 10)
          \t     Tab (ASCII 9)
          \r     Return (ASCII 13)
          \f     Form feed (ASCII 12)
          \b     Backspace (ASCII 8)
          \\     Backslash (\)
          \^     Caret (^)
          
The values from CONFIG.CIT are stored in ETC.TAB and the
values from CRON.CIT are stored in CRON.TAB, so they are not
read every time Citadel is loaded. The values in
HARDWARE.CIT, EXTERNAL.CIT, PROTOCOL.CIT, GRPDATA.CIT, and
MCI.CIT are read every time Citadel is loaded, and the
values in NODES.CIT, ROUTE.CIT, and DEFUSER.CIT are loaded
as Citadel needs them: when networking or doing a Net 6.9
fetch for NODES.CIT; when routing networked mail for
ROUTE.CIT; and when creating a default log entry for
DEFUSER.CIT.

CONFIG.CIT

Citadel's main configuration file is named CONFIG.CIT.
Because of the configurability of Citadel, there are over
150 keywords that can be specified in this file. However,
only a few are required for Citadel to run: the rest have
reasonable defaults. If Citadel cannot find one or more of
the required keywords when it loads this file, it prompts
for the missing information. It then adds this information
to the file so it is available the next time it is read.


Required
The following keywords must be in the CONFIG.CIT file for
Citadel to run. If any are missing, Citadel will ask you to
provide the missing information, then save it to CONFIG.CIT
for the future.

     #NODENAME
          This is the name of the system. It is displayed at
          the beginning of a call, and when the .Read Status
          (.RS) command is used. When a networked message
          from your board is read on another node, this node
          name will be in the header, along with the node
          region.
          
     #NODEREGION
          This is the city or town that your board is in. If
          you don't live within the boundaries of any
          city/town, choose the nearest major city/town as
          your region. In networked messages from your
          board, the region is displayed after the node
          name, in the format "node name, region".
          
     #NODECOUNTRY
          This is the country, state or province, and county
          (or whatever low-level subdivision your country
          uses) in which your board resides. The preferred
          format is hierarchical: country/state/county. For
          example, a Seattle, Washington board would have
          US/WA/KING.
          
     #NODEPHONE
          This is a string containing the node's phone
          number, including area code. At present, it is
          used for informational purposes only (users will
          see this field in the message header when reading
          verbosely), so it can be just a partial number or
          "private" if the board is a private node. For the
          United States and Canada, the preferred format is
          "(xxx)xxx-xxxx".
          
     #HOMEPATH
          This determines which drive and subdirectory the
          Citadel system files (CTDL.EXE,.DAT, .TAB, .CIT
          files, etc.) will be in. It must be given as a
          full path name, including drive letter. (See the
          beginning of this section for conventions
          regarding backslashes in quoted path names.)
          
     #MDATA
          This defines the modem data port. Citadel supports
          COM1 through COM4: #NODEPHONE use 1 for port 1, 2
          for port 2, 3 for port 3, 4 for port 4. Even
          though Citadel supports them, try to avoid COM3
          and COM4; on the IBM PC, the COM3 and COM4
          hardware is not well designed.
          
     #SYSOP
          This is the user name of the BBS's sysop. This
          account has access to all groups. If the
          (optional) #FORWARD keyword is set to 1, then all
          mail to "Sysop" will be sent to the #SYSOP account
          only.
          
     #ADDRESS
          This is the network address for your BBS. It is
          used when netting, and must be different from all
          other #ADDRESSes on the network. The format of
          #ADDRESSes is xxx.yyyy, where xxx is the alias
          specific to your BBS, and yyyy is the Location
          Identifier. Aliases may be one, two, or three
          characters. Most Location Identifiers are three
          characters, but they may be four, as well. See the
          file LOCID.ZIP for information on how to choose
          your Location Identifier.
          

Optional
The following keywords are optional, and let you set up
Citadel to reflect the character of your BBS. The default
settings are shown in parentheses.


Paths and filenames
Set these keywords to keep Citadel from creating its default
paths off of the path set by the required keyword #HOMEPATH.
This gives you the ability to keep different files on
different drives, etc.

     #APPLICPATH (#HOMEPATH + \APPLIC)
          This defines which drive and directory Citadel
          should search for application files in first. If
          they are not found in this directory, Citadel
          searches the DOS PATH for application files.
          Application files include room applications and
          the external programs found in EXTERNAL.CIT.
          
     #HELPPATH (#HOMEPATH + \HELP)
          This defines which drive and directory the help
          (*.HLP), menu (CTDL.MNU), and blurb (*.BLB) files
          are in.
          
     #HELPPATH2 ("")
          If present, this defines a second place to look
          for the help (*.HLP), menu (CTDL.MNU), and blurb
          (*.BLB) files if they cannot be found in
          #HELPPATH. If you are using a sub-board or front
          door, you should put the general files in the
          #HELPPATH2 directory (which should be the same for
          all sub-boards), and the sub-board-specific files
          in the #HELPPATH directory (which should be
          different for each sub-board).
          
     #ROOMPATH (#HELPPATH)
          This defines the drive and directory in which the
          room description files will be kept (these files
          are linked with rooms using the .Aide Edit room
          (.AE)command). The keyword #ROOMTELL determines
          whether or not any such files will be displayed to
          users.
          
     #SCRIPTPATH (#HOMEPATH)
          
          This defines the drive and directory in which Citadel
          script files (*.CSF) are found.
          
     #TEMPPATH (#HOMEPATH + \TEMP)
          This sets the drive and directory to use for
          temporary networking files. This must be different
          from #HOMEPATH, #TRANSPATH, and #DLPATH. This can
          be a RAM disk to improve networking performance.
          
     #TRANSPATH (#HOMEPATH + \TRANS)
          This sets the drive and directory for outgoing
          networked e-mail files, Net 6.9 packets, etc. This
          must not be a RAM disk, as you will lose all files
          if there is a power loss. This path must be
          different from #HOMEPATH, #DLPATH, and #TEMPPATH.
          
     #DIRPATH (#HELPPATH)
          This sets the default directory for directory
          rooms.
          
     #DLPATH (#HOMEPATH + \DLPATH)
          This sets the default directory for received Net
          6.9 file transfers.
          
     #MSGPATH (#HOMEPATH)
          This sets the directory for MSG.DAT. You should
          only set this to something other than #HOMEPATH if
          you are low on disk space on the drive where
          #HOMEPATH resides.
          
     #LOGEXTDIR (#HOMEPATH)
          This sets the directory for the log extension
          files: there may be as many of these as there are
          users in the userlog, so you may want to put this
          in some place other than #HOMEPATH to reduce
          clutter. Additionally, these files tend to be
          small, so putting these on a drive with a small
          cluster size will improve disk usage.
          
     #LEXPATH (#HOMEPATH)
          This sets the path for any dictionaries used by
          the spell checker.
          
     #RLMPATH (#APPLICPATH)
          
          This sets the path for .RLM files. This is all you need
          to know.
          
     #PRINTER (#HOMEPATH + \PRINTER.OUT 0)
          This defines the file that output is copied to
          when you press Alt+P. This can be any valid DOS
          file or device name. If you supply a filename
          only, rather than a full path name, the file will
          be in the #HOMEPATH directory. An optional second
          parameter, if set to 1, will make Citadel prompt
          for a file name when you press Alt+P, with the
          #PRINTER file name as the default.
          
     #TRAP_FILE (#HOMEPATH + \TRAP.FBI)
          This is the file that contains a log of system
          auditing and important events. This can be any
          valid DOS file or device name. Log information
          will be appended to this file. The #TRAP keyword
          lets you specify which events are trapped.
          
     #DICTIONARY (ENG-AM.DAT)
          This sets the name of the dictionary to use for
          spell-checking unless a specific one is assigned
          to a room.
          

Console Attributes (Colors)
These keywords are used to set the console colors. If you
want to change any of the defaults, refer to a reference
book on the IBM PC to see which colors are available, and
which hexadecimal values to use to specify them. All of
these are set with hexadecimal values.

     #ATTR (07)
          This sets the color for normal text. The default,
          07, gives white on black.
          
     #BATTR (00)
          This sets the color for the screen border; it is
          for color systems only. The default, 00, is black.
          The screen is looks best if it is left black or
          set to the same color as the background in #ATTR.
          
     #CATTR (0A)
          
          This sets the color of the characters that the console
          user types in chat mode. The default, 0A, gives
          green on black for color systems, and bold for
          monochrome systems.
          
     #UTTR (01)
          This sets the color for underlined text. The
          default, 01, is blue on black for color systems,
          and underline for monochrome systems.
          
     #WATTR (70)
          This sets the color for inverse text, including
          the status line. The default, 70, gives black on
          white for color systems, and inverse for
          monochrome systems.
          

System Size
These keywords set the size of your system. Once set, these
values can be changed by running Citadel with the "-C"
command line parameter: "CTDL -C".

Be reasonable about the sizes you set here. Don't try, for
example, to set #MAXLOGTAB and #MAXROOMS to their maximum
values at the same time. It is not that Citadel cannot
handle it, it is that it would take nearly 300 megabytes of
disk space to store the log files, and another four or five
to save the room file. Setting absurdly large values for
#MAXROOMS also slows things down a bit, and gives you
nothing. It is best to keep all the #MAX... values set only
a bit above what you actually have. When you need more, you
can always resize up. This will both keep things faster and
save you memory.

     #MESSAGEK (1024)
     #NMESSAGES (8000)
          #MESSAGEK sets how many kilobytes of disk space to
          reserve for the message base. Typically, 1024
          works well for the Regular version and non-
          networked BBSes running the Auxmem version, and
          5120 is a good value for networked BBSes running
          the Auxmem version.
          
          #NMESSAGES sets the maximum number of messages
          that the system will be expected to contain at any
          one time. 5-8 times #MESSAGEK is a good guess for
          non-netted systems; 3-5 times #MESSAGEK is good
          for netted systems. If you have #MSGCOMPRESS
          turned on, you can store about 1.3 times more
          messages, so you should increase #NMESSAGES
          accordingly. As a too-large #NMESSAGES merely
          wastes memory, while a too-small #NMESSAGES causes
          "message not found" error messages, the default is
          set to the very generous (in relation to the
          default #MESSAGEK) value of 8000. If you wish to
          save memory once your message base is scrolling,
          look at the values given in .Read Verbose Status,
          and set your #NMESSAGES to 500 or so larger than
          the number of messages on the system.
          
          Both the Auxmem and Regular versions of Citadel
          can handle #MESSAGEK values of up to two
          gigabytes. However, the Regular version of Citadel
          is limited to 32766 #NMESSAGES, each one taking 14
          bytes of RAM. The Auxmem version of Citadel has no
          practical limit on #NMESSAGES; it is limited by
          the amount of free memory and disk space (each
          message taking 22 bytes of RAM or disk space).
          
     #MAXLOGTAB (128)
          This sets how many users can be stored in the
          userlog at one time. Values between 64 and 256
          work well in most cases. The minimum allowed value
          is 2 and the maximum allowed value is Wow.
          
     #MAXROOMS (128)
          This sets the maximum number of rooms that can be
          on the system. The minimum is 8, and the maximum
          is 856 (Regular version) or 16376 (Auxmem
          version). It needs to be a multiple of 8. If it is
          not, or if it is out of range, Citadel will
          automatically set it to a valid value.
          
     #MAXHALLS (8)
          This sets the maximum number of halls that can be
          on the system. The minimum is 8, and the maximum
          ranges from 32 to 1360, depending on the setting
          of #MAXROOMS. To derive the largest possible
          #MAXHALLS from the #MAXROOMS setting, use the
          formula:
          
               INT((65532 / (#MAXROOMS / 8)) / 8) * 8
          
          #MAXHALLS needs to be a multiple of 8. If it is
          not, or if it is out of range, Citadel will
          automatically set it to a valid value.
          
     #MAXGROUPS (16)
          This set the maximum number of groups that can be
          on the system. The minimum is 8, and the maximum
          is 256. It needs to be a multiple of 8. If it is
          not, or if it is out of range, Citadel will
          automatically set it to a valid value.
          
     #MAXFILES (150)
          This sets the maximum number of files that Citadel
          will see in a directory. For non-Net 6.9 style
          networking (1.0, 1.1, 1.5, 1.6), this is also the
          maximum number of rooms you can network with any
          single node.
          
     #MAXBORDERS (10)
          
          This sets the maximum number of borders allowed on the
          system. Each border takes 81 bytes of RAM and 81
          bytes on disk when Citadel exits to store them for
          next time.
          

Modem
These keywords are used to set the various modem parameters
and commands. The default values work for Hayes-compatible
2400 baud modems. Check your modem documentation if you have
some other type of modem.

     #MODSETUP ("ATX4VMQS0=0S2=128&D2")
          This sets the modem initialization string, which
          is sent when Citadel loads, after every call,
          after every cron event, every #IDLE_WAIT minutes,
          and when F2 is pressed on console.
          
     #MODUNSETUP ("")
          This is sent when the BBS is taken down. If
          #MODSETUP sets auto-answer (S0=1 for Hayes-
          compatible modems), then #MODUNSETUP can be used
          to turn if off (S0=0 for Hayes-compatible modems).
          Also, if you are using #DUMB_MODEM 6 (described
          below), you can reset the modem to hang up when
          DTR is lost with this command.
          
     #INIT_BAUD (2400)
          This tells Citadel the baud rate at which the
          modem should be initialized. Valid values are:
          
               300    600     1200   2400    4800
               9600   19200   38400  57600   115200
               
     #MIN_BAUD (300)
          This is the minimum baud rate at which the system
          will accept calls. If a connection is established
          at a slower speed than #MIN_BAUD, the system will
          print out TOOLOW.BLB and then hang up. Valid
          settings are:
          
     300    600     1200   2400    4800
          7200   9600    12000  14400   16800
          
               19200  21600   24000  26400   28800
               38400  57600   115200 230400
               
     #DUMB_MODEM (0)
          This allows you to set the baud rate detection
          method for incoming calls. Settings of 4, 5, and 6
          are for high speed (9600+ baud) modems. Valid
          settings are:
          
               0    Citadel looks for numeric response codes
                    from a Hayes-compatible modem. Wow. This
                    is probably the same as 3 now. I'll have
                    to check.
                    
               1    Callers must type a plurality of
                    carriage returns to determine what the
                    baud rate is.
                    
               2    Citadel looks for the HS line on the RI
                    line. You need a special cable to do
                    this, but it is quite accurate and quick
                    for 1200 baud modems.
                    
               3    Citadel looks for verbose response codes
                    from a Hayes-compatible modem.
                    
               4    This fixes the system at the #INIT_BAUD
                    for incoming calls. (#BAUD in NODES.CIT
                    is used for netting out.)
                    
               5    This is the same as 4, but drops the
                    port speed for 300, 1200, and 2400 baud.
                    This can only be used with a few modems;
                    6 is more widely supported. (One one
                    modem ever tested worked with this
                    setting. Another modem of the same model
                    from the same manufacturer failed to
                    work properly with this setting.)
                    
               6    This is the same as 5, but instead of
                    just changing the port rate when a low
                    speed connection is made, Citadel first
                    drops DTR, then changes the port rate,
                    and then sends the string specified by
                    #DOWNSHIFT to the modem. #DOWNSHIFT
                    contains the command to switch back to
                    on-line mode, out of command mode. For
                    this to work, #MODSETUP needs to tell
                    the modem to go into command mode when
                    it loses DTR, and not to hang up the
                    phone (&D1 for Hayes-compatible modems).
                    When Citadel hangs up the phone with
                    this setting, it first drops DTR, then
                    sends the string specified by #HANGUP to
                    the modem.
                    
               7    Similar to 6. Richard says he'll write
                    something about it some time. Wow.
                    
     #DOWNSHIFT ("ATO")
     #HANGUP ("ATH")
          These keywords are for use with #DUMB_MODEM 6
          only. #DOWNSHIFT is the command to switch back to
          on-line mode, and is used when connecting as
          described in the #DUMB_MODEM entry. #HANGUP, also
          described in the #DUMB_MODEM entry, is the command
          to tell the modem to hang up after switching to
          command mode by dropping DTR.
          
     #DIAL_INIT ("ATM0V1")
          This is the string that is used to initialize the
          modem before dialing out; i.e., when netting out
          and when going into dial-out mode.
          
     #DIAL_PREF ("ATDT")
          This is the dial prefix used for dialing the phone
          number when networking.
          
     #DIAL_RING ("ATA")
          This is the string to send to the modem when the
          phone rings. Use "" if your modem auto-answers (S0
          is set to a non-zero value in the modem
          initialization string, #MODSETUP). Use "ATA" if
          you have S0=0 and no call-waiting.
          
          This is generally used to ensure that users will
          not get a "zombie modem" when the BBS is not
          answering the phone, and is used to implement
          #UP_HOURS and #UP_DAYS (explained below). However,
          it can also be used to run a BBS on a line with
          call waiting, if you can disable it and also have
          three-way calling on the line. Together with
          #UP_DAYS and #UP_HOURS, this lets you run a part-
          time BBS on a voice line. To do this, set
          #DIAL_RING to disable the call-waiting before
          answering the phone ("ATX3DT!,*70R" for Hayes-
          compatible modems).
          
          This keyword can take an optional second
          parameter: the number of seconds after answering
          the phone before Citadel should try again. Wow.
          
     #OFFHOOK (0)
          This determines whether Citadel should take the
          modem off-hook at console log-in, giving a busy
          signal to anyone calling during that time. Turn
          this on by setting it to 1.
          
          The effect of turning off  #OFFHOOK (setting it to
          0) depends on the configuration of the modem as
          specified with #MODSETUP. If auto-answer is off
          (S0=0 for Hayes-compatible modems), the modem will
          not answer. If the person logged-in at console can
          tell that there is a caller (if a phone plugged
          into the modem line is ringing, for example), he
          can log out and allow Citadel to tell the modem to
          answer the phone. If auto-answer is on (S0=a non-
          zero value for Hayes-compatible modems), the
          caller will get a zombie modem; the sysop can
          allow the caller to log in by doing a .Terminate
          Stay (a .Terminate Quit-Also will hang up on the
          caller, as it reinitializes the modem).
          
     #OFFHOOKSTR ("ATM0H1")
          This is the string to send to the modem to make it
          go off-hook when #OFFHOOK is set to 1.
          
     #HANGUPDELAY (0)
          This is the number of seconds to wait after
          dropping DTR before raising it again (or sending
          #HANGUP if #DUMB_MODEM is set to 6). Most modems
          don't need this, so the default is 0. If the BBS
          is not hanging up on your users when they issue
          the .Terminate Quit-Also command, try setting this
          to a larger number, after verifying that your
          modem is set to drop carrier when it loses DTR.
          (Or, if using #DUMB_MODEM 6 or 7, that #HANGUP is
          set correctly.)
          
     #CHECKCTS (0)
          This determines whether Citadel should check the
          Clear To Send (CTS) line of the serial port before
          sending data to the modem. If this is set to 0,
          Citadel will always send data. If it is set to 1,
          Citadel will only send data if CTS is true. This
          is used for synchronization of systems with high-
          speed modems, as Citadel will be communicating
          with the modem much faster than the modem
          communicates with the other modem. This lets the
          modem tell Citadel when it needs to wait for the
          remote modem.
          
     #AUTOANSI (0)
          This determines whether or not your system checks
          for ANSI at the beginning of a call. A setting of
          1 means that Citadel does the ANSI check. With 0
          or 2, Citadel doesn't check: with 0, it assumes
          that no caller has ANSI; with 2, it assumes that
          every caller has ANSI. (Of course, once the caller
          has logged-in, the ANSI settings in his
          configuration take priority. #AUTOANSI only
          applies before log-in, and sets the default ANSI
          setting for new users.)
          
     #CONNECTWAIT (0)
          After a connection is made with another modem,
          Citadel will wait #CONNECTWAIT seconds before
          sending anything out. This can be useful for
          synchronizing high-speed modems.
          
     #BAUDPAUSE (0)
          This tells Citadel to wait after changing the
          serial port speed before sending anything else to
          the port. Give the time desired to wait in
          hundredths of a second. The need for this option
          is very rare; one quite flaky modem seemed to be
          more stable when this was set.
          

System Settings
These keywords set various aspects of your BBS.

     #IDLE_WAIT (3)
          This is the time (in minutes) that the system will
          wait before executing a cron event or resetting
          the modem with #MODSETUP.
          
     #OLDCOUNT (150)
          This determines how many messages are new to first-
          time callers. A value of 0 makes all the messages
          on the system new.
          
     #ROOMTELL (1)
          This activates room descriptions. Room
          descriptions are displayed to users the first time
          each call they visit a room with a room
          description file set up, unless they turn off "see
          room descriptions" with the .Enter Configuration
          (.EC) command. Setting this to 1 enables room
          descriptions, and setting it to 0 disables them.
          However, there is no good reason to disable room
          descriptions; just don't set any with the .Aide
          Edit room (.AE)command if you don't want any.
          
     #UP_DAYS (ANY)
     #UP_HOURS (ANY)
          These set the days and hours that your BBS is up
          for callers. This only works if #DIAL_RING is set
          (i.e., you are not setting your modem to auto-
          answer). Valid settings are a list of numbers
          representing days or hours (for days, 0 =
          Sunday... 6 = Saturday; for hours, 0 = midnight
          through 23 = 11PM), or the word ANY. For example,
          to have the BBS only answer on weekdays between
          10PM and 7AM, use these two lines:
          
                    #UP_DAYS 1 2 3 4 5
                    #UP_HOURS 22 23 0 1 2 3 4 5 6
     
     #NETMAIL (1)
          This determines whether networked mail is put into
          the Mail room, or into the room corresponding to
          the room it was entered in on the originating
          system. (If there is no corresponding room, the
          mail will be put in the Mail room.) Setting this
          to 0 directs all networked mail to the Mail room;
          setting it to 1 tells Citadel to try to put it in
          a corresponding room.
          
     #SUBHUBS (1)
          This option affects how the Goto new messages (G)
          and Bypass (B) commands work. Valid settings for
          #SUBHUBS are:
          
               0    Window rooms are treated the same as on
                    Stonehenge; that is, you are never taken
                    to window rooms on a Goto loop unless
                    there are new messages in them. Also, if
                    there are no new messages in any room in
                    a hall, Goto will just take you to the
                    Lobby room, even if it is not in that
                    hall.
                    
               1    When you issue the Goto command, Citadel
                    will take you to the next room with new
                    messages. After all non-excluded new
                    rooms have been visited, further Gotos
                    will cycle through any window rooms in
                    that hall.
                    
               2    When you issue the Goto command, Citadel
                    will take you to the next room with new
                    messages or the next window room,
                    whichever comes first.
                    
               4    This enables floor mode: there are no
                    window rooms, so the > and < commands
                    will take you to the next or previous
                    hall from any room, and Goto will always
                    take you to the next room with new
                    messages, or to the Lobby room if there
                    are no rooms with new messages in the
                    current hall. When this setting is used,
                    it is not possible to remove the Lobby
                    room from any halls.
                    
          There is no #SUBHUBS 3.
          
     #SCREENSAVE (0 0 0 0 0 0)
          This keyword sets the screen saver parameters. You
          don't need to set all parameters; Citadel will
          assume a value of 0 for any that you don't set.
          The meaning of each parameter is as follows:
          
               1st  The number of minutes with no keyboard
                    activity before the screen blanks.
                    Setting this to 0 disables the screen
                    saver.
                    
               2nd  This tells Citadel whether or not to
                    turn off the screen saver when a call is
                    received. Setting this to 1 tells it to
                    turn off the screen saver, and setting
                    it to 0 tells it to leave it on.
                    
               3rd  This only makes sense if the second
                    parameter is on; it tells Citadel if you
                    want the screen saver to stay off for
                    the duration of the call. If this is set
                    to 1, the screen saver stays off;
                    setting it to 0 tells Citadel to turn
                    the screen saver on again after the
                    number of minutes set with the first
                    parameter.
                    
               4th  This tells Citadel whether or not to
                    display a clock on the screen while it
                    is blanked. If this is non-zero, a clock
                    is displayed that moves and changes
                    color after the number of seconds set by
                    this parameter. This movement and color
                    changing prevents screen burn-in.
                    Setting this to 0 disables the display
                    of the clock. (You can use the #SAVERMSG
                    keyword to display something other than
                    a clock.)
                    
               5th  This determines whether or not the
                    cursor is displayed on the blanked
                    screen. The cursor position is kept
                    current, as if the screen was not
                    blanked, so you can tell if a user is on
                    line by watching to see if the cursor
                    moves. Setting this to 1 tells Citadel
                    to display the cursor; setting it to 0
                    tells it not to display the cursor.
                    
               6th  This determines whether the console is
                    locked when the screen-saver turns on.
                    For this to work, a password must be set
                    with the #F6PASSWORD keyword. Setting
                    this to 1 tells Citadel to lock the
                    console; setting it to 0 tells it not to
                    lock the console.
                    
     #SAVERMSG ("")
          This sets a message to be displayed in place of a
          clock when the screen-saver is active if the
          fourth parameter to #SCREENSAVE is non-zero.
          
     #SCROLL_BACK (0 0 0)
          This sets up the console scroll-back buffer.
          Setting all three parameters to 0 means that no
          scroll-back buffer is created. Otherwise, the
          first parameter determines whether or not to save
          colors in scroll-back (set this to 1 to save
          color, or 0 to strip color information from the
          scroll-back buffer, which gives you twice as many
          lines), the second parameter sets the number of
          lines of scroll-back to allocate, and the third
          parameter sets the number of seconds of inactivity
          to allow before timing out of scroll-back (if this
          parameter is 0, it will never time out: this is
          not recommended, as you may inadvertently tie up
          Citadel for long periods of time by leaving the
          scroll-back buffer on). The Regular Version of
          Citadel can handle scroll-back buffers of up to
          64K in size, so the maximum number of lines you
          can save is around 400 with color, or 800 without
          (assuming an 80 column screen). If you set the
          number of lines too high, Citadel will calculate
          it for you, so you can get the maximum scroll-back
          by choosing an absurdly high value. In the Auxmem
          Version, the scroll-back buffer is stored in XMS,
          EMS , or virtual memory, and has no practical
          limit.
          
     #MSGCOMPRESS (0)
          This determines whether or not messages will be
          compressed. The current compression scheme only
          compresses message text (not headers), so it
          shouldn't interfere with auto-routing programs, or
          other programs that read the message header.
          However, this means that you will only get 20-30%
          more messages in your message base. Compression
          does, of course, slow down message reading
          slightly, but this is not particularly noticeable
          even on an XT. Also, turning this on leads to some
          memory overhead: there is some memory needed for
          the compression buffer and Huffman tree, and you
          will need to set #NMESSAGES higher because there
          will be more messages in the message base, so if
          you tend to be short on memory, you may not want
          to use compression. Set 1 for compression on, 0
          for compression off.
          
     #FORWARD (0)
          This sets where to send mail that users leave to
          "Sysop". By setting this to 1, mail to "Sysop" is
          sent to the user identified by the #SYSOP keyword;
          setting it to 0 makes mail to "Sysop" readable by
          every user on the system with sysop access by
          saving "Sysop" as the recipient of the mail.
          
     #TIMEOUT (5)
     #CONSOLETIMEOUT (#TIMEOUT)
     #UNLOGTIMEOUT (1)
          These keywords set the amount of time (in minutes)
          that a user may be idle before being logged out.
          #UNLOGTIMEOUT is the maximum allowed idle time for
          an unlogged-in user, and #TIMEOUT is the maximum
          allowed idle time for a logged-in user.
          #CONSOLETIMEOUT is the maximum allowed idle time
          for a user logged in at console.
          
     #SLEEPCOUNT (0)
     #COUNTBEEP (0)
          #SLEEPCOUNT sets a countdown timer on the idle
          time out. If this is set to a non-zero value,
          Citadel will perform a seconds-based countdown
          from this number before the user is logged out,
          but after the #SLEEPPROMPT is displayed: if the
          user takes any action during this countdown, it
          will be aborted, and the call will continue. A 0
          value means that no countdown will be done; the
          user is immediately logged out. #COUNTBEEP
          determines whether or not to beep every second
          during the #SLEEPCOUNT countdown (also during the
          post-download hang-up countdown). Set this to 1 to
          beep, or to 0 to not beep.
          
     #RESTORE_MODE (1)
          This sets whether or not to restore the video mode
          after a shell to an application. Usually, you will
          want Citadel to run in the same video mode always.
          However, if two people use Citadel from console,
          there may be a disagreement: for example, one
          person may like 25 line mode and the other likes
          50 line mode. When this is set to 1, you would
          have to exit Citadel, run a video-mode changing
          program, and restart it to switch video modes. If
          it is set to 0, simply shelling and running a
          video-mode changing program is sufficient to
          change video modes.
          
     #MAXJUMPBACK (25)
          This sets the maximum number of Jumpbacks the user
          can do at one time. Each new room added to the
          buffer takes a few bytes; the maximum is over 4000
          (if you set it too high, Citadel will set it to
          the maximum).
          
     #MAXSTAT (??50??)
          This sets the maximum number of system events to
          store for display on the System Status Screen. 50
          is more than enough for any standard screen mode.
          If you are in a mode with many lines on the screen
          and notice that the list does not fill the whole
          screen, increase this value. Alternatively, if you
          don't use the System Status Screen to view past
          events, you can save a small amount of memory by
          decreasing this setting.
          
     #BIOS (0)
          This determines whether Citadel will use the BIOS
          for screen writes, or whether it will write
          directly to video RAM. Set this to 1 to enable
          BIOS calls; set it to 0 to disable BIOS calls and
          use direct memory writes. Direct video writing is
          much faster, but might cause "snow" to appear when
          used with completely IBM-compatible CGA video
          cards. (Many clone CGA, and all Monochrome, EGA,
          and VGA, video cards will not produce snow with
          direct screen writes.)
          
          Even when this is set to 1, Citadel will sometimes
          use direct memory access (such as when saving and
          restoring the screen, or using the scroll-back
          buffer), so it still will not run properly under
          multitasking systems which require BIOS screen
          writes, such as IBM's Top-View or Quarterdeck's
          DESQview (except on 386 computers).
          
     #DIALMACRO (none)
          This defines macros to put on function keys for
          use in Dial-Out mode. After the #DIALMACRO
          keyword, enter the name of the function key, then
          the macro to assign to that function key. You can
          assign up to 48 macros (or 40 on older keyboards)
          by using the Shift, Alt, and Control keys with the
          function keys. Function keys are named "F1" to
          "F12", "ALT_F1" to "ALT_F12", "SFT_F1" to
          "SFT_F12", and "CTL_F1" to "CTL_F12". For example,
          the following will assign the string "ATDT555-
          1212" plus a return to Shift+F1:
          
                    #DIALMACRO SFT_F1 "ATDT555-1212\n"
     
     #EXPIRE (15)
          This is the message expiration value for
          networking. It should be set to the number of days
          messages stay in your message base before being
          scrolled off by new ones. This can be determined
          by reading forward in a regularly-used room like
          Aide, and subtracting the date of the first
          message found from the current date. You may want
          to make it a bit smaller than that as a safety
          measure, to prevent old messages from reappearing
          in a room if your scroll rate changes. (This is
          most likely to happen if the proportion of netted
          rooms to local rooms changes significantly.)
          
     #CIT86COUNTRY ("")
          This sets the node's country for broadcast over
          the Citadel-86 network, if you are connected to it
          either directly or indirectly.
          
     #CIT86DOMAIN ("")
          This sets your domain for broadcast over the
          Citadel-86 network. This should only be set on the
          node that gateways into the Citadel-86 network. As
          this only seems to be used for mail routing by
          Citadel-86es and the gateway does not support
          mail, this option really does nothing right now.
          
     #DISKFREE (0)
          This sets how much disk space Citadel should
          attempt to keep free, in bytes. If your disk has
          less free space than this on it, Citadel will no
          longer accept uploads.
          
     #FILEBUFSIZE (4096)
          
          To speed access to the message base, Citadel creates a
          buffer in memory to store parts of it. This sets
          the size of this buffer, in bytes. If you feel
          like experimenting, you may be able to optimize
          system performance by changing this value. (If it
          is too small, Citadel needs to access the disk
          more often when reading messages because it cannot
          hold enough of the data in the buffer at once. If
          it is too big, it also has to access the disk more
          often, because it tries to keep more data in the
          buffer than it needs.
          
     #NOBELLS (0)
          This lets you set how Citadel treats bells when
          first configured. Set to 0 to always ring the
          console speaker; 1 to ring it only as part of a
          chat request; or 2 to never ring it.
          
     #NOCHAT (0)
          This lets you turn chat on or off when first
          configured. Set to 0 to turn chat on or 1 to turn
          it off.
          
     #AIDECHATHRS (ANY)
          This lets you specify which hours the .Aide Chat
          (.AC) command is active. Specify the hours allowed
          as a number from 0 to 23, or use ANY to let it
          always be active.
          
     #CHATMAIL (0)
          Wow.
          
     #ADCHANCE (0)
          This sets the percentage chance that an ad will be
          displayed before a room prompt is displayed. Set
          this as an integer from 0 to 100.
          
     #ADTIME (0)
          This sets the number of seconds to wait at a room
          prompt with no activity before displaying an ad.
          Use 0 to disable this feature.
          
     #CHATWHY (0)
          Wow.
          
     #CHATFLASH (0)
          
          This sets whether to cycle the color of the border as
          part of the chat page. This can be useful to
          attract attention when the bell is turned off or
          otherwise inaudible. Set this to 1 to enable this
          feature or 0 to disable it.
          
     #WYSIWYG (0 0 0)
          This sets how colors appear on the console screen.
          The first parameter indicates how the color is set
          for new blank lines when the screen scrolls: set
          this to 0 to have them appear in the #ATTR color
          setting (standard DragCit behavior), or set it to
          1 to have them appear in the current character
          color (standard ANSI.SYS behavior). The second
          parameter indicates how a user's colors show up on
          console: set this to 0 to always display the
          colors as set by the CONFIG.CIT keywords #ATTR,
          #CATTR, etc.; set it to 1 to display the colors as
          set by the CONFIG.CIT keywords unless the user is
          logged in on console, in which case the user's
          color settings are used; or set it to 2 to have
          the colors always display as the user has them
          set. The third parameter indicates whether or not
          colors are always displayed on console regardless
          of user configuration: set it to 0 to have colors
          only displayed if the user is configured to
          display colors, or set it to 1 to have colors
          always displayed on console.
          
     #SPEECHON (0)
          This sets whether to send output to a speech
          synthesizer if an .ESD with speech synthesis is
          loaded. Set this to 1 to enable speech output, or
          0 to disable it. This sets the default for use
          after configuring; use the Alt+F1 keystroke while
          Citadel is running to toggle speech output.
          
     #OVREMS (0)
          This sets whether to store overlays in EMS memory.
          When overlays are stored in memory instead of on
          disk, Citadel runs faster. However, it also has
          less free memory.
          
     #OVREXT (0)
          
          This sets whether to store overlays in extended memory.
          When overlays are stored in memory instead of on
          disk, Citadel runs faster. However, it also has
          less free memory.
          
     #CHECKSYSMAIL (3)
          Wow.
          
     #MEMFREE (102400)
          This sets the minimum free memory (in bytes) to
          allow before forcing a super-shell when shelling.
          The default (100K) gives enough memory for most
          commonly-used utilities.
          
     #SHOWMOVED (1)
          This sets whether to display the original room
          name in a moved message's header when verbose mode
          is off. (It is always displayed when verbose mode
          is on.)
          
     #ALTF3TIME (300)
     #ALTF3MSG ("^A3The sysop needs the system. You have
          only ^A1%m:%s^A0^A3 left.^A0")
          These set how Citadel responds to the Alt+F3
          keystroke. #ALTF3TIME sets the time, in seconds,
          to allow the user to stay on the system after
          pressing Alt+F3. #ALTF3MSG sets the message to
          display to the user before every room prompt when
          his time is limited by Alt+F3. The following
          variables are allowed:
          
                %m   Minutes left, with no leading zero.
                %s   Seconds left.
                %z   Minutes left, with a leading zero if
                one digit.
                
     #FASTLOGIN (0)
          This sets whether to use an alternate message
          counting method that is sometimes faster (but
          sometimes slower) when logging a user in. This
          feature is only available in the Auxmem version.
          Trying to describe when it has a benefit and when
          it does not is more than I want to do, so just try
          it if it seems to take a while to log in.
          
     #SAVEJB (1)
          This sets whether to save jump-back information
          for users between calls. Saving jump-back
          information takes some disk space, so you may want
          to disable this feature if you are low.
          
     #SWAPNOTE (0 in Auxmem; 1 in Regular)
          This sets whether to display the "Swapping, please
          wait" message when doing a Super-shell. As most
          people running the Auxmem version have enough
          memory that a super-shell is to memory (and
          therefore quite quick), this defaults off for the
          Auxmem version. Similarly, as most people running
          the Regular version do their super-shells to disk
          (which is quite slow), the default for them is to
          display the message.
          
     #FASTSCRIPTS (0)
          This sets whether to make scripts load faster, at
          a sacrifice of memory. This only affects load
          time, not execution time. When this is set to 1,
          then the script interpreter does not free its
          memory when a script terminates, so it is ready to
          go the next time a script is run. If it does free
          its memory, it must take a bit of time to prepare
          to run the script each time.
          
     #NEWNODEALERT (1)
          This sets whether to save a message to the Aide)
          room whenever a new node is detected on the
          network. This message contains the node's name,
          region, country, address, and phone number, as
          well as the local message number that is the
          evidence of the node's existence.
          

Auxiliary Memory
These keywords only have an effect if you are running the
Auxmem version of Citadel. They are silently ignored by the
Regular version.

     #VIRTMEM ("VMEM.TAB")
          If the size of the room table exceeds the amount
          of XMS and EMS memory installed in your computer,
          Citadel will keep the information in a disk file.
          This keyword lets you set the drive and directory
          to keep this file in, as well as the name. This
          lets you, for example, keep this file on a RAM
          disk for speed. (If you have extended memory but
          no XMS provider, for example, setting the extended
          memory up as a RAM disk and writing this file to
          the RAM disk will give Citadel access to this
          memory.)
          
          If you don't want Citadel to ever use virtual
          memory, set this to an invalid file name.
          (#VIRTMEM "" works well.) Citadel will then abort
          with an error if it runs out of memory, instead of
          using virtual.
          

Configuration
These keywords determine the default configuration for
unlogged-in users. These are also the defaults for new
users, unless overridden in the DEFUSER.CIT file. New users
are given an opportunity to change these as part of the log-
in process. Existing users can change their settings with
the .Enter Configuration (.EC) command.

     #NET_PREFIX ("\^A3*\^A0")
          This sets the default net prefix for new and
          unlogged-in users. By default, it is displayed
          before the room name of networked rooms.
          
     #DATESTAMP ("%x %X %p")
     #VDATESTAMP ("%A %x %X %p")
          These set the default time/date formats for new
          and unlogged-in users. #DATESTAMP is used for
          message headers when reading non-verbosely;
          #VDATESTAMP is used for verbose message headers,
          .Read Status, and .Read Verbose Userlog.
          
     #PROMPT ("%n\^A2%r%e")
          This sets the default room prompt for new and
          unlogged-in users. See the file PROMPT.BLB for
          full information about setting the prompt.
          
     #MOREPROMPT ("<More>")
          
          This sets the default more prompt for new and unlogged-
          in users. The more prompt is displayed after each
          screen when screen pause is turned on and after
          each message when pause-between-messages is turned
          on.
          

System Personality
These keywords determine the "personality" of your BBS; for
example, whether it is a twitty or serious board.

     #ENTER_NAME ("your name")
          This allows you to configure the prompt that asks
          for a new user's name. This will be appended to
          "Enter " (that is the word "Enter" and a space),
          so don't include "Enter " as part of the string. A
          colon (":") will be appended to this string, so
          don't include any ending punctuation, either.
          
          Examples: "your name", "your handle", "your full
          real name". These will be displayed as: "Enter
          your name:", "Enter your handle:", and "Enter your
          full real name:".
          
     #CENSOR (0)
          This determines whether or not users can use the
          .Enter Configuration command to change their
          ability to see censored messages.
          
     #TWIT_FEATURES (TITLES NET_TITLES SURNAMES NET_SURNAMES
          ENTER_TITLES COLORS MCI)
          This turns on certain (rather frivolous) features
          of the software. The features currently
          implemented are:
          
          MSG_NYMS       Allows aides to change what
                         messages are called with the .Aide
                         Name messages (.AN)command. (See
                         #MESSAGE_NYM for the ability to set
                         the default name.)
                         
          BORDER_LINES   Allows users to enter borders with
                         the .Enter Border (.EB) command.
                         (See #BORDER for the ability to set
                         default borders.)
                         
          TITLES
          SURNAMES       Turn on support for titles and
                         surnames for users. Titles are seen
                         before the user's name on message
                         headers and surnames are seen after
                         the name: [Title] Name [Surname].
                         Titles and surnames can be edited
                         and locked by the sysop.
                         
          NET_TITLES
          NET_SURNAMES   Allow titles and surnames received
                         over the network to be displayed on
                         the BBS.
                         
          ENTER_TITLES   Allows users to change their title
                         and surname with the .Enter Surname
                         / Title (.ES) command.
                         
          COLORS         Allows colors in room names,
                         titles, surnames, user names, etc.
                         
          MCI            Enables MCI features (^AN, ^AT,
                         etc.).
                         
     #SIGNATURE ("")
          This is the signature line for your board. It is
          appended to each message sent over the network
          from your board. You may have as many #SIGNATURE
          lines as you like; Citadel will cycle through them
          in the order it finds them in the CONFIG.CIT file.
          You must have them sequentially in the file for
          this to work, with nothing else between the lines,
          not even blank lines.
          
     #ANONAUTHOR ("****")
          This sets the author of anonymous messages.
          
     #TWITREGION ("")
     #TWITCOUNTRY ("")
          These define "twit" (sometimes called
          "configurable") region and country fields that are
          displayed after the regular region and country
          fields on verbose read. They are not used in
          routing.
          
     #MESSAGE_NYM ("message" "messages" "Saving")
          This lets you define an alternate name for
          messages, and what is printed when they are being
          saved. The first parameter defines the singular
          name, the second defines the plural name, and the
          third is what you do to it when you save it. If
          the MSG_NYMS feature of the #TWIT_FEATURES keyword
          is enabled, then aides can change these with the
          .Aide Name message (.AN) command.
          
     #CREDIT_NYM ("credit" "credits")
          This lets you define alternate names for credits.
          The first parameter is the singular name, and the
          second is the plural name. These are only used if
          #ACCOUNTING is set to 1.
          
     #BORDER ("")
          This lets you initialize your borderlines. You can
          have up to 10 #BORDER lines. This only has an
          effect if BORDER_LINES is turned on in
          #TWIT_FEATURES.
          
     #POOP! (0)
          This sets what users will see when they hit P or Q
          at a room prompt. Valid settings are:
          
               0    All users will see "Poop!" and "Quack!"
                    when they hit P and Q, respectively.
                    
               1    Only users with Helpful Hints turned off
                    (expert mode on) will see "Poop!" and
                    "Quack!" when they hit P and Q; they are
                    treated as unknown commands for other
                    users.
                    
               2    P and Q will be treated as unknown
                    commands for all users.
                    
     #MCI_FIRSTNAME ("")
     #MCI_NAME ("")
     #MCI_TIME ("")
     #MCI_DATE ("")
     #MCI_POOP ("")
          These set what is sent out instead of the MCI
          values if MCI is not turned on in #TWIT_FEATURES,
          as follows:
          
          MCI_FIRSTNAME sets what to send on ^An.
          MCI_NAME      sets what to send on ^AN.
          MCI_TIME      sets what to send on ^At.
          MCI_DATE      sets what to send on ^AT.
          MCI_POOP      sets what to send on ^AP.
          
     #SLEEPPROMPT ("Sleeping? Call again! :-)")
          This sets the prompt that is shown to users who
          have been idle for too long.
          
     #TWIRLY ("/-\\|" 10)
          This sets a configurable twirly cursor string.
          This is used to build the twirly cursor for users
          who have it turned on. Citadel cycles through the
          string, displaying one character at a time. The
          optional second parameter controls speed: a larger
          value produces a slower twirl.
          
     #FUELBAR (ù #)
          This allows the sysop to configure the "Building
          message table" fuel bar that is displayed when
          doing a full reconfiguration. The first parameter
          is the character used to create the empty bar; the
          second parameter is the character used to fill it.
          
     #SOFTVERB ("")
          This should be named #SOFTADJECTIVE, but we are
          poopie. This specifies text to display before the
          name of the program, such as when callers call the
          system and it identifies itself and when the .Read
          Status (.RS) command is used.
          
     #ECTWIRLY (1)
          This sets whether users may enable (or disable)
          their twirly cursor with the .Enter Configuration
          (.EC) command.
          
     #ECUSERLOG (1)
          This sets whether users may make their account
          unlisted (or listed) with the .Enter Configuration
          (.EC) command.
          
     #ECSIGNATURE (1)
          This sets whether users may set their user
          signature with the .Enter Configuration (.EC)
          command.
          
     #ECCOLOR (1)
          This sets whether users may turn on (or off) and
          set their colors with the .Enter Configuration
          (.EC) command.
          
     #BORDERFREQ (20)
          This sets how often borders are displayed to the
          user. The value of this is used as a counter:
          after that number of room prompts has been
          displayed, a border is also displayed.
          
     #MAXERROR
          Wow.
          
     #MUSIC (1)
          
          This sets whether users may enable music with the
          .Enter Configuration (.EC) command.
          
     #TWITREV (1)
          This sets whether the Reverse (R) option works
          when you don't expect it.
          
     #PERSONALHALLOK (1)
          This sets whether the .Personal hall... (.P...)
          commands are active.
          
     #CHATBELL
          Wow.
          
     #ROOM_NYM ("room" "rooms")
          This sets what to call rooms.
          
     #HALL_NYM ("hall" "halls")
          This sets what to call halls.
          
     #USER_NYM ("user" "users")
          This sets what to call users.
          
     #GROUP_NYM ("group" "groups")
          This sets what to call groups.
          
     #FILTER (1 0 0)
          This sets the action of the Alt+B keystroke. This
          has three parameters: Psycho, Reverse, and Mmmm.
          You can turn on any combination of these for your
          desired effect. Psycho makes all characters
          alternate in case as they are output; Reverse
          makes all words come out backwards; and Mmmm
          replaces all upper-case letters with the character
          M and all lower-case letters with the character m.
          

Accounting
These keywords are used to set up accounting for your
system.

     #ACCOUNTING (0)
          This determines whether or not accounting will be
          enabled for your board. It defaults to 0, which
          means that accounting is disabled; set it to 1 to
          enable accounting.
          
     #UNLOGGEDBALANCE (5)
     #NEWBAL (60)
          #UNLOGGEDBALANCE sets the balance for users who
          are not logged-in. #NEWBAL sets the balance for
          new users. (Both are in minutes.)
          

Security
The following keywords determine security features of your
system.

     #LOGIN (VERIFIED NEW_ACCOUNTS)
          These keywords control how your BBS handles new-
          user log-ins. There are a number of possible
          events that may occur when creating a new account:
          #LOGIN allows you to select any combination of
          these events. Valid possibilities are:
          
          CLOSED_SYSTEM  Prints CLOSESYS.BLB and hangs up.
                         No account will be created, and no
                         message will be left alerting the
                         sysop that someone tried to create
                         an account.
                         
          NEW_ACCOUNTS   This allows new accounts to be
                         created by callers.
                         
          VERIFIED       All new users will automatically be
                         verified at log-in; the user does
                         not have to supply any information.
                         
          QUESTIONS      Asks a set of questions (real name,
                         phone number, etc.), and has the
                         caller enter a message to sysop.
                         The answers to the questions and
                         the message to sysop are saved to a
                         file for the sysop to read later.
                         Do not use this option; it is
                         included only for backwards-
                         compatibility. Use the
                         #NEWUSERQUESTIONS keyword instead.
                         
          SYSOP_MESSAGE  This has the caller leave a message
                         to the sysop. Don't use this with
                         QUESTIONS (which you shouldn't be
                         using anyway), or the caller will
                         have to enter two messages to the
                         sysop. This is slightly different
                         than the sysop-message that is part
                         of QUESTIONS: that message is
                         actually not saved to the message
                         base, but only the the new user
                         information file. This message is
                         actually saved to the message base.
                         
          If you include the #LOGIN keyword, you must
          explicitly set VERIFIED and NEW_ACCOUNTS on if you
          want them to be on. All options need to be set on
          the same line. For example, the following would
          allow new callers to create accounts, but they
          will not be verified and Citadel will have them
          leave a message to the sysop:
          
                    #LOGIN NEW_ACCOUNT SYSOP_MESSAGE
     
     #NEWUSERAPP ("")
          This sets an application to run as part of the new-
          user login routine. This gives you a chance to
          create an extensive questionnaire, run a call-back
          verifier, or do anything else you want to do.
          
     #NEWUSERQUESTIONS (none)
          This lets you have Citadel ask questions to new
          users when they first log on. Specify which
          questions you want Citadel to ask in the order
          that you want them asked. In addition to being
          saved in the user's log entry, the responses to
          these questions (except for COLORS) are saved to
          the file NEWUSER.LOG in your #HOMEPATH, so you can
          easily review all of your new users' answers at
          once. The available questions are:
          
          REALNAME
               The user is prompted for his real name. A
               response is required to continue.
               
          PHONENUMBER
               
               The user is prompted for his phone number. A
               response is required to continue.
               
          ADDRESS
               The user is prompted for his mailing address,
               which can be up to three lines long.
               
          OCCUPATION
               The user is prompted for his occupation.
               
          BIRTHDAY
               The user is prompted for his birthday.
               
          SEX
               The user is prompted for his sex. A choice of
               unspecified is available (and is the
               default).
               
          WHEREHEAR
               The user is prompted for where he heard about
               the system.
               
          COLORS
               
               The user is prompted to set his colors.
               
          TITLE
               The user is prompted to enter a title.
               
          SURNAME
               The user is prompted to enter a surname.
               
          PROTOCOL
               The user is prompted to select a default file
               transfer protocol.
               
          MESSAGE
               The user is prompted to leave a message to
               the sysop. Before the message editor is
               entered, the NEWQMSG.BLB file is displayed to
               the user. This message is saved to
               NEWUSER.LOG, and not to the message base.
               
     #F6PASSWORD ("")
          This keyword creates a system password to lock all
          function and Alt+ keys. They are always unlocked
          if a Sysop is logged-in. To unlock them at other
          times, press Alt+L. Citadel will then prompt for a
          password. If the password is correct, the keys
          will be unlocked until they are locked again by
          pressing Alt+L. When the console is locked, the
          symbol of a sun is displayed in the status line.
          
          Additionally, there are two special settings for
          this: "disabled" and "f6disabled". If "disabled"
          is used, then the keys are always locked unless a
          Sysop is logged in on console: the Alt+L keystroke
          cannot be used to unlock them. If "f6disabled" is
          used, then only the F6, Control+F6, Shift+F6, and
          Alt+F6 keys are locked; all other keys are
          available all the time. The F6 key combinations
          are only unlocked when a Sysop is logged-in: Alt+L
          cannot be used to unlock them.
          
          To disable the locking of console keys, set this
          to "" (the default).
          
     #FULLCONLOCK (0)
          
          This sets whether to fully lock the console when the
          console is locked. When fully locked, all
          keystrokes except Alt+L are disabled, not just the
          Alt+ and function key ones. It is very rare that
          you will want to set this to 1 if #F6PASSWORD is
          set to "disabled": in this situation, nothing can
          be done on console other than using
          Control+Alt+Del, the reset button, or the power
          switch. (A sysop can call from remote then upload
          and run a script that brings the system down in
          this situation.)
          
     #FORCELOGIN (1)
          This determines whether Citadel will automatically
          ask for initials and password when it receives a
          call. If set to 0, then callers will be able to be
          on-line as unlogged-in users, and their abilities
          will be restricted by the #READOK and #ENTEROK
          settings. (These also apply when a caller uses the
          .Terminate Stay (.TS) command.)
          
     #ENTEROK (1)
     #READOK (1)
          These two keywords determine whether or not
          unlogged-in users may use any Read or Enter
          commands. A setting of 0 for #ENTEROK means that
          unlogged-in users cannot use the Enter commands; a
          setting of 1 means that they can use the Enter
          commands. Similarly, a setting of 0 for #READOK
          means that unlogged-in users cannot use the Read
          command and a setting of 1 means that they can.
          
     #MESSAGE_ROOM (5)
          This sets the maximum number of messages that a
          user can enter in any single room on one call.
          Aides are exempt from this restriction.
          
     #READLLOG (1)
          This determines whether or not users can use the
          .Read Group-only Userlog (command. If it is set to
          1, all users can use this command; if it is set to
          0, only aides can.
          
     #ROOMOK (1)
          
          This determines whether or not non-aide users can
          create rooms. If this is set to 1, all users can
          make rooms in all halls. If it is set to 0, only
          aides can make rooms in all halls. Users can still
          make rooms in halls where the sysop explicitly
          allows it.
          
     #READALL (0)
          This determines who can use the All modifier of
          the .Read Messages (.RM) command. If it is set to
          0, everyone can; if it is set to 1, only aides
          can; if it is set to 2, only sysops can; and if it
          is set to 3, nobody can.
          
     #AIDEHALL (1)
          This keyword determines whether or not aides can
          use the hall changing commands .Aide Hall (.AH)
          and .Aide Window (.AW). If it is set to 0, then
          only sysops can use these commands; if it is set
          to 1, then aides can also use them.
          
     #MODERATE (1)
          
          This keyword determines whether or not aides can see
          moderated messages. If it is set to 0, then only
          sysops can see moderated messages; if it is set to
          1, then aides can also see them. Moderated
          messages are messages in moderated rooms and
          messages by users without network access in
          networked rooms.
          
     #NOPWECHO (48)
          This determines what the user sees when typing in
          initials and password. If it is set to 0, the user
          sees the characters as they are typed. If it is in
          the range of 48 through 57, the initials and
          password will be displayed as an automatically
          incrementing series of digits. Any other value
          will simply echo the character with that ASCII
          value in response to each character typed by the
          user.
          
     #TRAP (ALL)
          This controls which events are logged to the file
          specified by the #TRAP_FILE keyword. The following
          parameters are available; more than one may be
          specified:
          
               ALL
                    This causes all events to be logged.
                    
               CARRIER
                    This causes carrier detect and carrier
                    loss to be logged.
                    
               LOGIN
                    This causes log-ins, log-outs, and new
                    users to be logged.
                    
               NEWROOM
                    This causes the creations of new rooms
                    to be logged.
                    
               ACCOUNT
                    This causes accounting information to be
                    logged.
                    
               AIDE
                    
                    This causes Aide functions to be logged.
                    
               ANONYMOUS
                    This causes anonymous messages to be
                    logged.
                    
               APPLIC
                    This causes application executions to be
                    logged.
                    
               CHAT
                    This causes chat requests to be logged.
                    
               CRON
                    This causes Cron events to be logged.
                    
               DOWNLOAD
                    This causes file downloads to be logged.
                    
               ERROR
                    This causes internal system errors to be
                    logged.
                    
               HACK
                    This causes possible hack attempts to be
                    logged.
                    
               NETWORK
                    This causes network events to be logged.
                    
               PASSWORD
                    This causes password changes to be
                    logged.
                    
               PROBLEM_USER
                    This causes problem user messages to be
                    logged. Wow. I don't think this option
                    really exists.
                    
               SYSOP
                    This causes Sysop functions to be
                    logged.
                    
               UPLOAD
                    This causes file uploads to be logged.
                    
          Placing a ! before an item disables that item. For
          example, the following would trap everything
          except chat requests:
          
                    #TRAP ALL !CHAT
     
     #SYSOPOK (1)
          This sets whether users can be given sysop access
          from remote with the .Sysop Userlog edit (.SU)
          command.
          
     #SHOWSYSOP (1)
          Wow.
          
     #NUMROOMS
          Wow.
          
     #READLOG
          Wow.
          
     #ALLOWCRYPT (1)
          This sets whether message encryption is allowed.
          This has three settings: 0 (message encryption is
          not allowed); 1 (message encryption is allowed in
          mail only); or 2 (message encryption is allowed in
          any message).
          
     #BADPWPAUSE (0)
          This specifies an amount of time to wait after a
          user enters a bad password and declines to log in
          as a new user before providing the password prompt
          again. Specify the number of seconds you wish
          Citadel to pause for. Pausing at this time
          discourages attempted hacking of your system by
          password guessing.
          
     #PWDAYS (0)
          This sets how long people can keep their password
          before Citadel prompts for them to change it.
          Specify the number of days desired, or 0 to turn
          off this feature.
          
     #CALLLIMIT (0)
          This limits the number of calls users can make in
          a day. (A day being midnight-to-midnight, not any
          24 hour period.) This can also be set for each
          user with the .Sysop Userlog edit (.SU) command.
          Specify the number of calls, or 0 to allow
          unlimited calls. This restriction is placed in
          addition to system accounting which is enabled
          with the #ACCOUNTING keyword.
          
     #NOCONSOLETRAP (0)
          This sets whether to not trap anything to the trap
          file that is done on console. This can be used to
          save disk space if you have a secure console and
          know everything that happens there. However, it
          will cause statistics generators that read the
          trap file to generate inaccurate information. Set
          this to 0 to trap everything that happens on
          console, or 1 to not.
          
EXTERNAL.CIT

The EXTERNAL.CIT file mostly contains information that tells
Citadel how to use external programs: message editors
(#EDITOR and #AUTO_EDITOR), user applications (#USERAPP),
archivers (#ARCHIVER), and doors (#DOOR). It also contains
other information that needs to be read whenever Citadel
loads (#HOLIDAY and #REPLACE), or sometimes throughout the
operation of the program (#DIRECTORY and #REFUSER).

The standard Citadel flags for applications as described in
Section II apply to all command lines given in this file.

     #ARCHIVER "name" "view_cmd" "extract_cmd" "extension"
          External archivers are used to view archive files
          with the .Read Archive file (.RZ) command in
          directory rooms. "name" must have a different
          initial letter for each archiver; this is what
          Citadel uses as the keystroke to identify the
          archiver. "view_cmd" is the command line to use to
          view the contents of an archive. The output should
          be placed in the file README.APL in Citadel's
          #APPLICPATH so Citadel can display it to the user.
          Currently, "extract_cmd" is not used. "extension"
          is the DOS file extension usually attributed to
          the archiver (LZH for LHArc, ZIP for PKZIP, etc.).
          Citadel uses this to add an extension to files if
          the user does not provide one.
          
     #AUTO_EDITOR "name" console "cmd"
          Automatic editors are editors that are applied to
          every message saved. "name" is the name of the
          editor, which is not important or used. console is
          a flag that may be set to 0 or 1. If it is set to
          0, then the editor is always used. If it is set to
          1, then the editor is only used when on console.
          
     #CENSOR_AUTHOR "name"
     #CENSOR_NODE "name"
     #CENSOR_TEXT "word"
          These set up message censoring. For a full
          discussion of message censoring, see the "Message
          Censoring" topic in Section II.
          
     #DIRECTORY "dir_name"
          
          This provides a way to keep your remote sysops from
          creating directory rooms pointing to certain
          directories. If a sysop calling from remote tries
          to create a directory room pointing to any
          directory specified in a #DIRECTORY line, the
          sysop will be de-verified, Citadel will hang up
          the phone, and a message will be left in the Aide)
          room alerting you. #DIRECTORY lines are not
          checked when a directory room is made by a sysop
          on console.
          
          Wildcards are allowed in directory names, so "C:*"
          will lock out the whole C: drive, or "C:\WORK\*"
          will lock out C:\WORK and any directory below it,
          for example. (If the directory is specified in
          quotation marks, remember that you need to double
          backslashes: "C:\\WORK\\*".)
          
     #DOOR "name" "cmd" "group" console sysop aide dir
          override
          Doors give you a way to connect external programs
          to Citadel. Doors can either be accessed with the
          .Enter Door (.ED...) command, or by a single
          keystroke at the room prompt. "name" must have a
          unique letter for each door, because this is the
          keystroke that Citadel assigns to the door.
          Additionally, if the door has same first letter of
          any Citadel internal command, the door can be set
          to override the internal command with the override
          parameter. "cmd" is the application command line
          to execute for the door. "group" sets a group to
          access the door. Users must be in this group to
          use the door. (This gives you a way to disable
          commands by groups: make "name" override the
          internal command, set "group" to the group that
          you want the internal command disabled for, and
          set "override" to non-zero.) The next four items
          are Boolean flags: console can be set to 1 to make
          door active only on console, or 0 if it can be
          used from remote as well; sysop can be set to 1 to
          make the door only usable by Sysops, or 0 if it
          can be used by non-Sysops as well; aide can be set
          to 1 to make the door only usable by Aides, or 0
          if it can be used by non-Aides as well; dir can be
          set to 1 to make the door only work in directory
          rooms, or 0 if it should work in all rooms.
          override specifies how (and if) the door overrides
          internal commands. If set to 0, then it doesn't
          override any commands; the .Enter Door (.ED)
          command is the only way to execute the door. If
          set to 1, then the door overrides the single-key
          command with the same letter (for example, R at a
          room prompt). If set to 2, then the door overrides
          the extended command with the same letter (for
          example, .R at a room prompt). If set to 3, then
          the door overrides both.
          
     #EDITOR "name" console "cmd"
          Editors are optional external message editors.
          These are available from Citadel's internal
          message editor by going to the "Entry Command:"
          prompt and typing the first letter of the "name"
          field for the desired editor. For this to work,
          each "name" must not only start with different
          letters than the others, but they also have to be
          different than the Citadel editor commands ("S"
          for save, "A" for abort, etc.), otherwise Citadel
          will not be able to access its internal command.
          console can either be set to 0 for the editor to
          work over the modem (such as an ANSI editor, or a
          message filter), or 1 if the editor can only be
          used when on console (such as Brief, QEdit, MS-
          DOS's Edit, etc.). "cmd" is the application
          command line to execute for the editor. For
          example, the following command line will set up MS-
          DOS 5.0's Edit command for use with Citadel as a
          console editor:
          
               #EDITOR "Edit" 1 "?edit %f"
                    
          (As this program is quite large, you may have to
          use "!?edit %f" for the command line to enable
          super-shelling, as described in the Applications
          topic in Section II.)
          
     #EVENT "type" "cmd"
          Events cause Citadel to execute the application
          "cmd" whenever an event of type "type" occurs. You
          can have more than one event for each type: they
          will be executed in order they are found in the
          EXTERNAL.CIT file. The valid "type" settings are:
          
               
               LOGIN     LOGOUT    CHAT      DOWNLOAD
               READDIR   READINFO  UPLOAD    ROOMPROMPT
               SAVEMSG   READMSG   BEEP      READMSGS
               CARRIER   NEWROOM   HACK      PASSWORD
               AIDE      SYSOP     ERROR     NETWORK
               ACCOUNT   APPLIC    CRON      ANONYMOUS
               NEWUSER   STARTUP   SHUTDOWN
               
     #HOLIDAY month date week day "name"
          Holidays are displayed when a date stamp has a
          "%x" in it. Citadel can accept holidays as a
          certain date of a certain month, or as a certain
          day of a certain week of a certain month. That is,
          New Year's Day is always on January 1. However,
          other holidays (like President's Day) are always
          on a certain day of the week (the third Monday of
          February for President's Day).
          
          If date is left at 0, then week must be set from 1
          to 5 and day must be set from 1 (Sunday) to 7
          (Saturday). If date is set to an actual date (1 to
          31), then week and day must both be set to 0. For
          example, here are the holiday settings for New
          Year's Day and President's Day:
          
               #HOLIDAY 1 1 0 0 "New Year's Day"
               #HOLIDAY 2 0 3 2 "President's Day"
                    
     #NETCOMMAND "command" "script"
          This sets a script to be used to process a
          specific network command. command is the network
          command to pass to the script (without the "#"
          leading character, which is provided by Citadel).
          script is the name of the script file to run to
          process the command.
          
     #REPLACE "word" "replace_phrase"
          Citadel outputs to the screen and modem one word
          at a time. Before it outputs a word, it checks to
          see if it should replace it with another word or
          phrase, as set by the #REPLACE keyword. This can
          be used as a "bleep" type censor function or for
          pure obnoxiousness.
          
          For example:
          
               #REPLACE "cat" "cute cuddly thing"
                    
          This tells Citadel to print the words "cute cuddly
          thing" every time it sees the word "cat" in the
          output stream.
          
     #USERAPP "name" "outstr" "cmd" hangup
          These are executed every time a particular user
          logs in. "name" is the name of the user to tie the
          application to. "outstr" contains any text to send
          to the user before executing the application.
          "cmd" is the application command line to execute.
          hangup is a Boolean flag: if it is 1, then Citadel
          hangs up on the user after executing the
          application; if it is 0, then Citadel lets the
          user into the BBS after executing the application.
          
NODES.CIT

The NODES.CIT file contains information telling Citadel how
to network with other nodes. When Citadel loads a NODES.CIT
entry for a node, it first loads the "DEFAULT" entry, then
loads the node's entry. For options that usually stay the
same between nodes, it is best to set the option in the
"DEFAULT" entry. If you need to change an option for a
particular node, just set it for the node. Because the
node's information is read after the "DEFAULT" node is read,
any information specific to each node will override the
contents of the "DEFAULT" entry.

     #AUTOGROUP "group name" (none)
          This sets a group to limit rooms created by
          #AUTOROOM to. If you must use #AUTOROOM, it is a
          good idea to also use #AUTOGROUP with a group that
          no nodes (or no nodes other than the creating
          node) belong to, to prevent net-wide spread of bad
          rooms.
          
     #AUTOHALL "hall name" (none)
          
          This sets a hall to add rooms to that are created with
          #AUTOROOM.
          
     #AUTOROOM autoroom (0)
          This sets if rooms can be automatically created.
          Set to 1 to enable this feature. Note that this
          will create every networked room on the other node
          that your node has access to. This is usually not
          a good idea.
          
     #BAUD speed (#INIT_BAUD in CONFIG.CIT)
          This specifies the speed to set the serial port at
          before dialing the other node. Citadel will detect
          the connect rate when a connection is made with
          the other node and adjust its speed as required.
          The valid values for this are:
          
               300       600       1200      2400
               4800      9600      19200     38400
               57600     115200
          
     #DIALOUT "dial string" (none)
          
          This is the string sent to the modem to dial the phone.
          This is sent after #DIAL_PREF in CONFIG.CIT is
          sent and before a carriage return is sent.
          
     #DIAL_TIMEOUT timeout (60)
          This specifies the length of time (in seconds) to
          wait after sending the dial string to the modem
          before giving up trying to make a connection.
          
     #FETCH fetch (0)
          This sets how to fetch when on-line using Net 6.9.
          The valid values are:
          
          -1   Never do any fetching while on-line.
               
          0    Only do a fetch when on-line and there is no
               outgoing network packet for the other node in
               #TRANSPATH.
               
          1    Fetch any waiting mail and FILE69 file
               transfer files (but not normal messages) even
               if there is an outgoing network packet for
               the other node in #TRANSPATH.
               
          2    Do a full fetch even when there are outgoing
               network packets for the other node in
               #TRANSPATH.
               
     #FETCH_TIMEOUT timeout (35)
          This sets the number of minutes that Citadel will
          wait for the other node to complete fetching
          messages before assuming something is wrong and
          hanging up.
          
     #GATEWAY gateway (0)
          If this is non-zero, then Citadel will write extra
          information out to the network packet that may be
          helpful for software that acts as a gateway to
          other networks.
          
          Currently, the only thing written out differently
          is the time: In addition to the standard Citadel
          method of writing the time, it writes the time in
          a format that is easier for programs written in a
          language other than C to read.
          
          If you are running a gateway to another network,
          then the documentation for the gateway software
          will tell you if this setting is needed.
          
     #GROUP "grouphere" ["groupthere"] (none)
          If you want to map groups between two nodes, tell
          Citadel which groups to map to each other here.
          This is only used when incorporating messages: the
          group status of a room is not preserved or passed
          over the network.
          
          For example, if you network with a board that has
          a "Programming" group and you want to map messages
          in that board's "Programming" group into your
          board's "Programmers" group, set up the mapping
          here:
          
                    #GROUP "Programmers" "Programming"
     
          You need to explicitly set up a #GROUP mapping to
          share groups, even if the name is the same on both
          boards. However, if the name is the same, you
          don't need to provide the name of the group on the
          other node: Citadel will use the name of the group
          on the local board for the name of the group on
          the remote board if only one name is present.
          
          If a message comes in that belongs to a group that
          is not mapped, it is put into the group specified
          by #MAPUNKGROUP, described below.
          
     #LOGIN login script (none)
          This is used to tell Citadel how to log onto the
          other board for networking. Usually, you wait for
          "initials:" from the other board, then send your
          board's initials and password. Do this with the
          string:
          
                    #LOGIN w "initials:" s "in;pw\r"
     
          Take notice of the "\r" at the end of the initials
          and password: this is interpreted by Citadel as a
          return. If you don't include the "\r", then
          Citadel will never send the return to the other
          board, and you will not successfully log in, as
          the other board will be waiting for your board to
          finish entering its initials and password.
          
          Also know that after Citadel has reached the end
          of the #LOGIN script, it will claim that log-in
          was successful. However, it does not know if it
          was really able to log in, it just knows that it
          got to the end of its instructions. If you have
          something wrong (such as the wrong initials or
          password), your BBS will think that it was able to
          log in, but the other BBS will not. This is a
          common cause of networking error. Have the sysop
          of the other system watch the log-in process, to
          verify that your BBS was indeed able to log in.
          
          The available #LOGIN script commands are:
          
          D "protocol key" "path" "file"
               Download the file "file" into the path "path"
               with the file transfer protocol with
               "protocol key" as the menu key. Use an empty
               string ("") if downloading with a batch
               protocol.
               
          P "seconds"
               Pause for "seconds" number of seconds.
               
          R "wait" "send" "times"
               This is a complex "send while waiting"
               command. This is used to get the attention of
               some systems, which require you to hit the
               enter key often to recognize that they got a
               call. You would use this similarly to this:
               
                    R "Connected" "\r" "10"
     
               This will cause Citadel to wait for
               "Connected" (use whatever the called system
               sends when it recognizes the connection) for
               the amount of time specified by
               #WAIT_TIMEOUT. If Citadel sees the string,
               then it considers itself successful. If it
               does not see the string, then it sends "\r"
               (remember that Citadel interprets this as a
               carriage return) to the modem, and waits
               again. It repeats this process 10 times
               before giving up and considering the log-in
               to be a failure.
               
          S "text"
               This tells Citadel to send the text specified
               by "text" out to the other system.
               
          U "protocol key" "path" "file"
               Upload the file "file" from the path "path"
               with the file transfer protocol with
               "protocol key" as the menu key. If a batch
               protocol is used, "file" may contain
               wildcards and multiple filenames separated by
               spaces.
               
          W "text"
               This tells Citadel to wait for the text
               specified by "text" to come in from the other
               system. If it is not seen in the time
               specified by #WAIT_TIMEOUT, then Citadel
               considers the log-in process to be a failure.
               
          ! "cmd"
               This tells Citadel to shell out to DOS and
               run the application specified by "cmd". The
               standard application flags (!, @, $, etc.)
               may be placed at the start of the command
               line to tell Citadel how to run the
               application.
               
          @ "script"
               This tells Citadel to read the text file
               specified by "script" and interpret it as
               more of the #LOGIN command. Citadel reads
               each line in this file, so it can have any
               number of #LOGIN commands.
               
     #MAPUNKGROUP "group name" ("Reserved_2")
          This sets the group to place group-only messages
          in that come in over the network belonging to a
          group that is not explicitly mapped by the #GROUP
          keyword.
          
     #MOREINFO69 sendit (1)
          This is not used yet.
          
     #NETWORK networktype (DRAGCIT1_0)
          This sets the network protocol to use for the
          network. This has to be the same on both nodes.
          The available network protocols are:
          
               DRAGCIT1_0     DRAGCIT1_1     DRAGCIT1_5
               DRAGCIT1_6     NET6_9         NET6_9a
               HENGE          CIT86
          
          However, HENGE is not currently implemented. Wow.
          It should be removed.
          
     #NETFAIL failtrap (0)
          This sets how Citadel traps network events that
          fail. The available settings are:
          
          -1   Never trap failure.
               
          0    Trap failure as specified by #TRAP NETWORK in
               CONFIG.CIT.
               
          1    Always trap failure, even if network trapping
               is not enabled in CONFIG.CIT.
               
     #NODE "name" ["region"] (none)
          This declares the start of a section for a node.
          Give the node's "name" as either its full name or
          its full address, or just its alias if it is in
          the same region as your node.
          
          The optional "region" parameter is the old-style
          (30 character) region, and is not used for much.
          
     #OUTPUTPACE time (0)
          This sets the time to wait between each character
          sent while logging in with the #LOGIN command, in
          hundredths of a second. This is helpful when
          logging in over some packet-switched networks that
          cannot handle a full-speed transfer of data.
          
     #PHONE
          Avoid this keyword: use #DIALOUT instead.
          
     #PREDIAL "command" (none)
          This sets a command to send to the modem after
          #DIAL_INIT from CONFIG.CIT and before starting to
          dial the other board by sending #DIAL_PREF from
          CONFIG.CIT followed by #DIALOUT from this file.
          
     #PROTOCOL menukey (none)
          This specifies the file transfer protocol that
          Citadel should use for networking. For all network
          types, this must be a batch protocol. For Net 6.9,
          there is the additional requirement that it be a
          bi-directional file transfer protocol. (Use Net
          6.9a if you want to use a uni-directional file
          transfer protocol).
          
          The specified protocol must be defined in
          PROTOCOL.CIT so Citadel knows how to use it.
          
     #REDIAL attempts (0)
          This sets how many times to try dialing the node
          every time Citadel tries to network. A value of
          either 0 or 1 results in a single attempt.
          
     #REQUEST frequency (1)
          This sets how often to send room request files to
          Net 6.9 network partners. Set frequency to how
          often you wish to send your room request: Citadel
          will send the file after that many fetches. Use 0
          to never send a room request file. In general,
          this should be left at 1.
          
     #ROOM "name here" ["name there"] (none)
          When networking two boards using a network
          protocol of 1.6 or earlier, you need to tell
          Citadel which rooms to share with the other BBS,
          and the names of the rooms both on the local
          system and the remote system. Citadel then uses
          this to map the messages between the two systems.
          
          This is the biggest flaw of the earlier network
          protocols, as it is easy to make a mistake here
          that takes quite some time to track down: be
          careful as you set up your room mapping.
          
          If the room is named the same thing on both the
          local and remote system, then you may include only
          one name and Citadel will use it for both.
          
          #ROOM lines must be the last lines of a node's
          entry in NODES.CIT: after Citadel encounters the
          first #ROOM line, it only reads #ROOM lines.
          
          For Net 6.9, #ROOM lines are not used, as the
          mapping is done automatically based on the Network
          IDs of the rooms.
          
     #VERBOSE verbose (FILE69IN)
          This sets which error and status messages are
          saved to the Aide) room when networking with the
          specified node. The following parameters are
          available; more than one my be specified:
          
     FILE69IN
          
               Alerts you when an incoming file transfer is
               received.
               
          FILE69INFULL
               Alerts you when an incoming file transfer is
               received, and saves the output of the command
               used to extract the file from the packet.
               
          NOACCESS
               Alerts you when a node requests a room to
               which it does not have access.
               
          ROOMCREATED
               Alerts you when a room is created.
               
          ROOMNOTCREATED
               Alerts you when a room is not created, though
               Citadel tried.
               
          NETIDNOTFOUND
               Alerts you when a Net ID is detected on the
               network that Citadel has seen before, but
               that you don't carry. (Most likely because
               you have deleted the room.)
               
          NONETIDONSYSTEM
               Alerts you when a Net ID is specified in a
               Citadel-86 style network that does not exist
               on the system.
               
          In addition, the following shortcuts are
               available:
               
          0    Sets the default #VERBOSE.
               
          1    Sets the default #VERBOSE and turns on
               FILE69INFULL and NOACCESS.
               
          2    Sets the default #VERBOSE and turns on
               FILE69INFULL, NOACCESS, ROOMCREATED,
               ROOMNOTCREATED, NETIDNOTFOUND, and
               NONETIDONSYSTEM.
               
          ALL  Turns on all #VERBOSE settings. Currently,
               this is the same as 2, but this may change in
               the future: 2 will never turn on more than it
               currently does, but ALL will always turn on
               all options available.
               
          After using any of the shortcuts, you may then
          turn off any options by specifying the option
          preceded by an exclamation mark (!). For example,
          if you wanted to know about everything except
          NOACCESS, you could specify the following:
          
                    #VERBOSE ALL !NOACCESS
     
     #WAIT_TIMEOUT timeout (60)
          This sets the number of seconds that Citadel will
          wait for an incoming string with either the "W" or
          "R" #LOGIN commands before declaring failure.
          
     #ZIP "create" "extract" (see below)
          This sets how to create and extract network
          packets. This is not used for the DRAGCIT1_0,
          DRAGCIT1_1, or HENGE network types. For
          DRAGCIT1_5, DRAGCIT1_6, NET6_9, and NET6_9a, these
          are command lines to pass to an archiver such as
          PKZIP (thus the name #ZIP). For CIT86, these are
          the filenames for the network packets.
          
          For the "create" archiver command line, the
          variable %d gives the name of the archive file to
          create, and %f gives the names of the files to
          archive. (This will include multiple files
          separated by spaces and wildcards; make sure the
          archiver you choose supports these.) In the
          extract command line, the variable %d gives the
          name of the archive file to extract files from.
          Citadel always wants to extract all files from the
          archive, so there is no %f variable for
          extraction.
          
          Both you and your network partner must agree on
          how to create and extract network packets with an
          archiver: you must use the correct command to
          extract archives that he creates for you, and he
          must use the correct command to extract archives
          that you create for him. Though there is no
          requirement for it, the de facto standard program
          used on the Citadel network is PKZIP 2.04g.
          
          This is used in the CIT86 network protocol as the
          names of the files to create and read. For
          reading, wildcards are accepted.
          
          For use as archive command lines, there are no
          defaults. For use as CIT86 network packets, the
          default "create" packet name is "MSGOUT86.xxx"
          (where "xxx" rotates from "000" to "999"
          sequentially), and the default "extract" packet
          name is "MSGIN86.*".
          
CRON.CIT

The CRON.CIT file defines CRON events; events that Citadel
should run after some amount of time has passed. These are
used extensively for networking, to tell Citadel when to try
to network. They have other uses, however, such as taking
the board down, turning chat on or off, performing a backup,
analyzing usage with a program that reads the trap file, or
any other use that you desire.

You have full control over when an event will execute. You
can determine how long citadel should wait between
successful executions of the event, and how long it should
wait between unsuccessful executions of the event. You can
also limit the execution of the event to specific days,
dates, months, or hours. This can be used, for example, to
tell Citadel to only try to network at night, when long
distance charges are the lowest.

Control of when the events are executed is provided by the
#IDLE_WAIT CONFIG.CIT variable, which tells Citadel how many
idle minutes are allowed before it is to try to execute a
cron event, and the variables listed below.

     #DO
          This tells Citadel what to do for this cron event.
          After the #DO, you must specify a cron type and a
          command string. The cron type is one of the
          following:
          
          NETWORK   Attempt to network with a remote node.
                    The command string tells Citadel which
                    node to network with.
                    
          SHELL_1   This tells Citadel to execute an
                    application. The command string tells
                    Citadel which application to execute.
                    
          SHELL_2   This does the same exact thing as
                    SHELL_1. It is included only for
                    backwards compatibility.
                    
          SHUTDOWN  This tells Citadel to quit to DOS. The
                    command string is the exit code to used,
                    which can be interpreted by the
                    ERRORLEVEL command in a DOS batch file.
                    
          CHAT_ON   This tells Citadel to turn chat on. The
                    command string is ignored.
                    
          CHAT_OFF  This tells Citadel to turn chat off. The
                    command string is ignored.
                    
          NET69_IN  This incorporates any Net 6.9 packets in
                    the #TRANSPATH. The command string is
                    ignored.
                    
          NET69_OUT This executes a Net 6.9 pre-fetch for
                    another node. The command string tells
                    Citadel which node to pre-fetch for.
                    
          COMMAND   This runs a Citadel script file. While a
                    script file can also be run with the
                    SHELL_1 (or SHELL_2) command, running
                    one in this way gives the added ability
                    to check the success of the command,
                    which is used by the #RETRY_TIME
                    parameter, described below. The command
                    string tells Citadel which script file
                    to run.
                    
          NET86_IN
          NET86_OUT These are used for Cit-86 networking,
                    which is not yet fully implemented.
                    Don't use these; they are included here
                    only for completeness.
                    
          Any lines following a #DO line are considered by
          Citadel to apply to the #DO line. When Citadel
          reads another #DO line from CRON.CIT, it then
          assumes that all subsequent lines apply to the new
          #DO line.
          
     #HOURS
          This tells Citadel in which hours it is to attempt
          to execute the cron event. The parameters for
          #HOURS can be the word "ANY" or any numbers from 0
          to 23. If it is "ANY", or there is no #HOURS line,
          then Citadel will execute the cron event during
          any hour. Otherwise, Citadel will only run the
          command during one of the specified hours of the
          day. For example, to tell Citadel to run a cron
          event only between 11:00 PM and 5:00 am (for
          example to only network during the cheap long
          distance times of night), include the following
          line:
          
               #HOURS 23 0 1 2 3 4
               
          Note that 5 is not specified: the 4 applies to all
          times from 4:00 to 4:59:59, which brings us right
          to 5:00 am.
          
     #DAYS
          This tells Citadel during which days it is to
          attempt to execute the cron event. The parameters
          for #DAYS can be the word "ANY" or any combination
          of the days of the week, "SUN" to "SAT" or
          "SUNDAY" to "SATURDAY". For example, if you want
          to split long distance charges between a network
          partner, you might want to call it half of the
          days of the week. To do this, include the
          following line:
          
               #DAYS SUN TUE THU SAT
               
          The other node would include the corresponding:
          
               #DAYS MON WED FRI
               
          Of course this only splits the calling into four
          sevenths and three sevenths, but that is the
          result of having a culture that was not designed
          for the ease of computers. (This is not as bad as
          the 28, 29, 30, or 31 day month, however...)
          
     #MONTHS
          This tells Citadel during which months it is to
          attempt to execute the Cron event. The parameters
          for #MONTHS can be the word "ANY" or any
          combination of the months of the year, "1" to
          "12", "JAN" to "DEC", or "JANUARY" to "DECEMBER".
          For example, if you want to run an event only
          during the month of February, you could include
          the following line:
          
               #MONTHS FEB
               
     #DATES
          This tells Citadel during which dates of a month
          it is to attempt to execute the cron event. The
          parameters for #DATES can be the word "ANY" or any
          combination of dates, from "1" to "31". For
          example, if you want to analyze your trap file on
          a monthly basis, you could set #DATES as follows:
          
               #DATES 1
               
          This would let Citadel only execute the event on
          the first day of the month. Combine this with
          #REDO_TIME (see below) to make sure that the event
          is only executed once during this date.
          
     #REDO_TIME
          
          This tells Citadel how long to wait after executing an
          event before it should execute it again, in
          minutes. For example, if you want to network with
          another BBS every four hours, set this as follows:
          
               #REDO_TIME 240
               
     #RETRY_TIME
          This tells Citadel how long to wait, in minutes,
          after an event fails before it should attempt it
          again. A common cause of a failed event is that
          the other node is busy when attempting to network.
          For example, to tell Citadel to attempt to network
          every 5 minutes until it is successful, use the
          following line:
          
               #RETRY_TIME 5
               
GRPDATA.CIT

The GRPDATA.CIT file contains information that Citadel uses
for accounting. If you don't have accounting enabled, this
file is never read.

     #GROUP "Group Name"
          This sets the group that the next set of variables
          will affect. For example, to give information
          about the "Null" group, start with the following
          line:
          
               #GROUP "Null"
               
          Citadel will then assign all the information it
          finds next in the file to the "Null" group until
          it finds another #GROUP line or reaches the end of
          the file.
          
     #PRIORITY 0 to 32767
          When Citadel is determining the accounting for a
          user, it first assigns default values for
          accounting and sets the current priority level to
          0. The defaults are the worst possible values,
          from the user's point of view.
          
          It then checks each group on the system. If the
          user is in a group and the group is defined in
          GRPDATA.CIT, Citadel checks the priority of the
          group. If it is higher than the current priority
          level, it resets all accounting information to the
          default values, then reads that groups
          information. Otherwise, it chooses either the
          value already set for the user or the value set
          for the group, whichever is better.
          
          This means that, of all the groups a user belongs
          to, Citadel will only look at the groups with the
          highest setting of #PRIORITY, and give the user
          the best deal based on the settings for those
          groups.
          
          This lets the values of certain groups override
          the values of others. For example, if you have a
          group for twits or users who you want to limit to
          less time than the other users while still having
          access to the same groups they have, you could set
          this group with priority over all the other access
          groups and the user would be limited to what that
          group would allow, even though he is in groups
          with more access.
          
     #DAYS SUN MON TUE WED THU FRI SAT or ANY
          These set which days members of this group can log
          in. If a user tries to log in during a day that he
          cannot, Citadel will print NOLOGIN.BLB to the
          modem then disconnect.
          
     #HOURS 0 to 23 or ANY
          These set which hours members of this group can
          log in. If a user tries to log in during a hour
          that he cannot, Citadel will print NOLOGIN.BLB to
          the modem then disconnect.
          
     #SPECIAL 0 to 23 or ANY
          These set which hours are free for members of this
          group. No time at all is charged during these
          hours.
          
     #DAY_INC 0 to any reasonable value
          This sets how many minutes per 24 hour period to
          add for this group. Unlike most BBS software,
          which is broken, Citadel's accounting is
          continuous: it is not based on silly midnight-to-
          midnight days. So, if a user uses up all of his
          time at 11:30PM, he will not get it all back at
          midnight. If he calls back at midnight, Citadel
          will see that 30 minutes have passed, calculates
          that it has been one twenty-fourth of a day, and
          gives the user one-twenty-fourth of #DAY_INC.
          Similarly, if the user waits 36 hours to call back
          (a day and a half), Citadel will give the user one
          and a half times #DAY_INC minutes.
          
     #MAX_BAL 0 to any reasonable value
          This is the maximum time that users for this group
          can have in their account.
          
     #DL_MULT -32768 to 32767
     #UL_MULT -32768 to 32767
          These set special rates to charge for file uploads
          and downloads. This lets you, for example, charge
          only half the time spent uploading, or even to
          give time for uploads, as a "thank-you" for
          uploading.
          
          Here you must remember that during a transfer,
          time stands still in terms of accounting: no time
          is charged during the transfer. #UL_MULT and
          #DL_MULT are used to charge (or credit) the
          account balance after the transfer is complete,
          using the following formula:
          
               ACC_BAL = ACC_BAL + (TRNS_TIME * MULT / 100)
          
          Therefore, setting a positive value gives the user
          time, and setting a negative value takes it away.
          
          Examples of values and results are:
          
          Value  Result
          -200   Charge twice the time that the transfer
          took.
          -100   Charge for how long the transfer took.
          -50    Charge for half the time that the transfer
          took.
          0      Don't charge or credit any time for the
          transfer. (Ignore it.)
          50     Credit half the time the transfer took to
          the user's account.
          

Sample Entry
This is a sample entry in a GRPDATA.CIT file:

     #GROUP         "Null"
     #DAYS          ANY
     #HOURS         ANY
     #SPECIAL       0 1 2 3 4 5 6 7
     #DAY_INC       60
     #MAX_BAL       120
     #PRIORITY      1
     #UL_MULT       0
     #DL_MULT       -100
                    
This entry will allow members of group "Null" to call on any
day at any time. From midnight until 7:59am, they have
unlimited call time. An extra 60 minutes will be added to
their accounts every 24 hours, up to a maximum of 120
minutes.

Uploads are free, and downloads are charged for the time
spent during the transfer. That is, if a user uploaded a
file taking five minutes, the account balance at the end of
the transfer will be the same as it was at the beginning.
If, however, the user downloaded a file taking five minutes,
Citadel will take five minutes out of the account after the
transfer was complete.

If a user attempts a download that takes more time than
there is in the account, Citadel will allow it, but they
will be charged time for it. This will result in negative
time, so the user will have to wait for the time in his
account to become positive before he can log in again.

DEFUSER.CIT

It is best to specify only those parameters that you want
set differently than the defaults. While no damage is done
by redundantly setting parameters to the defaults, it takes
extra time for Citadel to read the DEFUSER.CIT file. On
slower computers and hard disks, this may be a noticeable
difference. To keep things fast, it is also best to keep
extra lines in this file to a minimum.

     #ADDR1
     #ADDR2
     #ADDR3 (none)
          These set the three lines of the new user's
          address. You can set each of these individually.
          There is rarely a reason to give new users a
          default address.
          
     #AIDE (0)
          This determines whether new users will be made
          Aides. The default (0) tells Citadel not to make
          new users into Aides. If set to non-zero, Citadel
          will make new users into Aides. It is usually
          considered a bad idea to make new users Aides.
          
     #BLINK (Wow.)
          This sets the default attribute for blinking text
          for users with ANSI emulation turned on.
          
     #BOLD (Wow.)
          This sets the default attribute for bold text for
          users with ANSI emulation turned on.
          
     #BORDERS (1)
          This determines whether the user can enter borders
          with the .Enter Border command. The default (1)
          lets users use the .Enter Border (.EB) command.
          Set this to 0 to disable the command for new
          users.
          
     #CALLLIMIT (0)
          This sets the calls-per-day limit for new users.
          This is in addition to a global calls-per-day
          limit set in CONFIG.CIT. A day is midnight-to-
          midnight. Set this to 0 to allow unlimited calls
          per day.
          
     #CHECKALLCAPS (0)
          This sets whether to check words in all-caps in
          the spell-checker.
          
     #CHECKAPS (0)
          This sets whether to check words ending with an
          apostrophe S in the spell-checker. If this is
          turned off, then the apostrophe S is removed from
          all words, and only the root word is checked.
          
     #CHECKDIGITS (0)
          This sets whether to check words with imbedded
          digits in the spell-checker.
          
     #CONFIRMABORT (1)
          This sets whether to ask for confirmation when the
          Abort command is used in the message editor and a
          message has been started.
          
     #CONFIRMEOABORT (0)
          
          This sets whether to ask for confirmation when the
          aborted message buffer is about to be cleared by
          starting a new message.
          
     #CONFIRMSAVE (0)
          This sets whether to ask for confirmation when the
          save command is used in the message editor.
          
     #CREDITS (60)
          This determines the number of credits to give new
          users.
          
     #DEFAULTHALL (none)
          This sets the default hall for new users. It
          defaults to none, which is effectively your Root
          hall. (Whatever you may have renamed it to.)
          
     #DICTWORD (none)
          This adds a word to the personal dictionary used
          by the spell-checker. As many words as desired may
          be specified by having multiple #DICTWORD
          keywords.
          
     #DISPLAYTS (1)
          This sets whether new users are configured to see
          titles and signatures by default. The default (1)
          sets new users to see titles and signatures. If
          you don't want new users to see titles and
          signatures, set this to 0.
          
     #DSTAMP (#DATESTAMP from CONFIG.CIT)
          This sets the default date stamp for new users.
          This is usually not used, as a default is set in
          CONFIG.CIT.
          
     #EXCLUDEENCRYPTED (0)
          This sets whether to exclude encrypted messages.
          
     #EXPERT (0)
          This sets the default expert mode for new users.
          The default (0) sets new users to be non-expert.
          If you want new users default to being expert, set
          this to non-zero.
          
     #FINGER (none)
          
          This sets the finger for new users.
          
     #FORWARD (none)
          This sets a user to forward all mail to.
          
     #FORWARDNODE (none)
          This sets a node to forward all mail to.
          
     #HALLTELL (1)
          This sets whether new users see hall descriptions
          by default. The default (1) sets new users to see
          hall descriptions. If you don't want new users to
          see hall descriptions, set this to be non-zero.
          
     #HIDEEXCL (0)
          This sets whether new users have message
          exclusions hidden by default. The default (0) does
          not hide message exclusions. If you want new users
          to have message exclusions hidden by default, set
          this to be non-zero.
          
     #IBMANSI (0)
          
          This sets whether new users have IBM ANSI mode turned
          on by default. #AUTOANSI in CONFIG.CIT overrides
          this setting. The default (0) does not turn on
          ANSI emulation mode. If you want new users to have
          ANSI emulation mode on by default, set this to be
          non-zero.
          
     #IBMCOLOR (0)
          This sets whether new users have ANSI COLOR mode
          turned on by default. #AUTOANSI in CONFIG.CIT
          overrides this setting. The default (0) does not
          have ANSI color turned on. If you want new users
          to have ANSI color on by default, set this to be
          non-zero.
          
     #IBMGRAPH (0)
          This sets whether new users have IBM extended
          ASCII turned on by default. The default (0) does
          not have IBM extended ASCII turned on by default.
          If you want new users to have IBM extended ASCII
          turned on by default, set this to be non-zero.
          
     #IBMROOM (0)
          
          This sets whether to display the room flags with IBM
          graphics characters.
          
     #INVERSE (Wow.)
          This sets the color code for inverse text.
          
     #KNODE (none)
          This sets a node to discard messages from. You can
          specify as many nodes as you wish by using
          multiple #KNODE keywords.
          
     #KREG (none)
          This sets a region to discard messages from. You
          can specify as many regions as you wish by using
          multiple #KREG keywords.
          
     #KTEXT (none)
          This sets text check for discarding: messages
          containing this text are discarded. You can
          specify as many text strings as you wish by using
          multiple #KTEXT keywords.
          
     #KUSER (none)
          
          This sets a user to discard messages from. You can
          specify as many users as you wish by using
          multiple #KUSER keywords.
          
     #LFMASK (1)
          This sets whether new users have linefeeds by
          default. The default (1) turns linefeeds on for
          new users. If you don't want linefeeds turned on
          for new users, set this to 0. You should leave
          this set to 1, as the vast majority of users will
          be calling with computers that require linefeeds.
          (Also, keep in mind that sending unnecessary
          linefeeds merely makes text appear double-spaced,
          but failing to send necessary linefeeds makes all
          text appear on the same line.)
          
     #LINESSCREEN (0)
          This sets the number of lines per screen for new
          users. The default (0) turns off full-screen
          pause. If you want full-screen pause turned on for
          new users, set this to the number of lines you
          desire. For example, #LINESSCREEN 23 means that
          screen pause defaults to on, with the pause every
          23 lines.
          
     #LOCKHALL (0)
          This sets whether the default hall of new users is
          locked. The default (0) does not have the default
          hall of new users locked. If you want to lock the
          default hall of new users, set this to be non-
          zero.
          
     #LOCKUSIG (0)
          This sets whether the user signature of new users
          is locked. The default (0) does not lock the user
          signature of new users. If you want to lock the
          user signature of new users, set this to be non-
          zero.
          
     #MINIBIN (1)
          This sets whether full usage statistics are
          displayed when logging in by default. The default
          (1) displays full statistics. If you don't want
          this to be on by default, set this to be non-zero.
          
     #MOREPROMPT (#MOREPROMPT from CONFIG.CIT)
          This sets the moreprompt for new users. This is
          usually not used, as a default is set in
          CONFIG.CIT. The more prompt is displayed after a
          full screen of text if the user has pause-on-full-
          screen turned on and after messages if the user
          has pause-between-messages turned on.
          
     #MSGCLS (0)
          This sets whether the screen is cleared between
          messages. (This only works if #IBMANSI is turned
          on.) The default (0) does not clear the screen
          between messages for new users. If you want to
          clear the screen between messages for new users,
          set this to be non-zero.
          
     #MSGPAUSE (0)
          This sets whether Citadel pauses between messages
          for new users by default. The default (0) does not
          pause between messages for new users. If you want
          the default to be pause between messages, set this
          to be non-zero.
          
     #MUSIC (0)
          This sets whether new users have music turned on
          or not. For this to have any effect, #MUSIC in
          CONFIG.CIT must be set to 1.
          
     #NETPREFIX (#NET_PREFIX from CONFIG.CIT)
          This sets the default net prefix for new users.
          This is usually not used, as a default is set in
          CONFIG.CIT.
          
     #NETUSER (1)
          This sets whether new users are Netusers by
          default. The default (1) makes new users Netusers
          by default. If you don't want new users to be
          Netusers by default, set this to be 0.
          
     #NEXTHALL (0)
          This sets whether new users have auto-next hall
          turned on by default. The default (0) does not
          have auto-next hall enabled. If you wish to enable
          auto-next hall for new users, set this to be non-
          zero.
          
     #NOACCOUNT (0)
          This sets whether new users have accounting
          disabled by default. The default (0) does not
          disable new users' accounting. If you wish to
          disable new users' accounting by default, set this
          to be non-zero.
          
     #NOCHAT (0)
          This sets whether new users have chat disabled by
          default.
          
     #NODE (0)
          This sets whether new users are Nodes by default.
          It is not a good idea to set this to 1.
          
     #NODOWNLOAD (0)
          This sets whether new users have download
          privileges disabled by default.
          
     #NOMAIL (0)
          This sets whether new users have mail disabled by
          default.
          
     #NOMAKEROOM (0)
          This sets whether new users have room creation
          abilities disabled by default.
          
     #NOUPLOAD (0)
          This sets whether new users have upload privileges
          disabled by default.
          
     #NULLS (0)
          This sets the default number of nulls for new
          users. There is no good reason to set this to
          anything greater than 0; this is a hold-over from
          the 1970s and early 1980s when many callers used
          printing terminals that could not keep up with the
          300 baud data stream from the modem.
          
     #NUMUSERSHOW (0)
          This sets the number of most-recent-caller users
          to show when logging-in.
          
     #OLDTOO (1)
          This sets whether new users have last old on new
          turned on by default.
          
     #OUT300 (0)
          This sets whether new users have 300 baud
          simulation turned on by default.
          
     #PERMANENT (0)
          This sets whether new users are permanent by
          default.
          
     #PHONENUM (none)
          This sets the default phone number of new users.
          
     #POOP (0)
          This sets the initial poopcount for new users.
          
     #PRINTFILE (0)
          This sets whether new users are trapped to the
          print file by default.
          
     #PROBLEM (0)
          This sets whether new users are considered problem
          users by default.
          
     #PROMPT (#PROMPT from CONFIG.CIT)
          This sets the room prompt for new users. This is
          usually not used, as a default is set by #PROMPT
          in CONFIG.CIT.
          
     #PROTOCOL (none)
          This sets the default file transfer protocol for
          new users.
          
     #PSYCHO (0)
          This sets whether new users have psycho chicken
          mode enabled by default.
          
     #PUNPAUSES (0)
          This sets whether the P key can be used to un-
          pause output that has been paused by the P key.
          (This also applies to Control+S, which Citadel
          treats exactly the same as P.)
          
     #REALNAME (none)
          
          This sets the default real name for new users.
          
     #REPLACE (none)
          This sets text to replace as it is entered in the
          message editor. Give two strings: first the text
          to replace, then the text to replace it with.
          Citadel makes an attempt to get the case right
          when replacing text.
          
     #ROOMINFO (1)
          This sets whether new users see room information
          lines by default.
          
     #ROOMTELL (1)
          This sets whether new users see room information
          files by default.
          
     #SEEBORDERS (1)
          This sets whether new users see borders and ads by
          default.
          
     #SHOWCOMMAS (1)
          
          This sets whether new users see commas in numbers as
          thousands separators.
          
     #SIGNATURE (none)
          This sets the default signature for new users.
          
     #SIGNATURES (1)
          This sets whether new users view signatures by
          default.
          
     #SPELLCHECK (Wow.)
          Wow.
          
     #SUBJECTS (1)
          This sets whether new users view subjects by
          default.
          
     #SURNAME (none)
          This sets the default surname for new users.
          
     #SURNAMLOK (0)
          This sets whether new users' titles and surnames
          are locked by default.
          
     #SYSOP (0)
          This sets whether new users are made sysops. This
          is generally not a good idea.
          
     #TABS (0)
          This determines whether or not tabs will be
          converted to spaces for new and unlogged-in users.
          The default is tabs off; i.e., tabs are converted
          to spaces. All terminals support spaces, so this
          is the safest setting.
          
     #TITLE (none)
          This sets the title for new users.
          
     #TUSER (none)
          This sets a user-tag. Give two parameters: first
          the name of the user to tag, then the tag. You can
          have as many user tags as you wish by specifying
          multiple #TUSER keywords.
          
     #TWIRLY (0)
          
          This sets if new users have their twirly cursor enabled
          by default.
          
     #UCMASK (0)
          This determines whether or not new and unlogged-in
          users will see text in all-uppercase. 0 leaves
          text in its normal case, 1 sets it to all-
          uppercase.
          
     #UNDERLINE (Wow.)
          This sets the attribute of underlined text.
          
     #UNLISTED (0)
          This sets if new users have unlisted accounts by
          default.
          
     #USEPERSONAL
          This sets if new users are in their personal hall
          by default. Nothing would be in their personal
          hall.
          
     #VDSTAMP (#VDATESTAMP from CONFIG.CIT)
          
          This sets the default verbose date stamp for new users.
          This is usually not used, as a default is set in
          CONFIG.CIT.
          
     #VERBOSE (0)
          This sets if new users have auto-verbose turned on
          by default.
          
     #VERBOSECONT (0)
          This sets the verbose-continue default for new and
          unlogged-in users. Setting it to 0 will set it to
          off, and setting it to 1 will set it to on.
          
          Verbose continue determines what happens when the
          "Continue" command is used in the message editor.
          If it is on, Citadel will print out the entire
          message before accepting new input; if it is off,
          Citadel prints out only the last 100 characters.
          
     #VERBOSELOGOUT (0)
          This sets if new users have verbose log-out turned
          on by default.
          
     #VERIFIED (1)
          This sets if new users are verified. (If not, they
          are not allowed to log in.)
          
     #VIEWCENSOR (0)
          This sets if new users are set to view censored
          messages by default.
          
     #WIDEROOM (0)
          This sets if new users have wide rooms turned on
          by default.
          
     #WIDTH (80)
          This sets the default screen width for new and
          unlogged-in users. Values from 10 to 255 are
          accepted.
          
     #YOUAREHERE (0)
          This sets if new users have You Are Here turned
          on. Please never turn this on, for it is evil.
          
HARDWARE.CIT

Citadel reads HARDWARE.CIT to know which external hardware
drivers (if any) to load. These drivers are written to
provide support for non-standard or specialized hardware.
Appendix B contains detailed information concerning
programming drivers for any specialized hardware you may
possess. Currently, hardware drivers are available for
FOSSIL serial support and Sound Blaster support. These
drivers are documented in Appendices C and D, respectively.

The following driver types are supported:

     #COMDRIVER
          This provides an alternate method to communicate
          with your computer's serial hardware. This can be
          useful for non-IBM PC compatible computers.
          Communications drivers have the extension "ECD"
          for External Communications Driver.
          
     #KBDDRIVER
          This provides an alternate method to communicate
          with your computer's keyboard. This can be useful
          for non-IBM PC compatible computers. Keyboard
          drivers have the extension "EKD" for External
          Keyboard Driver.
          
     #SNDDRIVER
          This provides a method to communicate with any
          sound cards in your computer. This can be
          incorporated with scripts to provide sound on your
          computer tied to certain events, or to add speech
          synthesis to Citadel. Sound drivers have the
          extension "ESD" for External Sound Driver.
          
To use external drivers, just create a HARDWARE.CIT which
specifies the drivers you desire, and place it in your
Citadel's #HOMEPATH (as defined in CONFIG.CIT), along with
the drivers. For example, to use the FOSSIL.ECD
communications driver, HARDWARE.CIT should have the
following line:

     #COMDRIVER FOSSIL
                    
When if a driver is loaded, you will see mention of it in
the "System Status / Debugging" section of the .Read Verbose
Status (.RVS) command. Only one driver of each type can be
loaded at a time.

PROTOCOL.CIT

The PROTOCOL.CIT file is used to define external file
transfer protocols for use with the .Upload (.U...) and
.Download (.D...) commands.

     #PROTOCOL "name"
          This gives the name of the file transfer protocol
          being defined. All keywords up until the next
          #PROTOCOL keyword define the attributes of the
          protocol.
          
     #MENU_NAME "menuname"
          This sets the name of the protocol to display on
          the .Upload Menu (.U?) and .Download Menu (.D?).
          If this is not provided, then the #PROTOCOL name
          is used.
          
     #COMMAND_KEY "character"
          This sets key used to execute the protocol. If
          this is not specified, then the first character of
          #MENU_NAME is used, or the first character of
          #PROTOCOL if #MENU_NAME is not specified.
          
     #BATCH batch
          This sets whether the protocol can transfer more
          than one file at a time. Specify 0 if the protocol
          is not batch (it can only transfer a single file
          at a time), or 1 if it is.
          
     #BLOCK_SIZE size
          This sets the block size used by the protocol. If
          it has a varying block size, then specify 0.
          
     #RECEIVE "command line"
          This specifies the command line to use to receive
          files with the file transfer protocol. See below
          for variables and flags that may be used.
          
     #SEND "command line"
          This specifies the command line to use to send
          files with the file transfer protocol. See below
          for variables and flags that may be used.
          
     #AUTO_UPLOAD "string"
          
          This specifies a string of characters that Citadel
          should respond to by initiating an upload with the
          file transfer protocol if it sees them at the room
          prompt of a directory room.
          
     #RESPONSE_SEND "command line"
          This specifies the command line to use to send
          files specified in a response file with the file
          transfer protocol. See below for variables and
          flags that may be used.
          
     #NET_ONLY netonly
          This specifies if the protocol should be used for
          networking only. Specify 0 to let the protocol be
          used by users, or 1 to make the protocol only be
          available for networking.
          
     #CHECK_TRANSFER
          Wow.
          

Command line variables and flags
With all command lines, the following variables may be used:

     %a   The application path, as set by the #APPLICPATH
          variable in CONFIG.CIT.
          
     %c   The modem-to-modem connect speed. For high speed
          modems, the actual speed of the connection from
          the computer to the modem is often higher than the
          actual speed that the two modems are connected at.
          The %s variable is used if the file transfer
          protocol needs to set the port rate to use; the %c
          variable is used to let the protocol more
          accurately guess the time that the transfer will
          take.
          
     %f   The file being sent or received. This is not used
          in the file receive string of a batch protocol:
          the protocol supplies the file name. Also, this is
          the name of the text file that lists the files to
          be sent when used in the response file send file
          command.
          
     %l   The modem port or LOCAL. This is the numeric value
          1-4, depending on which serial port the modem is
          connected to, or the text LOCAL if the current
          user is logged in locally.
          
     %p   The serial port that is being used: 1 to 4.
          
     %s   The actual speed (baud) used to talk to the serial
          port.
          
     %u   The name of the currently logged-in user, after
          stripping out any color codes. If there is no user
          logged-in, this passes the text "[Not logged in]".
          
In addition, the following flags can be put at the start of
the command line to tell Citadel how to run the application:

     !    This tells Citadel to "Super-shell", or swap as
          much of itself as possible out of memory, thus
          giving the application the most memory possible in
          which to run. Citadel leaves less than 1K of
          itself in memory, swapping the rest of itself to
          XMS, EMS, or disk. Swapping to XMS or EMS is
          nearly instantaneous, but swapping to disk takes a
          few seconds.
          
     @    This tells Citadel to not clear the screen before
          running the application, and to not restore the
          screen before returning. This is used to save
          memory if you are not super-shelling and the
          application saves and restores the screen for you:
          an 80x25 text screen takes nearly 4K to save in
          memory. When using the super-shell this does not
          make any difference, because the memory used to
          save the screen is also swapped out when shelling.
          
     $    This tells Citadel to load COMMAND.COM (or,
          actually, the program pointed to by the COMSPEC
          environment variable) and tell it to process the
          command. This is used to run DOS batch files or to
          redirect program output to a file.
          
     ?    This tells Citadel not to write out BBS
          information files when shelling. Writing these
          files takes some time and some disk space, but not
          much. Usually, it does not matter if they are
          written out when not needed. But, if you are very
          tight on disk space or running on a slow machine,
          this makes a difference.
          
     *    This tells Citadel that the application is a
          script file, not a program. This overrides all
          other flags. That is, if this flag is present then
          all others are ignored. This is because the other
          flags don't apply to script files. Also, when
          running a script file the command line arguments
          are not passed to it, since script files have no
          command line parameters.
          
Citadel also has some internal file transfer protocols,
which can be specified by setting the command lines to
special values: "[xmodem]" for Xmodem checksum;
"[crcxmodem]" for Xmodem CRC; "[1kxmodem]" for 1K Xmodem
(sometimes incorrectly referred to as Ymodem); and
"[zmodem]" for Zmodem. The internal file transfer protocols
don't work with file queuing.

MDMRESLT.CIT

The MDMRESLT.CIT file contains all result codes your modem
may generate that Citadel needs to understand. Any number of
each type of string may be present. If this file does not
exist, then Citadel uses built-in defaults. If this file
does exist, then you must specify all possible result codes
your modem can generate that Citadel needs to know about.

     #NOCARRIER "string"
          A string your modem sends when it is not able to
          make a connection when dialing out.
          
     #NOANSWER "string"
          A string your modem sends when there is no answer
          at a telephone number it just dialed. This is
          similar to #NOCARRIER.
          
     #ERROR "string"
          A string your modem sends when it doesn't
          understand what the computer just told it to do.
          
     #NODIALTONE "string"
          
          A string your modem sends when it is not able to detect
          a dial tone when dialing out.
          
     #BUSY "string"
          A string your modem sends when it detects a busy
          signal after dialing a telephone number.
          
     #RING "string"
          A string your modem sends when it detects a
          ringing signal on the phone line, after someone
          dials your phone number.
          
     #COMPRESSION "string"
          A string your modem sends when it has negotiated a
          connection with some form of data compression.
          
     #CORRECTION "string"
          A string your modem sends when it has negotiated a
          connection with some form of error correction.
          
     #CONNECT300 "string"
     #CONNECT1200 "string"
     #CONNECT2400 "string"
     #CONNECT4800 "string"
     #CONNECT7200 "string"
     #CONNECT9600 "string"
     #CONNECT12000 "string"
     #CONNECT14400 "string"
     #CONNECT16800 "string"
     #CONNECT19200 "string"
     #CONNECT28800 "string"
     #CONNECT38400 "string"
     #CONNECT57600 "string"
     #CONNECT115200 "string"
     #CONNECT230400 "string"
          Strings your modem sends after making a connection
          at the specified speed.
          
     #CONNECT1200C "string"
     #CONNECT2400C "string"
     #CONNECT4800C "string"
     #CONNECT7200C "string"
     #CONNECT9600C "string"
     #CONNECT12000C "string"
     #CONNECT14400C "string"
     #CONNECT16800C "string"
     #CONNECT19200C "string"
     #CONNECT28800C "string"
     #CONNECT38400C "string"
     #CONNECT57600C "string"
     #CONNECT115200C "string"
     #CONNECT230400C "string"
          Strings your modem sends after making a connection
          with data compression at the specified speed.
          Citadel also assumes that there is error
          correction on these connections.
          
     #CONNECT1200E "string"
     #CONNECT2400E "string"
     #CONNECT4800E "string"
     #CONNECT7200E "string"
     #CONNECT9600E "string"
     #CONNECT12000E "string"
     #CONNECT14400E "string"
     #CONNECT16800E "string"
     #CONNECT19200E "string"
     #CONNECT28800E "string"
     #CONNECT38400E "string"
     #CONNECT57600E "string"
     #CONNECT115200E "string"
     #CONNECT230400E "string"
          Strings your modem sends after making a connection
          with error correction (but not data compression)
          at the specified speed.
          
     #RUNAPPLIC "string" "command line"
          Result codes that your modem generates that you
          want to support in some way, but that Citadel does
          not know about. This tells Citadel to run an
          application when it receives the result code. This
          can be used to have Citadel shell to a fax program
          if it gets a FAX result code, for example.
          
ROUTE.CIT

The ROUTE.CIT file is used for routing networked mail.
Citadel appends information to the end of this file, and
expects to be able to read it back. Because of how the
standard C file reading functions work, this means that if
you edit this with a text editor, be sure that it does not
append a Control+Z character on the end. (As if this was
CP/M. This is MS-DOS. This is such an advanced operating
system that it actually keeps track of the length of files,
so it doesn't need Control+Zs at the end of files. Text
editors that always append Control+Zs to the end are stupid.
People who configure their text editors to do so when there
is a choice are equally stupid, and should be forced to use
CP/M like they evidently want to do.)

     #ADDRESS "address" "name" "region"
          This specifies the address, name, and region of a
          node on the network. Citadel adds valid #ADDRESS
          lines as new nodes are detected on the network.
          However, as there is no way to know when a node
          goes down, you are responsible for deleting
          #ADDRESS lines if you care. If not, then your
          users will be able to easily send messages to
          nodes that don't exist.
          
     #ROUTE "routed system" "through system"
          This lets you specify an explicit route for
          network mail to take to get somewhere. In general,
          it is best not to do so, and let Citadel deliver
          it as it sees best fit to do. However, it is
          possible (if you try hard enough) to design a
          network topology such that mail will not
          automatically get through. If you do this, it is
          your own fault. Neener. So it is your
          responsibility to fix the network topology (no, I
          am not going to tell you what is wrong with it),
          or at least force a route with this keyword. This
          can also be used to add more security to mail
          routing, if you know what you are doing. No, I am
          not going to tell you what this means, either.
          Cope. Basically, what I am doing here is
          discouraging you from using this keyword, as it is
          truly evil and only still exists for extreme
          cases.
          
MAILLIST.CIT

The MAILLIST.CIT file is used for creating mailing lists.
Citadel needs to edit this file occasionally, and it removes
any non-command lines from it as it does so (since it
doesn't know what they are). Therefore, if you put comments
in it, they might go away.

The available keywords are:

     #MAILLIST "name"
          This creates a mailing list. All keywords after
          this until the next #MAILLIST define the
          attributes of the mailing list.
          
     #USER "name [@ {node|address}[, region[, country]]]"
          This gives the routing information for a
          subscriber to the mailing list. (In the same
          format as you would address a message to the user
          manually.) Each subscriber has a #USER entry. For
          example, the following entries might exist:
          
               #USER "Bob"
               #USER "Sally @ Another BBS"
               #USER "Jane @ bbs.sea"
               #USER "Fred @ Yet another BBS, Somewhere"
               
     #MAYSUBSCRIBE maysub
          This sets whether users may subscribe to the
          mailing list. The default is 0: they may not
          subscribe. If users may not subscribe, then this
          file has to be edited manually to add users to the
          list.
          
     #MAYTELL maytell
          This sets Citadel may give out information about
          the mailing list when requested by a user. The
          default is 1: Citadel may tell about it.
          
     #MAYLIST maylist
          This sets whether the membership of the mailing
          list is private or not. (That is, whether it may
          be listed when requested by a user.) The default
          is 1: the membership is not private.
          
     #INFOLINE "infoline"
          
          This gives an optional one-line description of the
          mailing list. This is returned to users requesting
          information about the mailing list if #MAYTELL is
          set to 1.
          
     #INFOFILE "full path"
          This gives an optional text file description of
          the mailing list. This should be the full path to
          the file. This file is displayed in response to
          users requesting information about the mailing
          list if #MAYTELL is set to 1.
          
_Section V: Citadel Script Files

The internal script language in Citadel adds a high degree
of customizability to the software. With it, you can create
new commands or applications for your BBS. However, like any
programming language, learning the script language and
putting it to use can be difficult. It is not a problem if
you don't understand the script language: it is not required
to use Citadel. In fact, most sysops never use the script
language at all.

Overview

Scripts files are ASCII files (like CONFIG.CIT) that contain
commands that Citadel recognizes and acts upon. Some sample
scripts are included with Citadel. These can be used on your
system as-is to take advantage of the features they offer,
but they are intended to be used as example code to help you
understand the script language better.

Citadel reads script files into memory one line at a time.
When it reads a line, Citadel first removes any leading
spaces from it. If the first character after all spaces is a
"#", Citadel considers the line to be a script command.
Otherwise, it ignores the line and reads the next line from
the file. Therefore, any line not starting with a "#" (after
stripping of leading spaces) is effectively a comment.

The lines that do start with a "#" character are parsed and
stored in memory. If Citadel is not able to parse the line,
then it displays and error, and aborts out of the script
interpreter. After all lines of a script file are read,
Citadel begins executing the script. Therefore, the only
disk access is at the start of execution. The rest of the
processing is done in memory, and is fairly quick. Beyond
memory that Citadel allocates for the script interpreter's
use, the amount of memory used by a script file is usually
not much. By watching the display of the System Status
Screen (Press F4 while running Citadel to see this screen),
you can determine how much memory your script file takes.

All script commands are contained in functions. Citadel
initiates execution of a script file by calling the _Main
function. When this function returns, Citadel releases the
memory used by the script and continues with what it was
doing before it loaded the script. If this is the only
executing script (that is, it was not called by another
script), then it also releases the memory used by the
interpreter unless #FASTSCRIPT in CONFIG.CIT is set to 1.

Results from functions or script commands that generate
results are available in the special variable _Result. Use
this variable quickly if you need it; the next command or
function will probably overwrite it. To be safe, don't use
_Result as a parameter to a command that generates a
_Result; the results may be unpredictable, and may change in
future versions of Citadel. It is safe to use _Result in an
#ASGN, #IF, #LOOP, #WHILE, #IFNOT, #LOOPNOT, or #WHILENOT
command.

In the interest of speed, there is very little run-time
checking to ensure that the script does not overwrite memory
that it does not own, or that enough parameters are passed
to functions. When writing a script, it is best to do it on
a test system, to ensure that you don't corrupt your main
board. Be especially sure to test any script thoroughly
before releasing it to other sysops.


How script files are called
Script files can be called in one of three ways: with the
.Sysop Run script (.SR) command, with the COMMAND cron type,
or as an application. Because applications can be tied to
many things (see the Applications topic in the User's Guide
section), script files can be used many places within
Citadel.

Variables

Script variables can be either local or global. Local
variables can only be accessed in the function that they are
declared in. Global variables are available to all
functions, so they are good for storing global configuration
information that many functions might need to access. A
warning about local variables: they are all static. This
means that you shouldn't make functions recursive, unless
you take care not to have variable conflicts. (Actually, you
also shouldn't make functions recursive because doing so
will cause loops to act strangely.)

Local variables are declared with the #LVAR script command,
and global variables are declared with the #GVAR script
command. After the command, Citadel expects a variable type
followed by the variable's name.

The type can be Boolean, Integer, UInteger, Long, ULong, or
String[length] . Boolean variables can hold a value of TRUE
or FALSE; Integer variables can hold an integer in the range
of -36,768 to 36,767; UInteger variables can hold an integer
value in the range of 0 to 65,535; Long variables can hold
an integer value in the range of -2,147,483,648 to
2,147,483,647; ULong variables can hold an integer value in
the range of 0 to 4,294,967,295; and String variables can
store a string of characters of some length. String
variables need a length, so Citadel knows how much memory to
set aside for holding the string. Most strings in Citadel
can be held in 30 characters, so String30 is a common
length. The minimum allowed is String1 and the maximum
allowed is String255. There are no floating point variables
in script files (or anywhere else in Citadel).

All variables must start with the underscore character ("_")
and may contain any ASCII characters other than white space
(space, tab, linefeed, etc.). They are not case sensitive.

For example, the following lines in a script file would
define a local Integer variable named _Total and a global
String variable that can hold up to 30 characters named
_Name:

     #LVAR Integer _Total
     #GVAR String30 _Name
     
It does not matter where global variables are declared, and
the only restriction placed on the declaration of local
variables is that they must be declared in a function
definition, so Citadel knows which function owns the
variable. They can be used before they are declared, because
Citadel sets aside space for the variables when it loads the
script: by the time it is running, all variables that will
ever exist already exist.

When using variables, Citadel automatically converts their
type as appropriate for how you are using them. For example,
if you assign an Integer variable with the value 30 to a
String variable, the string will contain the text "30".
Similarly, if you assign a String variable containing the
text "130" to an Integer variable, then the Integer variable
will contain the value 130.

Functions

Script functions have a name, can take parameters, and
return a value. Like variables, all functions defined in a
script file must begin with the underscore ("_") character.
They may take up to five parameters, passed either by value
or by reference. The type of value returned can be any of
the types allowed for variables, or an additional type Void
which means that it returns no value. The return value is
placed in the _Result variable.

Functions are declared with the #FUNC script command. This
is followed by the function name, its return type, then any
parameters the function uses, the type followed by the name.
Parameters are passed by value by default. If you wish to
pass parameters by reference, append a _R to the end of the
parameter's type.

For example, the following line in a script file would
declare a function _Myfunc that returns an integer, and
takes a long value passed by value named _Param1 and a
Boolean value passed by reference named _Param2:

     #FUNC _MyFunc Integer Long _Param1 Boolean_R _Param2
     
When calling a function that takes a parameter by reference,
you must call it with a variable: trying to pass it an
immediate value will generate a run-time error, as Citadel
cannot pass these by reference (as there is no variable to
reference).

Return from functions using the #RET script command,
followed by the value to return. If the function has no
return value (that is, it was declared as Void), use "#RET
Void" to return from the function. Though it is not
required, you may end a function's definition using the
#ENDFUNC type. It is not required because Citadel ends a
function automatically at the end of the file, or when it
finds a new function defined with the #FUNC command. It just
looks cleaner to have the end defined.

In addition to functions that are be defined in a script
file, Citadel provides many internal functions that allow
script files to get and set Citadel's settings, communicate
with the user, manipulate files, etc. These functions don't
start with an underscore ("_") character, and never take
parameters by reference. They are detailed later in the
"Citadel internal functions" topic.

Script keywords

The following is an alphabetical list of all the keywords
used in the script files, and what they do:

     #ASGN _variable value
          This is used to assign a value to a variable.
          _variable is any user-defined variable that is in
          scope. value is any value you wish to assign to
          it, either an immediate value or another variable.
          Citadel automatically casts value to _variable's
          type. This means, for example, that you can assign
          an integer variable to a string variable; Citadel
          internally converts the integer variable to a base
          10 string representation of the variable and
          assigns that value to the string.
          
     #ADD value1 value2 [value3 ...]
          This adds all the values together and assigns the
          sum to _Result. All the values are interpreted as
          longs, and the result is given as a long.
          
     #AND value1 value2 [value3...]
          
          This performs a Boolean AND on all specified values
          (interpreted as Boolean values) and assigns the
          result to _Result. A Boolean AND returns TRUE if
          all parameters are TRUE; it returns FALSE if any
          one of the parameters are FALSE.
          
     #CALL function [param1 ...]
          This calls a function, which can be either a
          function defined in the script file or a Citadel
          internal function. If the function takes
          parameters, they should be placed after the
          function's name.
          
     #CHAIN script
          This executes the script specified by the string
          value script. When the other script returns,
          execution ceases in the current script.
          
     #DIV value1 value2 [value3 ...]
          This divides value1 by value2, and divides the
          quotient by value3 if it exists, then divides that
          quotient by value4 if it exists, etc. All values
          are interpreted as longs, and the resulting
          quotient is assigned to _Result as a long.
          
     #DO
          This begins a #DO... #LOOP or #DO...#LOOPNOT loop.
          The #DO is just a place holder, and does no
          processing by itself. When the associated #LOOP or
          #LOOPNOT command is encountered, Citadel returns
          to this #DO command if it is appropriate; see
          #LOOP and #LOOPNOT.
          
     #ELSE
          This begins an #ELSE block of an #IF... #ELSE...
          #ENDIF or #IFNOT...#ELSE...#ENDIF command block.
          Any commands from this #ELSE to the #ENDIF are
          executed if the #IF expression evaluates to FALSE
          or the #IFNOT expression evaluated to TRUE; see
          #IF and #IFNOT.
          
     #ENDFUNC
          This command ends a function definition. As
          explained in the "Functions" section, this is not
          required, it just looks neater.
          
     #ENDIF
          This ends an #IF... #ELSE... #ENDIF or
          #IFNOT...#ELSE...#ENDIF command block. Processing
          continues after this command as normal.
          
     #EQ value1 value2
          This tests value1 for equality with value2. At
          least one of the two values must be a variable
          expression, so Citadel knows what type to evaluate
          them as. (Besides, comparing two constants is just
          silly.) If both values are variables, Citadel
          evaluates them both as the type of the first
          variable. This command assigns _Result a Boolean
          value of TRUE (if the values are equal) or FALSE
          (if they are not).
          
     #EXIT result
          This exits the script immediately and returns
          control to Citadel. result is evaluated as a
          Boolean value and is passed back to Citadel.
          Citadel only looks at this value if it was called
          as a #DO COMMAND cron type; if result is TRUE,
          then Citadel considers the event to be a success,
          else it considers it a failure.
          
     #FUNC _name rettype [type1 _name1... type5 _name5]
          This marks the beginning of a function definition.
          The function's name is given by _name, and must
          start with an underscore ("_") character. rettype
          must be Boolean, Integer, UInteger, Long, ULong,
          String[length], or VOID. The function can take up
          to five parameters. Any parameters must have a
          type and a name, which must start with the
          underscore ("_") character. Parameters are passed
          by value by default; to pass them by reference,
          append a _R to their type. (For example, Integer_R
          will pass an Integer type by reference.)
          
     #GE value1 value2
          This tests if value1 is greater than or equal to
          value2. At least one of the two values must be a
          variable expression, so Citadel knows what type to
          evaluate them as. (Besides, comparing two
          constants is just silly.) If both values are
          variables, Citadel evaluates them both as the type
          of the first variable. This command assigns
          _Result a Boolean value of TRUE (if value1 is
          greater than or equal to value2) or FALSE (if it
          is not).
          
     #GOTO label
          This transfers control to the #LABEL command
          corresponding to label. This jump cannot be
          between functions.
          
     #GT value1 value2
          This tests if value1 is greater than value2. At
          least one of the two values must be a variable
          expression, so Citadel knows what type to evaluate
          them as. (Besides, comparing two constants is just
          silly.) If both values are variables, Citadel
          evaluates them both as the type of the first
          variable. This command assigns _Result a Boolean
          value of TRUE (if value1 is greater than value2)
          or FALSE (if it is not).
          
     #GVAR type _name
          This creates a global variable called _name of
          type type. _name must start with an underscore
          character ("_") and type must be one of: Boolean,
          Integer, UInteger, Long, ULong, or String[length].
          Global variables can be accessed anywhere in the
          script file.
          
     #IF expression
          This initiates an #IF... #ELSE... #ENDIF command
          block. expression is interpreted as a Boolean
          value. If it is TRUE, then execution starts at the
          command following the #IF and continues until an
          #ELSE or #ENDIF is found. If expression is FALSE,
          then execution starts at the command following an
          #ELSE or #ENDIF.
          
     #IFNOT expression
          This initiates an #IFNOT... #ELSE... #ENDIF
          command block. expression is interpreted as a
          Boolean value. If it is FALSE, then execution
          starts at the command following the #IFNOT and
          continues until an #ELSE or #ENDIF is found. If
          expression is TRUE, then execution starts at the
          command following an #ELSE or #ENDIF.
          
     #LABEL label
          This is a place holder for the #GOTO command. It
          is named label, which is that same label to give
          the #GOTO command to jump to this location; see
          #GOTO.
          
     #LOOP expression
          This ends a #DO... #LOOP loop. expression is
          evaluated as a Boolean value. If it is TRUE, then
          execution loops back to the #DO that started the
          loop. If it is FALSE, then execution passes to the
          command following the #LOOP command.
          
     #LOOPNOT expression
          This ends a #DO... #LOOPNOT loop. expression is
          evaluated as a Boolean value. If it is FALSE, then
          execution loops back to the #DO that started the
          loop. If it is TRUE, then execution passes to the
          command following the #LOOPNOT command.
          
     #LE value1 value2
          This tests if value1 is less than or equal to
          value2. At least one of the two values must be a
          variable expression, so Citadel knows what type to
          evaluate them as. (Besides, comparing two
          constants is just silly.) If both values are
          variables, Citadel evaluates them both as the type
          of the first variable. This command assigns
          _Result a Boolean value of TRUE (if value1 is less
          than or equal to value2) or FALSE (if it is not).
          
     #LT value1 value2
          This tests if value1 is less than value2. At least
          one of the two values must be a variable
          expression, so Citadel knows what type to evaluate
          them as. (Besides, comparing two constants is just
          silly.) If both values are variables, Citadel
          evaluates them both as the type of the first
          variable. This command assigns _Result a Boolean
          value of TRUE (if value1 is less than value2) or
          FALSE (if it is not).
          
     #LVAR type _name
          This creates a local variable called _name of type
          type. _name must start with an underscore
          character ("_") and type must be one of: Boolean,
          Integer, UInteger, Long, ULong, or String[length].
          Local variables can only be accessed in the
          function that they are defined in.
          
     #MOD value1 value2 [value3 ...]
          This divides value1 by value2, and divides the
          remainder by value3 if it exists, then divides
          that remainder by value4 if it exists, etc. All
          values are interpreted as longs, and the resulting
          remainder is given as a long.
          
     #MUL value1 value2 [value3 ...]
          This multiplies all the values together and
          assigns the product to _Result. All the values are
          interpreted as longs, and the result is a long.
          
     #NE value1 value2
          This tests value1 for inequality with value2. At
          least one of the two values must be a variable
          expression, so Citadel knows what type to evaluate
          them as. (Besides, comparing two constants is just
          silly.) If both values are variables, Citadel
          evaluates them both as the type of the first
          variable. This command assigns _Result a Boolean
          value of TRUE (if the values are not equal) or
          FALSE (if they are).
          
     #OR value1 value2 [value3...]
          This performs a Boolean OR on all specified values
          (interpreted as Boolean values) and assigns the
          result to _Result. A Boolean OR returns TRUE if
          any one the parameters is TRUE; it returns FALSE
          if all parameters are FALSE.
          
     #RET [value]
          This returns from a function. If the function has
          a return type, value gives the value to return,
          and is evaluated as the type that the function is
          defined to return. If the function does not have a
          return type, use Void as value.
          
     #RUN script
          This executes the script script. When the other
          script returns, execution continues in the current
          script with the next instruction.
          
     #STR code string1 [string2 ...]
          The action of this command depends on code, which
          can be one of the following:
          
          B    Return the sub-string of string1 starting at
               character position string2 (interpreted as an
               integer, not a string) and going for string3
               (interpreted as an integer, not a string)
               characters.
          U    Return string1 as all upper case.
          L    Return string2 as all lower case.
          C    Concatenate all strings.
          S    Return the size allocated to string1.
          E    Return the length of string1.
          PR   Pad string1 to string2 (interpreted as an
               integer, not a string) characters with spaces
               on the right.
          PL   Pad string1 to string2 (interpreted as an
               integer, not a string) characters with spaces
               on the left.
               
     #SUB value1 value2 [value3 ...]
          This subtracts value2 from value1, then subtracts
          value3 from the difference if it exists, then
          subtracts value4 from that difference if it
          exists, etc. All values are interpreted as longs,
          and the resulting difference is given as a long.
          
     #VERSION version
          This checks the version of Citadel that is
          running. If version specifies a version newer than
          the running version, then Citadel will not execute
          the script. This is checked at load-time, so it
          does not matter where #VERSION is placed in the
          file: if it is found, then the script will never
          begin execution. version is a numeric
          representation of the version of Citadel that is
          running generating by multiplying the version
          number and 1000 then adding the compile number.
          
     #WEND
          This ends a #WHILE... #WEND or #WHILENOT...#WEND
          loop. If the expression given in the #WHILE
          command is TRUE or the #WHILENOT command is FALSE,
          command execution returns to the command after the
          #WHILE or #WHILENOT command, else it continues
          with the command after the #WEND.
          
     #WHILE expression
          This begins a #WHILE... #WEND loop. If expression
          evaluates to be TRUE, command execution continues
          to the command after the #WHILE command. If it is
          FALSE, then command execution jumps to the command
          after the #WEND command.
          
     #WHILENOT expression
          
          This begins a #WHILENOT... #WEND loop. If expression
          evaluates to be FALSE, command execution continues
          to the command after the #WHILENOT command. If it
          is TRUE, then command execution jumps to the
          command after the #WEND command.
          
     #XOR value1 value2 [value3...]
          This performs a Boolean XOR on all specified
          values (interpreted as Booleans) and assigns the
          result to _Result. A Boolean XOR returns TRUE if
          one and only one the parameters is TRUE; it
          returns FALSE if either no parameter is TRUE or if
          more than one parameter is TRUE.
          
Debugging

The script interpreter provides a source-level debugger with
integrated profiler. To run a script with the debugger
active, append an asterisk to the end of the file name when
giving Citadel the name of the script to execute. You may
also activate the debugger on a currently running script by
placing Citadel in debug mode (this can be done almost any
time when Citadel is running by using the Alt+D keystroke).
Note that Citadel has to be placed into debug mode while the
script is running; if Citadel is already in debug mode when
the script starts, it will not load the debugger. If you
want to start using the debugger in this case press Alt+D
twice, to turn it off and then back on.

When the debugger first starts, it gives you the main
debugger message window. Citadel places all debugging
messages into this window. (It uses a window so it does not
interfere with the output of the script, in the main TTY
window.) The debugger has two other windows that it can
display if you tell it to: a watch window (which keeps track
of the values of any variables you tell it to) and a source
window (which displays your script file, and tells which
line is currently being executed).

Like all of Citadel's windowing functions, you can tell if a
window has focus (that is, will receive any keyboard
commands you provide) by looking at its border: if there is
a double line, then it has focus. If there is no window with
a double line, and the cursor is visible in the TTY window,
then no window has focus, and all keyboard commands will be
sent to the TTY window. To switch between TTY and window
modes, use Ctrl+F2 (or just click in the desired area with
the mouse, if you have one). This is important with the
script debugger because you must make sure that a debugger
window has the input focus before you try to use a debugger
command, else the keystrokes will be sent to the script for
processing.

Before it executes a command, the debugger displays the line
number in its main window. Once it has executed the command,
it displays how many milliseconds it took, the total time it
has spent on that command while executing the script, the
total number of times the command has been executed, and the
average time it has spent executing that command.

While any of the three debugging windows has the input
focus, any of the following command keys are active:

     space     Single-step. If the script is currently
          paused, this will execute a single instruction and
          then pause the script again.
          
     B    Breakpoint. You will be prompted for a line
          number. If there is currently a breakpoint set on
          that line, it will be cleared. If there is not a
          breakpoint set on that line, it will be added.
          When the script interpreter reaches a breakpoint,
          it pauses script execution, so you are able to
          examine the current state of the script.
          Breakpoints are identified in the source code
          window by using a different color to display the
          line number.
          
     E    Examine. This lets you examine the value of any
          variable. You are prompted for the name of the
          variable, then the debugger displays the value in
          the message window.
          
     P    Pause. This pauses the currently running script.
          
     Q    Quit. This quits the debugger, leaving the script
          to continue normally.
          
     S    Source. This opens a source window. The current
          execution line is displayed in a different color
          than the other lines. Line numbers are also given
          for each line; lines with breakpoints set are in a
          different color. If the script is paused, you may
          use the Cursor Up and Cursor Down keys to scroll
          through the source, or the Cursor Home key to
          bring the current execution line into the window.
          
     U    Un-pause. This resumes the execution of a
          currently paused script.
          
     W    Watch. This prompts for a variable, then adds it
          to the watch window (if it is not already in it),
          or removes it (if it is). If this is the first
          variable added to the watch window, then the
          window is created. If this is the last variable
          removed from the watch window, then the window is
          destroyed.
          
     X    Exit. This quits the debugger, and aborts the
          script's execution. Use this if you see that your
          script has worked itself into an endless loop, or
          otherwise is not functioning properly.
          
Citadel internal functions by name

The following internal functions are currently available.
More will be added in subsequent versions of Citadel.

     AddCommasToNumber number
          This adds commas as thousands separators to
          number. number is evaluated as a long and the
          result is given as a string. If the current user
          has show commas turned off in .Enter Configuration
          (.EC), then this has no effect.
          
     AddDupCheck string
          This adds the string specified by the string value
          string to the duplicate checking data. This
          function returns a Boolean value: TRUE if it was
          successful; FALSE if not (which means Citadel is
          out of memory).
          
          To use the duplicate checking functions, start by
          calling StartDupCheck, which initializes the
          checking data structures. Then add strings with
          AddDupCheck. Use CheckForDup to see if a string
          has been added. When you are finished, call
          StopDupCheck to free up the memory used by the
          duplicate checking.
          
     AddNetIDToNetIDCit netid comment
          This adds a Net ID to NETID.CIT. netid is a string
          value specifying the Net ID to add. comment is a
          string value specifying the comment to give the
          Net ID. This returns a Boolean value: TRUE if the
          Net ID could be added to NETID.CIT; FALSE if not.
          
     AddUser username groupname
          This adds a user to a group. username is a string
          expression giving the user's name and groupname is
          a string expression giving the group's name.
          
     AddWatch variable
          This sets a watch of variable variable in the
          script debugger. This can be tricky: you cannot
          merely use:
          
               #CALL AddWatch _Variable
               
          To add a watch of _Variable, because the value of
          _Variable will be used. The trick is to use the
          sub-string command, like this:
          
               #STR B x_Variable 1 99
               #CALL AddWatch _Result
               
          This makes the value of _Result be "_Variable"
          which is then passed to AddWatch.
          
          This function returns a Boolean value: TRUE if the
          watch could be added, or FALSE if it could not
          (either because Citadel is out of memory or
          because the script debugger is not currently
          active; see SetDebugScript).
          
     AppendToNetCommandReply string1 [string2...]
          This adds text to the network command reply
          message. This function is only valid in scripts
          called in response to a network command, as set by
          #NETCOMMAND in EXTERNAL.CIT; if used in any other
          script, it has no effect. This appends all
          specified string values to the message, with no
          space in between, so be sure to include any spaces
          or new lines that you wish to have in the reply
          message.
          
     ASCIIToChar asciivalue
          This converts an integer to a character having
          that ASCII value. asciivalue is the integer to
          convert, and the result is given as a single
          character long string.
          
     AskYN prompt default
          This prompts the user to answer a Yes/No (and
          sometimes Abort) question. prompt is a string
          expression giving the question (without a "?"
          following it; that is added by AskYN). default is
          an integer expression that takes the following
          form:
          
               0    Yes/No; Default no
               1    Yes/No; Default yes
               2    Yes/No/Abort; Default abort
               3    Yes/No/Abort; Default no
               4    Yes/No/Abort; Default yes
               
          This function returns an integer result: 0 for No;
          1 for Yes; and 2 for Abort.
          
     ChangeDir pathname
          This changes the current directory (and drive) to
          that given by pathname. If pathname is omitted,
          this changes to #HOMEPATH as set in CONFIG.CIT.
          
     CharToASCII charvalue
          This converts the first character of the string
          given by charvalue to its ASCII value, and returns
          that as an Integer.
          
     Chat
          This function enters into chat mode. No checking
          is done whether chat is on or off or if the
          current user has chat disabled.
          
     ChatReq ring internalchat
          
          This rings the chat bell, even if chat is disabled for
          the entire system or the current user. ring is a
          Boolean expression that is TRUE to ring the bell
          (if bells are enabled) or FALSE to not ring the
          bell (even if bells are enabled). internalchat is
          a Boolean expression that is TRUE to enter
          internal chat mode if the sysop responds to the
          page, and FALSE to not enter internal chat mode if
          the sysop responds to the page. This function
          returns a Boolean result: FALSE if the sysop does
          not respond, TRUE if the sysop does respond.
          
     CheckForDup string
          This checks the string specified by the string
          value string to see if it has been added to the
          duplicate checking data with AddDupCheck. This
          function returns a Boolean value: TRUE if string
          is a duplicate (that is, it has been added with
          AddDupCheck); FALSE if not.
          
          To use the duplicate checking functions, start by
          calling StartDupCheck, which initializes the
          checking data structures. Then add strings with
          AddDupCheck. Use CheckForDup to see if a string
          has been added. When you are finished, call
          StopDupCheck to free up the memory used by the
          duplicate checking.
          
     CheckUserOutControl pause
          Calling this lets the user use the Jump (J), Next
          (N), Stop (S), and Pause (P), commands. If your
          script is displaying text, then you don't need to
          call this, as the text output functions handle
          this for you. pause is a Boolean value: TRUE if
          you want Citadel to pause for the user (and
          display the more prompt), or FALSE if you just
          want it to check for user input. It is a good idea
          to place this in a loop where the script may be
          busy for a while but not display anything to the
          user, so the user can abort out of the loop. Use
          the IsCanOutput function afterwards to see if the
          user has tried to abort the loop: it will return
          FALSE if Stop was pressed.
          
     ClearBreakPoint lineno
          
          This clears the breakpoint at lineno in the script
          debugger. This function returns a Boolean value:
          TRUE if the breakpoint could be cleared; FALSE if
          it could not (it either was not set, or the script
          debugger was not active; see SetDebugScript).
          
     CloseFile filenumber
          This closes a file opened by the script file.
          filenumber is an integer value representing which
          file to close.
          
     CountDirectory
          This counts the number of files in the last loaded
          directory and returns the value as an Integer. See
          GetDirectory.
          
     DebuggingMsg message
          This outputs a message given by the string value
          message to the main debugging window if the script
          debugger is active. If it is not active, then this
          does nothing.
          
     DecToHex number [digits]
          
          This converts number to a string representation of the
          number in hexadecimal (base 16) using capital
          letters A-Z. The optional parameter digits is
          interpreted as an integer and gives the minimum
          number of digits to have in the hexadecimal
          string; if there are fewer digits than specified,
          then the string is padded on the left with zeros.
          
     DeleteFile filename
          This deletes the file specified by the string
          value filename. This function returns a Boolean
          value: TRUE if the file was deleted; FALSE if it
          was not (most likely because the file didn't
          exist).
          
     Dial phonenum timeout
          This dials the phone number given by phonenum and
          waits for a connection. The user may abort the
          dial by pressing a key. If no carrier is detected
          within timeout seconds, the dial is aborted.
          
Note:     phonenum can be more than just the phone number.
     This is appended to #DIAL_PREF as set in CONFIG.CIT,
     and output to the modem, followed by a carriage return
     (ASCII 13). So, assuming a Hayes-compatible modem, if
     #DIAL_PREF is set to just "AT", then phonenum has to
     include a "D" in addition to the phone number. See your
     modem manual for more information on modem commands.
     
     DirectoryGetName index
          This gets the name of the file in position index
          (starting at 1) in the last directory read by
          GetDirectory and returns it as a string value.
          
     DirectoryGetSize index
          This gets the size of the file in position index
          (starting at 1) in the last directory read by
          GetDirectory and returns it as a long value.
          
     DirectoryGetTime index
          This gets the time and date of the file in
          position index (starting at 1) in the last
          directory read by GetDirectory and returns it as a
          long value.
          
     DiskFree drive
          This function checks the free disk space on a
          specified drive and returns it as a long. drive is
          a string expression, the first character of which
          is interpreted as the disk to check. Use @ to
          check the default drive.
          
     DoCCR
          This sends a CR/LF to the console, but not the
          modem.
          
     DoChat
          This rings the chat bell only if chat is turned on
          for the system and the current user. ring is a
          Boolean expression that is TRUE to ring the bell
          (if bells are enabled) or FALSE to not ring the
          bell (even if bells are enabled). internalchat is
          a Boolean expression that is TRUE to enter
          internal chat mode if the sysop responds to the
          page, and FALSE to not enter internal chat mode if
          the sysop responds to the page. This function
          returns a Boolean result: FALSE if the sysop does
          not respond, TRUE if the sysop does respond.
          
     DoCR
          This sends a CR/LF to the console and modem.
          
     DoNetwork node
          This tells Citadel to network with the node
          specified (either by name or by address) by the
          string value node. This returns a Boolean value:
          TRUE if the network was successful, or FALSE if it
          failed for any reason.
          
     DumpDirectory
          This releases the memory used by the last
          GetDirectory function.
          
     DumpF filename format
          This dumps the file specified by filename to the
          user. format is a Boolean value that tells Citadel
          if it should apply its screen formatting to the
          file.
          
     DumpFC filename format
          
          This dumps the file specified by filename to the
          console only. format is a Boolean value that tells
          Citadel if it should apply its screen formatting
          to the file.
          
     ExitCitadel resultcode
          This exits Citadel. Execution of the script stops
          when this function is called. (Since Citadel
          itself exits, of course.) resultcode is an integer
          value that sets the return code of Citadel, which
          can be accessed by the ERRORLEVEL variable in MS-
          DOS batch files.
          
     FileEOF filenumber
          This tests the file referenced by filenumber to
          see if its end has been reached. This returns a
          Boolean value: TRUE if the end of the file has
          been reached; FALSE if not.
          
     FileExists filename
          This tests whether the file specified by filename
          exists on disk. This returns a Boolean value: TRUE
          if the file exists; FALSE if not.
          
     FindHallByName name [partial]
          This searches for a hall with the name name. The
          optional partial is a Boolean value which
          specifies that the search should include partial
          hall names. If TRUE, then partial names are
          included; if FALSE or not present, then only full
          matches are accepted. If the search is successful,
          then the hall index is returned as an integer
          value; if it is unsuccessful, then the value -1 is
          returned.
          
     FindNodeByName name
          This searches for a node with the name name. name
          can be either the address or full name of the node
          (no partial searches are allowed). If the search
          is successful, then the log table slot of the node
          is returned as an integer value; if unsuccessful,
          then the value -1 is returned.
          
     FindRoomByName roomname partial
          
          This finds the room index of a room when given a name
          to search for. roomname is a string value giving
          the name of the room to search for and partial is
          a Boolean value: TRUE if partial matches are
          acceptable; FALSE if an exact match is desired.
          The room index is returned as an integer value. If
          no match is found, the return value is -1 (an
          invalid room index).
          
     FindRoomByNetID netid network
          This finds the room index of a room when given a
          Net ID to search for. netid is a string value
          giving the Net ID to search for. network is a
          Boolean value: TRUE if the room must be networked
          to be considered a match; FALSE if not. The room
          index is returned as an integer value. If no match
          is found, the return value is -1 (an invalid room
          index).
          
     FindUserByName username partial
          This finds the log table index of a user when
          given a name to search for. username is a string
          value giving the name of the user to search for
          and partial is a Boolean value: TRUE if partial
          matches are acceptable; FALSE if an exact match is
          desired. The user's position in the log table is
          returned as an Integer value. If no match is
          found, the return value is -1 (an invalid room
          index).
          
          Note that users move around in the log table
          whenever a user logs in, so you cannot rely on a
          user always occupying the same location in the log
          table. Also, the position in the log table does
          not correspond to the position in the log file
          (which does stay constant): use GetLTLogSlot to
          find the position in the log file based on
          position in the log table.
          
     GetAccounting
          This checks to see if accounting is enabled for
          the system. This function returns a Boolean value:
          TRUE if accounting is enabled for the system,
          FALSE if it is not.
          
     GetAideChatHour hour
          This checks to see if the .Aide Chat (.AC) command
          is enabled for a specific hour. hour is an integer
          value from 0 to 23 representing the hour to check.
          This function returns a Boolean value: TRUE if
          .Aide Chat is allowed for the hour specified,
          FALSE if it is not.
          
     GetAideHall
          This checks to see if aides who are not sysops are
          allowed to use the .Aide Hall (.AH) and .Aide
          Window (.AW) commands, as specified by the
          #AIDEHALL CONFIG.CIT keyword. This function
          returns a Boolean value: TRUE if the commands are
          allowed for aides who are not sysops, and FALSE if
          the are not.
          
     GetAideModerate
          This checks to see if aides who are not sysops are
          allowed to moderate moderated rooms as set by the
          #MODERATE CONFIG.CIT keyword. This function
          returns a Boolean value: TRUE if aides who are not
          sysops are allowed to moderate moderated rooms,
          FALSE if they are not.
          
     GetAlias
          This function gets the current node's alias. It is
          returned as a string value.
          
     GetAnonAuthor
          This function gets the #ANONAUTHOR as set in
          CONFIG.CIT. It is returned as a string value.
          
     GetApplPath
          This function gets the #APPLICATIONS path as set
          in CONFIG.CIT. It is returned as a string value.
          
     GetAttr
          This function gets the console default attribute
          as set by #ATTR in CONFIG.CIT. It is returned as
          an integer value.
          
     GetAutoANSI
          This function returns the current setting of
          #AUTOANSI in CONFIG.CIT. It is returned as an
          integer value.
          
     GetBAttr
          This function gets the console's border attribute
          as set by #BATTR in CONFIG.CIT. It is returned as
          an integer value.
          
     GetBells
          This function returns the current state of bells
          on the system as an integer value. The possible
          values are:
          
               0    Bells on
               1    Bells are on for the chat page only
               2    Bells are never on.
          
     GetBIOS
          This function returns whether BIOS is being used
          to display screen output as set by #BIOS in
          CONFIG.CIT. This function returns a Boolean value:
          TRUE if BIOS is being used for screen output,
          FALSE if it is not.
          
     GetBorder number
          This function returns a border, as set by the
          .Enter Border (.EB) command. number is an integer
          value specifying which border to get. The border
          is returned as a string value. See GetMaxBorders
          for the limit of number.
          
     GetCallNo
          This function returns the current call number to
          the system. It is returned as a long.
          
     GetCAttr
          This function returns the attribute used in chat
          mode, as set by #CATTR in CONFIG.CIT. The value is
          returned as an integer.
          
     GetChatOn
          This function returns whether chat is on for the
          system or not. This function returns a Boolean
          value: TRUE if chat is on; FALSE if it is not.
          
     GetCheckCTS
          This functions returns whether CTS is being
          checked when sending characters to the modem, as
          set by #CHECKCTS in CONFIG.CIT. This function
          returns a Boolean value: TRUE if CTS is being
          checked; FALSE if it is not.
          
     GetCit86Country
          This returns #CIT86COUNTRY as set in CONFIG.CIT.
          
     GetCit86Domain
          This returns #CIT86DOMAIN as set in CONFIG.CIT.
          
     GetColors
          This function checks to see if colors are allowed
          everywhere on the system, as set by #TWIT_FEATURES
          COLORS in CONFIG.CIT. This function returns a
          Boolean value: TRUE if colors are allowed
          everywhere; FALSE if they are not.
          
     GetCommentOfNetIDInNetIDCit netid
          This gets the comment of a Net ID from NETID.CIT.
          netid is a string value giving the Net ID to find
          the comment of. This function returns a string
          value: the comment of the Net ID.
          
     GetConnectRate
          This function checks the current connect rate
          between the modems. The rate is returned as a
          long, from 300 to 115,200.
          
     GetConnectWait
          This function checks if Citadel waits after a
          connection is made before sending data to the
          modem, as set by #CONNECTWAIT in CONFIG.CIT. This
          function returns an integer value: the number of
          seconds to wait.
          
     GetContextSensitiveText
          This returns text, which may be different
          depending on when it is called. Currently, the
          only possible thing to be returned is the last
          string the user entered in small chat. Use it in
          conjunction with #EVENT SMALLCHAT.
          
     GetCountBeep
          This function checks to see if Citadel beeps when
          doing a countdown timer until hanging up, as set
          by #COUNTBEEP in CONFIG.CIT. This function returns
          a Boolean value: TRUE if Citadel beeps while
          counting down and FALSE if it does not.
          
     GetCreditNym
          This function returns the name of a single credit
          on the system, as set by #CREDIT_NYM in
          CONFIG.CIT. The name is returned as a string
          value.
          
     GetCreditsNym
          This function returns the name of credits on the
          system, as set by #CREDIT_NYM in CONFIG.CIT. The
          name is returned as a string value.
          
     GetCurrentTime
          This gets the current time and returns the value
          as a long. This value is the number of seconds
          since 12:00AM, January 1, 1970, GMT. (This is how
          Citadel stores time.)
          
     GetDebugSystem
          This function returns whether Citadel is in debug
          mode as a Boolean value: TRUE if debug mode is
          active; FALSE if not.
          
     GetDefDateStamp
          This function returns the date stamp for unlogged-
          in users. It is returned as a string value.
          
     GetDefNetPrefix
          This function returns the net prefix for unlogged-
          in users. It is returned as a string value.
          
     GetDefRPrompt
          This function returns the room prompt for unlogged-
          in users. It is returned as a string value.
          
     GetDefVDateStamp
          This function returns the verbose date stamp for
          unlogged-in users. It is returned as a string
          value.
          
     GetDialMacro index
          This function returns the string used for a dial
          out mode keyboard macro. index gives the key to
          look up, as per the following table:
          
               index Function Key
               1 - 12    F1 through F12
               13 - 24   Alt+F1 through Alt+F12
               25 - 36   Shift+F1 through Shift+F12
               37 - 48   Control+F1 through Control+F12
          
          The macro is returned as a string value.
          
     GetDialPref
          This returns the dialing prefix, as set by
          #DIAL_PREF in CONFIG.CIT. It is returned as a
          string value.
          
     GetDialRing
          This returns what is sent to the modem in response
          to a RING, as set by #DIALRING in CONFIG.CIT. It
          is returned as a string value.
          
     GetDialSetup
          This returns what is sent to the modem to set it
          up for dialing out, either when networking or when
          going into dial out mode. It is returned as a
          string value.
          
     GetDirectory path mask sortby reverse
          This reads an MS-DOS directory of files. path is a
          string value that gives the name of the
          subdirectory to load. If path is an empty string,
          then the current subdirectory is used. mask is a
          wildcard expression that specifies which files to
          load. UNIX-style wildcards are allowed here, not
          just DOS-style, so you can specify something like
          "[aeiou]*.*" to search for all files that start
          with a vowel. sortby is an integer value: 0 to not
          sort the directory; 1 to sort it by name; or 2 to
          sort it by date. reverse is a Boolean value: FALSE
          to sort from lowest to highest; TRUE to sort from
          highest to lowest.
          
     GetDirPath
          This returns what path is used as a default room
          path, as set by #DIRPATH in CONFIG.CIT. It is
          returned as a string value.
          
     GetDiskFree
          This returns the minimum amount of space Citadel
          is to try to keep free on disk, as set by
          #DISKFREE in CONFIG.CIT. It is returned as a long
          value.
          
     GetDLPath
          This returns what path is used for incoming Net
          6.9 file transfers, as set by #DLPATH in
          CONFIG.CIT. It is returned as a string value.
          
     GetDownShift
          This returns what is sent to the modem when
          #DUMB_MODEM is set to 6 to go back on-line after
          going into command mode and switching speeds. It
          is returned as a string value.
          
     GetDumbModem
          This returns the #DUMB_MODEM value from CONFIG.CIT
          which determines how Citadel is to detect and deal
          with different modem speeds. It is returned as an
          integer value.
          
     GetEnterName
          This returns what the user is asked for when
          entering his name when first logging in, as set by
          #ENTER_NYM in CONFIG.CIT. This is returned as a
          string value.
          
     GetEnterOK
          This returns whether unlogged-in users are allowed
          to leave messages, as set by #ENTEROK in
          CONFIG.CIT. This is returned as a Boolean value:
          TRUE if unlogged-in users may enter messages, and
          FALSE if they may not.
          
     GetEnterSur
          
          This returns whether users may enter their own surname,
          as set in CONFIG.CIT. This is returned as a
          Boolean value: TRUE if users may enter their own
          surname, and FALSE if they may not.
          
     GetExpire
          This returns the current setting of #EXPIRE in
          CONFIG.CIT. This is returned as an integer.
          
     GetF6Pass
          This returns the current F6 password as set in
          CONFIG.CIT. It is returned as a string value.
          
     GetFileBufSize
          This returns the current size of the MSG.DAT file
          buffer as set in CONFIG.CIT. It is returned as an
          integer value.
          
     GetForceLogin
          This returns whether users are forced to log in
          when they first call, as set by #FORCELOGIN in
          CONFIG.CIT. It is returned as a Boolean value:
          TRUE if users are forced to log in, and FALSE if
          they are not.
          
     GetForwardSys
          This returns if mail to "Sysop" is forwarded to
          the user specified by #SYSOP in CONFIG.CIT. It is
          returned as a Boolean value: TRUE if mail is to be
          forwarded, and FALSE if it is not.
          
     GetFuelBarEmpty
          This returns the character used to draw the empty
          fuel bar when re-indexing MSG.DAT. This is
          returned as an integer value.
          
     GetFuelBarFull
          This returns the character used to draw the full
          fuel bar when re-indexing MSG.DAT. This is
          returned as an integer value.
          
     GetGrpDesc group
          This returns a group's description. group is an
          index specifying which group to extract the
          description from. This is returned as a string
          value.
          
     GetGrpName group
          This returns a group's name. group is an index
          specifying which group to extract the name from.
          This is returned as a string value.
          
     GetGrpSlot name
          This returns the index of the group named by name.
          This is returned as an integer value. A return
          value of -1 means that the named group does not
          exist.
          
     GetHallDesc hall
          This returns a hall's description. hall is an
          index specifying which hall to extract the
          description from. This is returned as a string
          value.
          
     GetHallGroup hall
          This returns a hall's group. hall is an index
          specifying which hall to get the group for. The
          group's index is returned as an integer. This
          returns a value even if the hall is not group-
          only; use IsHallGrp to check that the hall is
          group-only first.
          
     GetHallName hall
          This returns a hall's name. hall is an index
          specifying which hall to extract the name from.
          This is returned as a string value.
          
     GetHangUp
          This returns the string sent to hang up the modem,
          if #DUMB_MODEM 6 is in use. This is returned as a
          string value.
          
     GetHangupDelay
          This returns the amount of time to spend after
          dropping DTR to hang up the modem before raising
          it again, in seconds. This is returned as an
          integer value. If a 0 is returned, Citadel still
          waits a half second.
          
     GetHelpPath
          This returns the help path, as set by #HELPPATH in
          CONFIG.CIT. This is returned as a string value.
          
     GetHelpPath2
          This returns the secondary help path, as set by
          #HELPPATH2 in CONFIG.CIT. This is returned as a
          string value.
          
     GetHomePath
          This returns Citadel's home path, as set by
          #HOMEPATH in CONFIG.CIT. This is returned as a
          string value.
          
     GetIdleTimeout
          This returns the idle time out, which is the
          number of minutes that Citadel will wait while
          idle before attempting to execute a Cron event.
          This is returned as an integer value.
          
     GetInitBaud
          This returns the speed that Citadel uses to
          initialize the modem. It is returned as an integer
          value, corresponding the following table:
          
               0    300 baud
               1    1,200 baud
               2    2,400 baud
               3    4,800 baud
               4    9,600 baud
               5    19,200 baud
               6    38,400 baud
               7    57,600 baud
               8    115,200 baud
          
     GetLApplication
          This returns the path Citadel uses to look for
          applications, as set by #APPLICPATH in CONFIG.CIT.
          This is returned as a string value.
          
     GetLClosedSys
          This reports if the system is closed to new
          callers, as set by #LOGIN CLOSED_SYSTEM in
          CONFIG.CIT. This is returned as a Boolean value:
          TRUE if the system is closed and FALSE if it is
          not.
          
     GetLCreate
          This reports if new accounts are being accepted
          from remote, as set by #LOGIN NEW_ACCOUNTS in
          CONFIG.CIT. This is returned as a Boolean value:
          TRUE if new accounts are allowed, FALSE if they
          are not.
          
     GetLogExtDir
          This returns the directory for log extensions
          (LE_*.DAT files) as set by #LOGEXTDIR in
          CONFIG.CIT. This is returned as a string value.
          
     GetLQuestionnaire
          This reports if new users are asked for user
          information (name, phone number, etc.) when
          logging in, as set by #LOGIN QUESTIONS. This is
          returned as a Boolean value: TRUE if questions are
          asked, FALSE if no questions are asked.
          
     GetLSysMsg
          
          This reports if new users are required to send a
          message to the sysop, as set by #LOGIN
          SYSOP_MESSAGE in CONFIG.CIT. This is returned as a
          Boolean value: TRUE if a message to sysop is
          required, FALSE if it is not.
          
     GetLTAide index
          This returns whether a user is an aide or not.
          index is an integer value indexing a slot in the
          log table. This function returns a Boolean value:
          TRUE if the user is an aide, and FALSE if not.
          
     GetLTAlias index
          This returns a user's alias. index is an integer
          value indexing a slot in the log table. This
          function returns the alias as a string value.
          
     GetLTCallNo index
          This returns a user's last call number. index is
          an integer value indexing a slot in the log table.
          This function returns the last call number as a
          long value.
          
     GetLTExpert index
          This returns whether a user has expert mode turned
          on or not. index is an integer value indexing a
          slot in the log table. This function returns a
          Boolean value: TRUE if the user has expert mode
          turned on, and FALSE if not.
          
     GetLTInHash index
          This returns a hash of the initials of a user.
          index is an integer value indexing a slot in the
          log table. This function returns the hash as an
          integer value.
          
     GetLTInuse index
          This returns whether a log slot is in use or not.
          index is an integer value indexing a slot in the
          log table. This function returns a Boolean value:
          TRUE if the slot is in use, and FALSE if not.
          
     GetLTLFMask index
          This returns whether a user has line feeds turned
          on or not. index is an integer value indexing a
          slot in the log table. This function returns a
          Boolean value: TRUE if the user has line feeds
          turned on, and FALSE if not.
          
     GetLTLogSlot index
          This returns a user's location in the log file.
          index is an integer value indexing a slot in the
          log table. This function returns the location in
          LOG.DAT as an integer value.
          
     GetLTName index
          This returns a user's name. index is an integer
          value indexing a slot in the log table. This
          function returns the name as a string value.
          
     GetLTNetUser index
          This returns whether a user has network privileges
          line or not. index is an integer value indexing a
          slot in the log table. This function returns a
          Boolean value: TRUE if the user has network
          privileges, and FALSE if not.
          
     GetLTNoAccount index
          
          This returns whether a user has accounting turned off
          or not. index is an integer value indexing a slot
          in the log table. This function returns a Boolean
          value: TRUE if the user has accounting turned off,
          and FALSE if not.
          
     GetLTNode index
          This returns whether a user is a node or not.
          index is an integer value indexing a slot in the
          log table. This function returns a Boolean value:
          TRUE if the user is a node, and FALSE if not.
          
     GetLTNoMail index
          This returns whether a user has mail turned off or
          not. index is an integer value indexing a slot in
          the log table. This function returns a Boolean
          value: TRUE if the user has mail turned off, and
          FALSE if not.
          
     GetLTOldToo index
          This returns whether a user is set to read the
          last old message on a new messages request. index
          is an integer value indexing a slot in the log
          table. This function returns a Boolean value: TRUE
          if the user has last old on new turned on, and
          FALSE if not.
          
     GetLTPermanent index
          This returns whether a user has a permanent
          account or not. index is an integer value indexing
          a slot in the log table. This function returns a
          Boolean value: TRUE if the user has a permanent
          account, and FALSE if not.
          
     GetLTProblem index
          This returns whether a user is a problem user or
          not. index is an integer value indexing a slot in
          the log table. This function returns a Boolean
          value: TRUE if the user is a problem user, and
          FALSE if not.
          
     GetLTPwHash index
          This returns a hash of the password of a user.
          index is an integer value indexing a slot in the
          log table. This function returns the hash as an
          integer value.
          
     GetLTRegion index
          This returns a user's region. This only makes
          since for users that are nodes. index is an
          integer value indexing a slot in the log table.
          This function returns the region as a string
          value.
          
     GetLTRoomTell index
          This returns whether a user has room descriptions
          turned on or not. index is an integer value
          indexing a slot in the log table. This function
          returns a Boolean value: TRUE if the user has room
          descriptions turned on, and FALSE if not.
          
     GetLTSysop index
          This returns whether a user is a sysop or not.
          index is an integer value indexing a slot in the
          log table. This function returns a Boolean value:
          TRUE if the user is a sysop, and FALSE if not.
          
     GetLTTabs index
          This returns whether a user has tabs turned on or
          not. index is an integer value indexing a slot in
          the log table. This function returns a Boolean
          value: TRUE if the user has tabs turned on, and
          FALSE if not.
          
     GetLTUCMask index
          This returns whether a user has uppercase only
          turned on or not. index is an integer value
          indexing a slot in the log table. This function
          returns a Boolean value: TRUE if the user has
          uppercase only turned on, and FALSE if not.
          
     GetLTUnlisted index
          This returns whether a user has an unlisted
          account or not. index is an integer value indexing
          a slot in the log table. This function returns a
          Boolean value: TRUE if the user has an unlisted
          account, and FALSE if not.
          
     GetLVerified index
          
          This returns whether a user is verified or not. index
          is an integer value indexing a slot in the log
          table. This function returns a Boolean value: TRUE
          if the user is verified, and FALSE if not.
          
     GetMaxBorders
          This returns the maximum number of borders
          allowed, as set by #MAXBORDERS in CONFIG.CIT. This
          is returned as an integer value.
          
     GetMaxFiles
          This returns the maximum number of files allowed,
          as set by #MAXFILES in CONFIG.CIT. This is
          returned as an integer value.
          
     GetMaxGroups
          This returns the maximum number of groups allowed,
          as set by #MAXGROUPS in CONFIG.CIT. This is
          returned as an integer value.
          
     GetMaxHalls
          This returns the maximum number of halls allowed,
          as set by #MAXHALLS in CONFIG.CIT. This is
          returned as an integer value.
          
     GetMaxJumpback
          This returns the maximum number of Jumpbacks
          allowed, as set by #MAXJUMPBACK in CONFIG.CIT.
          This is returned as an integer value.
          
     GetMaxLogTab
          This returns the maximum number of log entries
          allowed, as set by #MAXLOGTAB in CONFIG.CIT. This
          is returned as an integer value.
          
     GetMaxPoop
          This returns the poopcount of the current
          poopuser. This is returned as a long value.
          
     GetMaxRooms
          This returns the maximum number of rooms allowed,
          as set by #MAXROOMS in CONFIG.CIT. This is
          returned as an integer value.
          
     GetMCIDate
          
          This returns the string sent in response to ^AT if MCI
          is turned off. This is returned as a string value.
          
     GetMCIFirstName
          This returns the string sent in response to ^An if
          MCI is turned off. This is returned as a string
          value.
          
     GetMCIName
          This returns the string sent in response to ^AN if
          MCI is turned off. This is returned as a string
          value.
          
     GetMCIOn
          This returns whether MCI is turned on with
          #TWIT_FEATURES MCI or not. This is returned as a
          Boolean value: TRUE if MCI is on, FALSE if it is
          not.
          
     GetMCIPoop
          This returns the string sent in response to ^AP if
          MCI is turned off. This is returned as a string
          value.
          
     GetMCITime
          This returns the string sent in response to ^At if
          MCI is turned off. This is returned as a string
          value.
          
     GetMData
          This returns the serial port that the modem is
          attached to. This is returned as an integer value
          ranging from 1 to 4.
          
     GetMessageK
          This returns the size of the message base as set
          by #MESSAGEK in CONFIG.CIT. This is returned as a
          long value.
          
     GetMessageRoom
          This returns the maximum number of messages
          allowed in a single room per call for users who
          are not aides or sysops. This is returned as an
          integer value.
          
     GetMinBaud
          This returns the minimum baud rate that allowed to
          connect with the board. This is returned as an
          integer value as per the following table:
          
               0    300 baud
               1    1,200 baud
               2    2,400 baud
               3    4,800 baud
               4    7,200 baud
               5    9,600 baud
               6    12,000 baud
               7    14,400 baud
               8    16,800 baud
               9    19,200 baud
               10   38,400 baud
               11   57,600 baud
               12   115,200 baud
               13   230,400 baud
          
     GetModemString [length]
          This gets a string from the modem. The optional
          integer value length specifies the number of
          characters to retrieve. If it is not specified,
          255 is used. This returns when a CR (ASCII 13) or
          LF (ASCII 10) is received. If more than length
          characters are received, the console user presses
          a key, or more than three seconds pass, then this
          returns an empty string.
          
     GetModSetup
          This returns the string sent to the modem to
          initialize it as set by #MODSETUP in CONFIG.CIT.
          This is returned as a string value.
          
     GetModUnsetup
          This returns the string sent to the modem to
          deinitialize it as set by #MODUNSETUP in
          CONFIG.CIT. This is returned as string value.
          
     GetMorePrompt
          This returns the string sent to the screen when
          pausing, either because of full screen pause or
          between messages if pause between messages is
          turned on. This is returned as a string value.
          
     GetMsgCompress
          This returns whether the message base is being
          compressed by Citadel or not. This is returned as
          a Boolean value: TRUE if Citadel is compressing
          the message base, FALSE if it is not.
          
     GetMsgNym
          This function returns the name of a single message
          on the system, as set by #MESSAGE_NYM in
          CONFIG.CIT or the .Aide Name messages (.AN)
          command. The name is returned as a string value.
          
     GetMsgPath
          This returns the path Citadel uses to store the
          message file, as set by #MSGPATH in CONFIG.CIT.
          This is returned as a string value.
          
     GetMsgsNym
          This function returns the name of a messages on
          the system, as set by #MESSAGE_NYM in CONFIG.CIT
          or the .Aide Name messages (.AN) command. The name
          is returned as a string value.
          
     GetMsgVerb
          This function returns verb used to describe saving
          messages, as set by #MESSAGE_NYM in CONFIG.CIT or
          the .Aide Name messages (.AN) command. The name is
          returned as a string value.
          
     GetMTOldest
          This returns the message number of the oldest
          message in the message table. This is returned as
          a long value.
          
     GetNetCommandText
          This function returns the text of the network
          command message as a string value. This is only
          valid in scripts called to process network
          commands as set in #NETCOMMAND in EXTERNAL.CIT: if
          used in any other script, this returns an empty
          string. This only retrieves the first 255
          characters, as that is the maximum length of a
          script string.
          
     GetNetCommandTextToFile filename
          This function writes the text of the network
          command message to a text file specified by the
          string value filename. This returns a Boolean
          value: TRUE if the text could be written to the
          file, FALSE if not. This is only valid in scripts
          called to process network commands as set in
          #NETCOMMAND in EXTERNAL.CIT: if used in any other
          script, this has no effect and returns FALSE. This
          is useful for processing network command text over
          255 characters in length: you can read the file as
          needed.
          
     GetNetID index
          This returns the Net ID of a room. index is an
          integer value indexing a slot in the room table.
          The Net ID is returned as a string value.
          
     GetNetMail
          This returns whether net mail is always dumped in
          the Mail room, or if Citadel is to try to find the
          correct room for it. This is returned as a Boolean
          value: TRUE if Citadel should try to find the
          correct place for networked mail, FALSE if it
          always places it in the Mail room.
          
     GetNetSurnames
          This returns whether surnames are displayed on
          networked messages as set by #TWIT_FEATURES
          NET_SURNAMES in CONFIG.CIT. This is returned as a
          Boolean value: TRUE if they are, FALSE if they are
          not.
          
     GetNetTitles
          This returns whether titles are displayed on
          networked messages as set by #TWIT_FEATURES
          NET_TITLES in CONFIG.CIT. This is returned as a
          Boolean value: TRUE if they are, FALSE if they are
          not.
          
     GetNewest
          This returns the message number of the newest
          message on the system. This is returned as a long
          value.
          
     GetNewUserApp
          This returns the application run when new users
          log in. This is returned as a string value.
          
     GetNMessages
          This returns the maximum number of messages that
          Citadel can keep track of, as set by #NMESSAGES in
          CONFIG.CIT. This is returned as a long value.
          
     GetNodeCountry
          This returns the country of the node, as set by
          #NODECOUNTRY in CONFIG.CIT. This is returned as a
          string value.
          
     GetNodeName
          This returns the name of the node, as set by
          #NODENAME in CONFIG.CIT. This is returned as a
          string value.
          
     GetNodePhone
          
          This returns the phone number of the node, as set by
          #NODEPHONE in CONFIG.CIT. This is returned as a
          string value.
          
     GetNodeRegion
          This returns the region of the node, as set by
          #NODEREGION in CONFIG.CIT. This is returned as a
          string value.
          
     GetNodeSig
          This returns the current signature of the node, as
          set by #SIGNATURE in CONFIG.CIT. This is returned
          as a string value.
          
     GetNoPWEcho
          This returns the value of #NOPWECHO in CONFIG.CIT.
          This is returned as an integer value.
          
     GetNumberOfMessages
          This returns the total number of messages in the
          message table as a long value.
          
     GetOffHook
          
          This returns whether the modem is placed off hook when
          someone logs in local. This is returned as a
          Boolean value: TRUE if Citadel places the modem
          off hook when a user is logged-in on console,
          FALSE if it does not.
          
     GetOffHookStr
          This returns the string sent to the modem to place
          it off hook as set by #OFFHOOKSTR in CONFIG.CIT.
          This is returned as a string value.
          
     GetOldCount
          This returns the number of messages Citadel calls
          new for first-time callers. This is returned as an
          integer value.
          
     GetOldest
          This returns the message number of the oldest
          message in the message base. This might be older
          than the oldest message in the message table if
          #NMESSAGES is not set high enough. This is
          returned as a long value.
          
     GetOneKey prompt keys default label1 label2...
          This prompts the user to enter a single key.
          prompt is a string value that is displayed to the
          user, followed by the valid choices then a
          question mark. keys is a string value that gives
          the valid responses. default is a string value
          that gives the default key, for if the user
          presses Enter. label1, label2, etc., are string
          values that describe the choices.
          
          When the valid choices are presented to the user,
          Citadel uses the current user's expert setting: if
          expert mode is on, then only the valid keys are
          listed; if it is off, then the full labelx string
          is displayed. The choice specified by default is
          then displayed in brackets.
          
          When a valid key is pressed by the user, Citadel
          displays the labelx for that choice, and returns
          an integer value which is the index of the key in
          keys, starting at 0. If the user presses ESC, then
          the value -1 is returned.
          
     GetParam line index
          This gets an individual parameter from a line of
          multiple parameters. This uses the same algorithm
          that Citadel uses when reading configuration files
          like CONFIG.CIT. line is a string value, which is
          the line of text that is to be parsed. index is an
          integer value, from 1 up, which is the parameter
          that is to be returned. The specified parameter is
          returned as a string value.
          
     GetParamCount line
          This returns the total number of parameters on a
          line of multiple parameters. line is a string
          value that is counted. The total is returned as an
          integer value.
          
     GetPoop
          This returns the setting of #POOP! in CONFIG.CIT.
          This is returned as an integer value.
          
     GetPoopUser
          This returns the current poopuser. This is
          returned as a string value.
          
     GetPortRate
          This returns the current port rate, which is the
          speed that the computer is talking to the modem
          at. This is returned as a long value, ranging from
          300 to 115,200.
          
     GetPrinter
          This returns the current default printer file as
          set with #PRINTER in CONFIG.CIT. This is returned
          as a string value.
          
     GetPrinterPrompt
          This returns whether Citadel prompts for a file
          name when Alt+P is used to capture output. This is
          returned as a Boolean value: TRUE if Citadel
          prompts for a file name, FALSE if it does not.
          
     GetReadAll
          This returns the current value of #READALL in
          CONFIG.CIT. This is returned as an integer value.
          
     GetReadLUser
          This returns whether users can use the .Read Group-
          only Userlog (.RGU) command. This is returned as a
          Boolean value: TRUE if the command is allowed, and
          FALSE if it is not.
          
     GetReadOK
          This returns whether unlogged-in users may read
          messages, as set by #READOK in CONFIG.CIT. This is
          returned as a Boolean value: TRUE if unlogged
          users can use the Read commands, FALSE if they
          cannot.
          
     GetRestoreMode
          This returns whether the screen is restored after
          a shell. This is returned as a Boolean value: TRUE
          if Citadel forces the screen mode back to the mode
          before the shell and FALSE if it uses the new mode
          set while shelled.
          
     GetRoomBypass index
          This tells if a specific room has been bypassed by
          the user during this call. index is an integer
          value that indexes the room in the room table.
          This returns a Boolean value: TRUE if the room has
          been bypassed this call, FALSE if it has not.
          
     GetRoomDir
          This returns the directory for the current room.
          This may contain a return value even if the room
          is not currently a directory room; use IsRoomDIR
          first to verify that this is a directory room. The
          room's directory is returned as a string value.
          
     GetRoomEntered index
          This gets the number of messages entered this call
          in a room. index is an integer value indexing a
          slot in the room table. The number of messages
          entered in the room during this call is returned
          as an integer.
          
     GetRoomGroup index
          This gets the group slot for a group-only room.
          index is an integer value indexing a slot in the
          room table. The group number is returned as an
          integer value. Note that this function returns a
          slot even if the room is not group-only; use
          IsRoomGrpOnly to determine if the room is group-
          only first.
          
     GetRoomHasMail index
          This tells if a specific room contains mail
          waiting for the current user. index is an integer
          value indexing a slot in the room table. This
          function returns a Boolean value: TRUE if the user
          has mail waiting in the specified room; FALSE if
          he does not.
          
     GetRoomHasOldMail index
          This tells if a specific room contains old unread
          mail of the current user. index is an integer
          value indexing a slot in the room table. This
          function returns a Boolean value: TRUE if the user
          has unread old mail in the specified room; FALSE
          if he does not.
          
     GetRoomMsgs index
          
          This returns the number of messages visible to the
          current user in a room. index is an integer value
          indexing a slot in the room table. The number of
          messages visible to the current user in the
          specified room is returned as a long value.
          
     GetRoomName index
          This returns the name of the specified room. index
          is an integer value indexing a slot in the room
          table. The name of the room is returned as a
          string value.
          
     GetRoomNew
          This returns the number of new messages to the
          current user in a room. index is an integer value
          indexing a slot in the room table. The number of
          new messages visible to the current user in the
          specified room is returned as a long value.
          
     GetRoomOK
          This returns whether non-aide users can create
          rooms using the .Enter Room (.ER) command. This is
          returned as a Boolean value: TRUE if the command
          is allowed for all users, FALSE if only aides can
          use it.
          
     GetRoomPath
          This returns the path that Citadel searches for
          room descriptions in. This is returned as a string
          value.
          
     GetRoomTotal index
          This returns the total number of messages in a
          room, visible to the current user or not. index is
          an integer value indexing a slot in the room
          table. The number of messages in the specified
          room is returned as a long value.
          
     GetRoomVisited index
          This tells whether a room has been visited during
          this call. index is an integer value indexing a
          slot in the room table. This function returns a
          Boolean value: TRUE if the room has been visited
          this call, FALSE if it has not.
          
     GetScreenSave code
          This returns information about the current
          settings of the screen saver. code is an integer
          value telling what to tell about, as per the
          following table:
          
               1    The number of minutes before the screen
                    will blank; 0 if the screen saver is
                    turned off. This is returned as an
                    integer.
                    
               2    Whether the screen save is turned off
                    when Citadel gets a call. This is
                    returned as a Boolean: TRUE if is turned
                    off, FALSE if it is not.
                    
               3    Whether the screen saver turns off for
                    the duration of the call. This is
                    returned as a Boolean: TRUE if the
                    screen saver stays turned off for the
                    duration of a call, FALSE if it does
                    not.
                    
               4    Whether a clock is displayed on the
                    screen, and how often it moves if it is
                    displayed. This is returned as an
                    integer: 0 if no clock is to be
                    displayed on the screen, otherwise the
                    number of seconds before it is moved.
                    
               5    Whether the cursor stays on when the
                    screen is blanked. This is returned as a
                    Boolean: TRUE if the cursor stays on
                    when the screen is blanked, FALSE if it
                    is turned off.
                    
     GetScrollColors
          This tells whether colors are saved in the scroll-
          back buffer or not. This is returned as a Boolean
          value: TRUE if colors are saved; FALSE if they are
          not.
          
     GetScrollSize
          This tells the size of the scroll-back buffer, in
          lines. This is returned as an integer value.
          
     GetScrollTimeout
          This returns the scroll-back buffer time-out in
          seconds. This is returned as an integer value.
          
     GetSetCensor
          This tells if users can choose to view censored
          messages with the .Enter Configuration (.EC)
          command or not. This is returned as a Boolean
          value: TRUE if users can choose; FALSE if they
          cannot.
          
     GetSetMsgNym
          This tells whether the .Aide Name messages (.AN)
          command is active or not. This returns a Boolean
          value: TRUE if the command is active; FALSE if it
          is not.
          
     GetSleepCount
          This tells how long of a countdown timer (in
          seconds) is given to users before timing out on
          them. This is returned as an integer.
          
     GetSleepPrompt
          
          This returns the string sent to users when they are
          timed out on. This is returned as a string value.
          
     GetStatNum
          This returns the maximum number of system events
          tracked in the Status Screen (F4), as set by
          #MAXSTAT in CONFIG.CIT. This is returned as an
          integer value.
          
     GetString prompt default length
          This gets string input from the user. prompt is a
          string value used to prompt the user. It is
          appended to "Enter " to make a full sentence. If
          you don't want a prompt, use an empty string ("")
          for prompt. default gives the user a default
          choice, which is displayed in square brackets ([])
          to the user. If you don't want a default choice,
          use an empty string ("") for default. length is an
          integer value, which limits the length of a
          responds you want from the user. The string the
          user enters is returned as a string value.
          
     GetSubHubs
          
          This returns the setting of #SUBHUBS in CONFIG.CIT. It
          is returned as an integer value.
          
     GetSurnames
          This returns whether surnames allowed on the
          system as set by #TWIT_FEATURES SURNAMES in
          CONFIG.CIT. This is returned as a Boolean value:
          TRUE if they are, FALSE if they are not.
          
     GetSysBorders
          This tells whether borders are active on the
          system. This is returned as a Boolean value: TRUE
          if borders are active; FALSE if they are not.
          
     GetSysopName
          This tells the name of the sysop as set by #SYSOP
          in CONFIG.CIT. This is returned as a string value.
          
     GetTempPath
          This tells the temp path as set by #TEMPPATH in
          CONFIG.CIT. This is returned as a string value.
          
     GetTimeOut
          
          This tells the number of minutes users are allowed to
          be idle before Citadel times out on them. This is
          returned as an integer value.
          
     GetTitles
          This returns whether surnames allowed on the
          system as set by #TWIT_FEATURES SURNAMES in
          CONFIG.CIT. This is returned as a Boolean value:
          TRUE if they are, FALSE if they are not.
          
     GetTransPath
          This returns the transfer path as set by
          #TRANSPATH in CONFIG.CIT. This is returned as a
          string value.
          
     GetTrapFile
          This tells the name of the trap file as set by
          #TRAP_FILE in CONFIG.CIT. This is returned as a
          string value.
          
     GetTwirly
          This returns the twirly cursor string as set by
          #TWIRLY in CONFIG.CIT. This is returned as a
          string value.
          
     GetTwirlyPause
          This returns the length of the pause between
          updates of the twirly cursor as set by #TWIRLY in
          CONFIG.CIT. This is returned as an integer value.
          
     GetTwitCountry
          This returns the board's twit country as set in
          CONFIG.CIT. This is returned as a string value.
          
     GetTwitRegion
          This returns the board's twit region as set in
          CONFIG.CIT. This is returned as a string value.
          
     GetUnlogBal
          This returns the accounting balance of unlogged-in
          users. This is returned as a long value.
          
     GetUnlogTimeout
          This tells the number of minutes unlogged-in users
          are allowed to be idle before Citadel times out on
          them. This is returned as an integer value.
          
     GetUpDay day
          This tells if the board is up during a specified
          day. day is an integer value, ranging from 0
          (Sunday) to 6 (Saturday). This returns a Boolean
          value: TRUE if the board is up for callers on that
          day, FALSE if it is not.
          
     GetUpHour hour
          This tells if the board is up during a specified
          hour. hour is an integer value, ranging from 0 to
          23. This returns a Boolean value: TRUE if the
          board is up for callers during that hour of the
          day, FALSE if it is not.
          
     GetUserAddr1
          This returns line 1 of the current user's postal
          address. This is returned as a string value.
          
     GetUserAddr2
          
          This returns line 2 of the current user's postal
          address. This is returned as a string value.
          
     GetUserAddr3
          This returns line 3 of the current user's postal
          address. This is returned as a string value.
          
     GetUserCallNo
          This returns the current user's last call number.
          This is returned as a long value.
          
     GetUserCallTime
          This returns the current user's last call time.
          This is returned as a long value corresponding to
          Citadel's time/date functions.
          
     GetUserCredits
          This returns the number of credits that the
          current user has left. This is returned as a long
          value. Notice that this is a different value that
          you usually see when dealing with credits: Citadel
          thinks of credits internally in terms of seconds,
          but converts to minutes when displaying credits to
          users. This function returns the number of seconds
          left.
          
     GetUserDefHall
          This returns the current default hall for the
          user. The default hall is returned as a string
          value.
          
     GetUserDStamp
          This function returns the date stamp for the
          current user. It is returned as a string value.
          
     GetUserFwd
          This returns the user portion of the forwarding
          address for the current user. This is returned as
          a string value.
          
     GetUserFwdNode
          This returns the node portion of the forwarding
          address for the current user. This is returned as
          a string value.
          
     GetUserIn
          This returns the current user's initials. This is
          returned as a string value.
          
     GetUserLastHall
          This returns the last hall the current user was in
          last call. This is returned as a string value.
          Citadel currently does not keep track of this, so
          the returned value is meaningless.
          
     GetUserLastPointer
          This returns the newest message on the system
          during the current user's last call. This is
          returned as a long value.
          
     GetUserLastRoom
          This returns the last room the current user was in
          last call. This is returned as a string value.
          Citadel currently does not keep track of this, so
          the returned value is meaningless.
          
     GetUserLines
          
          This returns the current user's lines per screen
          setting. This is returned as an integer value.
          
     GetUserName
          This returns the current user's name. This is
          returned as a string value.
          
     GetUserNetPref
          This returns the current user's net prefix. This
          is returned as a string value.
          
     GetUserNulls
          This returns the current user's number of nulls.
          This is returned as an integer value.
          
     GetUserPhone
          This returns the current user's phone number. This
          is returned as a string value.
          
     GetUserPoop
          This returns the current user's poopcount. This is
          returned as a long value.
          
     GetUserPrompt
          This returns the current user's room prompt
          format. This is returned as a string value.
          
     GetUserProto
          This returns the current user's default protocol.
          This is returned as a string value.
          
     GetUserPW
          This returns the current user's password. This is
          returned as a string value.
          
     GetUserRealName
          This returns the current user's real name. This is
          returned as a string value.
          
     GetUserSig
          This returns the current user's signature. This is
          returned as a string value.
          
     GetUserSurname
          This returns the current user's surname. This is
          returned as a string value.
          
     GetUserTitle
          This returns the current user's title. This is
          returned as a string value.
          
     GetUserVDStamp
          This function returns the verbose date stamp for
          the current user. It is returned as a string
          value.
          
     GetUserWidth
          This returns the current user's screen width. This
          is returned as an integer value.
          
     GetUttr
          This function gets the console underlined text
          attribute as set by #UTTR in CONFIG.CIT. It is
          returned as an integer value.
          
     GetVMemFile
          This gets the name of the file being used for
          virtual memory. This is returned as a string
          value. When not running the Auxmem version, this
          function has no meaning and returns an empty
          string.
          
     GetWAttr
          This function gets the console reverse video
          attribute as set by #WATTR in CONFIG.CIT. It is
          returned as an integer value.
          
     Hangup
          This hangs up the modem.
          
     HexToDex hex
          This converts the string of hexadecimal digits hex
          to their numeric value and returns the result as a
          long value.
          
     HowLongAgoWasIt time
          This generates a string telling how long ago the
          time specified by the long value time was.
          
     IChar
          
          This waits for the user to enter a single character.
          This character is echoed to the screen, and
          returned as a single-character long string.
          
     ICharNE
          This waits for the user to enter a single
          character. This character is not echoed to the
          screen, and returned as a single-character long
          string.
          
     IsCanOutput
          This checks to see if output is being displayed to
          the user. This returns a Boolean value: TRUE if
          output is being displayed; FALSE if not (such as
          when the user presses Stop or Next).
          
     IsConsoleLocked
          This returns whether the console is locked as a
          Boolean value: TRUE if the console is locked;
          FALSE if not.
          
     IsFilenameLegal filename [allowspace]
          
          This checks the legality of filename. This checks for
          illegal characters and whether the name specifies
          a device, not a true file. allowspace is on
          optional Boolean value that specifies if spaces
          should be considered legal in the filename (such
          as for when multiple filenames are separated by
          spaces): if TRUE, then spaces are allowed; if
          FALSE or missing, then spaces are not allowed.
          
     IsGrpAutoAdd index
          This tells if a group is an auto-add group or not.
          index is an integer value indexing a slot in the
          group file. This returns a Boolean value: TRUE if
          the group is auto-add; FALSE if it is not.
          
     IsGrpHidden index
          This tells if a group is hidden or not. index is
          an integer value indexing a slot in the group
          file. This returns a Boolean value: TRUE if the
          group is hidden; FALSE if it is not.
          
     IsGrpInuse index
          
          This tells if a group is in use or not. index is an
          integer value indexing a slot in the group file.
          This returns a Boolean value: TRUE if the group is
          in use; FALSE if it is not.
          
     IsGrpLocked index
          This tells if a group is locked from aides or not.
          index is an integer value indexing a slot in the
          group file. This returns a Boolean value: TRUE if
          the group is locked from aides; FALSE if it is
          not.
          
     IsHallDesc index
          This tells if a hall has a description or not.
          index is an integer value indexing a slot in the
          hall file. This returns a Boolean value: TRUE if
          the hall is described; FALSE if it is not.
          
     IsHallEnterRoom index
          This tells if a user can enter rooms in this hall
          or not. index is an integer value indexing a slot
          in the hall file. This returns a Boolean value:
          TRUE if the users can enter rooms in this hall
          even if #ROOMOK in CONFIG.CIT is set to 0; FALSE
          if they cannot.
          
     IsHallGrp index
          This tells if a hall is a group-only or not. index
          is an integer value indexing a slot in the hall
          file. This returns a Boolean value: TRUE if the
          hall is group-only; FALSE if it is not.
          
     IsHallInuse index
          This tells if a hall is in use or not. index is an
          integer value indexing a slot in the hall file.
          This returns a Boolean value: TRUE if the hall is
          in use; FALSE if it is not.
          
     IsInGroup index
          This tells if the current user is in a group or
          not. index is an integer value indexing a slot in
          the group file. This returns a Boolean value: TRUE
          if the current user is in the group; FALSE if he
          is not.
          
     IsLoggedIn
          This tells if there is currently a user logged in
          or not. This returns a Boolean value: TRUE if
          there is a user logged in; FALSE if not.
          
     IsMatchWildcard string wildcard
          This tests if the string value specified by string
          matches the wildcard expression specified by the
          string value wildcard. You can use Unix-style
          wildcards in wildcard. For example, the wildcard
          string "th[ea]n" matches the string "then" and
          "than". Like almost everything in Citadel, this is
          not case-senesitive.
          
     IsNetIDInNetIDCit netid
          This searches NETID.CIT for a Net ID. netid is a
          string value specifying the Net ID to search for.
          This function returns a Boolean value: TRUE if the
          Net ID is found; FALSE if not.
          
     IsOutputJump
          This checks to see if the user has pressed the J
          key to jump output. This returns a Boolean value:
          TRUE if the user has pressed the J key; FALSE if
          not.
          
     IsOutputNext
          This checks to see if the user has pressed the N
          key to next output. This returns a Boolean value:
          TRUE if the user has pressed the N key; FALSE if
          not.
          
     IsOutputStop
          This checks to see if the user has pressed the S
          key to stop output. This returns a Boolean value:
          TRUE if the user has pressed the S key; FALSE if
          not.
          
     IsRoomAnon index
          This tells whether a room is anonymous or not.
          index is an integer value indexing a slot in the
          room table. This function returns a Boolean value:
          TRUE if the room is anonymous, FALSE if it is not.
          
     IsRoomApplic index
          
          This tells whether a room has an application or not.
          index is an integer value indexing a slot in the
          room table. This function returns a Boolean value:
          TRUE if the room has an application, FALSE if it
          does not.
          
     IsRoomBIO index
          This tells whether a room is BIO or not. index is
          an integer value indexing a slot in the room
          table. This function returns a Boolean value: TRUE
          if the room is BIO, FALSE if it is not.
          
     IsRoomBypassed index
          This tells whether a room has been bypassed during
          the current call or not. index is an integer value
          that specifies the room to test. This returns a
          Boolean value: TRUE if the room has been bypassed;
          FALSE if not.
          
     IsRoomDir index
          This tells whether a room has a directory or not.
          index is an integer value indexing a slot in the
          room table. This function returns a Boolean value:
          TRUE if the room has a directory, FALSE if it does
          not.
          
     IsRoomDownOnly index
          This tells whether a room is download-only or not.
          index is an integer value indexing a slot in the
          room table. This function returns a Boolean value:
          TRUE if the room is download-only, FALSE if it is
          not.
          
     IsRoomGrpMod index
          This tells whether a the privileges group
          moderates a room or not. index is an integer value
          indexing a slot in the room table. This function
          returns a Boolean value: TRUE if the room is
          moderated by the privileges group, FALSE if it is
          not.
          
     IsRoomGrpOnly index
          This tells whether a room is group-only or not.
          index is an integer value indexing a slot in the
          room table. This function returns a Boolean value:
          TRUE if the room is group-only, FALSE if it is
          not.
          
     IsRoomInHall hall room
          This returns whether the room specified by the
          index room is in the hall specified by the index
          hall as a Boolean value.
          
     IsRoomInuse index
          This tells whether a room is in use or not. index
          is an integer value indexing a slot in the room
          table. This function returns a Boolean value: TRUE
          if the room is in use, FALSE if it is not.
          
     IsRoomModerated index
          This tells whether a room is moderated or not.
          index is an integer value indexing a slot in the
          room table. This function returns a Boolean value:
          TRUE if the room is moderated, FALSE if it is not.
          
     IsRoomWindow index
          
          This returns whether a room is a window into other
          halls or not. index is an integer value indexing a
          slot in the room table. This function returns a
          Boolean value: TRUE if the room is a window, FALSE
          if not. In floor mode (#SUBHUBS 4 in CONFIG.CIT),
          this always returns FALSE.
          
     IsRoomPerm index
          This tells whether a room is permanent or not.
          index is an integer value indexing a slot in the
          room table. This function returns a Boolean value:
          TRUE if the room is permanent, FALSE if it is not.
          
     IsRoomPrivGrp index
          This tells whether a room is has a privileges
          group or not. index is an integer value indexing a
          slot in the room table. This function returns a
          Boolean value: TRUE if the room has a privileges
          group, FALSE if it is not.
          
     IsRoomPublic index
          This tells whether a room is public or not. index
          is an integer value indexing a slot in the room
          table. This function returns a Boolean value: TRUE
          if the room is public, FALSE if it is not (which
          means that it is hidden).
          
     IsRoomReadOnly index
          This tells whether a room is read-only or not.
          index is an integer value indexing a slot in the
          room table. This function returns a Boolean value:
          TRUE if the room is read-only, FALSE if it is not.
          
     IsRoomShared index
          This tells whether a room is shared or not. index
          is an integer value indexing a slot in the room
          table. This function returns a Boolean value: TRUE
          if the room is shared, FALSE if it is not.
          
     IsRoomSubject index
          This tells whether a room prompts for a subject or
          not. index is an integer value indexing a slot in
          the room table. This function returns a Boolean
          value: TRUE if the room prompts for a subject on
          all messages, FALSE if it is not.
          
     IsRoomUpOnly index
          This tells whether a room is upload-only or not.
          index is an integer value indexing a slot in the
          room table. This function returns a Boolean value:
          TRUE if the room is upload-only, FALSE if it is
          not.
          
     IsUserAide
          This tells whether the current user is an aide or
          not. This function returns a Boolean value: TRUE
          if the user is an aide, FALSE if he is not.
          
     IsUserDisplayTS
          This tells whether the current user chooses to
          view titles and surnames or not. This function
          returns a Boolean value: TRUE if the user chooses
          to view titles and surnames, FALSE if he does not.
          
     IsUserEntBorders
          This tells whether the current user is viewing
          borders and ads or not. This function returns a
          Boolean value: TRUE if the user sees borders and
          ads, FALSE if he does not.
          
     IsUserExpert
          This tells whether the current user is an expert
          or not. This function returns a Boolean value:
          TRUE if the user is an expert, FALSE if he is not.
          
     IsUserFwdNode
          This tells whether the current user is forwarding
          his mail to another node or not. This function
          returns a Boolean value: TRUE if the user is
          forwarding his mail to another node, FALSE if he
          is not.
          
     IsUserHallLock
          This tells whether the current user has his
          default hall locked or not. This function returns
          a Boolean value: TRUE if the user has his default
          hall locked, FALSE if he does not.
          
     IsUserHallTell
          
          This tells whether the current user sees hall
          descriptions or not. This function returns a
          Boolean value: TRUE if the user sees hall
          descriptions, FALSE if he does not.
          
     IsUserHideExcl
          This tells whether the current hides message
          exclusions or not. This function returns a Boolean
          value: TRUE if the user hides messages exclusions,
          FALSE if he does not.
          
     IsUserIBMANSI
          This tells whether the current user has IBM ANSI
          or not. This function returns a Boolean value:
          TRUE if the user has IBM ANSI, FALSE if he does
          not.
          
     IsUserIBMColor
          This tells whether the current user has IBM COLOR
          or not. This function returns a Boolean value:
          TRUE if the user has IBM COLOR, FALSE if he does
          not.
          
     IsUserIBMGraph
          This tells whether the current user has IBM
          graphics or not. This function returns a Boolean
          value: TRUE if the user has IBM graphics, FALSE if
          he does not.
          
     IsUserInuse
          This tells whether the current user is in use or
          not. This function returns a Boolean value: TRUE
          if the user is in use, FALSE if it is not. If a
          user is logged-in, this should always return TRUE.
          If a user is not logged-in, this should always
          return FALSE.
          
     IsUserLastOld
          This tells whether the current user has last old
          on new turned on or not. This function returns a
          Boolean value: TRUE if the user has last old on
          new turned on, FALSE if he does not.
          
     IsUserLF
          This tells whether the current user has linefeeds
          turned on or not. This function returns a Boolean
          value: TRUE if the user has linefeeds turned on,
          FALSE if he does not.
          
     IsUserLockSig
          This tells whether the current user has a locked
          signature or not. This function returns a Boolean
          value: TRUE if the user has a locked signature,
          FALSE if he does not.
          
     IsUserMiniBin
          This tells whether the current user has Minibin
          usage statistics turned on or not. This function
          returns a Boolean value: TRUE if the user has
          Minibin usage statistics turned on, FALSE if he
          does not.
          
     IsUserMsgCls
          This tells whether the current user has clear
          screen between messages turned on or not. This
          function returns a Boolean value: TRUE if the user
          has clear screen between messages turned on, FALSE
          if he does not.
          
     IsUserMsgPause
          This tells whether the current user has pause
          between messages turned on or not. This function
          returns a Boolean value: TRUE if the user has
          pause between messages turned on, FALSE if he does
          not.
          
     IsUserNet
          This tells whether the current user has network
          privileges or not. This function returns a Boolean
          value: TRUE if the user has network privileges,
          FALSE if he does not.
          
     IsUserNextHall
          This tells whether the current user has auto next
          hall turned on or not. This function returns a
          Boolean value: TRUE if the user has auto next hall
          turned on, FALSE if he does not.
          
     IsUserNoAcct
          
          This tells whether the current user has no accounting
          or not. This function returns a Boolean value:
          TRUE if the user has no accounting, FALSE if he
          does not (meaning that he does have accounting).
          
     IsUserNoChat
          This tells whether the current user has chat
          disabled or not. This function returns a Boolean
          value: TRUE if the user has chat disabled, FALSE
          if he does not.
          
     IsUserNode
          This tells whether the current user is a node or
          not. This function returns a Boolean value: TRUE
          if the user is a node, FALSE if he is not.
          
     IsUserNoDownload
          This tells whether the current user has downloads
          disabled or not. This function returns a Boolean
          value: TRUE if the user has downloads disabled,
          FALSE if he does not.
          
     IsUserNoMail
          
          This tells whether the current user has mail disabled
          or not. This function returns a Boolean value:
          TRUE if the user has mail disabled, FALSE if he
          does not.
          
     IsUserNoUpload
          This tells whether the current user has uploads
          disabled or not. This function returns a Boolean
          value: TRUE if the user has uploads disabled,
          FALSE if he does not.
          
     IsUserOut300
          This tells whether the current user has 300 baud
          simulation turned on or not. This function returns
          a Boolean value: TRUE if the user has 300 baud
          simulation turned on, FALSE if he does not.
          
     IsUserPerm
          This tells whether the current user is permanent
          or not. This function returns a Boolean value:
          TRUE if the user is permanent, FALSE if he is not.
          
     IsUserPrint
          
          This tells whether the current user is trapped to the
          print file or not. This function returns a Boolean
          value: TRUE if the user is trapped to the print
          file, FALSE if he is not.
          
     IsUserProblem
          This tells whether the current user is a problem
          user or not. This function returns a Boolean
          value: TRUE if the user is a problem user, FALSE
          if he is not.
          
     IsUserPsycho
          This tells whether the current user has psycho
          chicken turned on or not. This function returns a
          Boolean value: TRUE if the user has psycho chicken
          turned on, FALSE if he does not.
          
     IsUserRoomInfo
          This tells whether the current user has room
          information lines turned on or not. This function
          returns a Boolean value: TRUE if the user has room
          information lines turned on, FALSE if he does not.
          
     IsUserRoomTell
          This tells whether the current user has room
          descriptions turned on or not. This function
          returns a Boolean value: TRUE if the user has room
          descriptions turned on, FALSE if he does not.
          
     IsUserSeeBorders
          This tells whether the current user sees borders
          or not. This function returns a Boolean value:
          TRUE if the user sees borders, FALSE if he does
          not.
          
     IsUserSignatures
          This tells whether the current user sees
          signatures or not. This function returns a Boolean
          value: TRUE if the user sees signatures, FALSE if
          he does not.
          
     IsUserSubjects
          This tells whether the current user sees subjects
          or not. This function returns a Boolean value:
          TRUE if the user sees subjects, FALSE if he does
          not.
          
     IsUserSurLock
          This tells whether the current user has a locked
          surname and title or not. This function returns a
          Boolean value: TRUE if the user has a locked
          surname and title, FALSE if he does not.
          
     IsUserSysop
          This tells whether the current user is a sysop or
          not. This function returns a Boolean value: TRUE
          if the user is a sysop, FALSE if he is not.
          
     IsUserTabs
          This tells whether the current user has tabs
          turned on or not. This function returns a Boolean
          value: TRUE if the user has tabs turned on, FALSE
          if he does not.
          
     IsUserTwirly
          This tells whether the current user has the twirly
          cursor turned on or not. This function returns a
          Boolean value: TRUE if the user has the twirly
          cursor turned on, FALSE if he does not.
          
     IsUserUnlisted
          This tells whether the current user has an
          unlisted account or not. This function returns a
          Boolean value: TRUE if the user is unlisted, FALSE
          if he is not.
          
     IsUserUpOnly
          This tells whether the current user has upper case
          only turned on or not. This function returns a
          Boolean value: TRUE if the user has upper case
          only turned on, FALSE if he does not.
          
     IsUserVCont
          This tells whether the current user has verbose
          continue turned on or not. This function returns a
          Boolean value: TRUE if the user has verbose
          continue turned on, FALSE if he does not.
          
     IsUserVerbose
          
          This tells whether the current user has verbose mode
          turned on or not. This function returns a Boolean
          value: TRUE if the user has verbose mode turned
          on, FALSE if he does not.
          
     IsUserVerified
          This tells whether the current user is verified or
          not. This function returns a Boolean value: TRUE
          if the user is verified, FALSE if he is not.
          
     IsUserViewCensor
          This tells whether the current user views censored
          messages or not. This function returns a Boolean
          value: TRUE if the user views censored messages,
          FALSE if he does not.
          
     KeyboardAdd string1 [string2...]
          This adds the characters of the specified strings
          to the keyboard buffer. This can be useful as the
          last thing a script does before exiting, as then
          Citadel will process the characters as if they
          were pressed on the keyboard. In this way, a
          script can execute some Citadel commands.
          
     KeyboardFlush
          This clears all keys out of Citadel's keyboard
          buffer.
          
     KillRoom [roomname]
          This attempts to kill a room on the system and
          returns a Boolean value: TRUE if the room was
          killed; FALSE if not. roomname is an optional
          string value: if it is present, then this tries to
          kill the room with that name; else it prompts the
          user for the name of the room to kill, as would
          happen if the user invoked the .Aide Kill room
          (.AK) command.
          
     KillUser [username]
          This attempts to kill a user on the system and
          returns a Boolean value: TRUE if the user was
          killed; FALSE if not. username is an optional
          string value: if it is present, then this tries to
          kill the user with that name; else is prompts the
          user for the name of the user to kill, as would
          happen if the user invoked the .Sysop Kill user
          (.SK) command.
          
     MemoryFree
          This finds the size of the largest free block of
          memory and returns the number of bytes as a long
          value.
          
     ModemFlush
          This flushes the input buffer of the modem: all
          pending incoming characters from the modem are
          discarded.
          
     ModemInitPort
          This initializes the modem port.
          
     MsgAddComment comment
          This adds a comment to the message in the script's
          message buffer. comment is a string value which is
          used as the comment to add. This returns a Boolean
          value: TRUE if the comment could be added; FALSE
          if it could not (which generally means that
          Citadel is out of memory).
          
     MsgAppendText string1 [string2...]
          This appends each string to the script's message
          buffer.
          
     MsgClear
          This clears all information from the script's
          message buffer.
          
     MsgDump
          This deletes the script's message buffer, freeing
          the memory for other use.
          
     MsgGetAuthor
          This retrieves the author from the script's
          message buffer.
          
     MsgGetCit86Country
          This retrieves the Citadel-86 country from the
          script's message buffer.
          
     MsgGetComment index
          This retrieves a comment from the message in the
          script's message buffer. index is a long value
          that specifies which comment to retrieve. The
          comment is returned as a string value.
          
     MsgGetCommentCount
          This returns the number of comments the message in
          the script's message buffer has. The count is
          returned as a long value.
          
     MsgGetCopyOfMessage
          This retrieves the original message ID from the
          script's message buffer, if this message is a
          copy. If this message is not a copy, this returns
          an empty string.
          
     MsgGetCreationRoom
          This retrieves the creation room from the script's
          message buffer.
          
     MsgGetCreationTime
          
          This retrieves the creation time from the script's
          message buffer. This is returned as the number of
          seconds since 12:00AM, January 1, 1970, GMT.
          
     MsgGetDestinationAddress
          This retrieves the destination address from the
          script's message buffer.
          
     MsgGetEncryptionKey
          This retrieves the encryption key from the
          script's message buffer.
          
     MsgGetEZCreationTime
          This retrieves the EZ creation time from the
          script's message buffer.
          
     MsgGetFilelink
          This retrieves the linked file from the script's
          message buffer.
          
     MsgGetForward
          This retrieves the forwardee's name from the
          script's message buffer.
          
     MsgGetFromPath
          This retrieves the from path from the script's
          message buffer.
          
     MsgGetGroup
          This retrieves the group from the script's message
          buffer.
          
     MsgGetHeadLoc
          This retrieves the location of the message in
          MSG.DAT from the script's message buffer.
          
     MsgGetLocalID
          This retrieves the local ID from the script's
          message buffer.
          
     MsgGetOriginAddress
          This retrieves the origin address of the message
          in the script's message buffer as a string value.
          The origin address is not always available, so a
          return value of an empty string does not always
          mean that the message originated on a node with no
          address.
          
     MsgGetOriginalAttribute
          This retrieves the attribute of the original
          message (if this message is a copy) from the
          script's message buffer.
          
     MsgGetOriginalID
          This retrieves the original ID from the script's
          message buffer.
          
     MsgGetOriginalRoom
          This retrieves the original room from the script's
          message buffer.
          
     MsgGetOriginCountry
          This retrieves the origin country from the
          script's message buffer.
          
     MsgGetOriginNodeName
          
          This retrieves the origin node name from the script's
          message buffer.
          
     MsgGetOriginPhoneNumber
          This retrieves the origin phone number from the
          script's message buffer.
          
     MsgGetOriginRegion
          This retrieves the origin region from the script's
          message buffer.
          
     MsgGetOriginSoftware
          This retrieves the origin software from the
          script's message buffer.
          
     MsgGetRealName
          This retrieves the real name from the script's
          message buffer.
          
     MsgGetReplyToMessage
          This retrieves the ID of the message this is a
          reply to from the script's message buffer, if this
          is a reply. If it is not, then this returns an
          empty string.
          
     MsgGetRoomNumber
          This retrieves the room number from the script's
          message buffer.
          
     MsgGetSignature
          This retrieves the signature from the script's
          message buffer.
          
     MsgGetSourceID
          This retrieves the source ID from the script's
          message buffer.
          
     MsgGetSourceRoomName
          This retrieves the source room name from the
          script's message buffer.
          
     MsgGetSubject
          This retrieves the subject from the script's
          message buffer.
          
     MsgGetSurname
          This retrieves the surname from the script's
          message buffer.
          
     MsgGetTitle
          This retrieves the title from the script's message
          buffer.
          
     MsgGetToCountry
          This retrieves the destination country from the
          script's message buffer, if this is networked
          mail. If not, this returns an empty string.
          
     MsgGetToNodeName
          This retrieves the destination node name from the
          script's message buffer, if this is networked
          mail. If not, this returns an empty string.
          
     MsgGetToPath
          This retrieves the forced path from the script's
          message buffer.
          
     MsgGetToPhoneNumber
          
          This retrieves the destination phone number from the
          script's message buffer, if this is networked
          mail. If not, this returns an empty string.
          
     MsgGetToRegion
          This retrieves the destination region from the
          script's message buffer, if this is networked
          mail. If not, this returns an empty string.
          
     MsgGetToUser
          This retrieves the destination user from the
          script's message buffer, if this is mail. If not,
          this returns an empty string.
          
     MsgGetTwitCountry
          This retrieves the twit country from the script's
          message buffer.
          
     MsgGetTwitRegion
          This retrieves the twit region from the script's
          message buffer.
          
     MsgGetUserSignature
          
          This retrieves the user signature from the script's
          message buffer.
          
     MsgGetX
          This retrieves the X field from the script's
          message buffer.
          
     MsgHeaderClear
          This clears the message header of the script's
          message buffer, but does not affect the message
          text.
          
     MsgIsCensored
          This returns a Boolean value: TRUE if the message
          is censored; FALSE if not.
          
     MsgIsCompressed
          This returns a Boolean value: TRUE if the message
          is compressed; FALSE if not.
          
     MsgIsEncrypted
          This returns a Boolean value: TRUE if the message
          is encrypted; FALSE if not.
          
     MsgIsLocal
          This returns a Boolean value: TRUE if the message
          is local-only; FALSE if not.
          
     MsgIsMadeVisible
          This returns a Boolean value: TRUE if the message
          is a released problem user or moderated message;
          FALSE if not.
          
     MsgIsMoreFlag flag
          This checks whether the message in the script's
          message buffer has a specified moreflag set. flag
          is a string value, the first character of which
          specifies the flag. This returns a Boolean value:
          TRUE if the specified flag is set; FALSE if not.
          
     MsgIsReceiptConfirmationRequested
          This returns a Boolean value: TRUE if the message
          is receipt confirmation requested; FALSE if not.
          
     MsgIsReceived
          
          This returns a Boolean value: TRUE if the message is
          received; FALSE if not.
          
     MsgIsRepliedTo
          This returns a Boolean value: TRUE if the message
          is replied to; FALSE if not.
          
     MsgIsViewDuplicate
          This returns a Boolean value: TRUE if the message
          is a duplicate; FALSE if not.
          
     MsgLoad messageid
          This loads the message with the number messageid
          into the script's message buffer. This returns a
          Boolean value: TRUE if the message could be read;
          FALSE if it could not (the message doesn't exist,
          or there isn't enough memory to allocate the
          message buffer).
          
     MsgSave
          This saves the message in the script's message
          buffer to the message base.
          
     MsgSaveTextToFile filename
          This saves the text of the message in the script's
          message buffer to the text file specified by the
          string value filename. This returns a Boolean
          value: TRUE if it worked, or FALSE if it didn't
          (there is no message in the script's message
          buffer or filename could not be opened to write
          the text to).
          
     MsgSetAuthor author
          This sets the author of the script's message
          buffer. author is a string value giving the author
          of the message.
          
     MsgSetCensored censored
          This sets whether the message in the script's
          message buffer is censored or not. censored is a
          Boolean value: TRUE if the message should be
          censored; FALSE if not.
          
     MsgSetCreationRoom roomname
          This sets the creation room of the script's
          message buffer. roomname is a string value giving
          the creation room of the message.
          
     MsgSetCreationTime time
          This sets the creation time of the script's
          message buffer. time is a long value giving the
          creation time of the message, in seconds since
          12:00AM January 1, 1970, GMT.
          
     MsgSetDestinationAddress address
          This sets the destination address of the script's
          message buffer. address is a string value giving
          the destination address of the message.
          
     MsgSetEncrypted encrypt
          This sets whether the message in the script's
          message buffer is encrypted or not. encrypt is a
          Boolean value: TRUE if the message should be
          encrypted; FALSE if not.
          
     MsgSetEncryptionKey key
          This sets the encryption key of the script's
          message buffer. key  is a string value giving the
          encryption key of the message.
          
     MsgSetEZCreationTime time
          This sets the EZ creation time of the script's
          message buffer. time is a string value giving the
          EZ creation time of the message.
          
     MsgSetFilelink filename
          This sets the linked file of the script's message
          buffer. filename is a string value giving the file
          to link the message to.
          
     MsgSetForward username
          This sets the forwarding address of the script's
          message buffer. username is a string value giving
          the forwardee of the message.
          
     MsgSetGroup groupname
          This sets the group of the script's message
          buffer. groupname is a string value giving the
          group of the message.
          
     MsgSetLocal local
          This sets whether the message in the script's
          message buffer is local-only or not. local is a
          Boolean value: TRUE if the message should be local-
          only; FALSE if not.
          
     MsgSetMoreFlag flag value
          This sets whether the message in the script's
          message buffer has a specified moreflag set. flag
          is a string value, the first character of which
          specifies the flag. value is a Boolean value: TRUE
          to set the flag, FALSE to clear it. This returns a
          Boolean value: TRUE if the specified flag could be
          set or cleared; FALSE if not (for example, the
          maximum number of moreflags has been set).
          
     MsgSetOriginalRoom roomname
          This sets the original room of the script's
          message buffer. roomname is a string value giving
          the original room name of the message.
          
     MsgSetRealName name
          
          This sets the real name of the script's message buffer.
          name is a string value giving the real name of the
          author of the message.
          
     MsgSetReceiptConfirmationRequested requested
          This sets whether receipt confirmation is
          requested of the message in the script's message
          buffer. requested is a Boolean value: TRUE if
          confirmation is requested; FALSE if not.
          
     MsgSetReplyToMessage messageid
          This sets the message number that the message in
          the script's message buffer is a reply to.
          messageid is a string value giving the message
          that this is a reply to.
          
     MsgSetRoomNumber roomno
          This sets the room number of the script's message
          buffer. roomno is an integer value giving the room
          number of this message.
          
     MsgSetSignature signature
          
          This sets the signature of the script's message buffer.
          signature is a string value giving the signature
          of the message.
          
     MsgSetSourceRoomName roomname
          This sets the source room name of the script's
          message buffer. roomname is a string value giving
          the source room name of the message.
          
     MsgSetSubject subject
          This sets the subject of the script's message
          buffer. subject is a string value giving the
          subject of the message.
          
     MsgSetSurname surname
          This sets the surname of the script's message
          buffer. surname is a string value giving the
          surname of the message.
          
     MsgSetText text
          This sets the text of the script's message buffer.
          text is a string value giving the text of the
          message.
          
     MsgSetTitle title
          This sets the title of the script's message
          buffer. title is a string value giving the title
          of the message.
          
     MsgSetToPath path
          This sets the to path of the script's message
          buffer. path is a string value giving the to path
          of the message.
          
     MsgSetToPhoneNumber phonenum
          This sets the destination phone number of the
          script's message buffer. phonenum is a string
          value giving the destination phone number of the
          message.
          
     MsgSetToUser touser
          This sets the destination user of the script's
          message buffer. This can be a user on the network,
          by setting touser to something like "user @ node".
          
     MsgSetUserSignature signature
          This sets the user signature of the script's
          message buffer. signature is a string value giving
          the user signature of the message.
          
     MsgSetX x
          This sets the X field of the script's message
          buffer. x is a string value giving the X field of
          the message.
          
     MsgShow
          This displays the message in the script's message
          buffer to the user.
          
     MsgStart
          This starts a new message by allocating a message
          buffer for the script.
          
     MsgTabGetAuthHash index
          This returns the hash of the author of a message
          as an integer value. index is a long value giving
          the index of the message in the message table.
          
     MsgTabGetCopyOffset index
          This returns the offset from a copied message of
          the original message as a long value. index is a
          long value giving the index of the copied message
          in the message table.
          
     MsgTabGetLocation index
          This returns the byte offset in MSG.DAT of the
          start of a message as a long value. index is a
          long value giving the index of the message in the
          message table.
          
     MsgTabGetNextRoomMsg index
          This returns the message number of the next
          message in the same room as a message as a long
          value. index is a long value giving the index of
          the message in the message table. If the specified
          message is the last message in the room, then this
          returns -1.
          
Note:     This function is only valid in the Auxmem version.
     If executed in the Regular version, this will always
     return -1.
     
     MsgTabGetOriginID index
          This returns the low word of the Origin ID of a
          message networked message as an integer value.
          index is a long value giving the index of the
          message in the message table.
          
     MsgTabGetPrevRoomMsg index
          This returns the message number of the previous
          message in the same room as a message as a long
          value. index is a long value giving the index of
          the message in the message table. If the specified
          message is the first message in the room, then
          this returns -1.
          
Note:     This function is only valid in the Auxmem version.
     If executed in the Regular version, this will always
     return -1.
     
     MsgTabGetRoomNum index
          This returns the room number of a message as an
          integer value. index is a long value giving the
          index of the message in the message table.
          
     MsgTabGetToHash index
          This returns the hash of the destination user of a
          message as an integer value. index is a long value
          giving the index of the message in the message
          table.
          
     MsgTabIsCensored index
          This returns whether a message has been censored
          as a Boolean value. index is a long value giving
          the index of the message in the message table.
          
     MsgTabIsCopy index
          This returns whether a message is a copy of
          another one as a Boolean value. index is a long
          value giving the index of the message in the
          message table.
          
     MsgTabIsForwarded index
          This returns whether a message is forwarded as a
          Boolean value. index is a long value giving the
          index of the message in the message table.
          
     MsgTabIsInUse index
          This returns whether a message table entry is in
          use as a Boolean value. index is a long value
          giving the index of the entry in the message
          table.
          
     MsgTabIsLimited index
          This returns whether a message is group-only as a
          Boolean value. index is a long value giving the
          index of the message in the message table.
          
     MsgTabIsLocal index
          This returns whether a message is local-only as a
          Boolean value. index is a long value giving the
          index of the message in the message table.
          
     MsgTabIsMail index
          This returns whether a message is mail as a
          Boolean value. index is a long value giving the
          index of the message in the message table.
          
     MsgTabIsMadeVis index
          This returns whether a problem-user or moderated
          message has been made visible as a Boolean value.
          index is a long value giving the index of the
          message in the message table.
          
     MsgTabIsMassEMail index
          This returns whether a message is mass E-Mail as a
          Boolean value. index is a long value giving the
          index of the message in the message table.
          
     MsgTabIsModerated index
          This returns whether a message is a moderated
          message as a Boolean value. index is a long value
          giving the index of the message in the message
          table.
          
     MsgTabIsNetMail index
          This returns whether a message is network mail
          destined for another system as a Boolean value.
          index is a long value giving the index of the
          message in the message table.
          
     MsgTabIsNetworked index
          This returns whether a message is from another
          node on the network as a Boolean value. index is a
          long value giving the index of the message in the
          message table.
          
     MsgTabIsProblem index
          This returns whether a message is a problem-user
          message as a Boolean value. index is a long value
          giving the index of the message in the message
          table.
          
     MsgTabIsReceived index
          This returns whether a message has been received
          as a Boolean value. index is a long value giving
          the index of the message in the message table.
          
     MsgTabIsRepliedTo index
          This returns whether a message has been replied to
          as a Boolean value. index is a long value giving
          the index of the message in the message table.
          
     Net69Fetch nodename
          This does a Net 6.9 pre-fetch for the node
          specified by nodename.
          
     Net69Incorporate
          This does a Net 6.9 incorporation of any incoming
          network packets in the transfer path.
          
     Net69RoomReq nodename
          This creates a room request file for the node
          specified by the string value nodename. This has
          the same effect as the .Sysop 6.9 Net Room request
          (.S6R) command.
          
     Net86Fetch nodename
          This does a Citadel-86 fetch for the node
          specified by nodename.
          
     Net86Incorporate nodename
          
          This does a Citadel-86 incorporation for the node
          specified by nodename.
          
     OpenFile filenumber name
          This function opens a file. The file is created if
          it does not exist, and is opened for read and
          write access. filenumber is an integer from 0 to 4
          which is used to reference the file later. name is
          a string value giving the file's name. If there is
          no path information in name, the file is opened in
          #HOMEPATH as set in CONFIG.CIT. If there is
          already a file referenced by filenumber open, it
          is closed first. This function returns a Boolean
          value: TRUE if the file was opened and FALSE if it
          was not for any reason.
          
     OutStrPaced string pacing
          This outputs a string to the modem, pausing
          between each character. string is the string to
          output to the modem, and pacing is the number of
          hundredths of a second to pause between
          characters. (Citadel might pause longer than this
          value, but not less.)
          
     ParseDateString datestring
          This attempts to parse a date as a human may enter
          it in a string. For example, this can accept
          "March 13, 1995" or "3-13-95" or "3/13/1995" or
          "95Mar13" and know what it means. This returns a
          long value which can then be passed to any script
          function that requests a time or date: the time
          and date specified by the long value is 12:00 AM
          on the date parsed. If Citadel cannot parse the
          date, it returns the long value that specifies
          January 1, 1970. Yes, this really is a stupid
          error return value. If you wish to parse both a
          date and a time, add the return values of
          ParseDateString and ParseTimeString to end up with
          a value that specifies the given time on the given
          date.
          
     ParseTimeString timestring
          This attempts to parse a time as a human may enter
          it in a string. For example, this can accept
          "13:05:00" or "1:05pm" or "01:05 P" and know what
          it means. This returns a long value which can then
          be passed to any script function that requests a
          time or date: the time and date specified by the
          long value is the time specified on January 1,
          1970. If Citadel cannot parse the time, it returns
          the long value that specifies 12:00 AM. Yes, this
          really is a stupid error return value. If you wish
          to parse both a date and a time, add the return
          values of ParseDateString and ParseTimeString to
          end up with a value that specifies the given time
          on the given date.
          
     Pause delay
          This causes Citadel to pause. delay gives the
          length of the pause, in hundredths of a second.
          Citadel might pause longer than this value, but
          not less.
          
     PauseScript
          This causes the script to pause, and the script
          debugger to be activated, if it is not currently
          activated.
          
     PlaySound type name
          Wow.
          
     PrintC string1 [string2 ...]
          This prints all specified strings to the console
          screen, one after the other.
          
     PrintM string1 [string2 ...]
          This prints all specified strings to the console
          screen and modem, one after the other.
          
     Random limit
          This returns a random number in the range of 0 to
          one less than limit. limit is an integer value,
          and the random number is returned as an integer.
          
     ReadAplOnExit
          This tells the script interpreter to read
          INPUT.APL, README.APL, MESSAGE.APL, and
          CONSOLE.APL when the script exits. If you call the
          WriteApl function, then you do not need to call
          this function as well.
          
     ReadBool filenumber
          This reads a Boolean value from the file
          referenced by the integer value filenumber and
          returns it as a Boolean.
          
     ReadChar filenumber
          This reads a single character (byte) from the file
          referenced by the integer value filenumber and
          returns its ASCII value as an integer.
          
     ReadInt filenumber
          This reads an integer value from the file
          referenced by the integer value filenumber and
          returns it as an integer.
          
     ReadLong filenumber
          This reads a long value from the file referenced
          by the integer value filenumber and returns it as
          a long.
          
     ReadStr filenumber
          This reads a string value from the file referenced
          by the integer value filenumber and returns it as
          a string. The string can end with an ASCII 0
          (NUL), an ASCII 10 (LF), and ASCII 13 (CR), or an
          ASCII 255.
          
     ReadUInt filenumber
          This reads an unsigned integer value from the file
          referenced by the integer value filenumber and
          returns it as an unsigned integer.
          
     ReadULong filenumber
          This reads an unsigned long value from the file
          referenced by the integer value filenumber and
          returns it as an unsigned long.
          
     RemoveNetIDFromNetIDCit netid
          This removes a Net ID from NETID.CIT. netid is a
          string value specifying the Net ID to remove. This
          function returns a Boolean value: TRUE if the Net
          ID could be removed; FALSE if not.
          
     RemoveUser username groupname
          This removed the user specified by the string
          value username from the group specified by the
          string value groupname.
          
     RemoveWatch
          This removes a watch of variable variable in the
          script debugger. This can be tricky: you cannot
          merely use:
          
               #CALL RemoveWatch _Variable
               
          To remove a watch of _Variable, because the value
          of _Variable will be used. The trick is to use the
          sub-string command, like this:
          
               #STR B x_Variable 1 99
               #CALL RemoveWatch _Result
               
          This makes the value of _Result be "_Variable"
          which is then passed to RemoveWatch.
          
          This function returns a Boolean value: TRUE if the
          watch could be removed, or FALSE if it could not
          (either because the variable is not currently
          being watched, or because the script debugger is
          not currently active; see SetDebugScript).
          
     RenameFile oldname newname
          This attempts to rename the file given by the
          string value oldname to the name given by the
          string value newname. oldname and newname may
          reside in different directories on the same disk
          (in which case the file is moved), but not on
          different disks. If the rename operation was
          successful, this returns TRUE; else it returns
          FALSE.
          
     RunApplic cmdline
          This runs the application given by the string
          variable cmdline. cmdline is interpreted by
          Citadel like any other application command line:
          place a "!" at the beginning of it to tell Citadel
          to super-shell to the application, etc.
          
     SayASCII string
          
          This only works if you have an external sound driver
          loaded that support speech syntheses. This calls
          that function and tells it to speak the words in
          the string value string.
          
     SeekFile file location fromwhere
          This seeks to a location in a file opened by
          OpenFile. file is an integer value telling which
          file to perform the seeking in. location is a long
          value telling where to seek to. fromwhere is an
          integer value telling where to start the seek as
          per the following table:
          
               0    Seek from the beginning of the file.
               1    Seek from the current location in the
          file.
               2    Seek from the end of the file.
          
     SetAideChatHour hour value
          This sets whether the .Aide Chat (.AC) command is
          active for any hour of the day. hour is the hour,
          from 0 (Midnight) to 23 (11pm). value is a Boolean
          value: TRUE if the command should be enabled for
          that hour; FALSE if not.
          
     SetAideHall value
          This sets whether Aides may use the .Aide Hall
          (.AH) and .Aide Window (.AW) commands, or if they
          are restricted to Sysops. value is a Boolean
          value: TRUE if Aides are allowed to use the
          commands; FALSE if not.
          
     SetAideModerate value
          This sets whether Aides may release moderated
          messages, or if that power is restricted to
          Sysops. value is a Boolean value: TRUE if Aides
          are allowed to release moderated messages; FALSE
          if not.
          
     SetAnonAuthor author
          This sets the name that Citadel prints as the
          author of anonymous messages. author is a string
          value giving the new name.
          
     SetApplPath path
          
          This sets Citadel's application path. path is a string
          value giving the new path.
          
     SetAttr attr
          This sets the new attribute (color) of normal text
          on console. attr is an integer value giving the
          new color code.
          
     SetAutoANSI value
          This sets Citadel's automatic ANSI detection.
          value is an integer value, corresponding to the
          values for the #AUTOANSI CONFIG.CIT keyword.
          
     SetBAttr attr
          This sets the attribute (color) of the border
          (overscan) area of the screen. attr is an integer
          value giving the new color.
          
     SetBells value
          This sets how Citadel determines whether to ring
          the console speaker when it encounters a Control+G
          character. value is an integer value: 0 for never
          ring the speaker; 1 for ring the speaker only in
          response to chat requests; and 2 for always ring
          the speaker.
          
     SetBorder number string
          This sets a border. number is an integer value
          specifying the border to set, and string is a
          string value specifying the new contents of the
          border.
          
     SetBreakPoint lineno
          This sets a breakpoint in the script debugger on
          the line specified by lineno. This returns a
          Boolean value: TRUE if the break point could be
          set; FALSE if not (either because Citadel is out
          of memory, or because the script debugger is not
          currently running; see DebugScript).
          
     SetCAttr attr
          This sets the attribute (color) of text entered on
          console during chat. This is also used for the
          color of bold text. attr is an integer value
          giving the new color code to use.
          
     SetChatOn value
          This turns the Chat (C) command on and off. value
          is a Boolean value: TRUE if chat should be turned
          on; FALSE if it should be turned off.
          
     SetCheckCTS value
          This sets whether Citadel should check the Clear
          To Send (CTS) line of the serial port before
          sending data to it. value is a Boolean value: TRUE
          to check CTS; FALSE to ignore it. After setting
          this, you should call InitPort to make the new
          setting active.
          
     SetCit86Country country
          This sets the country used for Citadel-86
          networking. country is a string value giving the
          new country code.
          
     SetCit86Domain domain
          This sets the domain used for Citadel-86
          networking. domain is a string value giving the
          new domain name.
          
     SetColors value
          This sets whether Citadel should allow colors in
          strings such as user names, room names, etc. value
          is a Boolean value: TRUE if it should allow colors
          everywhere; FALSE if not.
          
     SetConnectWait time
          This sets the length of time after a connection is
          made before Citadel should start sending data to
          the serial port. If you don't have an error-
          correcting or data-compressing modem, you can set
          this to give callers with such modems time for
          their modems to determine that you don't have such
          a modem. time is an integer value giving the
          number of seconds to wait after a connection
          before sending data to the serial port.
          
     SetConsoleLock lock
          This sets whether the console is locked. lock is a
          Boolean value: TRUE to lock the console; FALSE to
          unlock it.
          
     SetCountBeep value
          This sets whether Citadel should send Control+G
          characters to the serial port when counting down
          to hanging up (after timing out if #SLEEPCOUNT in
          CONFIG.CIT is non-zero or after the user finishes
          a download that he told Citadel to hang up after).
          value is a Boolean value: TRUE if Control+Gs
          should be sent every second; FALSE if not.
          
     SetCreditNym name
          This sets the singular name of credits on the
          system. name is a string value giving the new
          name.
          
     SetCreditsNym name
          This sets the plural name of credits on the
          system. name is a string value giving the new
          name.
          
     SetDebugScript debug
          
          This either turns on or off the script debugger. debug
          is a Boolean value: TRUE to turn on the debugger;
          FALSE to turn it off.
          
     SetDebugSystem debug
          This sets whether Citadel's debug mode is on or
          not. debug is a Boolean value: TRUE to set debug
          mode on; FALSE to set it off.
          
     SetDefDateStamp dstamp
          This sets the date stamp for unlogged-in users and
          new users (unless overridden in DEFUSER.CIT).
          dstamp is a string value giving the new date
          stamp.
          
     SetDefNetPrefix netprefix
          This sets the net prefix for unlogged-in users and
          new users (unless overridden in DEFUSER.CIT).
          netprefix is a string value giving the new net
          prefix.
          
     SetDefRPrompt prompt
          
          This sets the room prompt for unlogged-in users and new
          users (unless overridden in DEFUSER.CIT). prompt
          is a string value giving the new room prompt.
          
     SetDefVDateStamp dstamp
          This sets the verbose date stamp for unlogged-in
          users and new users (unless overridden in
          DEFUSER.CIT). dstamp is a string value giving the
          new date stamp.
          
     SetDialMacro index macro
          This sets the string used for a dial out mode
          keyboard macro. index gives the key to set, as per
          the following table:
          
               index Function Key
               1 - 12    F1 through F12
               13 - 24   Alt+F1 through Alt+F12
               25 - 36   Shift+F1 through Shift+F12
               37 - 48   Control+F1 through Control+F12
          
          macro is a string value giving the new macro.
          
     SetDialPref prefix
          This sets the dial prefix used for dialing out.
          prefix is a string value giving the new prefix.
          
     SetDialRing command
          This sets the text sent to the modem in response
          to a RING signal from the modem. command is a
          string value giving the new text to send.
          
     SetDialSetup command
          This sets the text to send to the modem to set it
          up for dialing out. command is a string value
          giving the new text to send.
          
     SetDirPath path
          This sets the path to use for the default when
          creating a new directory room. path is a string
          value giving the new path.
          
     SetDiskFree bytes
          This sets how many bytes that Citadel should try
          to keep free on disk. When there is less than this
          amount free, Citadel will stop accepting uploads.
          bytes is a long value giving the new number of
          bytes to be kept free.
          
     SetDLPath path
          This sets the path used to store incoming Net 6.9
          file transfers. path is a string value giving the
          new path name.
          
     SetDownShift command
          This sets the string sent to the modem to go back
          on-line after dropping the speed when using
          #DUMBMODEM 6 or #DUMBMODEM 7. command is a string
          value giving the new string to send to the modem.
          
     SetDumbModem value
          This sets how Citadel should handle baud rate
          detection, as explained in the #DUMBMODEM section
          of CONFIG.CIT. value is an integer value giving
          the new method to detect baud rate.
          
     SetEnterName string
          
          This sets what Citadel prompts for when asking new
          users for their name. string is a string value
          giving the new text to use.
          
     SetEnterOK value
          This sets whether unlogged-in users are allowed to
          enter messages. value is a Boolean value: TRUE if
          they are allowed to enter messages; FALSE if not.
          
     SetEnterSur value
          This sets whether users are allowed to change
          their title and surname. value is a Boolean value:
          TRUE if users should be allowed to change their
          title and surname; FALSE if not.
          
     SetExpire days
          This sets the number of days to use for expiring
          incoming network messages. days is an integer
          value giving the new number of days to use.
          
     SetF6Pass password
          This sets the new F6 password. password is a
          string value giving the new password to use. (Use
          an empty string to turn off the password
          checking.)
          
     SetForceLogin value
          This sets whether users are forced to log in when
          first calling the system, or if they are given a
          room prompt without logging in. value is a Boolean
          value: TRUE if users are forced to log in; FALSE
          if not.
          
     SetForwardSys value
          This sets whether messages to "Sysop" are
          delivered to the user specified by #SYSOP in
          CONFIG.CIT, or if they are left addressed to
          "Sysop" (which means that any user with Sysop
          access may read the message). value is a Boolean
          value: TRUE if the messages should be forwarded to
          #SYSOP; FALSE if not.
          
     SetFuelBarEmpty value
          This sets what Citadel should display for the
          empty fuel bar when indexing the message base.
          value is an integer value giving the ASCII code of
          the character to use.
          
     SetFuelBarFull value
          This sets what Citadel should display for the full
          fuel bar when indexing the message base. value is
          an integer value giving the ASCII code of the
          character to use.
          
     SetHangup command
          This sets the command used to hang up the modem
          when using #DUMBMODEM 6 or #DUMBMODEM 7. command
          is a string value giving the new command to use.
          
     SetHangupDelay time
          This sets the amount of time after telling the
          modem to hang up before sending more data to it.
          time is an integer value. If it is zero, then
          Citadel will wait a half a second after hanging up
          before sending more data to the modem. If it is
          non-zero, then it will wait that number of seconds
          before sending more data to the modem.
          
     SetHelpPath path
          This sets the path Citadel uses to look for help
          files. path is a string value giving the new path
          to use.
          
     SetHelpPath2 path
          This sets the alternate path Citadel uses to look
          for help files. path is a string value giving the
          new path to use.
          
     SetHomePath path
          This sets the path Citadel uses to look for most
          of its system files. path is a string value giving
          the new path to use.
          
     SetIdleTimeout timeout
          This sets the new idle time-out that Citadel uses
          to determine when it can attempt a Cron event.
          timeout is an integer value telling the new time-
          out value, in minutes.
          
     SetInitBaud code
          This sets the speed to initialize the modem at.
          code is an integer value that determines the
          speed:
          
               code speed
               0    300
               1    1200
               2    2400
               3    4800
               4    9600
               5    19200
               6    38400
               7    57600
               8    115200
          
     SetLApplication value
          This sets whether Citadel runs the new user
          application when a new user logs onto the system.
          value is a Boolean value: TRUE to run the
          application; FALSE not to run it.
          
     SetLClosedSys value
          
          This sets whether the system is closed (which means it
          doesn't accept new users). value is a Boolean
          value: TRUE to close the system; FALSE to make it
          open (and thus accept new users).
          
     SetLCreate value
          This sets whether new users are allowed to create
          accounts. (No, I don't know how this differs from
          SetLClosedSys, either). value is a Boolean value:
          TRUE to allow new users to create accounts; FALSE
          not to allow it.
          
     SetLogExtDir path
          This sets the directory Citadel uses to store log
          extension files. path is a string value giving the
          new path to use.
          
     SetLQuestionnaire value
          This sets whether Citadel asks new users for their
          real name, phone number, address, etc., when
          logging on. value is a Boolean value: TRUE to ask
          the questions; FALSE to not ask them.
          
     SetLSysMsg value
          This sets whether Citadel requires new users to
          leave a message to the sysop when first logging
          in. value is a Boolean value: TRUE to make them
          leave a message to the sysop; FALSE to not do it.
          
     SetLVerified value
          This sets whether new users are automatically
          verified when logging onto the system. value is a
          Boolean value: TRUE to automatically verify all
          new users; FALSE to not.
          
     SetMaxFiles max
          This sets the maximum number of files that Citadel
          can see in a single directory. max is an integer
          value giving the maximum number.
          
     SetMCIDate string
          This sets the string sent to the user when MCI is
          turned off and the MCI date command (^AT) is
          encountered. string is a string value giving the
          new string to send.
          
     SetMCIFirstName string
          This sets the string sent to the user when MCI is
          turned off and the MCI first name command (^An) is
          encountered. string is a string value giving the
          new string to send.
          
     SetMCIName string
          This sets the string to send to the user when MCI
          is turned off and the MCI name command (^AN) is
          encountered. string is a string value giving the
          new string to send.
          
     SetMCIOn value
          This sets whether MCI is active or not. value is a
          Boolean value: TRUE to make MCI active; FALSE to
          turn it off.
          
     SetMCIPoop string
          This sets the string to send to the user when MCI
          is turned off and the MCI poop command (^Ap) is
          encountered. string is a string value giving the
          new string to send.
          
     SetMCITime string
          This sets the string to send to the user when MCI
          is turned off and the MCI time command (^At) is
          encountered. string is a string value giving the
          new string to send.
          
     SetMData port
          This sets the serial port that the modem is
          attached to. port is an integer value in the range
          of 1 to 4 to use for the serial port. After a new
          port is set with this function, use the InitPort
          function to make it active.
          
     SetMessageRoom number
          This sets the maximum number of messages to allow
          a user to enter in a single room on a single call.
          number is an integer value giving the maximum
          number of messages allowed.
          
     SetMinBaud code
          This sets the minimum speed that the system will
          accept callers at. code is an integer value giving
          the speed:
          
               code baud
               0    300
               1    1,200
               2    2,400
               3    4,800
               4    7,200
               5    9,600
               6    12,000
               7    14,400
               8    16,800
               9    19,200
               10   38,400
               11   57,600
               12   115,200
               13   230,400
          
     SetModSetup command
          This sets the string to send to the modem to set
          it up. command is a string value giving the new
          command to use.
          
     SetModUnSetup command
          This sets the string to send to the modem when
          exiting Citadel. command is a string value giving
          the new command to use.
          
     SetMorePrompt promt
          This sets the more prompt for unlogged-in users
          and new users (unless overridden in DEFUSER.CIT).
          prompt is a string value giving the new more
          prompt.
          
     SetMsgCompress value
          This sets whether Citadel compresses messages as
          it saves them. value is a Boolean value: TRUE to
          compress messages; FALSE to not.
          
     SetMsgNym name
          This sets the singular name of messages on the
          system. name is a string value giving the new name
          to use.
          
     SetMsgPath path
          
          This sets the path that Citadel uses to store the
          MSG.DAT file. path is a string value giving the
          new path to use.
          
     SetMsgsNym name
          This sets the plural name of messages on the
          system. name is a string value giving the new name
          to use.
          
     SetMsgVerb verb
          This sets the verb to use when saving messages.
          verb is a string value giving the new verb to use.
          
     SetNetMail value
          This sets whether Citadel should attempt to find
          the original room for incoming networked mail, or
          just leave it in the Mail room. value is a Boolean
          value: TRUE to tell it to attempt to find the
          original room; FALSE to just place it in Mail.
          
     SetNetSurnames value
          This sets whether Citadel should display surnames
          on messages that come in over the network. value
          is a Boolean value: TRUE to display networked
          surnames; FALSE to not.
          
     SetNetTitles value
          This sets whether Citadel should display titles on
          messages that come in over the network. value is a
          Boolean value: TRUE to display networked titles;
          FALSE to not.
          
     SetNewUserApp app
          This sets the application to run when a new user
          creates an account. app is a string value giving
          the application name.
          
     SetNodeCountry country
          This sets the country of the node to save to
          networked messages. country is a string value
          giving the new country to use.
          
     SetNodeName name
          This sets the system's name. name is a string
          value giving the new name to use.
          
     SetNodePhone phonenum
          This sets the system's phone number. phonenum is a
          string value giving the new phone number to use.
          
     SetNodeRegion region
          This sets the region of the node to save to
          networked messages. region is a string value
          giving the new region to use.
          
     SetNoPWEcho value
          This sets what to echo to the user as he enters
          his password. value is an integer value,
          corresponding to the values for #NOPWECHO in
          CONFIG.CIT.
          
     SetOffHook value
          This determines whether to place the modem off-
          hook while the system is busy doing other things.
          (This makes the line busy for callers.) value is
          an integer value: 0 to never place the modem off-
          hook; 1 to place the modem off-hook when a user is
          logged in on console or when incorporating network
          packets; 2 to place the modem off-hook when a user
          is logged in on console, but not when
          incorporating network packets.
          
     SetOffHookStr command
          This sets the string to send to the modem to place
          it off-hook. command is a string value giving the
          text to send.
          
     SetOldCount count
          This sets the number of messages on the system to
          make new for new users. count is an integer value
          giving the number of messages to be new. (Use 0 to
          make all messages new.)
          
     SetOutImpervious
          This turns off the user's ability to skip output
          with the Next, Stop, or Jump commands, or to pause
          it with the Pause command.
          
     SetOutNormal
          
          This turns on the user's ability to skip output with
          the Next, Stop, or Jump commands, or to pause it
          with the Pause command.
          
     SetOutNoStop
          This turns off the user's ability to skip output
          with the Next, Stop, or Jump commands, but allows
          it to be paused with the Pause command.
          
     SetPoop poop
          This sets the action of the Q and P keys. poop is
          an integer value, which may have the same values
          of #POOP! in CONFIG.CIT.
          
     SetPortRate baud
          This sets the baud rate of the serial port. If
          baud is omitted, then the port is initialized to
          the speed given by #INITBAUD in CONFIG.CIT. baud
          can be 300, 1200, 2400, 4800, 9600, 19200, 38400,
          57600, or 115200, and Citadel will initialize the
          port at that rate. Or, it could be a number from 0
          to 8, and Citadel will initialize the port as
          follows:
          
               baud speed
               0    300
               1    1200
               2    2400
               3    4800
               4    9600
               5    19200
               6    38400
               7    57600
               8    115200
          
     SetPrinter filename
          This sets the name of the file to send output to
          when the printer capture is turned on. filename is
          a string value giving the name of the file.
          
     SetPrinterPrompt value
          This sets whether Citadel prompts for a new file
          name every time the Alt+P keystroke is used to
          start capturing text. value is a Boolean value:
          TRUE to prompt for a new filename every time;
          FALSE to just use the filename set by #PRINTER in
          CONFIG.CIT.
          
     SetRandom
          This reinitializes the random number generator.
          
     SetReadAll value
          This sets who may use the .Read All... (.RA...)
          commands. value is an integer value, with the same
          settings as #READALL in CONFIG.CIT.
          
     SetReadLUser value
          This sets if the .Read Group-only Userlog (.RGU)
          command is allowed or not. value is a Boolean
          value: TRUE to allow the command; FALSE to not.
          
     SetReadOK value
          This sets whether unlogged-in users may read
          messages. value is a Boolean value: TRUE to allow
          them to read; FALSE to not.
          
     SetRestoreMode value
          
          This sets whether Citadel restores the screen mode
          after returning from a shell if it has changed.
          value is a Boolean value: TRUE to restore the
          screen mode; FALSE to not.
          
     SetRoomBypassed index bypass
          This sets whether a room has been bypassed during
          the current call or not. index is an integer value
          that specifies the room to set the bypass flag
          for. bypass is a Boolean value: TRUE to set the
          flag; FALSE to clear it.
          
     SetRoomInHall hall room inhall
          This sets whether the room specified by the index
          room is in the hall specified by the index hall.
          inhall is a Boolean value: TRUE to place the room
          in the hall; FALSE to remove it.
          
     SetRoomOK value
          This sets whether non-Aides are allowed to create
          rooms in halls not explicitly set that users may
          create rooms. value is a Boolean value: TRUE if
          non-Aides may create rooms in any halls; FALSE if
          they may only create rooms in halls that have been
          explicitly set to allow it.
          
     SetRoomPath path
          This sets the path to store room description files
          in. path is a string value giving the new path to
          use.
          
     SetScreenSave code value
          This sets the behavior of the screen saver. code
          is an integer value telling what to set, as per
          the following table:
          
               1    The number of minutes before the screen
                    will blank. value is an integer value;
                    use 0 to turn the screen saver off.
                    
               2    Whether the screen saver is turned off
                    when Citadel gets a call. value is a
                    Boolean value: TRUE to turn it off,
                    FALSE to leave it on.
                    
               3    Whether the screen saver stays turned
                    off for the duration of the call. value
                    is a Boolean value: TRUE to make the
                    screen saver stay turned off for the
                    duration of a call, FALSE to let it turn
                    back on during a call.
                    
               4    Whether a clock is displayed on the
                    screen, and how often it moves if it is
                    displayed. value is an integer value:
                    the number of seconds to wait before
                    moving the clock; use 0 to turn off the
                    display of the clock.
                    
               5    Whether the cursor stays on when the
                    screen is blanked. value is a Boolean
                    value: TRUE to make the cursor stay on
                    when the screen is blanked, FALSE to
                    turn it off.
                    
     SetScrollTimeout time
          This sets the amount of time the scroll-back
          buffer is displayed with no keyboard activity
          before turning it off. time is an integer value
          giving the number of seconds.
          
     SetSetCensor value
          This sets whether users are allowed to set if they
          wish to view censored messages or not. value is a
          Boolean value: TRUE to allow users to set this;
          FALSE to not.
          
     SetSetMsgNym value
          This sets whether Aides are allowed to change the
          name of messages with the .Aide Name messages
          (.AN) command. value is a Boolean value: TRUE to
          allow Aides to change the name of messages; FALSE
          to not.
          
     SetSleepCount value
          This sets whether to initiate a count-down when
          users time-out. value is a Boolean value: TRUE to
          initiate a count-down; FALSE to just hang-up.
          
     SetSleepPrompt prompt
          
          This sets the text to display to the user when he times
          out. prompt is a string value giving the text to
          display.
          
     SetSubHubs value
          This sets how Citadel handles sub-hubs. value is
          an integer value with the same meaning as #SUBHUBS
          in CONFIG.CIT.
          
     SetSurnames value
          This determines if surnames are allowed on the
          system. value is a Boolean value: TRUE to allow
          surnames; FALSE to not.
          
     SetSysopName name
          This sets the user name of the main sysop on the
          system. name is a string value giving the name of
          the sysop.
          
     SetTempPath path
          This sets the path Citadel uses for temporary
          files. path is a string value giving the name of
          the new path to use.
          
     SetTimeOut time
          This sets the amount of time users may be idle on
          the system before they are timed out on. time is
          an integer value giving the number of minutes to
          wait.
          
     SetTitles value
          This determines if titles are allowed on the
          system. value is a Boolean value: TRUE to allow
          titles; FALSE to not.
          
     SetTransPath path
          This sets the path used for transient network
          files. path is a string value giving the new path
          to use.
          
     SetTrapFile filename
          This sets the name of the trap file. filename is a
          string value giving the new filename to use.
          
     SetTwirly string
          
          This sets the string used to create the twirly cursor.
          string is a string value used to set the twirly
          cursor. The cursor is created by sending each
          character of the string out one at a time.
          
     SetTwirlyPause time
          This sets the amount of time to wait between
          sending each character of the twirly cursor out.
          time is an integer value giving the number of
          hundredths of a second to wait.
          
     SetTwitCountry country
          This sets the twit country to use for networked
          messages. country is a string value giving the new
          twit country.
          
     SetTwitRegion region
          This sets the twit region to use for networked
          messages. region is a string value giving the new
          twit region.
          
     SetUnlogBal credits
          
          This sets the number of credits to assign to unlogged-
          in users. credits is a long value giving the
          number of seconds to give to the user.
          
     SetUnlogTimeout time
          This sets the amount of time that unlogged-in
          users may be idle before the system times out on
          them. time is an integer value giving the number
          of minutes.
          
     SetUpDay day value
          This sets whether the system is up on the
          specified day. day is an integer value ranging
          from 0 (Sunday) to 6 (Saturday) specifying the day
          to set. value is a Boolean value: TRUE to make the
          system active on that day; FALSE to make it
          inactive.
          
     SetUpHour hour value
          This sets whether the system is up during the
          specified hour. hour is an integer value ranging
          from 0 (Midnight) to 23 (11 PM) specifying the
          hour to set. value is a Boolean value: TRUE to
          make the system active during that hour; FALSE to
          make it inactive.
          
     SetUserCredits credits
          This sets the currently logged-in user's credits
          to the long value credits. Remember that Citadel
          thinks of credits internally in terms of seconds,
          not minutes, so this value is the number of
          seconds, not minutes, to assign to the user.
          
     SetUttr attr
          This sets the attribute (color) to use for
          underlined text on console. attr is an integer
          value giving the color code to use.
          
     SetWattr attr
          This sets the attribute (color) to use to display
          the status line (and all other reverse text) on
          console. attr is an integer value giving the color
          code to use.
          
     SFormat formatstring codes [var1...var10]
          
          This gives replaceable parameters in a format string,
          formatstring. In addition to standard text, this
          string contains special codes denoting replaceable
          parameters: the percent symbol ("%") followed by a
          single letter. codes includes all letters that are
          valid in formatstring. var1 through var10 give
          what to replace the codes with. (You don't need
          all varx parameters: use only as many as you need.
          You cannot use more than 10, however.)
          
          For example, the following call:
          
               #CALL SFormat "Testing %a %b %a %c" "abcd"
                    "string1" "string2" "string3" "string4"
               
          Would result in the following string:
          
               "Testing string1 string2 string1 string 3"
               
          As you can see, you can re-use format codes
          several times in formatstring, and you don't need
          to use all the codes. If you want the percent
          symbol itself to appear in the result string, use
          two in a row in formatstring: "This is 100%%
          complete."
          
     StartDupCheck
          This readies the duplicate checking data for use.
          Call it before using AddDupCheck.
          
          To use the duplicate checking functions, start by
          calling StartDupCheck, which initializes the
          checking data structures. Then add strings with
          AddDupCheck. Use CheckForDup to see if a string
          has been added. When you are finished, call
          StopDupCheck to free up the memory used by the
          duplicate checking.
          
     StartMessageEditor room
          This loads the message in the script's message
          buffer into the message editor and lets the
          current user edit and save (or abort) it. room is
          an integer value that specifies the room the
          message should be entered into, or -1 if it should
          go to the current room. This returns a Boolean
          value: TRUE if the message was saved, FALSE if not
          (either because the user chose Abort or Citadel
          ran out of memory).
          
     StopDupCheck
          This frees up all memory used for duplicate
          checking. Call it when you are done duplicate
          checking.
          
          To use the duplicate checking functions, start by
          calling StartDupCheck, which initializes the
          checking data structures. Then add strings with
          AddDupCheck. Use CheckForDup to see if a string
          has been added. When you are finished, call
          StopDupCheck to free up the memory used by the
          duplicate checking.
          
     StrfTime formatstring time length
          This outputs a time formatted like other time
          strings in Citadel. (See the Time/Date Format
          Strings section for a full explanation.)
          formatstring is the string used to format the
          output, time is the time to format (given as the
          number of seconds since 12:00AM January 1, 1970,
          GMT), and length is the maximum allowed length of
          the resulting string. As a short-cut, you can use
          the number 0 for time to have Citadel format the
          current time.
          
     StringIsAddress string
          This returns whether the string specified by
          string is a valid address on the Citadel network.
          This does not check for the existence of the
          address, only if it has a valid format for one.
          This returns a Boolean value: TRUE if the string
          is a valid address; FALSE if not.
          
     StrPos
          Wow.
          
     TellFile filenumbner
          This returns the current position of the file
          pointer in the file given by the integer
          expression filenumber. The position is returned as
          an unsigned long value.
          
     ThisRoom
          This returns the current room as an index into the
          room table. This is returned as an integer value.
          
     UserAddKillNode nodename
          This adds a node-based message exclusion for the
          user in the script user buffer. nodename is a
          string value giving the name of the node to
          exclude. This returns a Boolean value: TRUE if the
          exclusion could be added; FALSE if not.
          
     UserAddKillRegion region
          This adds a region-based message exclusion for the
          user in the script user buffer. region is a string
          value giving the region to exclude. This returns a
          Boolean value: TRUE if the exclusion could be
          added; FALSE if not.
          
     UserAddKillText text
          
          This adds a text-based message exclusion for the user
          in the script user buffer. text is a string value
          giving the text to exclude. This returns a Boolean
          value: TRUE if the exclusion could be added; FALSE
          if not.
          
     UserAddKillUser username
          This adds a user-based message exclusion for the
          user in the script user buffer. username is a
          string value giving the name of the user to
          exclude. This returns a Boolean value: TRUE if the
          exclusion could be added; FALSE if not.
          
     UserAddWordToDictionary word
          This adds a word to the personal dictionary of the
          user in the script user buffer. word is a string
          value giving the word to add.
          
     UserClear
          This clears the script user buffer, setting all
          values to their defaults.
          
     UserDump
          
          This releases the memory used by the script user
          buffer.
          
     UserGetAlias
          This returns the alias of the user in the script
          user buffer as a string value.
          
     UserGetBirthDate
          This returns the birth date of the user in the
          script user buffer as a long value (the time of
          midnight on the user's birth date).
          
     UserGetCallLimit
          This returns the call-per-day limit of the user in
          the script user buffer as an integer value. If
          this returns a 0, then there is no limit for the
          user.
          
     UserGetCallNumber
          This returns the call number of the user in the
          script user buffer as a long value.
          
     UserGetCallsToday
          
          This returns the number of calls during one day
          (midnight to midnight) of the user in the script
          user buffer as an integer value. Note that this
          will return a non-zero number even if the user has
          not called today: it returns the number of calls
          the user made during the last day he called. Use
          UserGetCallTime to determine which day that was.
          
     UserGetCallTime
          This returns the time of the last call of the user
          in the script user buffer as a long value.
          
     UserGetCredits
          This returns the number of credits of the user in
          the script user buffer as a long value. Note that
          Citadel internally stores credits as seconds, not
          minutes.
          
     UserGetDateStamp
          This returns the date stamp of the user in the
          script user buffer as a string value.
          
     UserGetDefaultHall
          
          This returns the default hall of the user in the script
          user buffer as a string value.
          
     UserGetDefaultProtocol
          This returns the default file transfer protocol of
          the user in the script user buffer as a string
          value. Note that only the menu-key letter of the
          protocol is returned, not the full name.
          
     UserGetDefaultRoom
          This returns the default room of the user in the
          script user buffer as a string value. Note that
          the default room is not currently in use.
          
     UserGetDL_Bytes
          This returns the number of bytes the user in the
          script user buffer has downloaded as a long value.
          Note that this is not currently in use.
          
     UserGetDL_Num
          This returns the number of files the user in the
          script user buffer has uploaded as an integer
          value. Note that this is not currently in use.
          
     UserGetFirstOn
          This returns the time of the first call of the
          user in the script user buffer as a long value.
          
     UserGetForwardAddr
          This returns the user mail to the user in the
          script user buffer is forwarded to as a string
          value.
          
     UserGetForwardAddrNode
          This returns the node mail to the user in the
          script user buffer is forwarded to as a string
          value.
          
     UserGetForwardAddrRegion
          This returns the region of the node mail to the
          user in the script user buffer is forwarded to as
          a string value.
          
     UserGetInitials
          
          This returns the initials of the user in the script
          user buffer as a string value.
          
     UserGetKillNode index
          This returns a node-based message exclusion of the
          user in the script user buffer as a string value.
          index is an integer value giving the exclusion
          number to extract.
          
     UserGetKillRegion index
          This returns a region-based message exclusion of
          the user in the script user buffer as a string
          value. index is an integer value giving the
          exclusion number to extract.
          
     UserGetKillText index
          This returns a text-based message exclusion of the
          user in the script user buffer as a string value.
          index is an integer value giving the exclusion
          number to extract.
          
     UserGetKillUser index
          
          This returns a user-based message exclusion of the user
          in the script user buffer as a string value. index
          is an integer value giving the exclusion number to
          extract.
          
     UserGetLastHall
          This returns the last hall the user in the script
          user buffer was in last call as a string value.
          
     UserGetLastMessage
          This returns the message number of the last
          message on the system during the last call of the
          user in the script user buffer as a long value.
          
     UserGetLastRoom
          This returns the last room the user in the script
          user buffer was in last call as a string value.
          
     UserGetLinesPerScreen
          This returns the lines per screen of the user in
          the script user buffer as an integer value.
          
     UserGetLocID
          
          This returns the Location Identifier of the user in the
          script user buffer as a string value.
          
     UserGetLogins
          This returns the number of times the user in the
          script user buffer has logged in as an unsigned
          integer value.
          
     UserGetMailAddr1
          This returns the first line of the mailing address
          of the user in the script user buffer as a string
          value.
          
     UserGetMailAddr2
          This returns the second line of the mailing
          address of the user in the script user buffer as a
          string value.
          
     UserGetMailAddr3
          This returns the third line of the mailing address
          of the user in the script user buffer as a string
          value.
          
     UserGetMorePrompt
          This returns the more prompt of the user in the
          script user buffer as a string value.
          
     UserGetName
          This returns the name of the user in the script
          user buffer as a string value.
          
     UserGetNetPrefix
          This returns the net prefix of the user in the
          script user buffer as a string value.
          
     UserGetNulls
          This returns the number of nulls of the user in
          the script user buffer as an integer value.
          
     UserGetNumKillNode
          This returns the number of node-based message
          exclusions the user in the script user buffer has
          defined as a long value.
          
     UserGetNumKillRegion
          
          This returns the number of region-based message
          exclusions the user in the script user buffer has
          defined as a long value.
          
     UserGetNumKillText
          This returns the number of text-based message
          exclusions the user in the script user buffer has
          defined as a long value.
          
     UserGetNumKillUser
          This returns the number of user-based message
          exclusions the user in the script user buffer has
          defined as a long value.
          
     UserGetNumUserShow
          This returns the number of users to show on log-in
          of the user in the script user buffer as an
          integer value.
          
     UserGetOccupation
          This returns the occupation of the user in the
          script user buffer as a string value.
          
     UserGetPassword
          This returns the password of the user in the
          script user buffer as a string value.
          
     UserGetPasswordChangeTime
          This returns the time the user in the script user
          buffer last changed his password as a long value.
          
     UserGetPhoneNumber
          This returns the phone number of the user in the
          script user buffer as a string value.
          
     UserGetPoopcount
          This returns the poopcount of the user in the
          script user buffer as a long value.
          
     UserGetPosted
          This returns the total number of messages the user
          in the script user buffer has posted as a long
          value.
          
     UserGetPromptFormat
          
          This returns the room prompt format string of the user
          in the script user buffer as a string value.
          
     UserGetRead
          This returns the total number of messages the user
          in the script user buffer as read as a long value.
          
     UserGetRealName
          This returns the real name of the user in the
          script user buffer as a string value.
          
     UserGetRoomNewPointer index
          This returns the message pointer of the user in
          the script user buffer as a long value. index is
          an integer value giving room to get the message
          pointer of.
          
     UserGetSex
          This returns the sex of the user in the script
          user buffer as an integer value. This is 0 if the
          sex has not been specified, 1 if male, or 2 if
          female.
          
     UserGetSignature
          This returns the signature of the user in the
          script user buffer as a string value.
          
     UserGetSpellCheckMode
          This returns the spell check mode of the user in
          the script user buffer as an integer value.
          
     UserGetSurname
          This returns the surname of the user in the script
          user buffer as a string value.
          
     UserGetTitle
          This returns the title of the user in the script
          user buffer as a string value.
          
     UserGetTotalTime
          This returns the total amount of time (in seconds)
          the user in the script user buffer has spent on
          the system as a long value.
          
     UserGetUL_Bytes
          
          This returns the total number of bytes the user in the
          script user buffer has uploaded to the system as a
          long value. Note that this is not currently in
          use.
          
     UserGetUL_Num
          This returns the total number of files the user in
          the script user buffer has uploaded to the system
          as an integer value. Note that this is not
          currently in use.
          
     UserGetUserDefined code
          This returns user-defined data for the user in the
          script user buffer as a string value. code is a
          string value giving a code used to distinguish the
          data. With user-defined data, your script can
          easily store information in each user's data files
          on disk. Just be sure to pick a unique code so
          your script does not conflict with other people's
          scripts. code can be any string up to 30
          characters long, so you can do something like use
          your name followed by a number ("Brent Bottles 1"
          for example) and be reasonably assured of
          uniqueness.
          
     UserGetVerboseDateStamp
          This returns the verbose date stamp of the user in
          the script user buffer as a string value.
          
     UserGetWhereHear
          This returns where the user in the script user
          buffer heard about the BBS as a string value.
          
     UserGetWidth
          This returns the terminal width of the user in the
          script user buffer as an integer value.
          
     UserIsAccounting
          This returns whether the user in the script user
          buffer has accounting turned on as a Boolean
          value.
          
     UserIsAide
          This returns whether the user in the script user
          buffer is an aide as a Boolean value.
          
     UserIsAutoNextHall
          This returns whether the user in the script user
          buffer has auto-next-hall turned on as a Boolean
          value.
          
     UserIsAutoVerbose
          This returns whether the user in the script user
          buffer has auto-verbose turned on as a Boolean
          value.
          
     UserIsChat
          This returns whether the user in the script user
          buffer can use the Chat (C) command as a Boolean
          value.
          
     UserIsCheckAllCaps
          This returns whether the user in the script user
          buffer has spell-checking of words in all caps
          turned on as a Boolean value.
          
     UserIsCheckApostropheS
          
          This returns whether the user in the script user buffer
          has spell-checking of words that end in "'s"
          turned on as a Boolean value.
          
     UserIsCheckDigits
          This returns whether the user in the script user
          buffer has spell-checking of words containing
          digits turned on as a Boolean value.
          
     UserIsClearScreenBetweenMessages
          This returns whether the user in the script user
          buffer has clear screen between messages turned on
          as a Boolean value.
          
     UserIsConfirmNoEO
          This returns whether the user in the script user
          buffer has confirm no .EO when there is an aborted
          message turned on as a Boolean value.
          
     UserIsDefaultHallLocked
          This returns whether the user in the script user
          buffer has his default hall locked as a Boolean
          value.
          
     UserIsDownload
          This returns whether the user in the script user
          buffer may download as a Boolean value.
          
     UserIsDungeoned
          This returns whether the user in the script user
          buffer is dungeoned as a Boolean value. Note that
          this is not currently in use.
          
     UserIsEnterBorders
          This returns whether the user in the script user
          buffer may enter borders as a Boolean value.
          
     UserIsExcludeEncryptedMessages
          This returns whether the user in the script user
          buffer has exclusion of encrypted messages turned
          on as a Boolean value.
          
     UserIsExpert
          This returns whether the user in the script user
          buffer is an expert as a Boolean value.
          
     UserIsForwardToNode
          This returns whether the user in the script user
          buffer has forwarding-to-node turned on as a
          Boolean value.
          
     UserIsHideMessageExclusions
          This returns whether the user in the script user
          buffer has hiding of message exclusions turned on
          as a Boolean value.
          
     UserIsIBMANSI
          This returns whether the user in the script user
          buffer has IBM ANSI turned on as a Boolean value.
          
     UserIsIBMColor
          This returns whether the user in the script user
          buffer has IBM color turned on as a Boolean value.
          
     UserIsIBMGraph
          This returns whether the user in the script user
          buffer has IBM graphics characters turned on as a
          Boolean value.
          
     UserIsIBMRoom
          This returns whether the user in the script user
          buffer has IBM room prompt characters turned on as
          a Boolean value.
          
     UserIsInGroup index
          This returns whether the user in the script user
          buffer is in a group as a Boolean value. index is
          the group's index.
          
     UserIsInRoom index
          This returns whether the user in the script user
          buffer is in a room as a Boolean value. index is
          the room's index.
          
     UserIsInuse
          This returns whether the user in the script user
          buffer is in use as a Boolean value.
          
     UserIsKillNode nodename
          
          This returns whether a node is subjected to node-based
          message exclusion by the user in the script user
          buffer as a Boolean value. nodename is the name of
          the node to test.
          
     UserIsKillRegion region
          This returns whether a region is subjected to
          region-based message exclusion by the user in the
          script user buffer as a Boolean value. region is
          the of the region to test.
          
     UserIsKillText text
          This returns whether text is subjected to text-
          based message exclusion by the user in the script
          user buffer as a Boolean value. text is the text
          to test.
          
     UserIsKillUser username
          This returns whether a user is subjected to user-
          based message exclusion by the user in the script
          user buffer as a Boolean value. username is the
          name of the node to test.
          
     UserIsLinefeeds
          This returns whether the user in the script user
          buffer has linefeeds turned on as a Boolean value.
          
     UserIsMail
          This returns whether the user in the script user
          buffer may send mail as a Boolean value.
          
     UserIsMainSysop
          This returns whether the user in the script user
          buffer is the main sysop as set by #SYSOP in
          CONFIG.CIT as a Boolean value.
          
     UserIsMakeRoom
          This returns whether the user in the script user
          buffer may make rooms as a Boolean value.
          
     UserIsMinibin
          This returns whether the user in the script user
          buffer has Minibin usage statistics turned on as a
          Boolean value.
          
     UserIsMusic
          
          This returns whether the user in the script user buffer
          has music turned on as a Boolean value.
          
     UserIsNetUser
          This returns whether the user in the script user
          buffer has network privileges as a Boolean value.
          
     UserIsNode
          This returns whether the user in the script user
          buffer is a node as a Boolean value.
          
     UserIsOldToo
          This returns whether the user in the script user
          buffer has last old on new turned on as a Boolean
          value.
          
     UserIsOut300
          This returns whether the user in the script user
          buffer has 300 baud output simulation turned on as
          a Boolean value.
          
     UserIsPauseBetweenMessages
          
          This returns whether the user in the script user buffer
          has pause-between-messages turned on as a Boolean
          value.
          
     UserIsPermanent
          This returns whether the user in the script user
          buffer is permanent as a Boolean value.
          
     UserIsPrintFile
          This returns whether the user in the script user
          buffer has automatic trap-to-print file turned on
          as a Boolean value.
          
     UserIsProblem
          This returns whether the user in the script user
          buffer is a problem user as a Boolean value.
          
     UserIsPsycho
          This returns whether the user in the script user
          buffer has psycho chicken turned on as a Boolean
          value.
          
     UserIsPUnPauses
          
          This returns whether the user in the script user buffer
          has P Unpauses turned on as a Boolean value.
          
     UserIsRoomExcluded index
          This returns whether the user in the script user
          buffer has a room excluded as a Boolean value.
          index is an integer value specifying which room to
          check.
          
     UserIsRoomInPersonalHall index
          This returns whether the user in the script user
          buffer has a room in his personal hall as a
          Boolean value. index is an integer value
          specifying which room to check.
          
     UserIsSurnameLocked
          This returns whether the user in the script user
          buffer has his title and surname locked as a
          Boolean value.
          
     UserIsSysop
          This returns whether the user in the script user
          buffer is a Sysop as a Boolean value.
          
     UserIsTabs
          This returns whether the user in the script user
          buffer has tabs turned on as a Boolean value.
          
     UserIsTwirly
          This returns whether the user in the script user
          buffer has the twirly cursor turned on as a
          Boolean value.
          
     UserIsUnlisted
          This returns whether the user in the script user
          buffer is not listed in the userlog as a Boolean
          value.
          
     UserIsUpload
          This returns whether the user in the script user
          buffer may upload files as a Boolean value.
          
     UserIsUpperOnly
          This returns whether the user in the script user
          buffer has upper case only turned on as a Boolean
          value.
          
     UserIsUsePersonalHall
          This returns whether the user in the script user
          buffer is using his personal hall as a Boolean
          value.
          
     UserIsUserDefined code
          This returns whether user-defined data for the
          user in the script user buffer has been defined as
          a Boolean data. code is a string value giving a
          code used to distinguish the data. With user-
          defined data, your script can easily store
          information in each user's data files on disk.
          Just be sure to pick a unique code so your script
          does not conflict with other people's scripts.
          code can be any string up to 30 characters long,
          so you can do something like use your name
          followed by a number ("Brent Bottles 1" for
          example) and be reasonably assured of uniqueness.
          
     UserIsUserSignatureLocked
          
          This returns whether the user in the script user buffer
          has his signature locked as a Boolean value.
          
     UserIsVerboseLogOut
          This returns whether the user in the script user
          buffer has verbose log-out turned on as a Boolean
          value.
          
     UserIsVerified
          This returns whether the user in the script user
          buffer has been verified as a Boolean value.
          
     UserIsViewBorders
          This returns whether the user in the script user
          buffer has the display of borders turned on as a
          Boolean value.
          
     UserIsViewCensoredMessages
          This returns whether the user in the script user
          buffer has the display of censored messages turned
          on as a Boolean value.
          
     UserIsViewCommas
          
          This returns whether the user in the script user buffer
          has the display of commas as thousands separators
          in number turned on as a Boolean value.
          
     UserIsViewHallDescription
          This returns whether the user in the script user
          buffer has the display of hall description files
          turned on as a Boolean value.
          
     UserIsViewRoomDesc
          This returns whether the user in the script user
          buffer has the display of room description files
          turned on as a Boolean value.
          
     UserIsViewRoomInfoLines
          This returns whether the user in the script user
          buffer has the display of room information lines
          turned on as a Boolean value.
          
     UserIsViewSignatures
          This returns whether the user in the script user
          buffer has the display of signatures turned on as
          a Boolean value.
          
     UserIsViewSubjects
          This returns whether the user in the script user
          buffer has the display of subjects turned on as a
          Boolean value.
          
     UserIsViewTitleSurname
          This returns whether the user in the script user
          buffer has the display of titles and surnames
          turned on as a Boolean value.
          
     UserIsWideRoom
          This returns whether the user in the script user
          buffer has wide rooms turned on as a Boolean
          value.
          
     UserIsWordInDictionary word
          This returns whether a word is in the personal
          dictionary of the user in the script user buffer
          as a Boolean value. word is the word to check.
          
     UserIsYouAreHere
          
          This returns whether the user in the script user buffer
          has you are here turned on as a Boolean value.
          
     UserLoad index
          This loads a user off disk into the script user
          buffer. index is an integer value that specifies
          which user to load. This returns a Boolean value:
          TRUE if the user could be loaded; FALSE if not.
          
     UserRemoveKillNode nodename
          This removes a node-based message exclusion from
          the user in the script user buffer. nodename is a
          string value giving the name of the node to stop
          excluding. This returns a Boolean value: TRUE if
          the node could be removed; FALSE if not (most
          likely, the node wasn't excluded).
          
     UserRemoveKillRegion region
          This removes a region-based message exclusion from
          the user in the script user buffer. region is a
          string value giving the name of the region to stop
          excluding. This returns a Boolean value: TRUE if
          the region could be removed; FALSE if not (most
          likely, the region wasn't excluded).
          
     UserRemoveKillText text
          This removes a text-based message exclusion from
          the user in the script user buffer. text is a
          string value giving the text to stop excluding.
          This returns a Boolean value: TRUE if the text
          could be removed; FALSE if not (most likely, the
          text wasn't excluded).
          
     UserRemoveKillUser username
          This removes a user-based message exclusion from
          the user in the script user buffer. username is a
          string value giving the name of the user to stop
          excluding. This returns a Boolean value: TRUE if
          the user could be removed; FALSE if not (most
          likely, the user wasn't excluded).
          
     UserRemoveUserDefined code
          This removes user-defined data from the user in
          the script user buffer. code is a string value
          giving a code used to distinguish the data. With
          user-defined data, your script can easily store
          information in each user's data files on disk.
          Just be sure to pick a unique code so your script
          does not conflict with other people's scripts.
          code can be any string up to 30 characters long,
          so you can do something like use your name
          followed by a number ("Brent Bottles 1" for
          example) and be reasonably assured of uniqueness.
          This returns a Boolean value: TRUE if the data
          could be removed; FALSE if not (most likely, the
          data wasn't defined).
          
     UserRemoveWordFromDictionary word
          This removes a word from the personal dictionary
          of the user in the script user buffer. word is a
          string value giving the word to remove from the
          dictionary. This returns a Boolean value: TRUE if
          the word could be removed; FALSE if not (most
          likely, the word was not in the user's personal
          dictionary).
          
     UserSave index
          
          This saves the user in the script user buffer to disk.
          index is the position in the log files to save the
          user. This returns a Boolean value: TRUE if the
          user could be saved; FALSE if not.
          
     UserSetAccounting accounting
          This sets whether the user in the script user
          buffer has accounting turned on. accounting is a
          Boolean value: TRUE to turn accounting on; FALSE
          to turn it off.
          
     UserSetAide aide
          This sets whether the user in the script user
          buffer is an aide. aide is a Boolean value: TRUE
          to make the user an aide; FALSE to make the user
          not an aide.
          
     UserSetAlias alias
          This sets the alias of the user in the script user
          buffer. alias is a string value giving the new
          alias.
          
     UserSetAutoNextHall autonexthall
          
          This sets whether the user in the script user buffer
          has auto-next-hall turned on. autonexthall is a
          Boolean value: TRUE to turn it on; FALSE to turn
          it off.
          
     UserSetAutoVerbose autoverbose
          This sets whether the user in the script user
          buffer has auto-verbose turned on. autoverbose is
          a Boolean value: TRUE to turn it on; FALSE to turn
          it off.
          
     UserSetBirthDate date
          This sets the birth date of the user in the script
          user buffer. date is a long value giving the time
          of midnight on the morning of the user's birth
          date.
          
     UserSetCallLimit limit
          This sets the call-per-day limit of the user in
          the script user buffer. limit is an integer value
          giving the new limit. Use 0 to remove the limit.
          
     UserSetCallNumber number
          
          This sets the last call number of the user in the
          script user buffer. number is a long value giving
          the new call number.
          
     UserSetCallsToday calls
          This sets the number of calls the user in the
          script user buffer made during the last day that
          the user called. calls is an integer value giving
          the number of calls.
          
     UserSetCallTime time
          This sets the time the user in the script user
          buffer last called. time is a long value giving
          the time of the last call.
          
     UserSetChat maychat
          This sets whether the user in the script user
          buffer has access to the Chat (C) command. maychat
          is a Boolean value: TRUE to let the user chat;
          FALSE to not.
          
     UserSetCheckAllCaps checkcaps
          
          This sets whether the user in the script user buffer
          has checking of words in all-caps turned on in the
          spell checker. checkcaps is a Boolean value: TRUE
          to turn on checking of all-caps; FALSE to turn it
          off.
          
     UserSetCheckApostropheS check
          This sets whether the user in the script user
          buffer has apostrophe s checking turned on in the
          spell checker. check is a Boolean value: TRUE to
          turn on checking; FALSE to turn it off.
          
     UserSetCheckDigits check
          This sets whether the user in the script user
          buffer has digit checking turned on in the spell
          checker. check is a Boolean value: TRUE to turn on
          checking; FALSE to turn it off.
          
     UserSetClearScreenBetweenMessages cls
          This sets whether the user in the script user
          buffer has clear-screen-between-messages turned on
          or not. cls is a Boolean value: TRUE to turn it
          on; FALSE to turn it off.
          
     UserSetConfirmNoEO confirm
          This sets whether the user in the script user
          buffer has confirm not .EO turned on or not.
          confirm is a Boolean value: TRUE to turn it on;
          FALSE to turn it off.
          
     UserSetCredits credits
          This sets the number of credits the user in the
          script user buffer has in his account. credits is
          a long value giving the new number of credits.
          (Remember that Citadel thinks of credits
          internally in terms of seconds, not minutes.)
          
     UserSetDateStamp stamp
          This sets the date stamp of the user in the script
          user buffer. stamp is a string value giving the
          new date stamp.
          
     UserSetDefaultHall hallname
          This sets the default hall of the user in the
          script user buffer. hallname is a string value
          giving the name of the new default hall.
          
     UserSetDefaultHallLocked locked
          This sets whether the default hall of the user in
          the script user buffer is locked or not. locked is
          a Boolean value: TRUE if the hall is to be locked;
          FALSE if not.
          
     UserSetDefaultProtocol protocol
          This sets the default file transfer protocol of
          the user in the script user buffer. protocol is a
          string value, the first letter of which gives the
          menu command for the file transfer protocol to be
          used as default.
          
     UserSetDefaultRoom roomname
          This sets the default room of the user in the
          script user buffer. roomname is a string value
          giving the name of the room to make the default
          room. Note that the default room is not currently
          in use.
          
     UserSetDL_Bytes bytes
          This sets the number of bytes downloaded by the
          user in the script user buffer. bytes is a long
          value giving the new number of bytes downloaded.
          
     UserSetDL_Num files
          This sets the number of files downloaded by the
          user in the script user buffer. files is an
          integer value giving the new number of files
          downloaded.
          
     UserSetDownload maydownload
          This sets whether the user in the script user
          buffer may download files. maydownload is a
          Boolean value: TRUE if the user may download;
          FALSE if not.
          
     UserSetDungeoned dungeoned
          This sets whether the user in the script user
          buffer is dungeoned or not. dungeoned is a Boolean
          value: TRUE if the user is dungeoned; FALSE if
          not. Note that dungeoning currently has no effect.
          
     UserSetEnterBorders mayenter
          This sets whether the user in the script user
          buffer may enter (change) borders. mayenter is a
          Boolean value: TRUE if the user may enter borders;
          FALSE if not.
          
     UserSetExcludeEncryptedMessages exclude
          This sets whether the user in the script user
          buffer excludes encrypted messages or not. exclude
          is a Boolean value: TRUE to exclude encrypted
          messages; FALSE to not.
          
     UserSetExpert expert
          This sets whether the user in the script user
          buffer is an expert or not. expert is a Boolean
          value: TRUE if the user is an expert; FALSE if
          not.
          
     UserSetFirstOn time
          This sets the time the user in the script user
          buffer was first on the system. time is a long
          value giving the time.
          
     UserSetForwardAddr username
          This sets the forwarding address of the user in
          the script user buffer. username is a string value
          giving the name of the user to forward messages
          to.
          
     UserSetForwardAddrNode nodename
          This sets the node of the forwarding address of
          the user in the script user buffer. nodename is a
          string value giving the name of the node to
          forward messages to.
          
     UserSetForwardAddrRegion region
          This sets the region of the forwarding address of
          the user in the script user buffer. region is a
          string value giving the region of the node to
          forward messages to.
          
     UserSetForwardToNode fwd
          This sets whether to forward mail to the user in
          the script user buffer to another node or not. fwd
          is a Boolean value: TRUE to forward the mail to
          another node; FALSE to not.
          
     UserSetHideMessageExclusions hide
          This sets whether the user in the script user
          buffer hides messages exclusions or not. hide is a
          Boolean value: TRUE to hide the message
          exclusions; FALSE to not.
          
     UserSetIBMANSI ibmansi
          This sets whether the user in the script user
          buffer has IBM ANSI turned on or not. ibmansi is a
          Boolean value: TRUE to set it on; FALSE to set it
          off.
          
     UserSetIBMColor ibmcolor
          This sets whether the user in the script user
          buffer has IBM color ANSI turned on or not.
          ibmcolor is a Boolean value: TRUE to set it on;
          FALSE to set it off.
          
     UserSetIBMGraph ibmgraph
          This sets whether the user in the script user
          buffer has IBM graphics characters turned on or
          not. ibmgraph is a Boolean value: TRUE to set them
          on; FALSE to set them off.
          
     UserSetIBMRoom ibmroom
          This sets whether to use IBM graphics characters
          in room prompts for the user in the script user
          buffer. ibmroom is a Boolean value: TRUE to use
          them; FALSE to not.
          
     UserSetInGroup group ingroup
          This sets whether the user in the script user
          buffer is in a group. group is an integer value
          giving the index of the group. ingroup is a
          Boolean value: TRUE to place the user in the
          group; FALSE to remove him.
          
     UserSetInitials initials
          This sets the initials of the user in the script
          user buffer. initials is a string value giving the
          new initials.
          
     UserSetInRoom room inroom
          
          This sets whether the user in the script user buffer is
          in a room. room is an integer value giving the
          index of the room. inroom is a Boolean value: TRUE
          to place the user in the room; FALSE to remove
          him.
          
     UserSetInuse inuse
          This sets whether the user in the script user
          buffer is in use or not. inuse is a Boolean value:
          TRUE to make the user in use; FALSE to not.
          
     UserSetLastHall lasthall
          This sets the last hall the user in the script
          user buffer was in during the last call. lasthall
          is a string value giving the name of the hall.
          
     UserSetLastMessage msgnumber
          This sets the last message on the system during
          the user in the script user buffer's last call.
          msgnumber is a long value giving the number of the
          message.
          
     UserSetLastRoom lastroom
          
          This sets the last room the user in the script user
          buffer was in during the last call. lastroom is a
          string value giving the name of the room.
          
     UserSetLinefeeds linefeeds
          This sets whether the user in the script user
          buffer has linefeeds turned on or not. linefeeds
          is a Boolean value: TRUE to turn on linefeeds;
          FALSE to not.
          
     UserSetLinesPerScreen lines
          This sets the number of lines on the screen of the
          user in the script user buffer. lines is an
          integer value giving the number of lines. Use 0 to
          turn off pause-on-full-screen.
          
     UserSetLocID locid
          This sets the Location Identifier of the user in
          the script user buffer. locid is a string value
          giving the new Location Identifier. (This is
          generally used only for nodes.)
          
     UserSetLogins number
          
          This sets the number of times the user in the script
          user buffer has logged into the system. number is
          an integer value giving the number of log-ins.
          
     UserSetMail mail
          This sets whether the user in the script user
          buffer may leave mail. mail is a Boolean value:
          TRUE if he may leave mail; FALSE if not.
          
     UserSetMailAddr1 addr1
          This sets the first line of the mailing address of
          the user in the script user buffer. addr1 is a
          string value giving the line.
          
     UserSetMailAddr2 addr2
          This sets the second line of the mailing address
          of the user in the script user buffer. addr2 is a
          string value giving the line.
          
     UserSetMailAddr3 addr3
          This sets the third line of the mailing address of
          the user in the script user buffer. addr3 is a
          string value giving the line.
          
     UserSetMakeRoom makeroom
          This sets whether the user in the script user
          buffer may make rooms or not. makeroom is a
          Boolean value: TRUE to allow room creation; FALSE
          to not.
          
     UserSetMinibin minibin
          This sets whether the user in the script user
          buffer has Minibin usage statistics turned on or
          not. minibin is a Boolean value: TRUE if the
          statistics are on: FALSE if not.
          
     UserSetMorePrompt prompt
          This sets the more prompt of the user in the
          script user buffer. prompt is a string value
          giving the new more prompt.
          
     UserSetMusic music
          This sets whether the user in the script user
          buffer has music turned on or not. music is a
          Boolean value: TRUE if music is on; FALSE if off.
          
     UserSetName name
          This sets the name of the user in the script user
          buffer. name is a string value giving the new name
          to use.
          
     UserSetNetPrefix prefix
          This sets the net prefix of the user in the script
          user buffer. prefix is a string value giving the
          new net prefix.
          
     UserSetNetUser netuser
          This sets whether the user in the script user
          buffer is a net user or not. netuser is a Boolean
          value: TRUE to make the user a Netuser; FALSE to
          not.
          
     UserSetNode node
          This sets whether the user in the script user
          buffer is a node. node is a Boolean value: TRUE to
          make the user a node; FALSE to not.
          
     UserSetNulls nulls
          This sets the number of nulls for the user in the
          script user buffer. nulls is an integer value
          giving the number of nulls.
          
     UserSetNumUserShow number
          This sets the number of users to show on log-in
          for the user in the script user buffer. number is
          an integer value giving the number of users to
          show.
          
     UserSetOccupation occupation
          This sets the occupation of the user in the script
          user buffer. occupation is a string value giving
          the occupation.
          
     UserSetOldToo oldtoo
          This sets whether the user in the script user
          buffer sees the last old message when reading new
          messages. oldtoo is a Boolean value: TRUE to view
          last old on new; FALSE to not.
          
     UserSetOut300 out300
          
          This sets whether the user in the script user buffer
          has 300 baud simulation turned on or not. out300
          is a Boolean value: TRUE to turn it on; FALSE to
          not.
          
     UserSetPassword password
          This sets the password of the user in the script
          user buffer. password is a string value giving the
          new password to use.
          
     UserSetPasswordChangeTime time
          This sets the time the user last changed his
          password. time is a long value giving the time.
          
     UserSetPauseBetweenMessages pause
          This sets whether the user in the script user
          buffer has pause-between-messages turned on or
          not. pause is a Boolean value: TRUE to pause;
          FALSE to not.
          
     UserSetPermanent permanent
          This sets whether the user in the script user
          buffer is permanent or not. permanent is a Boolean
          value: TRUE to make the user permanent; FALSE to
          not.
          
     UserSetPhoneNumber phonenum
          This sets the phone number of the user in the
          script user buffer. phonenum is a string value
          giving the user's phone number.
          
     UserSetPoopcount poopcount
          This sets the poopcount of the user in the script
          user buffer. poopcount is a long value giving the
          new poopcount.
          
     UserSetPosted number
          This sets the number of messages posted by the
          user in the script user buffer. number is a long
          value giving the total number of messages posted.
          
     UserSetPrintFile printfile
          This sets whether automatic capture to print file
          is turned on for the user in the script user
          buffer. printfile is a Boolean value: TRUE to turn
          on automatic capture; FALSE to not.
          
     UserSetProblem problem
          This sets whether the user in the script user
          buffer is a problem user or not. problem is a
          Boolean value: TRUE to make the user a problem
          user; FALSE to not.
          
     UserSetPromptFormat prompt
          This sets the room prompt format for the user in
          the script user buffer. prompt is a string value
          giving the new room prompt format.
          
     UserSetPsycho psycho
          This sets whether the user in the script user
          buffer has psycho chicken turned on or not. psycho
          is a Boolean value: TRUE to turn it on; FALSE to
          turn it off.
          
     UserSetPUnPauses punpauses
          This sets whether the P key un-pauses for the user
          in the script user buffer. punpauses is a Boolean
          value: TRUE to make it un-pause; FALSE to not.
          
     UserSetRead number
          This sets the total number of messages read by the
          user in the script user buffer. number is a long
          value giving the number of messages read.
          
     UserSetRealName name
          This sets the real name of the user in the script
          user buffer. name is a string value giving the new
          real name.
          
     UserSetRoomExcluded room excluded
          This sets whether the user in the script user
          buffer has a room excluded or not. room is an
          integer value giving the room index to set.
          excluded is a Boolean value: TRUE to exclude the
          room; FALSE to not.
          
     UserSetRoomInPersonalHall room inhall
          This sets whether a room is in the personal hall
          of the user in the script user buffer. room is an
          integer value giving the room index to set. inhall
          is a Boolean value: TRUE to place the room in the
          hall; FALSE to remove it.
          
     UserSetRoomNewPointer room pointer
          This sets the new message pointer for the user in
          the script user buffer in a particular room. room
          is an integer value giving the room index to set.
          pointer is a long value, giving the message number
          of the last old message in the room
          
     UserSetSex sex
          This sets the sex of the user in the script user
          buffer. sex is an integer value: 0 to make the sex
          unspecified; 1 to set the sex as male; or 2 to set
          the sex as female.
          
     UserSetSignature signature
          This sets the user signature of the user in the
          script user buffer. signature is a string value
          giving the new signature.
          
     UserSetSpellCheckMode mode
          This sets the spell checker mode of the user in
          the script user buffer.
          
     UserSetSurname surname
          This sets the new surname for the user in the
          script user buffer. surname is a string value
          giving the new surname to use.
          
     UserSetSurnameLocked locked
          This sets whether the title and surname of the
          user in the script user buffer is locked or not.
          locked is a Boolean value: TRUE to lock the title
          and surname; FALSE to unlock them.
          
     UserSetSysop sysop
          This sets whether the user in the script user
          buffer is a sysop or not. sysop is a Boolean
          value: TRUE to make the user a sysop; FALSE to
          not.
          
     UserSetTabs tabs
          
          This sets whether the user in the script user buffer
          has tabs turned on or not. tabs is a Boolean
          value: TRUE to turn tabs on; FALSE to turn them
          off.
          
     UserSetTitle title
          This sets the title of the user in the script user
          buffer. title is a string value giving the new
          title.
          
     UserSetTotalTime time
          This sets the total time spent on the system by
          the user in the script user buffer. time is a long
          value giving the total time in seconds.
          
     UserSetTwirly twirly
          This sets whether the user in the script user
          buffer has the twirly cursor turned on or not.
          twirly is a Boolean value: TRUE to turn the twirly
          cursor on; FALSE to turn it off.
          
     UserSetUL_Bytes bytes
          
          This sets the number of bytes uploaded by the user in
          the script user buffer. bytes is a long value to
          use as the new number of bytes uploaded.
          
     UserSetUL_Num files
          This sets the number of files uploaded by the user
          in the script user buffer. files is an integer
          value to use as the new number of files uploaded.
          
     UserSetUnlisted unlisted
          This sets whether the user in the script user
          buffer has an unlisted account or not. unlisted is
          a Boolean value: TRUE to set the account as
          unlisted; FALSE to set it as listed.
          
     UserSetUpload mayupload
          This sets whether the user in the script user
          buffer may upload or not. mayupload is a Boolean
          value: TRUE if the user may upload; FALSE if not.
          
     UserSetUpperOnly upperonly
          This sets whether the user in the script user
          buffer has uppercase-only turned on. upperonly is
          a Boolean value: TRUE to set uppercase-only on;
          FALSE to set it off.
          
     UserSetUsePersonalHall userpersonal
          This sets whether the user in the script user
          buffer is set to use his personal hall or not.
          usepersonal is a Boolean value: TRUE to use the
          personal hall; FALSE to not.
          
     UserSetUserDefined code data
          This sets user-defined data for the user in the
          script user buffer. code is a string value giving
          a code used to distinguish the data. data is a
          string value which is the actual data to set. With
          user-defined data, your script can easily store
          information in each user's data files on disk.
          Just be sure to pick a unique code so your script
          does not conflict with other people's scripts.
          code can be any string up to 30 characters long,
          so you can do something like use your name
          followed by a number ("Brent Bottles 1" for
          example) and be reasonably assured of uniqueness.
          
     UserSetUserSignatureLocked lock
          This sets whether the user in the script user
          buffer has a locked user signature or not. lock is
          a Boolean value: TRUE to lock the signature; FALSE
          to unlock it.
          
     UserSetVerboseDateStamp stamp
          This sets the verbose date stamp for the user in
          the script user buffer. stamp is a string value to
          use as the new verbose date stamp.
          
     UserSetVerboseLogOut vlogout
          This sets whether the user in the script user
          buffer has verbose log-out turned on or not.
          vlogout is a Boolean value: TRUE to turn it on;
          FALSE to turn it off.
          
     UserSetVerified verified
          This sets whether the user in the script user
          buffer is verified or not. verified is a Boolean
          value: TRUE to verify the user; FALSE to deverify
          him.
          
     UserSetViewBorders viewborders
          This sets whether the user in the script user
          buffer views borders and ads or not. viewborders
          is a Boolean value: TRUE to view borders; FALSE to
          not.
          
     UserSetViewCensoredMessages viewcensored
          This sets whether the user in the script user
          buffer views censored messages or not.
          viewcensored is a Boolean value: TRUE to view
          censored messages; FALSE to not.
          
     UserSetViewCommas commas
          This sets whether the user in the script user
          buffer views commas as a thousands separator in
          numbers or not. commas is a Boolean value: TRUE to
          view them; FALSE to not.
          
     UserSetViewHallDescription desc
          
          This sets whether the user in the script user buffer
          views hall descriptions or not. desc is a Boolean
          value: TRUE to view hall descriptions; FALSE to
          not.
          
     UserSetViewRoomDesc desc
          This sets whether the user in the script user
          buffer views room descriptions or not. desc is a
          Boolean value: TRUE to view room descriptions;
          FALSE to not.
          
     UserSetViewRoomInfoLines info
          This sets whether the user in the script user
          buffer views room information lines or not. desc
          is a Boolean value: TRUE to view room information
          lines; FALSE to not.
          
     UserSetViewSignatures signatures
          This sets whether the user in the script user
          buffer views signatures or not. signatures is a
          Boolean value: TRUE to view signatures; FALSE to
          not.
          
     UserSetViewSubjects subjects
          This sets whether the user in the script user
          buffer views message subjects or not. subjects is
          a Boolean value: TRUE to view message subjects;
          FALSE to not.
          
     UserSetViewTitleSurname titlesurname
          This sets whether the user in the script user
          buffer views titles and surnames or not.
          titlesurname is a Boolean value: TRUE to view
          titles and surnames; FALSE to not.
          
     UserSetWhereHear wherehear
          This sets where the user in the script user buffer
          heard about the system. wherehear is a string
          value to use as where he heard about it.
          
     UserSetWideRoom wideroom
          This sets whether the user in the script user
          buffer has wide rooms turned on or not. wideroom
          is a Boolean value: TRUE to turn on wide rooms;
          FALSE to turn it off.
          
     UserSetWidth width
          This sets the terminal width of the user in the
          script user buffer. width is an integer value of
          the new width of his terminal.
          
     UserSetYouAreHere youarehere
          This sets whether the user in the script user
          buffer has you are here on or not. youarehere is a
          Boolean value: TRUE to turn on you are here; FALSE
          to turn it off.
          
     UserStart
          This allocates a buffer for the script to load,
          edit, and save users. This returns a Boolean
          value: TRUE if the buffer could be allocated;
          FALSE if not (Citadel is out of memory). If there
          is already a script user buffer, this clears it
          and sets all values to their default.
          
     UserUseCurrentUser
          This is a short-cut to load the current user into
          the script's user buffer, instead of having to
          find the user's index and call UserLoad.
          
     WaitFor text timeout
          This waits for the text given by text to come in
          over the modem. timeout is the number of seconds
          to wait before giving up. This returns a Boolean
          value: TRUE if the text was found; FALSE if not
          (Citadel timed-out).
          
     WriteApl code value
          This writes something to INPUT.APL. This is a
          quick-and-dirty way to make a change in Citadel:
          after the script is finished running, Citadel
          checks for INPUT.APL and uses the data in it to
          change its configuration. See the Applications
          section for full information on this file. code is
          the INPUT.APL code to write and value is the value
          to write for the code. This returns a Boolean
          value: TRUE if the file could be updated; FALSE if
          it couldn't.
          
     WriteBool filenumber value
          
          This writes the Boolean value value to the file
          referenced by the integer value filenumber.
          
     WriteChar filenumber value
          This writes a character with the ASCII value
          specified by the integer value value to the file
          referenced by the integer value filenumber.
          
     WriteInt filenumber value
          This writes the integer value value to the file
          referenced by the integer value filenumber.
          
     WriteLong filenumber value
          This writes the long value value to the file
          referenced by the integer value filenumber.
          
     WriteStr filenumber value terminate
          This writes the string value value to the file
          referenced by the integer value filenumber. The
          string is terminated according to the value of the
          integer variable terminate:
          
               0    Don't write anything after the string.
                    
               1    Write ASCII 0 (NUL) after the string.
                    
               2    Write an ASCII 13 (CR) followed by an
                    ASCII 10 (LF) after the string.
                    
     WriteUInt filenumber value
          This writes the unsigned integer value value to
          the file referenced by the integer value
          filenumber.
          
     WriteULong filenumber value
          This writes the unsigned long value value to the
          file referenced by the integer value filenumber.
          
Citadel internal functions by function

Following is a list of internal functions grouped by
function. See the previous topic for details of the
functions. Dial.


Configuration

Debugging
AddWatch

ClearBreakPoint

DebuggingMsg


Files
ChangeDir

CloseFile

CountDirectory

DeleteFile


Messages

Networking
AddNetIDToNetIDCit

AppendToNetCommandReply


Users
AddUser


Rooms

Halls

Groups
AddUser


User interaction
AskYN

Chat

ChatReq

CheckUserOutControl

DecToHex

Dial


String duplication checking
AddDupCheck

CheckForDup


Miscellaneous
AddCommasToNumber

ASCIIToChar

CharToASCII

_Appendix A: Customization

If you wish to change the messages that appear when running
Citadel, or the dictionary, you will need the Citadel
Customization Kit, available from The Anticlimactic
Teleservice at (206)562-9792. This section explains how to
use the Kit.

Note:     This section might be too technical for some
     users. If you don't understand what is being said,
     please don't attempt to change things, unless you have
     a backup of everything. By modifying the files
     described in this document in the wrong way, you can
     easily make Citadel not run properly or not run at all.
     If you have any questions, please ask before trying
     anything.
     
Usually, Citadel reads string information (what it displays
to the user) from CTDL.EXE. However, it first looks for a
file named CTDL.DAT. If it finds this file, it uses it to
load its strings out of. By creating a specialized CTDL.DAT,
you can give your board its own special look. However, be
warned that doing this once does not mean that you have done
it for good: future revisions of Citadel will be looking for
different information in the CTDL.DAT file. While most of
the strings we add will go after the existing strings, there
is no guarantee that we will not change the order of
strings. We will not go out of our way to change the data,
but we also will not avoid doing it to further enhance
Citadel's memory usage.

What this means is that you might have to do some extra work
next time you update your Citadel software if you want to
keep your changes to CTDL.DAT changed. If you make more
changes, you will have more work to do when updating than if
you don't make as many changes.

If you add words to Citadel's spell checker by modifying ENG-
AM.DAT, please send us your new dictionary, so we can update
the distribution dictionary as well. There are 115,756 words
in the dictionary, which includes most of the common words
in the English language, but there might be some missing. We
don't have the time to add more words, so would appreciate
any help we can receive.


The CTDL.DAT File
Citadel loads various parts of CTDL.DAT into memory when it
needs to do certain tasks. For example, a section is loaded
into memory when you enter the sysop "Privileged Function"
menu, from either F6 or the .Sysop (.S...) command. This
section includes all the text of the sysop commands. When
you abort out of this menu, the memory is released for other
use.

Allowing the strings to be in a separate file like this
gives two benefits: it lets users modify strings without
needing source code to the CTDL.EXE program itself, and it
saves memory by not keeping more strings than are needed in
memory at a time. (The same memory management is in effect
if not running with a CTDL.DAT file: Citadel knows to read
only part of CTDL.EXE at a time, just as it reads part of
CTDL.DAT at a time.)

Citadel refers to different sections in the file by number,
and different sub-sections in a section by number. You must
have all sections Citadel expects: there is no error
checking done when loading data from CTDL.DAT, and a
corrupted file or missing sections will cause Citadel to
crash (or at least look really funky).

For speedy lookup and loading, CTDL.DAT is a binary file.
That is, one that you cannot easily edit. A program in the
customization kit, CTDLDAT.EXE, reads in a text file (that
is, one that you can easily edit) and turns it into
CTDL.DAT. This is the same program that we use to create a
CTDL.DAT that is combined with CTDL.EXE and distributed as
Citadel.


Using CTDLDAT.EXE
To run CTDLDAT.EXE, you must first have the text file for it
to read. By default, this file is called CTDLDATA.DEF, but
it can be named anything you desire, by specifying the name
on the CTDLDAT command line. That is, to create CTDL.DAT
from the CTDLDATA.DEF file, use the following command:

     C:\CIT>ctdldat
                    
If your data is kept in a different file, such as
MYCTDL.DEF, then just enter that name on the command line,
as follows:

     C:\CIT>ctdldat myctdl.def
                    
CTDLDAT will then read information out of MYCTDL.DEF, not
CTDLDATA.DEF.

As it runs, CTDLDAT will display exclamation marks and
periods, which indicate new sections and sub-sections,
respectively. Once all data is read, it reports how much
memory is free, then starts writing the data, again
displaying exclamation marks and periods. Because much of
the data in this file, it takes a while to write it. Any
line in the input file that is not understood will simply be
ignored by CTDLDAT, and an error message will be displayed
to the screen. If you have any of these errors, fix them
before trying to run Citadel with the resulting CTDL.DAT
file, or it will probably crash.


The CTDLDATA.DEF file
The general format for the CTDLDATA.DEF file is as follows:

     VERSION x
     
     ENTRY
                    SUBENTRY TYPE
                         DATA
                    ENDSUB
     ENDENT
                    
Any number of SUBENTRY blocks can be in an ENTRY block, and
any number of ENTRY blocks can be in a file. But, of course,
Citadel expects a certain number of each.

The VERSION is a number used by Citadel to check that you
are using the correct version of CTDL.DAT. Citadel expects
this number to be 1000 times its major version number plus
its minor version number. Therefore, Citadel+/065.106
expects this to be 65106. That is, the following line should
be in CTDLDATA.DEF:

     VERSION 65106
                    
Note:     Your version of Citadel is not 65.106: use
     whatever version number that comes with your
     customization kit.
     
As explained earlier, Citadel refers to entries in CTDL.DAT
by number, and subentries within entries by number. This
number is the location of the entry block in CTDLDATA.DEF.
This means that the order of this file is important, so
don't re-order the contents.

The currently-defined SUBENTRY types are STRING, STRCMP,
STRCMPA, STRCMPK, STRCMPT, STRCMPX, and RAWDATA. STRING and
STRCMPx types are tables of strings used by the program (the
various STRCMPx types are strings compressed with various
algorithms), and RAWDATA is just a list of defined bytes. In
future releases of Citadel, more subentry types might be
added as needed.

There are two basic types of data compression available for
strings: STRCMP and STRCMPX. The other types are just
slightly modified versions of STRCMP. STRCMPX does not
compress as well as the rest, but it decompresses almost
instantaneously. Therefore, it is used for sections that are
read often while the program is in use. The others are used
for data that is not used as often. STRCMPA is optimized for
alphabetic characters only; STRCMPK is optimized for
characters used in keywords (#, A-Z, 0-9, _, and !); and
STRCMPT is optimized for general text (letters, numbers,
punctuation, etc.).

There are two valid DATA lines for the various STRING
subentries: STRING and STRFILE. STRING data lines are
written to CTDL.DAT string by string. STRFILE entries tell
CTDLDAT to read in a text file, and output each line of the
file as a separate string.

There are also two valid DATA lines for RAWDATA subentries:
DB (Define Byte) followed by a list of numbers showing the
value of each byte, and DW (Define Word) followed by a list
of numbers showing the value of each word (two bytes).


What Citadel expects
This is the order of entries and subentries that
Citadel+/065.106 expects to find in CTDL.DAT, and thus
should be in CTDLDATA.DEF:

     1.   The first entry is used when configuring, and has
          the following subentries:
          
          1.   Messages used in configuration.
               
          2.   CONFIG.CIT keywords.
               
          3.   Trap types, for the #TRAP CONFIG.CIT keyword.
               
          4.   Default new-user keywords, for the #USER
               CONFIG.CIT keyword. This section is no longer
               used, as the #USER keyword has been
               discontinued. However, it must still exist,
               as a place holder.
               
          5.   System setting keywords, for the #LOGIN
               CONFIG.CIT keyword.
               
          6.   Twit feature keywords, for the #TWIT_FEATURES
               CONFIG.CIT keyword.
               
          7.   Function key names, for the #DIALMACRO
               CONFIG.CIT keyword.
               
          8.   GRPDATA.CIT keywords.
               
          9.   EXTERNAL.CIT keywords.
               
          10.  Event keywords, for the #EVENT EXTERNAL.CIT
               keyword.
               
          11.  PROTOCOL.CIT keywords.
               
          12.  MDMRESLT.CIT keywords.
               
     2.   The second entry for general purpose messages, and
          has the following two subentries:
          
          1.   All general-purpose messages.
               
          2.   Messages for the F4 screen "doing" message.
               
          3.   Messages for writing to the trap file.
               
     3.   The third entry is used by the script language
          interpreter, and has the following subentries:
          
          1.   All script language keywords.
               
          2.   All internal script functions.
               
          3.   Status/error messages used when running
               scripts.
               
          4.   The names of the script commands.
               
     4.   The fourth entry is for time/date information, and
          has the following subentries:
          
          1.   Short month names.
               
          2.   Long month names.
               
          3.   Short day names.
               
          4.   Long day names.
               
          5.   What to call AM and PM.
               
Note:     The month and day names are not only used for
     output. They also tell Citadel what the names days and
     months are when reading configuration files, such as
     CRON.CIT. If you change these subentries, then you will
     also have to change your configuration files to reflect
     the different names.
     
     5.   This entry is used for networking, and has only
          one subentry:
          
          1.   Messages used when networking.
               
     6.   This entry is used for the F6 "Privileged
          Function" menu, and has only one subentry:
          
          1.   Messages used when in the sysop menu.
               
     7.   This entry is defined for miscellaneous strings.
          
          1.   The command line usage display.
               
          2.   The note explaining why you need to run
               Citadel with the -C command-line parameter.
               
     8.   These are the menus used in the Control+F6 console
          sysop interface. The menus are:
          
          1.   The main menu.
               
          2.   The hall menu.
               
          3.   The hall-room menu.
               
          4.   The room menu.
               
          5.   The user menu.
               
          6.   The group menu.
               
          7.   The help menu.
               
          8.   Help files menu.
               
          9.   DOS menu.
               
     9.   This entry is used for setting default user
          settings. It has only one subentry:
          
          1.   All the default user keywords.
               
     10.  This entry is used when loading the CRON.CIT file
          (and, actually, in the .SCL (Sysop Cron List)
          command.) It has the following two subentries:
          
          1.   Cron types, for the #DO CRON.CIT keyword.
               
          2.   All CRON.CIT keywords.
               
     11.  This entry is used for loading NODES.CIT.
          
          1.   All NODES.CIT keywords.
               
          2.   The #NETWORK types.
               
          3.   Messages used when reading NODES.CIT.
               
          4.   The #VERBOSE types.
               
     12.  The built-in menus.
          
          1.   The #ENTOPT menu.
               
          2.   The #KNOWN menu.
               
          3.   The #READOPT menu.
               
          4.   The #GRPGLOB menu.
               
          5.   The #EDIT menu.
               
          6.   The #TERMINATE menu.
               
          7.   The #SYSNET menu.
               
          8.   The #SYSGROUP menu.
               
          9.   The #SYSHALL menu.
               
          10.  The #SYSENTER menu.
               
          11.  The #AIDE menu.
               
          12.  The #AIDEQUEUE menu.
               
          13.  The #MAINDOT menu.
               
          14.  The #DOOR menu. Note that as doors are set up
               by individual sysops, the default #DOOR menu
               just alerts the user that the sysop has not
               set up the #DOOR menu in his CTDL.MNU file.
               
          15.  The #CRON menu.
               
          16.  The #SYSOP menu.
               
          17.  The #MAINOPT menu.
               
          18.  The #VOLKSWAGEN menu.
               
          19.  The #BULLETINS menu. As this is an optional
               menu, this is not used, and is only a place-
               holder.
               
          20.  The #INVITE menu.
               
          21.  The #FILEQUEUE menu.
               
          22.  The #HELP menu. As this is an optional menu,
               this is not used, and is only a place-holder.
               
          23.  The #PERSONAL menu.
               
          24.  The #PERSONALADD menu.
               
          25.  The #FINGER menu.
               
          26.  The #EDITTEXT menu.
               
          27.  The #SYSTABLE menu.
               
          28.  The #READWC menu.
               
          29.  The #ENTERWC menu.
               
     13.  This is used when processing network commands.
          
          1.   Messages used when processing network
               commands.
               
          2.   Network command names.
               
     14.  The built-in blurbs.
          
          1.   BULLETIN.BLB.
               
          2.   CHAT.BLB.
               
          3.   CLOSESYS.BLB.
               
          4.   ENTRY.BLB.
               
          5.   GOODBYE.BLB.
               
          6.   HELLO.BLB.
               
          7.   LOGOUT.BLB.
               
          8.   NEWMSG.BLB.
               
          9.   NEWQUEST.BLB.
               
          10.  NEWROOM.BLB.
               
          11.  NOCHAT.BLB.
               
          12.  NOLOGIN.BLB.
               
          13.  PASSWORD.BLB.
               
          14.  TEXTUP.BLB.
               
          15.  TOOLOW.BLB.
               
          16.  USERINFO.BLB.
               
          17   VERIFIED.BLB
               
          18.  WARNING.BLB.
               
          19.  WCDOWN.BLB.
               
          20.  WCUP.BLB.
               
          21.  NOROUTE.BLB.
               
          22.  CHATTED.BLB.
               
          23.  CENSOR.BLB.
               
          24.  RESUME.BLB.
               
          25.  DISCLAIM.BLB.
               
          26.  AD.BLB.
               
          27.  NOANSWER.BLB.
               
          28.  TOOMANY.BLB.
               
          29.  MOREPRMP.BLB.
               
          30.  REALNAME.BLB.
               
          31.  PHONENUM.BLB.
               
          32.  ADDRESS.BLB.
               
          33.  NETPREFX.BLB.
               
          34.  TIME.BLB.
               
          35.  PROMPT.BLB.
               
          36.  MSGNYM.BLB.
               
          37.  COLORS.BLB.
               
          38.  ENTERNYM.BLB.
               
          39.  ENCRYPT.BLB.
               
          40.  WOWCOUNT.BLB.
               
          41.  CALLIMIT.BLB.
               
          42.  WIDTH.BLB.
               
          43.  LENGTH.BLB.
               
          44.  NULLS.BLB.
               
          45.  NUMUSERS.BLB.
               
          46.  UNLINK.BLB.
               
     15.  The built-in help files.
          
          1.   ACCOUNT.HLP.
               
          2.   AIDE.HLP.
               
          3.   ANSI.HLP.
               
          4.   CONFIG.HLP.
               
          5.   DOHELP.HLP.
               
          6.   DOORS.HLP.
               
          7.   DOTCMDS.HLP.
               
          8.   ENTER.HLP.
               
          9.   FILES.HLP.
               
          10.  GROUPS.HLP.
               
          11.  HALLS.HLP.
               
          12.  HELP.HLP.
               
          13.  INTRO.HLP.
               
          14.  KNOWN.HLP.
               
          15.  LOGIN.HLP.
               
          16.  MEMBERS.HLP.
               
          17.  MESSAGES.HLP.
               
          18.  NETWORK.HLP.
               
          19.  POLICY.HLP.
               
          20.  QUEUE.HLP.
               
          21.  READ.HLP.
               
          22.  ROOMS.HLP.
               
          23.  ROOMSYS.HLP.
               
          24.  SPECIAL.HLP.
               
          25.  SPELL.HLP.
               
          26.  SURNAMES.HLP.
               
          27.  SYSOP.HLP.
               
     16.  This is the Huffman tree data used for message
          compression.
          
          1.   The Huffman tree data. Don't change this
               unless you are sure you know what you are
               doing.
               
     17.  Sample .CIT files.
          
          1.   EXTERNAL.CIT.
               
          2.   NODES.CIT.
               
          3.   GRPDATA.CIT.
               
          4.   CRON.CIT.
               
          5.   MDMRESLT.CIT.
               
          6.   PROTOCOL.CIT.
               
     18.  Used for ;; commands.
          
          1.   An index to all the ;; commands: each
               subentry following this tells what to display
               for the ;; commands. After the index, a
               string with just "#" denotes the end.
               
          2-x  The text of the ;; commands. In general, just
               place the text of the command, then a string
               with "-end-" at the end tells Citadel that it
               has come to the end. However, there are two
               special output types: the looping entry, and
               the random entry.
               
               For the looping entry, place a "#" string.
               When Citadel gets to this string, it will
               jump back to the beginning of the entry, and
               start displaying again. The only way out of
               this is for the user to use the Stop (S)
               command. See the ;;GREMCIT entry for an
               example.
               
               For the random entry, start the first line
               with an asterisk ("*") followed by the number
               of entries to choose from. Each entry starts
               with an exclamation mark ("!") as the first
               character of the line, and goes on until the
               next line that starts with an exclamation
               mark. After the last entry, make a string of
               just "!" to end it. See the ;;GOLTAR entry
               for an example.
               
     19.  Used for the .Volkswagen (.V) command.
          
               1.   xxx.
               

The ENG-AM.DAT File
As with CTDL.DAT, the ENG-AM.DAT file is a binary file, so
Citadel can search it quickly. However, Citadel itself
includes the ability to create this file, with either the -o
command line parameter or the Configuration option of the
main menu of the Control+F6 sysop interface. Choose Compile
Dictionary from the menu, and then enter the name of the
file to use as the input. Citadel will then compile the
dictionary file.

For the input file, use ENG-AM.TXT that comes with the
customization kit, or create your own file. This file is an
alphabetized listing of words, each on its own line
separated by CR/LF combinations. If there is some word out
of alphabetical order, Citadel will alert you to this, and
stop the compilation.

_Appendix B: External drivers

Note:     This section is not required for using Citadel. If
     you have unusual hardware, and experience writing
     assembly routines to access it, you can create external
     drivers that tell Citadel how to access your hardware.
     Currently, external driver support exists for serial
     communication, keyboard access, and sound card support.
     Support for video drivers is planned, but not yet
     implemented.
     
Citadel's external hardware drivers are actual machine code
that access the hardware being supported. Therefore, to
create an external hardware driver, you need some method to
create machine code. The examples and discussion that
follows uses Borland's Turbo Assembler, but you may be able
to use other development tools if they are able to create a
file of the format needed by Citadel.

The driver file must be smaller than 64K, as Citadel loads
it into a segment. No segment fix-ups are performed on the
file as it is loaded, so don't rely on the file being in any
specific segment. The CS register will, naturally, point to
the segment Citadel loaded the driver into, and can be used
to initialize the DS register to access any memory used by
the driver.

The general format of the files are as follows:

     Offset                Length    Data
     0                     32   Description. This is a NUL
                           terminated ASCII string that
                           defines the driver in English.
                           This description is displayed as
                           part of the .Read Verbose Status
                           (.RVS) command when the driver
                           is loaded.
     32                    256  Function offsets. Citadel
                           expects function offsets in this
                           part of the file, two bytes per
                           function. The order of these
                           offsets is defined by what type
                           of driver this is, as explained
                           below. Don't put anything else
                           in this area of the driver, as
                           it may cause unpredictable
                           results in future versions of
                           Citadel. (If, that is, you call
                           a system crash "unpredictable".)
     288                   variable  This is the actual
                           driver code and data, which (of
                           course) is different from driver
                           to driver.
     
All functions should conform to the C calling standard, as
is used by Borland C++ 3.x. That is, parameters are passed
left to right on the stack, and the calling function is
responsible for cleaning up the stack. Integer return values
should be placed in the AX register, and long integer return
values should be placed in the DX:AX register pair, with DX
being the MSW and AX being the LSW. All pointers, both
passed and returned, are far pointers.

A minimal driver, as coded in Borland's Turbo Assembler,
would look like this:

; skeleton hardware driver for citadel


ideal
model large, c

codeseg

org 0
desc   db 'Skeleton Hardware Driver'
       db 32 - ((offset $ - offset desc)) dup(0)
                              ; filler for alignment

       dw offset function     ; our function

       dw 127 dup (0)         ; 128 total entries reserved

proc function
       ret
endp
end

This shows all the major components of a Citadel hardware
driver: the description string, a function offset, space for
up to 128 offsets total, and a function. This skeleton is
essentially unchanged for all drivers.

What does change from driver to driver is, of course, the
functions. Perhaps the best way to show the functions of the
different drivers is with example source code. The following
code implements a skeleton driver for serial communications,
a full driver for use with the IBM PC keyboard, and a full
driver for use with the Sound Blaster sound card.

In the serial driver, the only non-obvious part is the
parameters for the init_port function, which are as follows:

     Port (0 to 3)
          0 = COM1  1 = COM2  2 = COM3  3 = COM4
          
     Baud (0 to 11 (0Bh))
          0 = 110   1 = 150   2 = 300   3 = 600
          4 = 1200  5 = 2400  6 = 4800  7 = 9600
          8 = 19200 9 = 38400 A = 57600 B = 115200
          
     Stops (0 to 1)
          
          0 = 1 stop bit 1 = 2 stop bits
          
     Parity (0 to 3)
          0 = none  1 = odd   2 = none  3 = even
          
     Len (0 to 3)
          0 = 5 bits,    1 = 6 bits,    2 = 7 bits,    3 = 8
          bits
          
          
     cCTS
          0 = no check   1 = check CTS on output
          
     ; skeleton com driver for citadel
          ideal
          model large, c
          
          codeseg
          
          org 0
          desc   db 'Skeleton Com Driver'
                 db 32 - ((offset $ - offset desc)) dup(0)
          
                              ; filler for alignment

       dw offset init_port    ; open port with params
       dw offset close_port   ; close port

       dw offset ring_detect  ; is the RI line active?
       dw offset have_carrier ; is the CD line active?

       dw offset mi_ready     ; do we have stuff waiting?
       dw offset ib_flush     ; flush the input buffer

       dw offset get_input    ; get the next thing waiting
       dw offset put_output   ; send this character...

       dw offset set_dtr      ; raise or drop it
       dw offset ob_flush     ; flush output buffer

       dw 118 dup (0)         ; 128 total entries reserved

; ----------------------------------------------------------
------------
proc init_port port:word, baud:word, stops:word,
parity:word, len:word, cCTS:word
       ret
endp

; ----------------------------------------------------------
------------
proc close_port
       ret
endp

; ----------------------------------------------------------
------------
proc ring_detect
       xor ax, ax
       ret
endp

; ----------------------------------------------------------
------------
proc have_carrier
       xor ax, ax
       ret

endp

; ----------------------------------------------------------
------------
proc mi_ready
       xor ax, ax
       ret
endp

; ----------------------------------------------------------
------------
proc ib_flush
       ret
endp

; ----------------------------------------------------------
------------
proc get_input
       ret
endp

; ----------------------------------------------------------
------------
proc put_output char:byte
       ret
endp

; ----------------------------------------------------------
------------
proc set_dtr setit:word
       ret
endp

; ----------------------------------------------------------
------------
proc ob_flush
       ret
endp

end

In the keyboard driver, the init_kbd and close_kbd are often
not used. get_kbd returns ASCII 0 to 255 for normal key
presses. For extended key presses, it sets the LSB to 0 and
the MSB to the IBM keyboard scan code for the key. sp_press
is used only to turn off the screen blanker when a special
key is pressed. If you cannot support the function with your
hardware, don't worry; it is not needed for the operation of
Citadel.

; skeleton kbd driver for citadel

ideal
model large, c

codeseg

org 0
desc   db 'Skeleton Keyboard Driver'
       db 32 - ((offset $ - offset desc)) dup(0)
                              ; filler for alignment

       dw offset init_kbd     ; open kbd
       dw offset close_kbd    ; close kbd

       dw offset stat_kbd     ; are there keys waiting?

       dw offset get_kbd      ; get key

       dw offset sp_press     ; special (alt, shift, ctl)
pressed?

       dw 123 dup (0)         ; 128 total entries reserved

; ----------------------------------------------------------
------------
proc init_kbd
       ret                    ; Nothing special for IBM PC
endp

; ----------------------------------------------------------
------------
proc close_kbd
       ret                    ; Nothing special for IBM PC
endp

; ----------------------------------------------------------
------------
proc stat_kbd

       mov ah, 1              ; read keyboard status
       int 16h                ; BIOS keyboard service

       jnz Char               ; is there a character?

       xor ax, ax             ; no character, return zero
       ret

Char:  mov ax, 1              ; character, return non zero
       ret
endp

; ----------------------------------------------------------
------------
proc get_kbd
       mov ah, 0              ; read keyboard character
       int 16h                ; BIOS keyboard service

       or al, al              ; extended character?
       je Extended
       xor ah, ah             ; no, zero high byte


Extended:
       ret
endp

; ----------------------------------------------------------
------------
proc sp_press
       xor ax, ax
       mov es, ax
       mov di, 417h
       mov ax, [es:di]
       and ax, 0f00fh
       ret
endp
end

Sound card support is, obviously, not integral to BBS
software. Because of this, the sound options in Citadel are
mostly supported only through script files. The only
exception to this is speech synthesizer support, which can
be toggled on for anything being output by Citadel.

The reason for including this driver's source code is to
provide sample code for a somewhat complex driver, which
might be beneficial for generating ideas of how to implement
some other driver. There are a few tricks in this driver
that might not be totally obvious, but are helpful when
developing drivers.

While many more functions are implemented in the Sound
Blaster driver, the only ones currently used by Citadel are
init_sound, close_sound, play_sound, and say_ASCII. The
format for future sound drivers may have different or
changed functions. The reason for this is that the current
driver specification is very much tailored to one specific
sound card: the Sound Blaster. If a sound driver is written
for another card, the specification may need to be changed
slightly to support it. If you want to implement a driver
for some other sound hardware, and find that you need to
change the specification for it to work well, contact
Anticlimactic Teleservices. We can then work with you to
provide services in Citadel that work with your driver. Even
if you don't need to change the driver format, it would be
best to contact Anticlimactic Teleservices if you plan to
implement a sound driver, to be sure that it has not changed
since this documentation was written.

; sound blaster sound driver for citadel
; -- sbsim is used for interface to hardware

ideal
model large, c

codeseg

org 0
desc   db 'Citadel Soundblaster 1.00'
       db 32 - ((offset $ - offset desc)) dup(0)
                              ; filler for alignment

       dw offset init_sound   ; init driver
       dw offset close_sound  ; close driver

       dw offset get_version  ; get sbsim version
       dw offset query_drivers     ; which are loaded?
       dw offset query_status ; which are currently active?


       dw offset start_snd_src     ; wow
       dw offset play_sound   ; wow
       dw offset stop_sound   ; wow
       dw offset pause_sound  ; wow
       dw offset resume_sound ; wow
       dw offset read_snd_stat     ; wow

       dw offset set_midi_map ; wow

       dw offset get_src_vol  ; wow
       dw offset set_src_vol  ; wow
       dw offset set_fade_pan ; wow
       dw offset strt_fade_pan     ; wow
       dw offset stop_fade_pan     ; wow
       dw offset pse_fade_pan ; wow
       dw offset res_fade_pan ; wow
       dw offset read_fade_pan     ; wow
       dw offset get_pan_pos  ; wow
       dw offset set_pan_pos  ; wow

       dw offset say_ASCII    ; wow


       dw 105 dup (0)         ; 128 total entries reserved

talk   db 0
talkadr                       dd 0
talkbuf                       dd 0

proc do_int near
       db 0cdh                ; int
dvr_int                       db 0
       ret
endp

; ----------------------------------------------------------
------------
proc init_sound
       cmp [dvr_int], 0       ; already initialized?
       jne is_ret

       mov bx, 7fh * 4        ; offs of first sbsim int - 1
       xor ax, ax             ; segment of ivt

wrong_int:

       add bx, 4              ; next int offset
       cmp bx, 0c0h * 4
       jae no_int
       mov es, ax             ; and segment

       mov dx, [es:bx+2]      ; segment in dx
       mov es, dx             ; then es...  [es:103h] is
signature

       cmp [word ptr es:103h], 'BS'
       jne wrong_int
       cmp [word ptr es:105h], 'IS'
       jne wrong_int
       cmp [byte ptr es:107h], 'M'
       jne wrong_int

       shr bx, 1
       shr bx, 1
       mov [dvr_int], bl
       jmp short sbtalker

no_int: mov [dvr_int], 0


; look for sbtalker
sbtalker:
       mov [talk], 0

       mov dx, [es:0bch]      ; int 2f segment
       or dx, dx
       jz is_ret

       mov es, dx
       mov ax, 0fbfbh
       int 2fh
       or ax, ax
       jnz is_ret

       mov ax, [es:bx+4]
       mov dx, [es:bx+6]

       mov [word ptr talkadr], ax
       mov [word ptr talkadr+2], dx

       add bx, 20h

       mov [word ptr talkbuf], bx
       mov [word ptr talkbuf+2], es

       mov [talk], 1

is_ret: mov al, [dvr_int]
       mov ah, 0
       ret
endp

; ----------------------------------------------------------
------------
proc close_sound
       mov [dvr_int], 0
       mov [talk], 0
       xor ax, ax
       ret
endp

; ----------------------------------------------------------
------------
proc get_version

       xor ax, ax
       cmp [dvr_int], 0
       je gv_ret

       xor bx, bx
       call do_int
gv_ret: ret
endp

; ----------------------------------------------------------
------------
proc query_drivers
       xor ax, ax
       cmp [dvr_int], 0
       je qd_ret

       mov bx, 1
       call do_int

qd_ret: ret
endp


; ----------------------------------------------------------
------------
proc query_status
       xor ax, ax
       cmp [dvr_int], 0
       je qs_ret

       mov bx, 3
       call do_int

qs_ret: ret
endp

; ----------------------------------------------------------
------------
proc start_snd_src which:byte, what:dword
       mov ax, -1
       cmp [dvr_int], 0
       je sss_ret

       mov bh, [which]
       mov bl, 0

       mov ax, [word ptr what]
       mov dx, [word ptr what+2]
       push ds
       mov ds, dx
       call do_int
       pop ds

sss_ret:ret
endp

; ----------------------------------------------------------
------------
proc play_sound which:byte
       mov ax, -1
       cmp [dvr_int], 0
       je ps_ret

       mov bh, [which]
       mov bl, 1
       call do_int

ps_ret: ret

endp

; ----------------------------------------------------------
------------
proc stop_sound which:byte
       mov ax, -1
       cmp [dvr_int], 0
       je ss_ret

       mov bh, [which]
       mov bl, 2
       call do_int
       xor ax, ax

ss_ret: ret
endp

; ----------------------------------------------------------
------------
proc pause_sound which:byte
       mov ax, -1
       cmp [dvr_int], 0

       je pse_ret

       mov bh, [which]
       mov bl, 3
       call do_int
       xor ax, ax

pse_ret:ret
endp

; ----------------------------------------------------------
------------
proc resume_sound which:byte
       mov ax, -1
       cmp [dvr_int], 0
       je rs_ret

       mov bh, [which]
       mov bl, 4
       call do_int
       xor ax, ax


rs_ret: ret
endp

; ----------------------------------------------------------
------------
proc read_snd_stat which:byte
       mov ax, -1
       cmp [dvr_int], 0
       je rss_ret

       mov bh, [which]
       mov bl, 5
       call do_int

rss_ret:ret
endp

; ----------------------------------------------------------
------------
proc set_midi_map map:word
       mov ax, -1
       cmp [dvr_int], 0

       je smm_ret

       mov bx, 0506h
       mov ax, [map]
       call do_int
       xor ax, ax

smm_ret:ret
endp

; ----------------------------------------------------------
------------
proc get_src_vol which:word
       xor ax, ax
       cmp [dvr_int], 0
       je gsv_ret

       mov bx, 0400h
       mov ax, [which]
       call do_int

gsv_ret:ret

endp

; ----------------------------------------------------------
------------
proc set_src_vol which:word, vol:word
       mov ax, -1
       cmp [dvr_int], 0
       je ssv_ret

       mov bx, 0401h
       mov ax, [which]
       mov dx, [vol]
       call do_int

ssv_ret:ret
endp

; ----------------------------------------------------------
------------
proc set_fade_pan fps:dword
       mov ax, -1
       cmp [dvr_int], 0

       je sfp_ret

       mov bx, 0410h
       mov ax, [word ptr fps]
       mov dx, [word ptr fps+2]
       call do_int

sfp_ret:ret
endp

; ----------------------------------------------------------
------------
proc strt_fade_pan
       mov ax, -1
       cmp [dvr_int], 0
       je bfp_ret

       mov bx, 0411h
       call do_int

bfp_ret:ret
endp


; ----------------------------------------------------------
------------
proc stop_fade_pan which:word
       mov ax, -1
       cmp [dvr_int], 0
       je tfp_ret

       mov bx, 0412h
       mov ax, [which]
       call do_int

tfp_ret:ret
endp

; ----------------------------------------------------------
------------
proc pse_fade_pan
       mov ax, -1
       cmp [dvr_int], 0
       je pfp_ret


       mov bx, 0413h
       call do_int

pfp_ret:ret
endp

; ----------------------------------------------------------
------------
proc res_fade_pan
       mov ax, -1
       cmp [dvr_int], 0
       je rfp_ret

       mov bx, 0414h
       call do_int

rfp_ret:ret
endp

; ----------------------------------------------------------
------------
proc read_fade_pan which:word

       mov ax, -1
       cmp [dvr_int], 0
       je dfp_ret

       mov bx, 0415h
       mov ax, [which]
       call do_int

dfp_ret:ret
endp

; ----------------------------------------------------------
------------
proc get_pan_pos which:word
       mov ax, -1
       cmp [dvr_int], 0
       je gpp_ret

       mov bx, 0416h
       mov ax, [which]
       call do_int


gpp_ret:ret
endp

; ----------------------------------------------------------
------------
proc set_pan_pos which:word, pos:word
       mov ax, -1
       cmp [dvr_int], 0
       je spp_ret

       mov bx, 0417h
       mov ax, [which]
       mov dx, [pos]
       call do_int

spp_ret:ret
endp

; ----------------------------------------------------------
------------
proc say_ASCII uses si di, what:dword, len:byte
       mov ax, -1

       cmp [talk], 0
       je sa_ret

       mov es, [word ptr talkbuf+2]
       mov di, [word ptr talkbuf]

       mov al, [len]
       stosb

       push ds
       mov ds, [word ptr what+2]
       mov si, [word ptr what]
       mov cl, al
       mov ch, 0
       rep movsb
       pop ds

       mov ax, 707h
       call [talkadr]
       xor ax, ax

sa_ret:

       ret
endp
end

If you do create a driver for some specialized hardware, we
would like to distribute it with future releases of Citadel.
This way, we can support a wider variety of hardware than we
currently do. Of course, full credit will be given to you as
the author of the driver.

_Appendix C: FOSSIL support

Citadel's internal serial support is quite robust, so most
people will not need to use FOSSIL drivers. If, however, you
have non-standard serial hardware, or some other desire to
use FOSSIL drivers, support is provided through Citadel's
external hardware drivers.

The driver, called FOSSIL.ECD, is loaded by creating a
HARDWARE.CIT file in Citadel's #HOMEPATH (as set in
CONFIG.CIT) which contains the following line:

     #COMDRIVER FOSSIL
                    
You will also need to place the FOSSIL.ECD driver in
#HOMEPATH. Citadel will then use the routines in the FOSSIL
driver for serial I/O, beginning with the next time Citadel
is loaded.

When running with the FOSSIL driver, there is at least one
limitation. While Citadel's internal serial routines can
handle up to 115,200 baud, the FOSSIL standard is limited to
38,400 baud. This is usually not a problem, but something to
be aware of. If you tell Citadel to initialize the port at
115,600 baud or 57,800 baud, it will think it was
successful; the FOSSIL driver hides the 38,400 baud limit
from Citadel. Nothing will go wrong, you will just have a
slower port rate.

If Citadel does not seem to be using your FOSSIL driver,
first use the .Read Verbose Status (.RVS) command in
Citadel. In the "System Status / Debugging" section, it
should mention that you are using the FOSSIL External
Communications Driver. If it does not, then the problem is
either in the HARDWARE.CIT file, or the FOSSIL.ECD file is
not in Citadel's #HOMEPATH. If the driver is being loaded,
then you should check your FOSSIL driver's configuration.

_Appendix D: Sound Blaster

If you wish to have Sound Blaster support on the console
system, you will need the Citadel Sound Blaster Extensions,
available from The Anticlimactic Teleservice at (206)562-
9792. This section explains how to use the Extensions.

Sound capabilities are enabled in Citadel by loading an
External Sound Driver (.ESD) driver. This is specified in
the HARDWARE.CIT file. To add the Sound Blaster driver,
include the following line:

     #SNDDRIVER SB
                    
In addition, Creative Lab's SBSIM driver must be loaded to
use the Sound Blaster support provided through the SB.ESD
driver.

As sound support is not integral to a BBS, there are no
hooks in Citadel specific to using the Sound Blaster. The
only support for sound is through Citadel's script language.

By linking script files to play certain sounds with system
events with the #EVENT keyword in EXTERNAL.CIT, you can have
a fair amount of control over sounds on console. The #EVENT
keyword tells Citadel to run an application every time a
specific system event occurs.

The EXTADD.TXT file contains the #EVENT lines to add to your
EXTERNAL.CIT file. The .VOC files contain the sounds to be
played and should be placed in Citadel's #HOMEPATH as set in
CONFIG.CIT. The .CSF files are the Citadel Script Files that
are referenced by the #EVENT lines in EXTADD.TXT and call
the various .VOC files. They should also be placed in
#HOMEPATH.

After making these changes, start Citadel, and sounds should
start working. If no sound is generated, first check the
obvious problems (sound on the Sound Blaster is turned down,
the speakers are not turned on or plugged in, etc.). If
everything looks good, use the .Read Verbose Status (.RVS)
command in Citadel. In the "System Status / Debugging"
section, it should mention that you are using the External
Sound Driver for Sound Blaster. If it does not, then the
problem is in the HARDWARE.CIT file, or that the SB.ESD file
is not in #HOMEPATH.

If Citadel says that it is using the Sound Blaster driver,
then it may be that you forgot to load the SBSIM driver that
comes with the Sound Blaster. This driver is required for
the SB.ESD driver to work.

_Appendix E: Citadel BBSes

Like any BBS list, this list is incomplete, and probably
somewhat inaccurate. It is not meant as an absolute
reference of boards, but a sampling of BBSes that you can
call to see Citadel+ in action. Anticlimactic Teleservices
does not necessarily recommend any BBSes by inclusion on
this list. It is for informational purposes only, and
opinions of individual sysops and users are not necessarily
those of Anticlimactic Teleservices. We were not able to
verify the existence of nodes marked with a "?" character.

Name                Phone Number          Speed   Hours
Amber               (206)861-7829         300-14.4 v.32bis
24 hours
The Anticlimactic Teleservice (206)562-9792  300-9600 v.32
24 hours
?The Asylum         (206)244-2350         300-14.4 v.32bis?
?
The Basement        (206)488-6337         300-2400     24
hours
Black Mountain      (206)599-0903         ???     24 hours
Blain's World (Not!)          (206)380-2236  300-2400
9:30pm-7am PT
Blind Man's Bluff   (206)823-3744         300-14.4 v.32bis
24 hours
Bypass' Sideband Alley        (206)243-8977  300-2400  24
hours
Cave Bear's Laire   (206)630-9863         300-14.4 v.32bis
24 hours
A Clockwork Orange  (206)486-6527         300-2400     24
hours
?Cod's World        (206)939-5857         300-1200     24
hours
?The Coffee Connection        (206)367-6443  300-14.4
v.32bis             24 hours
Columbia Crest      (206)786-9248         300-2400     24
hours
?Desolation Row     (410)730-0231         ?  ?
Digital Free America          (816)563-6810  300-14.4
v.32bis             24 hours
?The Dragon's Laire (509)925-5745         300-14.4 v.32bis
24 hours
The Dream Realm     (214)436-3881         300-14.4 v.32bis
24 hours
?Dystopia ][        (206)734-4636         300-14.4 v.32bis
24 hours
Fort Blatherskite   (206)542-2774         300-14.4 v.32bis?
24 hours
Gateway to Reality  (206)547-2331         300-2400     24
hours
The Ghetto          (206)364-2514         300-14.4 v.32bis
24 hours
?The Hermitage      (206)347-7306         ?  24 hours
The Institute       (916)635-1453         300-2400     24
hours
Isles of Ether      (206)725-1048         300-14.4 v.32bis
24 hours
?Line Noize         (206)384-4133         ???     24 hours
Lost Archives       (206)366-5102         300-14.4 v.32bis
24 hours
The Lost Ideas      (916)452-1332         300-14.4 v.32bis
24 hours
?Masquerade         (206)485-8463         1200-2400    24
hours
Memory Alpha        (206)859-6200         1200-14.4 v.32bis
24 hours
Miscellaneous Debris          (916)773-2417  1200-2400 24
hours
the Modern Imagination BBS    (916)349-9352  1200-14.4
v.32bis             24 hours
Mostly Harmless     (206)883-1383         300-14.4 v.32bis
24 hours
The Netherworld     (403)329-8905         ?  8p-6a MT
?The Oasis          (206)534-9928         300-14.4 v.32bis
24 hours
The Ocean           (916)368-7661         300-2400     24
hours
Outsider's          (301)587-5922         300-14.4 v.32bis
24 hours
Palace of Miniken   (206)820-8424         300-2400     24
hours
The Raft            (206)861-9936         300-14.4 v.32bis
24 hours
Simple Treasures    (206)939-3998         300-2400     7p-
7a; 24 Sun & Holidays PT
Slumberland         (206)547-2629         300-9600 v.32
24 hours
St. Dismas' Infirmary         (301)434-0867  ?    24 hours
Star Fleet Academy  (206)491-9605         300-14.4 v.32bis
24 hours
Starship Inconnu    (206)661-3664         300-14.4 v.32bis
24 hours
Succulent Shrimp BBS          (214)503-1772  ?    24 hours
?Suck My Duck       (206)475-8399         300-2400     24
hours
This Twilight Garden          (206)488-4371  300-14.4
v.32bis             23 hours
Too Dark Park       (206)869-3809         300-14.4 v.32bis
24 hours
Toys in the Attic   (206)582-7476         ???     24 hours
Vulgar Display of Power       (206)882-0551  300-2400  24
hours
?Your Name Here     (206)564-5303         300-14.4 v.32bis
24 hours
?The Wall           (206)255-4682         300-14.4 v.32bis
24 hours
?The Wind           (206)589-1733         300-2400     24
hours

_Appendix F: Credits

Citadel has been worked on by many people over several
years, so it is impossible to give credit to everybody who
has made a contribution to this program; memories fade, and
not everything is written down. So, this list is not at all
a complete list of people who have played a role in bringing
the software to where it is today. But, it is nice to give
some credit to people who played a part in Citadel's
history.

A historically minded person may wish to study the various
Citadel history documents that can be found lurking on many
Citadel user's hard disks, or stored on some forgotten
floppy disk. However, I am not such a person, so I have not
spent time verifying the accuracy of this information; it is
just a list of a few people who have been involved, as I
remember it, from either being there or reading one of the
various Citadel history documents. This history ends with a
brief description of the people currently working on
Citadel.

The first person that should be mentioned, of course, is
Cynbe ru Taren, the original author of Citadel. His version
was quite a bit less powerful than modern versions of
Citadel, and much rougher around the edges, but it is thanks
to him that Citadel was written in the first place. Though
there is probably not much of his original code left, it is
ideas that make a program what it is, not code. His idea of
a simple interface to a message oriented board is still what
drives Citadel development today.

It is hard to decide if David Bonn or Hue A. White, Jr., is
the next name that should be mentioned here. David Bonn
worked on a program derived from Citadel called Stonehenge,
which was a commercial program that met limited success in
the Seattle area in the mid-1980s. This program introduced
many of the ideas that exist in Citadel now, halls and
groups being the most noticeable.

However, Citadel is not based, code-wise, on David Bonn's
Stonehenge code; it derives from Hue A. White's Citadel-86
code. Matt Pfleger used Citadel-86 as a launching point in
his effort to clone Stonehenge in a free BBS. His version of
Citadel cloned almost every feature in Stonehenge, and added
quite a few of its own. It also implemented many features
that were in Stonehenge in a better way.

The only feature not cloned by Matt was networking.
Stonehenge networking had some conceptual errors in it, so
he did not want to copy it exactly. He also did not like
Citadel-86's networking protocol, which he had long since
removed from Citadel. He was trying to develop a better
method of networking, but never did finish.

In the late 1980s, he abandoned Citadel development when
Peter Torkleson (The Dragon) started active development with
an older version of Matt's source code. This program was
developed into the very early 1990s, and was named Dragon's
Citadel. Major enhancements added during this time include
networking, ANSI support, and applications.

But, like many Citadel authors before him, Peter abandoned
Citadel. At this point, Matt Pfleger almost immediately took
Peter's latest source code, and started development on it
again.

Matt is currently joined by four other people. The current
people working on Citadel in one form or another are (in
reverse alphabetical order) Matt Pfleger, Elisabeth Perrin,
Don Kimberlin, Richard Finegold, and Brent Bottles.

The five of us have been involved in computers, BBSes, and
Citadel for several years and bring a wide variety of
backgrounds to the project. This combination of talent and
vision comes together to bring you the best Citadel BBS in
existence.

_Appendix G: Data Files

Citadel stores information it needs to run in two different
types of files: data files and table files. Data files have
the extension .DAT and table files have the extension .TAB.
Table files change often, and even between the Auxmem
version and Regular version of the program. Because of this,
and because there is little reason to know what is in a
table file, we will not go into the specifics of tables.
Data files change too, but in predictable ways. This is how
Citadel is able to convert data files when you upgrade to a
new version.

All multi-byte integers are stored in Intel-standard format;
that is, least significant byte first, most significant byte
last. All strings are stored in C-standard format; that is a
string of ASCII characters followed by a nul (ASCII 0) byte.
Bit fields are stored in whatever direction that Borland C++
stores them; I don't know what order they are stored in, but
I do know that it allocated 16 bits at a time. Time is
stored as the UNIX standard: the number of seconds since
12:00:00 AM, January 1, 1970. GMT.

In general, the data files start with a four-byte long
integer that tells how long each record in the file is, in
bytes. After this, each record is saved to the file in
sequential order. This does not hold true to the secondary
data files (those with a number in their names), the message
file (MSG.DAT), or log extension files (LE*.DAT).

When Citadel loads, it looks at this value, and uses it to
ensure that the data files are the proper length. If the
record size stored to the data file is too small, Citadel
converts the file by adding the correct number of bytes to
the end of each record, all cleared to 0. If the record size
stored in the data file is too big, Citadel removes that
many bytes from the end of each record. Because of this,
Citadel can convert data files from previous versions to the
current version, and from future versions back to the
current version. Also, because of this, new fields are added
to data files only at the end of the records.

Some data files are split into many parts. (The log file,
for example, is in six parts.) This is to facilitate
automatic resizing of data files when values are changed in
CONFIG.CIT: the LOG6.DAT file, for example, depends on both
#MAXLOGTAB and #MAXROOMS to set how big it is. Citadel can
look at the size of LOG.DAT and ROOM.DAT to see the previous
settings of #MAXLOGTAB and #MAXROOMS, respectively, and use
that to resize LOG6.DAT correctly.

What follows are the specifics of each data file, correct as
of Version 65 alpha 77.


The userlog files
The userlog is split into six parts, with each user also
having a possible log extension file. LOG.DAT stores the
bulk of the information for each user; LOG2.DAT stores which
groups each user is a member of; LOG3.DAT stores which rooms
each user has access to; LOG4.DAT stores which rooms each
user has excluded; LOG5.DAT stores the last-message-read
pointer for each room; LOG6.DAT stores which rooms are in
each user's personal hall; and the log extension files store
things that might change in number, such as words in the
personal dictionary, message exclusion, and the like.

LOG.DAT

          The LOG.DAT file starts with a four-byte long integer
          that stores the length of each record, as
          explained above. After that, each record is saved
          sequentially, which is as follows:
          
     Offset                Length    Name Description
     0                     31   UserName  Name of the user.
     31                    31   Initials  Initials used to
                           log in.
     62                    31   Password  Password used to
                           log in.
     93                    31   ForwardAddr    Name to
                           forward mail to.
     124                   31   ForwardNode    Node to
                           forward mail to. (See FwdToNode,
                           below.)
     155                   31   Surname   User's surname.
     186                   31   Title     User's title.
     217                   1    Reserved_0     Set to 0.
     218                   2    Reserved_1     Set to 0.
     220                   1    Nulls     Number of nulls
                           to send.
     221                   1    Width     Terminal width.
     222                   4    CallTime  Time of last
                           call.
     226                   4    CallNumber     Caller
                           number of last call.
     230                   4    Credits   Number of seconds
                           left in the user's account. Note
                           that this is not what Citadel
                           displays: it converts to minutes
                           first.
     234                   4    LastPointer    The newest
                           message at the time of the last
                           call.
     238                   4    Reserved_2     Set to 0.
     242                   1    LinesPerScreen For screen
                           pause; 0 for off.
     243                   1    AttrNormal     Attribute
                           for Normal text.
     244                   1    AttrBlink Attribute for
                           Blinking.
     245                   1    AttrInv   Attribute for
                           Inverse.
     246                   1    AttrBold  Attribute for
                           Bold.
     247                   1    AttrUnderline  Attribute
                           for Underline.
     248                   1    DefProtocol    First letter
                           of default protocol.
     249                   64   PromptFmt Room prompt
                           format string.
     313                   64   TimeStamp Time stamp format
                           string.
     377                   64   VTimeStamp     Verbose time
                           stamp format string.
     441                   91   Signature User's signature.
     532                   31   NetPrefix User's net
                           prefix.
     563                   31   Address1  First line of
                           user's mailing address.
     594                   31   Address2  Second line of
                           user's mailing address.
     625                   31   Address3  Third line of
                           user's mailing address.
     656                   4    Alias     User's alias.
     660                   5    Region    User's region.
     665                   1    Reserved_3     Set to 0.
     666                   4    DLBytes   Number of bytes
                           downloaded. (Not in use.)
     670                   4    ULBytes   Number of bytes
                           uploaded. (Not in use.)
     674                   2    DLNumber  Number of files
                           downloaded. (Not in use.)
     676                   2    ULNumber  Number of files
                           uploaded. (Not in use.)
     678                   31   ForwardRegion  Region to
                           forward mail to. (Might not be
                           in use.)
     709                   80   MorePrompt     User's
                           "more" prompt.
     789                   31   Occupation     What's the
                           user's job is. (Not in use.)
     820                   2    NumUserShow    Number of
                           users to show on login.
     822                   4    Birthdate Midnight on day
                           of birthdate. (Not in use.)
     826                   4    FirstOn   Time of first
                           call to system.
     830                   2    Male 1 if male, 0 if
                           female.
     832                   4    TotalTime Total number of
                           seconds on the system.
     836                   4    Logins    How many times
                           have logged into the system.
     840                   4    Posted    Total number of
                           messages posted on the system.
     844                   4    Read Total number of
                           messages read on the system.
     848                   4    PWChange  The last time the
                           user's password was changed.
     852                   2    CallsToday     The number
                           of calls today. (Midnight to
                           midnight, not 24 hours.)
     854                   2    CallLimit Number of calls
                           allowed per day. (0 for
                           unlimited.)
     856                   80   WhereHear Where did you
                           hear about the BBS?
     936                   16   Reserved_4     Set to 0.
     952                   31   LastRoom  Room they were
                           last in on last call.
     983                   31   LastHall  Hall they were
                           last in on last call.
     914                   31   DefaultRoom    Default
                           room. (Not in use.)
     945                   31   DefaultHall    Default
                           hall.
     976                   4    Poopcount The user's
                           Poopcount.
     980                   2    Bitmap_1  Bitmapped flags,
                           as follows:
                                InUse     Is slot in use.
                                UCMask    Upper case only.
                                LFMask    Send linefeeds.
                                Expert    Expert mode.
                                Aide Is user an Aide?
                           (Note: if this is cleared, but
                           Sysop (below) is set, the user
                           is considered to be an Aide.)
                                Tabs Send tabs?
                                OldToo    Send last old
                           message on new message request.
                                Problem   Is user a twit?
                           (Note: Even if this is set, the
                           user is not considered a twit if
                           he is an Aide (see above).)
                                Unlisted  Unlisted userlog
                           entry.
                                Permanent Permanent userlog
                           entry.
                                Sysop     Is user sysop.
                                Node Is user a node.
                                NetUser   Is user a
                           netuser.
                                NoAccount Is accounting
                           disabled.
                                NoMail    Is mail disabled.
                                RoomTell  Does user view
                           room descriptions.
     982                   2    Bitmap_2  More bitmapped
                           flags as follows:
                                Dungeoned Is user
                           dungeoned? (Not in use.)
                                MsgAide   Message-only
                           aide. (Not in use.)
                                FwdToNode Mail forwarded to
                           a node.
                                AutoNextHall   Auto next
                           hall.
                                FileAide  File-only aide.
                           (Not in use.)
                                EnterBorders   Can user
                           change borders.
                                UnVerified     Is user
                           unverified.
                                SurnameLock    Is user's
                           title and surname locked?
                                LockHall  Is user's default
                           hall locked?
                                Psycho    Is user psyco-
                           chickened?
                                DisplayTS Display titles
                           and surnames to user?
                                Subjects  Display subjects?
                                Signatures     Display
                           signatures?
                                IBMGraph  Display IBM
                           graphic characters?
                                IBMANSI   Use ANSI?
                                IBMCOLOR  Use color ANSI?
     984                   2    Bitmap_3  More flags:
                                Twirly    Show twirly
                           cursor.
                                Verbose   Auto verbose.
                                MsgPause  Pause between
                           messages.
                                Minibin   Show Minibin
                           login stats.
                                MsgCLS    Clear screen
                           before message.
                                RoomInfo  Display room info
                           lines.
                                HallTell  Display hall
                           descriptions.
                                VerboseCont    Continue in
                           the message editor in the icky
                           verbose way.
                                ViewCensor     View
                           censored messages.
                                SeeBorders     Display
                           borders.
                                Out300    Simulate 300 baud
                           output.
                                LockSignature  Lock user's
                           signature.
                                HideExclusions Hide message
                           exclusions. (Don't tell the user
                           when messages are excluded.)
                                NoDownload     User may not
                           download.
                                NoUpload  User may not
                           upload.
                                NoChat    User may not
                           chat.
     986                   2    Bitmap_4  More flags...
                                PrintFile Turn on printfile
                           when user logs in.
                                SpellCheck     Two bits: 00
                           for terse, 01 for regular, 10
                           for verbose, 11 for automatic.
                                NoMakeRoom     User may not
                           use .ER command.
                                VerboseLogOut  Log user out
                           verbosely.
                                ConfirmSave    Ask for
                           confirmation before saving
                           message.
                                NoConfAbort    Don't ask
                           for confirmation before aborting
                           message.
                                ConfirmNoEO    Confirm
                           entering a message when one is
                           aborted.
                                UsePersonal    Use personal
                           hall.
                                YouAreHere     Use
                           YouAreHere.
                                IBMRoom   Show room prompt
                           with IBM graphic characters.
                                WideRoom  Show room lists
                           widely.
                                Music     User can hear it.
                                CheckAPS  Check apostrophe
                           Ses in the spell checker.
                                CheckAllCap    Check words
                           in all-caps in the spell
                           checker.
                                CheckDigits    Check words
                           with digits in them in the spell
                           checker.
     988                   1    Reserved_5     Set to 0.
     989                   31   RealName  The user's real
                           name.
     1020                  31   PhoneNumber    The user's
                           phone number.
     1051                  1    Reserved_6     Set to 0.
     1052                  2    Bitmap_5  Even more
                           flags...
                                ExcludeCrypt   Exclude
                           encrypted messages.
                                HideCommas     Don't show
                           commas in numbers.
                                PUnPauses The P key
                           unpauses text output.
                                Reserved_7     13 bits: set
                           all to 0.
     1054                  4    LastCalledVer  Version of
                           Citadel running during last
                           call. Major version times 1000
                           plus minor version. (65077 for
                           65 alpha 77, for example.)
                           
     LOG2.DAT
          The LOG2.DAT file stores the groups that each user
          has access to. There is no leading four-byte
          integer as in LOG.DAT. Each user gets #MAXGROUPS/8
          bytes: one bit per group. Access to group 0 is
          governed by the LSB of the first byte; access to
          group 7 is governed by the MSB of the first byte;
          access to group 8 is governed by the LSB of the
          second byte; etc.
          
     LOG3.DAT
          The LOG3.DAT file stores the rooms that each user
          has access to. There is no leading four-byte
          integer as in LOG.DAT. Each user gets #MAXROOMS/8
          bytes: one bit per room. Access to room 0 is
          governed by the LSB of the first byte; access to
          room 7 is governed by the MSB of the first byte;
          access to room 8 is governed by the LSB of the
          second byte; etc.
          
          If a user does not have a bit set for a room, then
          the user may not go to the room unless it is a
          hidden room and the user knows the name of the
          room. New users are given access to all public
          rooms when they log in, but not BIO or hidden
          rooms.
          
     LOG4.DAT
          The LOG4.DAT file stores the rooms that each user
          has excluded. There is no leading four-byte
          integer as in LOG.DAT. Each user gets #MAXROOMS/8
          bytes: one bit per room. Room 0 is governed by the
          LSB of the first byte; Room 7 is governed by the
          MSB of the first byte; Room 8 is governed by the
          LSB of the second byte; etc.
          
     LOG5.DAT
          The LOG5.DAT file stores the last message read for
          each user for each room. There is no leading four-
          byte integer as in LOG.DAT. Each user gets
          #MAXROOMS four-byte integers: one for each room.
          Room 0 is governed by the first four-byte integer;
          Room 1 is governed by the second four-byte
          integer; etc.
          
     LOG6.DAT
          The LOG6.DAT file stores the rooms that each user
          has added to his personal hall. There is no
          leading four-byte integer as in LOG.DAT. Each user
          gets #MAXROOMS/8 bytes: one bit per room. Room 0
          is governed by the LSB of the first byte; Room 7
          is governed by the MSB of the first byte; Room 8
          is governed by the LSB of the second byte; etc.
          
     LE*.DAT
          Each user may also have a Log Extension file,
          which stores information that cannot be expressed
          in the structured data files above. The name of
          the file is LE then the number of the user in the
          LOG.DAT file, then the .DAT extension. If there is
          no data for a user to put in the log extension
          file, it is not created. In general, the file
          consists of a keyword (starting with the character
          #), white space, then the keyword's value in one
          or more quoted strings followed by a CR/LF
          combination (ASCII 13 followed by ASCII 10). The
          two exceptions to this are the #MESSAGE and
          #FINGER log extensions, as described below. All
          log extensions other than #MESSAGE and #FINGER may
          show up multiple times: all occurrences of the
          extensions are loaded into memory.
          
     Keyword   Description
               
     #KILLUSER The name of a user to exclude messages from.
               
     #KILLTEXT Message text to exclude.
               
     #KILLNODE The name of a node to exclude messages from.
               
     #KILLREG  The name of a region to exclude messages
               from.
               
     #DICTWORD The words of the user's personal dictionary.
               
     #TAGUSER  Two strings: first the name of the user,
               second the user's tag.
               
     #JB       Jump-back information, stored as five
               numbers: first, the newpointer for the room;
               second the number of new messages in the
               room; third, the hall to jump back to;
               fourth, the room to jump back to; and fifth,
               whether the room was bypassed.
               
     #MESSAGE  A message to resume next call; saved if
               carrier is lost when entering a message.
               Immediately after the #MESSAGE, a CR/LF
               combination is stored to the file. Then the
               binary data of the message is saved, similar
               to the format of MSG.DAT (explained below).
               After the last byte of the message, a CR/LF
               combination is saved.
               
     #FINGER   The user's information, set and viewed by the
               .Finger... commands. Immediately after the
               #FINGER, a CR/LF combination is stored to the
               file. After that, the finger data is stored,
               as a nul-terminated string. After that,
               another CR/LF combination is stored to the
               file.
               

The room files
The room database is split into two parts. ROOM.DAT stores
the bulk of the information for each room; ROOMPOS.DAT
stores the logical order of the rooms.

     ROOM.DAT
          The ROOM.DAT file starts with a four-byte long
          integer that stores the length of each record, as
          explained above. After that, each record is saved
          sequentially, which is as follows:
          
     Offset                Length    Name Description
     0                     2    Bitmapped_1    This stores
                           the room's flags, as follows:
                                Inuse     Whether the room
                           is in use.
                                Public    Whether the room
                           is public (non-hidden).
                                Directory Whether the room
                           is a directory room.
                                Permanent Whether the room
                           is permanent.
                                GroupOnly Whether the room
                           is group-only.
                                ReadOnly  Whether the room
                           is read-only.
                                DownloadOnly   Whether the
                           room is download-only.
                                Shared    Whether the room
                           is shared (networked).
                                Moderated Whether the room
                           is moderated.
                                Application    Whether the
                           room has an application.
                                BIO  Whether the room is By-
                           Invitation-Only.
                                UploadOnly     Whether the
                           room is upload-only.
                                PrivGrp   Whether the room
                           has a privileged group.
                                Anonymous Whether the room
                           is anonymous.
                                AskSubject     Whether to
                           ask for a subject for messages
                           in the room.
                                GrpModerated   Whether the
                           group is moderated by the
                           privileged group.
     2                     2    Bitmapped_2    This stores
                           more flags, as follows:
                                ArchiveMsgs    Whether to
                           archive all messages saved in
                           the room.
                                BoolGroup Whether access to
                           the room is based on a Boolean
                           expression.
                                Unused_1  14 bits: set all
                           to 0.
     4                     31   Name Name of room.
     35                    64   DirName   Name of the
                           room's directory.
     99                    13   RoomTell  File name of
                           room's description.
     102                   13   ApplicName     File name of
                           room's application.
     115                   1    Unused_2  Set to 0.
     116                   2    GroupNumber    Number of
                           owning group.
     118                   4    Unused_3  Set to 0.
     122                   2    PrivGrpNum     Number of
                           privileged group.
     124                   2    Bitmapped_3    More flags,
                           as follows:
                                AutoApp   Run room's
                           application automatically when
                           entering the room for the first
                           time on a call.
                                NoExclude Users may not
                           exclude room.
                                Unused_4  14 bits: set all
                           to 0.
     126                   80   InfoLine  Room's info line.
     206                   31   NetID     Network ID of
                           room.
     237                   13   ArchiveFile    File name
                           for archiving.
     250                   13   Dictionary     File name
                           for dictionary, if using custom
                           dictionary for room.
     263                   31   Moderator Name of the
                           room's moderator. (Not in use.)
     294                   31   ExclNetPartner Exclusive
                           net partner. (Not in use.)
     325                   1    Unused_5  Set to 0.
     326                   50   BoolGroup Used for Boolean
                           group access.
     
     ROOMPOS.DAT
          This is a list of each room's logical position.
          Each room gets a two-byte integer for its
          location. The first room gets the first two bytes,
          the second room the next two, etc. Locations are
          expressed starting with 0 and ending with one less
          than the maximum number of rooms on the system.
          

The hall files
The hall database is split into three parts. HALL.DAT stores
the bulk of the information for each room; HALL2.DAT stores
the other two parts: which rooms are in each hall, and which
rooms are windowed into each hall.

     HALL.DAT
          The HALL.DAT file starts with a four-byte long
          integer that stores the length of each record, as
          explained above. After that, each record is saved
          sequentially, which is as follows:
          
     Offset                Length    Name Description
     0                     31   Name The name of the hall.
     31                    1    GroupNumber    The hall's
                           group number.
     32                    2    Bitmapped Flags, as
                           follows:
                                Inuse     Whether the hall
                           is used.
                                Owned     Whether the hall
                           is group-only.
                                Described Whether the hall
                           has a description file.
                                Unused_1  Set to 0.
                                EnterRoom May users enter
                           rooms?
                                BoolGroup Use the Boolean
                           expression for group access?
                                Unused_2  10 bits: set all
                           to 0.
     34                    1    Unused_3  Set to 0.
     35                    13   DescriptionFile     Name of
                           hall's description file.
     48                    50   GroupExpr Boolean group
                           access expression.
                           
     HALL2.DAT
          HALL2.DAT stores which rooms are in each hall, and
          which rooms are windowed into each hall. There are
          two parts to this file: first the rooms in each
          all, then the rooms windowed into each hall. In
          each part, each hall gets #MAXROOMS/8 bytes: one
          bit for each room. For each section, Room 0 is
          governed by the LSB of the first byte for the
          hall; Room 7 is governed by the MSB of the first
          byte for the hall; Room 8 is governed by the LSB
          of the second byte for the hall; etc.
          

The group file
There is only a single file for group storing the group
database, GRP.DAT.

     GRP.DAT
          The GRP.DAT file starts with a four-byte long
          integer that stores the length of each record, as
          explained above. After that, each record is saved
          sequentially, which is as follows:
          
     Offset                Length    Name Description
     0                     31   Name Name of the group
     31                    1    Reserved_1     Set to 0.
     32                    80   Description    Group's
                           description.
     122                   2    Bitmapped Flags, as
                           follows:
                                Inuse     Whether group is
                           used.
                                Locked    Whether group is
                           locked from aides.
                                Hidden    Whether group is
                           hidden.
                                AutoAdd   Whether new users
                           are added to the group when they
                           log in.
                                Reserved_2     12 bits: set
                           all to 0.
                           

The borders file
Borders are saved in a single file, BORDERS.DAT.

BORDERS.DAT

          Each border is saved as an 81 byte string. There are as
          many of these as there are borders.
          

The message file
The message base is saved as a single file, MSG.DAT. Other
than the log extension files, this is the most "free-form"
of the data files. There is not any set limit of the number
of messages in the file, the first byte of the file might
not be the first byte of a message, not all bytes in the
file are usually used by messages, and messages don't have
any set length in the file.

The first byte of a message is ASCII 255 (0xFF hex), which
Citadel uses as a key to the start of a message. This is the
only byte that is allowed to have this value in the message
base.

After the 0xFF that starts the message, the next byte is the
message's attribute byte. This is a bitmapped byte, with
each bit having the following value:

     Bit                   Name Description
     0 (LSB)               Received  Only used for mail: if
                           the message was received.
     1                     Replied   Only used for mail: if
                           the message was replied to.
     2                     MadeVis   Only used for
                           moderated and problem user
                           messages: whether the message
                           has been made visible. (Note
                           that when a message is released,
                           a copy of the message is also
                           made. How this all works is
                           somewhat complicated.)
     3                     Compressed     If the message
                           has been compressed.
     4                     Censored  If the message is
                           censored.
     5                     BigRoom   If two bytes are used
                           to save the message's room
                           number. (See below for full room
                           number information.)
     6                     More If there is a second
                           attribute byte.
     7 (MSB)               Reserved  Must always be 0, to
                           avoid making this be 0xFF.
                           
If the More bit is set in this attribute byte, there is a
second attribute byte, of which currently only the LSB is
used. This is set to indicate a local message. The other 7
bits must all be set to 0.

After the one or two attribute bytes, the room number is
saved. If the room number is less than or equal to 254, it
is saved as a single byte. If the room number is 255 or
greater, it is saved as two bytes, and the BigRoom attribute
bit is set. Additionally, to avoid the possibility of 255
being written as part of the room number, if the room is
being saved in two bytes, it is first multiplied by two.
This way the least significant bit of the least significant
byte is always a 0, and it can never be a 255. As the limit
to the number of rooms in Citadel is 13683, the most
significant bit of the most significant byte of the room
number is also always 0, even after multiplying by two.

After the room number, the message number is written as an
ASCII string, followed by a nul (ASCII 0) byte. Message
numbers are assigned sequentially.

After this, the following fields might be saved in any
order. They are written by first writing the field's code as
a single character, then the ASCII information of the field,
then a nul (ASCII 0) byte. All numbers are written out as a
base 10 ASCII number. Not all fields are saved to all
messages. For example, if the message's author has no
surname defined, there will be no surname field present.

     Code                  Name Description
     A                     Author    The message's author.
     B                     Subject   The message's subject.
     C                     Copy Message number of message
                           this is a copy of.
     D                     Date The time the message was
                           created.
     d                     EZTime    The time saved in an
                           easier method to read. Only
                           saved to networked messages, and
                           only if #GATEWAY in NODES.CIT is
                           set for the other node.
     F                     Forward   User mail is being
                           forwarded to. Note that if this
                           is a message forwarded over the
                           network, this field will
                           actually contain the name of the
                           user the mail was originally
                           written to, and the "ToUser"
                           field ("T") will contain the
                           name of the forwardee. There is
                           a reason for this. Try to figure
                           it out yourself if you want a
                           challenge.
     G                     Group     The name of the group
                           that this message belongs to.
     H                     OriginPhone    This is the phone
                           number of the node the message
                           was first written on.
     h                     DestinationPhone    This is the
                           phone number of the node the
                           message is being sent to. If
                           this was used at all, which it
                           is not, it would only be used in
                           mail.
     I                     ReplyToMessage This is the
                           message number that this message
                           is a reply to.
     J                     TwitRegion     This is the
                           message's twit region.
     j                     TwitCountry    This is the
                           message's twit country.
     L                     FileLink  This is the file the
                           message is linked to.
     l                     ApplLink  This is the
                           application the message is
                           linked to.
     N                     Title     This is the title of
                           the message's author.
     n                     Surname   This is the surname of
                           the message's author.
     O                     OriginNodeName The name of the
                           system the message was first
                           written on.
     o                     OriginNodeRegion    This is the
                           region of the system the message
                           was first written on.
     P                     FromPath  This is the path the
                           message took to get to the
                           current system.
     p                     ToPath    This is the path that
                           the message will follow. Only
                           used in mail.
     Q                     OriginCountry  This is the
                           country of the system the
                           message was first written on.
     q                      ToCountry This is the country
                           that the message is destined to.
                           Only used in mail.
     R                     CreationRoom   This is the name
                           of the room that the message
                           first came to the current board
                           in.
     r                      OriginalRoom   This is the name
                           of the room on the system that
                           the message was first written
                           on.
     S                     SourceID  The message number on
                           the system the message was first
                           written on.
     s                      SourceSoftware This is the name
                           and version of the software that
                           first generated this message.
     T                     ToUser    This is the name of
                           the user that the message is
                           addressed to. Only used in mail.
     U                     Cit86Country   This is the
                           message's country as defined by
                           the Citadel-86 network.
     X                     X    This field is "Y" if the
                           message is a problem user
                           message, and "M" if it is
                           moderated.
     Z                     ToNodeName     This is the node
                           that the message is being sent
                           to. Only used in mail.
     z                      ToRegion  This is the region
                           that the message is being sent
                           to. Only used in mail.
     .                     Signature This is the message's
                           signature.
     _                     UserSignature  This is the
                           signature of the user who left
                           the message.
     !                     RealName  This is the real name
                           of the author of the message.
     >                     DestAddress    This is the
                           address of the system that the
                           message is being sent to. Only
                           used in mail.
     #                     MoreFlags This text string
                           contains any number of
                           characters, each of which is a
                           flag that signifies something.
                           Currently, the only two flags
                           that have been defined are:
                                R    Receipt confirmation
                           requested.
                                E    Encrypted.
     %                     Comment   There may be any
                           number of comments.
     other                 unknown   Citadel will store and
                           pass through the network any
                           field, even if it does not
                           recognize the field's code. The
                           only limit is that it will only
                           store the first 255 characters
                           of each field.
After this information, which makes the header, one last
field is written: the message's text. This is written
starting with a "M" character, followed by the text of the
message, followed by a nul (ASCII 0) character. This is
usually ASCII text, but it is not guaranteed to be: if the
message is compressed or encrypted, this will be binary
data. The only two guarantees are that there is no 0xFF
character (as that would violate the rule about the only one
of those allowed being the start of the message) and there
is no 0x00 character (as that would mark the end of the
message).

Each message is written to the file right after the previous
one. When the end of the MSG.DAT file is reached (which is a
static size set in CONFIG.CIT), writing continues at the
start of the file. A single message might be located at the
end and beginning of the file. Citadel keeps track of 0xFF
characters, and as each is written over, it knows that that
message is no longer valid. There is usually some slack
between the end of the last message and the start of the
first.

_Appendix H: Other files


Queued file transfers
Citadel uses a temporary file named FILEQTMP.CIT for queued
file transfers. When it calls the external file transfer
protocol, it first writes out each file to transfer to this
file, then uses the #RESPONSE_FILE transfer command in
PROTOCOL.CIT to transfer each of these files. This file is
then deleted when the transfer is finished.


Abnormal termination
When Citadel detects a problem that prevents further
execution, it creates a file named CRASH.CIT with an
explanation of the problem in it. The possible problems are:

     Allocating system tables twice.
          Citadel's trying to do something that it should't.
          Try to remember what you did to cause this to
          happen, and see if it can be re-produced. Then
          report your findings to The Anticlimactic
          Teleservice at (206)562-9792.
          
     Auxmem corrupted!
          Report the circumstances of this error appearing
          to The Anticlimactic Teleservice at (206)562-9792.
          
     Bad auxmem request! slot : number, size number (number)
          Citadel tried to access memory that does not
          exist. Report the circumstances of this error
          appearing to The Anticlimactic Teleservice at
          (206)562-9792.
          
     Bad bad.
          Report the circumstances of this error appearing
          to The Anticlimactic Teleservice at (206)562-9792.
          
     Bad bad memory stuff.
          Report the circumstances of this error appearing
          to The Anticlimactic Teleservice at (206)562-9792.
          
     Cannot allocate file buffer for filename
          
          Citadel is most likely out of memory. See if you can
          remove any memory resident utilities or extra
          device drivers, or otherwise increase the amount
          of conventional memory available to Citadel. If
          this is not possible, try setting the system size
          in CONFIG.CIT to be smaller.
          
     Cannot allocate space for accounting information
          Citadel is most likely out of memory. See if you
          can remove any memory resident utilities or extra
          device drivers, or otherwise increase the amount
          of conventional memory available to Citadel. If
          this is not possible, try setting the system size
          in CONFIG.CIT to be smaller.
          
     Cannot allocate space for file buffer
          Citadel is most likely out of memory. See if you
          can remove any memory resident utilities or extra
          device drivers, or otherwise increase the amount
          of conventional memory available to Citadel. If
          this is not possible, try setting the system size
          in CONFIG.CIT to be smaller.
          
     Cannot allocate space for tables
          Citadel is most likely out of memory. See if you
          can remove any memory resident utilities or extra
          device drivers, or otherwise increase the amount
          of conventional memory available to Citadel. If
          this is not possible, try setting the system size
          in CONFIG.CIT to be smaller.
          
     Cannot find any messages.
          When Citadel tried to build its index to MSG.DAT,
          it was not able to find any valid messages in the
          whole file. Citadel needs to be able to find at
          least one message to run successfully, and creates
          one when it creates MSG.DAT. This most likely
          means that your MSG.DAT got highly corrupted, and
          you probably need to restore from a back-up.
          
     Cannot read filename!
          Most likely, a disk error occurred when trying to
          read the specified file.
          
     Cannot write filename!
          
          Citadel is not able to write some information to one of
          its data files. This probably indicates that you
          are out of disk space; delete any extra files that
          you have on the disk.
          
     Cannot write size of file: filename
          Citadel is not able to write some information to
          one of its data files. This probably indicates
          that you are out of disk space; delete any extra
          files that you have on the disk.
          
     Could not create filename file!
          Citadel was not able to create a file that is
          essential to the operation of the program. Check
          that you have enough FILES set in CONFIG.SYS, and
          try to create the file yourself, to see if there
          is something blocking Citadel from doing it.
          
     EMS->heap error #number
          The EMS driver was not able to copy some of
          Citadel's data from EMS to conventional memory.
          number indicates the EMS error that occurred.
          
     Error allocating free chunck
          Citadel is most likely out of memory. See if you
          can remove any memory resident utilities or extra
          device drivers, or otherwise increase the amount
          of conventional memory available to Citadel. If
          this is not possible, try setting the system size
          in CONFIG.CIT to be smaller.
          
     Error allocating logTab
          Citadel is most likely out of memory. See if you
          can remove any memory resident utilities or extra
          device drivers, or otherwise increase the amount
          of conventional memory available to Citadel. If
          this is not possible, try setting the system size
          in CONFIG.CIT to be smaller.
          
     Error allocating msgTab
          Citadel is most likely out of memory. See if you
          can remove any memory resident utilities or extra
          device drivers, or otherwise increase the amount
          of conventional memory available to Citadel. If
          this is not possible, try setting the system size
          in CONFIG.CIT to be smaller.
          
     Error allocating roomTab
          Citadel is most likely out of memory. See if you
          can remove any memory resident utilities or extra
          device drivers, or otherwise increase the amount
          of conventional memory available to Citadel. If
          this is not possible, try setting the system size
          in CONFIG.CIT to be smaller.
          
     Error allocating msgTab (number)
          Citadel is most likely out of memory. See if you
          can remove any memory resident utilities or extra
          device drivers, or otherwise increase the amount
          of conventional memory available to Citadel. If
          this is not possible, try setting the system size
          in CONFIG.CIT to be smaller.
          
     Error allocating roomTab (number)
          Citadel is most likely out of memory. See if you
          can remove any memory resident utilities or extra
          device drivers, or otherwise increase the amount
          of conventional memory available to Citadel. If
          this is not possible, try setting the system size
          in CONFIG.CIT to be smaller.
          
     filename file missing! (errorcode)
          Citadel cannot find a file that it needs to
          continue operation. Check that FILES is set high
          enough in CONFIG.SYS, and that the file actually
          exists.
          
     filename resize failed
          Citadel was not able to resize one of its data
          files. Check that you have enough memory and disk
          space free to accomplish the resize.
          
     Freeing system tables twice.
          Citadel's trying to do something that it should't.
          Try to remember what you did to cause this to
          happen, and see if it can be re-produced. Then
          report your findings to The Anticlimactic
          Teleservice at (206)562-9792.
          
     functionname - not enough memory
          
          Citadel was not able to allocate enough memory to
          accomplish some essential task. For most things,
          Citadel is able to abort out of the task if it
          cannot allocate enough memory to complete it.
          However, it cannot do this with all tasks. See if
          you can remove any memory resident utilities or
          extra device drivers, or otherwise increase the
          amount of conventional memory available to
          Citadel. If this is not possible, try setting the
          system size in CONFIG.CIT to be smaller.
          
     Heap is corrupted.
          Something has corrupted memory. Report the
          circumstances of this error appearing to The
          Anticlimactic Teleservice at (206)562-9792.
          
     Heap->EMS error #number
          The EMS driver was not able to copy some of
          Citadel's data from  conventional memory to EMS.
          number indicates the EMS error that occurred.
          
     Heap->XMS error #number
          
          The XMS driver was not able to copy some of Citadel's
          data from  conventional memory to XMS. number
          indicates the XMS error that occurred.
          
     Heap->Virtual error
          Citadel was not able to copy some of its data from
          conventional memory into virtual memory.
          
     Lost auxmem block!
          Report the circumstances of this error appearing
          to The Anticlimactic Teleservice at (206)562-9792.
          
     Message::ReadHeader: bad HowToRead
          Report the circumstances of this error appearing
          to The Anticlimactic Teleservice at (206)562-9792.
          
     Message::Store: bad HowToSave
          Report the circumstances of this error appearing
          to The Anticlimactic Teleservice at (206)562-9792.
          
     No auxmem chain!
          Report the circumstances of this error appearing
          to The Anticlimactic Teleservice at (206)562-9792.
          
     not enough memory for cron table
          Citadel is most likely out of memory. See if you
          can remove any memory resident utilities or extra
          device drivers, or otherwise increase the amount
          of conventional memory available to Citadel. If
          this is not possible, try setting the system size
          in CONFIG.CIT to be smaller.
          
     Room missing in table!
          A room could not be found in the table of logical
          room ordering. You can delete the ROOMPOS.DAT
          file, and Citadel will create a valid new one. You
          will lose any logical room ordering you have
          created with the .Aide Move room (.A- and .A+)
          commands.
          
     Super secret error #x14h-22a!!
          If we told you, then it wouldn't be a secret,
          would it?
          
     Unknown required keyword: keyword
          
          Report the circumstances of this error appearing to The
          Anticlimactic Teleservice at (206)562-9792.
          
     Virt->heap error
          Citadel was not able to copy some of its data from
          virtual memory into conventional memory.
          
     XMS->heap error #number
          The XMS driver was not able to copy some of
          Citadel's data from XMS to conventional memory.
          number indicates the XMS error that occurred.
          

Networking files
Citadel creates several files for the purpose of networking.
Most of these are temporary files, which are just
transferred to the other node then deleted. The other node
reads the files, then deltes them.


The NETID.CIT file
One file that is used for networking that is not a temporary
file is NETID.CIT. This file stores the Net IDs of all
networked rooms created on the system with #AUTOROOM. This
keeps track of which node the room came from, and also keeps
rooms from being created with #AUTOROOM that you have
killed: before createing a room, Citadel checks this file to
see if the Net ID has already been used. If so, then it does
not recreate the room.

In general, you should never edit this file. However, it is
user-editable, in case some circumstance comes up that
warrents editing of it. The file is simply a text file with
lines following this general format:

     #NETID "Net ID" "Original Node"
     
Where "Net ID" is the Net ID and "Original Node" is the name
of the system that the room came from.


Net 1.0/1.1 network packets
     Wow.


Net 1.5/1.6 network packets
     Wow.


Net 6.9 network packets
In the Net 6.9 protocol, everything is included in a single
packet. The packet is created with some archiver program
(usually PKZIP) and contains several different files. The
name of this packet is important: it is the destination
board's alias plus the string "69" plus the creating board's
alias, with a serial number as an extension. (The
extension's contents is not important: it just is used to
make sure that the packets have unique names over a
reasonable amount of time. Citadel+ assigns a number from
000 to 999 as the serial number, incrementing it each time a
packet is created for the other node. After 999, the counter
restarts at 000.) For example, the first packet created for
a node with the alias SKY on a board with the alias TGI
would be SKY69TGI.000; the second would be SKY69TGI.001; the
thousanth would be SKY69TGI.999; etc.

The following files may be found in a packet (any number of
them may be included; there are no required files):

          Filename       Contents
          MSG.69         Messages in rooms.
          MESG.TMP       Mail.
          ROOMREQ.(alias)     Room request file.
          FILE69.(alias) Network file transfers.
          

MSG.69 format
The MSG.69 file contains the messages to be incorporated
into various rooms. The first thing in the file is the full
address (or, previously, name) of the originating node,
followed by a NUL (ASCII 0). The receiving node uses this
information to determine where the packet came from.

After this are the messages for any number of rooms (even
zero). First, there is the Network ID of the room, followed
by a NUL (ASCII 0). Following this are the messages in
standard Citadel format. (The only message attributes that
should be included are Received and Replied, in the interest
of backwards compatibility.) The room number is not
important, but must be included. Following the last message
in the room, there is the Network ID of the next room or the
end of the file. (Citadel knows the difference between
Network IDs and messages because messages all start with
ASCII 255, which is an invalid character in a Network ID.)


MESG.TMP format
The MESG.TMP file contains all mail destined for the node,
either as a final destination or for routing. The file
simply consists of the messages, in standard Citadel format.
(The only message attributes that should be included are
Received and Replied, in the interest of backwards
compatibility.) The room number is not important, but must
be included.


ROOMREQ.(alias) format
The ROOMREQ.(alias) file contains the Network IDs of the
rooms that the creating node wishes to receive from the
destination node. The (alias) that is the extension of the
file is the alias of the creating node. This file is simply
a list of Network IDs, separated by a CR/LF (ASCII 13 and
ASCII 10) combination.

Note:     The <cr><lf> combination is used for readability
     and editability. Net 6.9 will accept Null/0xFF/CR/LF or
     any mix or combination of those characters as
     separators.
     

FILE69.(alias) format
The FILE69.(alias) file is an archive file created with the
archiver specified by #ZIP in the NODES.CIT entry for the
other node. The other node uses the extract command to
extract all of the files from FILE69.(alias). It extracts
all files to its #DLPATH as set in CONFIG.CIT. After
extracting the archive file, the receiving node checks for
the existence of any FILE69.(alias) files in #DLPATH, and
moves any found to #TRANSPATH as set in CONFIG.CIT. This
allows for multiple hop file transfers.


CALLINFO.BBS. format
The CALLINFO.BBS information we have is incomplete, so
Citadel might not write this file completely correctly. This
file is a text file, with each field taking a line followed
by a carriage return/line feed (ASCII 13 and ASCII 10)
combination. The information that Citadel writes is:

     User's Name    The name of the currently logged in
                    user, with all color codes removed.
     Speed          The number 0 for 2400 baud, 1 for 300
                    baud, 2 for 1200 baud, 3 for 9600 baud,
                    or 5 for console or other speed.
     City           The last line of the user's mailing
                    address that has data in it, or blank if
                    no lines have data.
     Security Level The number 5 for problem users, 30 for
                    normal users, 80 for Aides, and 100 for
                    Sysops.
     Time left      The time left in the user's accounts, in
                    minutes. In an attempt to keep from
                    overflowing other software's limits, no
                    value larger than 546 minutes is
                    written.
     ANSI Color     The word "COLOR" if the current user has
                    ANSI color enabled or "MONO" if he does
                    not.
     Password       The current user's password (but not
                    initials).
     Userlog Number The current user's slot in LOG.DAT. (Not
                    that this means anything to Citadel.)
     Time used      The number of minutes this call has
                    lasted. If there is no user logged in,
                    the number 0.
     Unknown        Citadel writes nothing out. Our
                    information lists this field as being
                    "01:23".
     Unknown        Citadel writes nothing out. Our
                    information lists this field as being
                    "01:23 01/02/90".
     Unknown        Citadel writes nothing out. Our
                    information lists this field as being
                    "ABCDEFGH".
     Unknown        Citadel writes nothing out. Our
                    information lists this field as being
                    "0".
     Unknown        Citadel writes nothing out. Our
                    information lists this field as being
                    "99".
     Unknown        Citadel writes nothing out. Our
                    information lists this field as being
                    "0".
     Unknown        Citadel writes nothing out. Our
                    information lists this field as being
                    "9999".
     Phone number   The current user's phone number.
     Unknown        Citadel writes nothing out. Our
                    information lists this field as being
                    "01/01/90 02:34".
     Expert         The word "EXPERT" if helpful hints are
                    turned off or "NOVICE" if they are on.
     File transfer protocol   The name of the user's default
                    file transfer protocol, or a blank line
                    if none is specified.
     Unknown        Citadel writes nothing out. Our
                    information lists this field as being
                    "01/01/90".
     Times on       The number of times the current user has
                    logged onto the system.
     Lines per screen    The number of lines per screen, or
                    0 if the current user has screen pause
                    turned off.
     Last message read   The new message pointer for the
                    current room.
     Total uploads  The total number of files the user has
                    uploaded.
     Total downloads     The total number of files the user
                    has downloaded.
     Idiotically Stupid!!!    The text "8  { Databits }".
                    (There are two spaces between the "8"
                    and the "{".)
     User's location     The text "LOCAL" if logged in on
                    console, or "REMOTE" if logged in over
                    the modem.
     Port           The text "COM" followed by the serial
                    port number of the modem. (For example,
                    "COM1" if the modem is on the first
                    serial port.)
     Speed          The number 0 for 2400 baud, 1 for 300
                    baud, 2 for 1200 baud, 3 for 9600 baud,
                    or 5 for other speed. No attention is
                    paid to whether the user is on console
                    or not.
     Unknown        Citadel writes nothing out. Our
                    information lists this field as being
                    "FALSE".
     Another stupid thing     The text "Normal Connection".
     Unknown        Citadel writes nothing out. Our
                    information lists this field as being
                    "01/02/94 01:20".
     Task number    Citadel writes the number 0.
     Door number    Citadel writes the number 1.
                    

CHAIN.TXT. format
The information regarding the format for this file came from
a post to alt.bbs by Paranoid@f102.n514.z17.mtlnet.org dated
September 28, 1993. This message consisted of a file created
by Mr. Bill (or perhaps MrBill), WWIVnet Address 1 @ 7300
[MrBill's Abode 703-369-6140], or CompuServe address
71001,1101. CHAIN.TXT is a text file, with each field taking
a line followed by a carriage return/line feed (ASCII 13 and
ASCII 10) combination. The information that Citadel writes
is:

     User Number    The current user's slot in LOG.DAT. (Not
                    that this really means anything on
                    Citadel.)
     User's Alias   The user's name, with color codes
                    removed.
     User's Name    The user's real name, with color codes
                    removed.
     Ham radio call sign Citadel writes nothing out.
     User's age     Calculated from the user's birthdate. If
                    the user has not specified a birthdate,
                    the number 21.
     User's sex     The letter "M" if the user is a male, or
                    "F" if the user is a female, or hasn't
                    specified his sex.
     User's gold    The number of seconds left in the user's
                    account. (Limited to 32,767 to avoid
                    overflowing other software.)
     Last logon date     The date the user last logged on
                    before the current call. Written in the
                    form "01/01/95".
     Columns        The user's terminal width.
     Lines per screen    The user's lines per screen, or 0
                    if screen pause is turned off.
     Security level The number 5 for problem users, 75 for
                    normal users, 200 for Aides, and 250 for
                    Sysops.
     Co-Sysop       The number 1 if the current user is an
                    Aide, or 0 if not.
     Sysop          The number 1 if the current user is a
                    Sysop, or 0 if not.
     ANSI           The number 1 if the current user has
                    ANSI turned on, or 0 if not.
     Remote         The number 1 if logged in remotely, or 0
                    if on console.
     Time left      The number of seconds left in the
                    current user's account, limited to
                    32,767 to avoid overflowing other
                    software.
     GFILES directory    #DIRPATH as set in CONFIG.CIT with
                    a trailing back-slash.
     DATA directory #HOMEPATH as set in CONFIG.CIT with a
                    trailing back-slash.
     System log of the day    Citadel writes the text
                    "wow.log"
     User baud rate The connect rate if there is a
                    connection or the port rate if there is
                    no connection.
     Serial port    The number 1, 2, 3, or 4.
     System name    #NODENAME as set in CONFIG.CIT with any
                    color codes removed.
     System sysop   #SYSOP as set in CONFIG.CIT with any
                    color codes removed.
     User login time     The time that the current user
                    logged in (or the current time if there
                    is no user logged in), written as
                    seconds after midnight.
     Time used      The number of seconds used this call (or
                    0 if there is no user logged in).
     Uploaded K     The number of kilobytes uploaded by the
                    user. (Citadel stores this for each
                    user, but does not track this
                    currently.)
     Uploaded files The number of files uploaded by the
                    user. (Citadel stores this for each
                    user, but does not track this
                    currently.)
     Downloaded K   The number of kilobytes downloaded by
                    the user. (Citadel stores this for each
                    user, but does not track this
                    currently.)
     Downloaded files    The number of files downloaded by
                    the user. (Citadel stores this for each
                    user, but does not track this
                    currently.)
     Data format    The text "8N1" as this is the only data
                    format supported by Citadel.
     Port rate      The current speed of the serial port.
     WWIVnet node   Citadel writes the number 0.
                    

CONSOLE.APL. format
CONSOLE.APL is a text file that Citadel displays to the
console after it returns from a shell. After it displays
this file, Citadel deletes it.


DOOR.SYS. format
The format for DOOR.SYS comes from a March 14, 1988 release
by "Limited Release Software Group" (and apparently written
by Rick Greer, who is nowhere to be found), amended March
21, 1988, October 22, 1988 (by Kenny Gardner), July 7, 1990
(by Kenny Gardner for Raymond Clements), and July 14, 1991
(by Jim Harrer of Mustang Software, who can't program).
DOOR.SYS is a text file, with each field taking a line
followed by a carriage return/line feed (ASCII 13 and ASCII
10) combination. The information that Citadel writes is:

     Com port       "COMx:" where "x" is replaced by the
                    serial port number, or 0 if the current
                    user is logged in on console.
     User speed     The connect speed if carrier is present,
                    or the port speed if no carrier is
                    present.
     Parity         The number "8".
     Node number    The number "1".
     DTE Rate       The port speed.
     Screen display The text "N" if the screen saver is
                    active, or "Y" if it is not.
     Printer status The text "Y" if text is being captured
                    with Alt+P, or "N" if it is not.
     Page bell      The text "Y" is the speaker is activated
                    for the Chat command, or "N" if it is
                    not.
     Caller alarm   The text "Y".
     User name      The current user's name, with color
                    codes removed.
     Calling from   The last line of the current user's
                    address with data in it, or blank if
                    there is no address information at all.
     Home phone     The current user's phone number.
     Work/Data phone     The current user's phone number.
     Password       The current user's password (but not
                    initials).
     Security level The number 5 for problem users, 30 for
                    regular users, 80 for Aides, and 100 for
                    Sysops.
     Total times on The number of times the current user has
                    logged onto the system.
     Last date called    The date that the current user last
                    called before this call, in the format
                    "01/01/95".
     Seconds remaining   Number of seconds left in the
                    current user's account, limited to
                    32,767 to avoid overflowing other
                    software.
     Minutes remaining   Number of minutes left in the
                    current user's account, limited to 546
                    to avoid overflowing other software.
     Graphics mode  The text "GR" if the current user has
                    IBM Graphics characters turned on, or
                    "NG" if not.
     Page length    The screen length of the current user,
                    or 0 if screen pause is turned off.
     Expert mode    The text "N" if helpful hints are turned
                    on, or "Y" if they are off.
     Forums registered in     Citadel writes a blank line.
     Current conference  The index of the current room in
                    ROOM.DAT.
     User expiration date     The text "12/31/99".
     User number    The index of the current user in
                    LOG.DAT. (Not that this means anything
                    in Citadel.)
     Default protocol    The command key that represents the
                    current user's default file transfer
                    protocol.
     Number of uploads   The number of files the current
                    user has uploaded. (Citadel stores this
                    information, but does not currently
                    track it.)
     Number of downloads The number of files the current
                    user has downloaded. (Citadel stores
                    this information, but does not currently
                    track it.)
     Daily K downloaded  The number "0".
     Daily K limit  The number "999,999".
     Birthdate      The current user's birthdate, written in
                    the form "01/01/95".
     MAIN directory #HOMEPATH as set in CONFIG.CIT.
     GEN directory  #DIRPATH as set in CONFIG.CIT.
     Sysop's name   #SYSOP as set in CONFIG.CIT with all
                    color codes removed.
     Alias name     The current user's name, with color
                    codes removed.
     Event time     Citadel writes a blank line.
     Error correction    The text "Y" if the modems are
                    communicating with an error-correcting
                    protocol, or "N" if not.
     ANSI in no graphics The text "N".
     Use record locking  The text "N".
     BBS Default color   The color as set by #ATTR in
                    CONFIG.CIT.
     Time in minutes     The time left in the current user's
                    account, in minutes. The highest number
                    written is 546, to avoid overflowing
                    other software.
     Last new file scan  The date of the user's last call,
                    in the format "01/01/95".
     This call time The time that the user called (or the
                    current time if there is no user logged
                    in) in the form "00:00".
     Last call time The time that the user last called in
                    the form "00:00".
     Max files available The number "99".
     Files d/l today     The number "0".
     Total K uploaded    The total kilobytes uploaded by the
                    current user. (Citadel stores this
                    information for each caller, but does
                    not currently track it.)
     Total K downloaded  The total kilobytes downloaded by
                    the current user. (Citadel stores this
                    information for each caller, but does
                    not currently track it.)
     User comment   The current user's signature.
     Total doors opened  The number "0".
     Total messages left The total number of messages posted
                    by the current user.
                    

DORINFO1.DEF. format
DORINFO1.DEF is a text file, with each field taking a line
followed by a carriage return/line feed (ASCII 13 and ASCII
10) combination. The information that Citadel writes is:

     Node name      The name of the system, with color codes
                    removed.
     Sysop's first name  The text of #SYSOP as set in
                    CONFIG.CIT with color codes removed, up
                    to the first space.
     Sysop's last name   The text of #SYSOP as set in
                    CONFIG.CIT with color codes removed,
                    following the first space.
     Com port       The serial port the modem is connected
                    to, or 0 if logged in on console.
     Baud rate      The current port rate.
     Networked      The number "0".
     User's first name   The current user's name with color
                    codes removed, up to the first space.
     User's last name    The current user's name with color
                    codes removed, following the first
                    space.
     City           The last line of the current user's
                    address that has data in it, or a blank
                    line if there is no address information.
     Terminal type  The number "0" if TTY, or "1" if ANSI.
     Security level The number 5 for problem users, 30 for
                    regular users, 80 for Aides, and 100 for
                    Sysops.
     Minutes remaining   The number of minutes left in the
                    current user's account, limited to 546
                    to keep from overflowing other software.
     FOSSIL         The number "-1" if using an external
                    serial driver or "0" if using internal
                    serial routines.
                    

INPUT.APL. format
INPUT.APL is read by Citadel after it returns from a shell,
and the data in it is used to change Citadel's current
settings. This is a text file, with each line starting with
a character that serves as a flag specifying what is on the
line, followed by text that specifies the data. After the
data, the line is either ended by a carriage return/line
feed (ASCII 13 and 10) combination, or just a single line
feed (ASCII 10). Not all data is required to be in
INPUT.APL: just write what you desire to change. Also,
Citadel ignores any field it does not know about. The
following data types are defined by Citadel:

     Flag           Name Data
     33             Surname   The current user's surname.
     34             Title     The current user's title.
     35             Sysop     Whether the current user is a
                    Sysop - 1 or 0.
     36             Aide Whether the current user is an Aide
                    - 1 or 0.
     37             Twit Whether the current user is twitted
                    - 1 or 0.
     38             Expert    Whether the current user is in
                    expert mode (that is, helpful hints are
                    turned off) - 1 or 0.
     39             Credits   The number of minutes left in
                    the current user's account.
     40             Permanent Whether the current user has a
                    permanent account - 1 or 0.
     41             NetUser   Whether the user has net
                    access - 1 or 0.
     42             NoMail    Whether the user cannot send
                    mail - 1 or 0.
     43             Verified  Whether the user is a verified
                    user - 1 or 0.
     48             RealName  The current user's real name.
     50             Nulls     The number of nulls the
                    current user is configured for.
     51             Linefeed  Whether the current user has
                    linefeeds turned on - 1 or 0.
     52             Uppercase Whether the current user is
                    configured for an uppercase-only
                    terminal - 1 or 0.
     54             Columns   The number of columns the
                    current user is configured for.
     55             Lines     The number of lines on screen
                    the current user is configured for, or 0
                    if screen pause is turned off.
     56             Unlisted  Whether the current user has
                    an unlisted userlog entry - 1 or 0.
     73             Hall The name of the hall the user is
                    currently in.
     74             Room The name of the room the user is
                    currently in.
     95             Transmitted    The number of characters
                    sent by Citadel to the currently logged-
                    in user.
     96             Received  The number of characters
                    received by Citadel from the currently
                    logged-in user.
     97             SysReq    Whether the system has been
                    requested (F3 or Alt+F3) -1 or 0.
     99             StatusScreen   Whether the system status
                    screen (F4) is displayed or not - 1 or
                    0.
     100            Chat Whether Chat is enabled or not - 1
                    or 0.
     101            Bells     Whether bells are enabled or
                    not - 1 or 0.
     102            Printing  Whether output is being
                    trapped (Alt+P) or not - 1 or 0.
     111            GroupAdd  Specifies the name of a group
                    to add the current user to.
     112            GroupRemove    Specifies the name of a
                    group to remove the current user from.
     200            MsgAuthor Specifies the name to use for
                    the author of the message created by
                    MESSAGE.APL. (If this field is not
                    specified but MESSAGE.APL exists, the
                    node's name is used as the message
                    author.)
     201            MsgToUser Specifies the user to use for
                    the recipient of the message created by
                    MESSAGE.APL. (If this field is not
                    specified but MESSAGE.APL exists, the
                    message is not sent to anybody; it is
                    made to be a public message.)
     202            MsgGroup  Specifies the group to use for
                    the message created by MESSAGE.APL. (If
                    this field is not specified but
                    MESSAGE.APL exists, the message is not
                    made to be group-only; it is made to be
                    a public message.)
     203            MsgRoom   Specifies the room to place
                    the message created by MESSAGE.APL in.
                    (If this field is not specified but
                    MESSAGE.APL exists, the message is
                    placed in the current room.)

MESSAGE.APL. format
MESSAGE.APL is used to create a message when returning from
a shell. This file contains the text of the message.
(Remember that Citadel messages can only be 8K long. If this
file is longer than 8K, it will be truncated to 8K in the
message.) You can set certain fields in INPUT.APL to control
some aspects of the message, such as its author and group.


OUTPUT.APL. format
OUTPUT.APL is created by Citadel before it shells to another
application, to let the other application know about the
operating environment of Citadel. This is a text file, with
each field being on a line by itself. The first character of
the line is a flag telling what data is on the line. After
the flag is the data, then a carriage return/linefeed (ASCII
13 and 10) combination to end the line. Applications that
read OUTPUT.APL should know to ignore flags not defined
here: more may be added in the future. Also, applications
should be able to operate with reasonable defaults if they
cannot find data in this file: fields may be removed in the
future (though this is not likely). The following data types
are defined by Citadel:

     Flag           Name Data
     32             Name The current user's name.
     33             Surname   The current user's surname.
     34             Title     The current user's title.
     35             Sysop     Whether the current user is a
                    Sysop - 1 or 0.
     36             Aide Whether the current user is an Aide
                    - 1 or 0.
     37             Twit Whether the current user is twitted
                    - 1 or 0.
     38             Expert    Whether the current user is in
                    expert mode (that is, helpful hints are
                    turned off) - 1 or 0.
     39             Credits   The number of minutes left in
                    the current user's account.
     40             Permanent Whether the current user has a
                    permanent account - 1 or 0.
     41             NetUser   Whether the user has net
                    access - 1 or 0.
     42             NoMail    Whether the user cannot send
                    mail - 1 or 0.
     43             Verified  Whether the user is a verified
                    user - 1 or 0.
     44             DLMult    The percentage of time that is
                    charged for downloads by the current
                    user.
     45             ULMult    The percentage of time that is
                    charged for uploads by the current user.
     46             Initials  The current user's initials.
     47             Password  The current user's password.
     48             RealName  The current user's real name.
     49             ConnectRate    The speed that the modem
                    is talking to the other modem at: 300,
                    600, 1200, 2400, 4800, 7200, 9600,
                    12000, 14400, 16800, 19200, 21600,
                    24000, 26400, 28800, 38400, 57600,
                    115200, or 230400.
     50             Nulls     The number of nulls the
                    current user is configured for.
     51             Linefeed  Whether the current user has
                    linefeeds turned on - 1 or 0.
     52             Uppercase Whether the current user is
                    configured for an uppercase-only
                    terminal - 1 or 0.
     54             Columns   The number of columns the
                    current user is configured for.
     55             Lines     The number lines on screen the
                    current user is configured for, or 0 if
                    screen pause is turned off.
     56             Unlisted  Whether the current user has
                    an unlisted userlog entry - 1 or 0.
     57             MData     Which serial port the system
                    is using; 1, 2, 3, or 4.
     58             Baud Old port rate index. Do not use
                    this as it is included only for
                    backwards compatibility; use PortRate
                    (68) instead. The possible values are: 0
                    (300 bps), 1 (600 or 1200 bps), 2 (2400
                    bps), 3 (4800 bps), 4 (9600 bps), 5
                    (19200 bps), 6 (38400 bps), 7 (57600
                    bps), or 8 (115200 bps).
     62             TRMNormal The string to send to change
                    the current user's terminal to normal
                    text.
     63             TRMBold   The string to send to change
                    the current user's terminal to bold
                    text.
     64             TRMInvr   The string to send to change
                    the current user's terminal to inverse
                    text.
     65             TRMBlink  The string to send to change
                    the current user's terminal to blinking
                    text.
     66             TRMUnder  The string to send to change
                    the current user's terminal to
                    underlined text.
     67             EffBaud   Old connect rate index. Do not
                    use this as it is included only for
                    backwards compatibility; use ConnectRate
                    (49) instead. The possible values are: 0
                    (300 bps), 1 (600 or 1200 bps), 2 (2400
                    bps), 3 (4800 bps), 4 (7200 bps), 5
                    (9600 bps), 6 (12000 bps), 7 (14400
                    bps), 8 (16800 bps), 9 (19200 bps), 10
                    (21600 bps), 11 (24000 bps), 12 (26400
                    bps), 13 (28800 bps), 14 (38400 bps), 15
                    (57600 bps), 16 (115200 bps), and 17
                    (230400 bps).
     68             PortRate  The speed that Citadel is
                    talking to the modem at: 300, 600, 1200,
                    2400, 4800, 9600, 19200, 38400, 57600,
                    or 115200.
     69             Country   The country of the system, as
                    set by #NODECOUNTRY in CONFIG.CIT.
     70             NodeName  The name of the system, as set
                    by #NODENAME in CONFIG.CIT
     71             Region    The region of the system, as
                    set by #NODEREGION in CONFIG.CIT
     72             Version   Citadel's version string, such
                    as "/065".
     73             Hall The name of the hall the user is
                    currently in.
     74             Room The name of the room the user is
                    currently in.
     75             TempPath  The path specified by
                    #TEMPPATH in CONFIG.CIT.
     76             ApplPath  The path specified by
                    #APPLICPATH in CONFIG.CIT.
     77             HelpPath  The path specified by
                    #HELPPATH in CONFIG.CIT.
     78             HomePath  The path specified by
                    #HOMEPATH in CONFIG.CIT.
     79             RoomPath  The path specified by
                    #ROOMPATH in CONFIG.CIT.
     80             MsgPath   The path specified by #MSGPATH
                    in CONFIG.CIT.
     81             PrintFile The full name of the printer
                    output file as specified by #PRINTER in
                    CONFIG.CIT.
     82             TrapFile  The path specified by
                    #TRAP_FILE in CONFIG.CIT.
     83             Accounting     Is accounting turned on
                    for the system.
     84             TransPath The path specified by
                    #TRANSPATH in CONFIG.CIT.
     85             Software  The name of the currently
                    running software. (For example,
                    "Citadel+".)
     90             Attr The value of #ATTR in CONFIG.CIT.
     91             WAttr     The value of #WATTR in
                    CONFIG.CIT.
     92             CAttr     The value of #CATTR in
                    CONFIG.CIT.
     93             Uttr The value of #UTTR in CONFIG.CIT.
     94             BAttr     The value of #BATTR in
                    CONFIG.CIT.
     95             Transmitted    The number characters
                    sent by Citadel to the currently logged-
                    in user.
     96             Received  The number of characters
                    received by Citadel from the currently
                    logged-in user.
     97             SysReq    Whether the system has been
                    requested (F3 or Alt+F3) -1 or 0.
     98             ConLock   Whether the system console is
                    locked - 1 or 0.
     99             StatusScreen   Whether the system status
                    screen (F4) is displayed or not - 1 or
                    0.
     100            Chat Whether Chat is enabled or not - 1
                    or 0.
     101            Bells     Whether bells are enabled or
                    not - 1 or 0.
     102            Printing  Whether output is being
                    trapped (Alt+P) or not - 1 or 0.
     103            SysopName The value of #SYSOP in
                    CONFIG.CIT.

PCBOARD.SYS. format
The information used to create this file came from the
FeatherNet PRO! 1.01 documentation, page 44.15. PCBOARD.SYS
is a fixed-width field file with a truly evil file format.
Information noted as being written out as an "integer" is
written in two bytes, MSB followed by LSB. Other fields are
written as ASCII, padded out to the field length shown with
spaces. The information written out by Citadel is:

     Offset                Length    Name Description
     0                     2    Unknown   The text "-1"
     2                     2    Unknown   The text " 0"
                           (note the leading space).
     4                     2    Chat on   The text "-1" if
                           chat is on or " 0" (note the
                           leading space) if chat is off.
     6                     2    User in file   The text "-
                           1".
     8                     1    Expert mode    The text "Y"
                           if helpful hints are turned off,
                           or "N" if they are on.
     9                     2    Error correction    The
                           text "-1" if an error-correcting
                           protocol is in use by the modem,
                           or " 0" if not (note the leading
                           space).
     11                    1    Graphics mode  The text "Y"
                           if ANSI is turned on, or "N" if
                           not.
     12                    1    Unknown   The text "A".
     13                    5    DTE Rate  The port rate,
                           padded with spaces on the left.
                           115,200 is written out as
                           "11520". I think.
     18                    5    DCE Rate  The connect rate,
                           padded with spaces on the left.
                           115,200 is written out as
                           "11520" and 230,400 is written
                           out as "23040". I think. If
                           there is no carrier, the word
                           "Local" is written.
     23                    2    User number    The position
                           of the current user in LOG.DAT
                           written as an integer.
     25                    15   User's first name   The
                           current user's name with color
                           codes removed, up to the first
                           space or 15 characters,
                           whichever comes first. Padded
                           with spaces on the right.
     40                    12   User's password     The
                           current user's password, up to
                           the first 12 characters, padded
                           with spaces on the right.
     52                    2    Time logged on The time the
                           current user logged on (or the
                           current time if there is no user
                           logged on) expressed as minutes
                           since midnight, written as an
                           integer.
     54                    2    Time on   The time the
                           current user has been on the
                           system (or 0 if there is no user
                           on the system) expressed in
                           minutes as an integer.
     56                    5    Time logged on The time the
                           current user logged on (or the
                           current time if there is no user
                           logged on) expressed in "12:34"
                           format.
     61                    2    Time allowed   The total
                           time allowed on the system in
                           minutes, calculated by adding
                           the time already spent on system
                           to the time left in the current
                           user's account, expressed in
                           minutes as an integer.
     63                    2    D/L limit The number "99"
                           written out as an integer.
     65                    1    Conf last joined    The LSB
                           of the current room's room
                           number.
     66                    5    Areas been in  All bits set
                           (0xFF, 0xFF, 0xFF, 0xFF, 0xFF).
     71                    5    Areas scanned  All bits set
                           (0xFF, 0xFF, 0xFF, 0xFF, 0xFF).
     76                    2    Unknown   The number "0"
                           written as an integer.
     78                    2    Unknown   The number "0"
                           written as an integer.
     80                    4    Unknown   Four spaces.
     84                    25   Full name The first 25
                           characters of the user's name
                           after removing color codes.
     109                   2    Time left The time left on
                           the system in minutes (limited
                           to 546 to avoid overflowing
                           other software) written as an
                           integer.
     111                   1    Node on   The ASCII
                           character 0x00.
     112                   5    Event time     The text
                           "00:00".
     117                   2    Event active   The text "
                           0" (note the leading space).
     119                   2    Unknown   The text " 0"
                           (note the leading space).
     121                   4    Unknown   All bits cleared
                           (0x00, 0x00, 0x00, 0x00).
     125                   1    Com port  The number "1"
                           through "4" written as ASCII
                           characters. (0x31 through 0x34)
                           or the ASCII character "0"
                           (0x30) if on console.
     126                   2    File transfer type  The
                           keystroke used for the current
                           user's default file transfer
                           protocol, written twice.
     128                   1    ANSI mode 0x01 if ANSI is
                           active, or 0x00 if not.
     129                   13   Unknown   Filled with
                           spsaces (ASCII 0x20).
     142                   2    Last area in   The current
                           room's index in ROOM.DAT,
                           written as an integer.

README.APL. format
README.APL is a text file that Citadel displays to the user
after returning from a shell. After Citadel displays the
file, it deletes it.


TRIBBS.SYS. format
TRIBBS.SYS is a text file, with each field taking a line
followed by a carriage return/line feed (ASCII 13 and ASCII
10) combination. The information that Citadel writes is:

     User's record number     The index of the current user
                    in LOG.DAT (not that this means anything
                    with Citadel).
     User's name    The name of the current user, after
                    color codes have been removed.
     User's password     The current user's password (but
                    not initials).
     Security level The current user's security level: 5 for
                    problem user, 75 for regular users, 200
                    for Aides, and 250 for Sysops.
     Expert mode    The text "Y" if helpful hints are turned
                    off, or "N" if they are on.
     ANSI mode      The text "Y" if ANSI is turned on, or
                    "N" if not.
     Minutes left   The number of minutes left this call,
                    limited to 546 to keep from overflowing
                    other software.
     Phone number   The current user's phone number.
     City and State The last line of the current user's
                    address, or blank if there is no address
                    data.
     Birthdate      The current user's birthdate, written in
                    the form "01/01/95".
     Node number    The text "1".
     Serial port    The port, from "1" to "4".
     Baud rate      The current connect rate, or 0 if the
                    user is on local.
     Port rate      The current port rate.
     RTS/CTS        The text "Y" if #CHECKCTS in CONFIG.CIT
                    is set to 1, or "N" if set to 0.
     Error correction    The text "Y" if the modem is using
                    an error-correcting protocol, or "N" if
                    not.
     Board's name   The name of the system with color codes
                    removed.
     Sysop's name   The name of the sysop as set by #SYSOP
                    in CONFIG.CIT with color codes removed.
     User's alias   The name of the current user with color
                    codes removed.
     RIP Script support  The text "N".
                    

USERINFO.DAT . format
USERINFO.DAT is a text file, with each field taking a line
followed by a carriage return/line feed (ASCII 13 and ASCII
10) combination. The information that Citadel writes is:

     User's name    The current user's name with color codes
                    removed.
     Connect rate   The current connect rate, or the text
                    "LOCAL" if there is no carrier.
     Data bits      The text "8"
     ANSI           The text "Y" if the current user has
                    ANSI enabled, or "N" if not.
     MNP Connection The text "N".
     Time/date of call   The time and date of the current
                    call (or the current time and date if
                    there is no user logged in) written in
                    the form "00:00 01/01/95".
     Current time/date   The current time and date written
                    as "00:00 01/01/95".
     Minutes remaining   The number of minutes left in the
                    current user's account, limited to 546
                    to avoid overflowing other software.
     Start with cmd line The text "N".
     Current conference  The index of the current room in
                    ROOM.DAT.
     Active menu number  The text "0" ("Main" in Wildcat!
                    speak).
     Security level name Citadel writes a blank line.
     Banked time    The text "60".
     Door number    The text "1".
     Alias name     The current user's name with color codes
                    removed.
     Hang up in door     The text "N".
     Files downloaded    The number of files the current use
                    has downloaded. (Citadel stores this
                    information for each user, but currently
                    does not track it.)
     K downloaded   The total kilobytes downloaded by the
                    current user. (Citadel stores this
                    information for each user, but currently
                    does not track it.)
_Appendix I: Legal

The only copyright on Citadel is one that Borland (the
makers of our compiler) told us to put on it. Challenge
yourself: find the notice in the program. However, we didn't
add any copyright to it. You are free, and actually
encouraged, to copy and distribute it as much as you want
for any purposes that you want. Honor dictates that you
don't call it your own, or try to sell it for a profit, or
change the files in any way, but there is nothing really
keeping you from doing it. (Other than the thought of little
pixies pricking you in your sleep for the rest of your
life.) (Challenge yourself again, and look for that message
in Citadel.)

A possible problem arises, however, if you distribute the
program outside of the United States of America. I don't
know if the message encryption in Citadel is good enough to
bother the government, but there are certain restrictions on
exporting data encryption technology from the United States.
Our government is so paranoid that this technology falls
under the same classification as nuclear warheads: a weapon
of war. (You cannot export nuclear warheads, either.) I am
sure than a good mathematician specializing in cryptology
can find a way to break the encryption without too much
difficulty, but there may be a problem anyway. I have not
looked into the laws, so I don't know much more than this.

Also note that we cannot, of course, warrant the program's
operation in any way. We test it thoroughly and run it
ourselves, but even with the safety precautions we go
through, some potentially dangerous bug may exist, which
could cause data loss or equipment failure. This is not
likely, and we will try to fix any such bugs brought to our
attention, but we cannot give any guarantee that such bugs
don't exist, or can be fixed.

Source code is generally not available to the public. If you
require source code for some reason, call The Anticlimactic
Teleservice at (206)562-9792. We will make a decision to
release code on an individual basis. Be aware, however, that
code releases are not common.

_Index

                                CHAIN.TXT. See Shell Files
            _#_                 Citadel-86
#CONFIG.CIT                      MSGADD, 36, 43
 #DUMB_MODEM, 85                 MSGOUT, 36, 43
                                COMMAND.COM, 22, 23, 130
            _A_                 Commands
Accounting, 11                   .Aide
ANSI Colors, 13                   Attributes (.AA), 64
Applications, 22                  Chat (.AC), 64
Auxmem version, 1, 51, 64,        Copy message to old-
 82, 92, 93, 173, 188, 267          buffer (.A<), 66
                                  Edit room (.AE), 9, 25,
            _B_                     39, 48, 57, 65, 66, 79
Basic Usage, 4                    File set (.AF), 65
BL@, 27                           Group (.AG), 9, 65
BLB, 27                           Hall (.AH), 65
                                  Insert (.AI), 73
            _C_                   Insert message (.AI), 65
CALLINFO.BBS. See Shell           Jump to Aide) and
 Files                              Maintenance (.AJ), 65
                                  Kill room (.AK), 65
                                  List group (.AL), 9, 62,
  6                                 Set file information
  Menu (.A?), 66                    (.AS), 66
  Move file (.AM), 65             Unlink (.AU), 30, 66
  Move room back (.A-), 66        Window room (.AW), 66
  Move room forward (.A+),       .Aide (.A...), 61, 64
    66                            Edit room (.AE), 86
  Name message (.AN), 65          Hall (.AH), 100
  Name messages (.AN), 29,        Name messages (.AN), 94,
    164, 169, 203                   95
  Queue (.AQ...), 65              Window (.AW), 100
    Auto mark/kill/censor        .Bypass (.B), 57
     toggle (.AQA), 65           .Bypass (.B...), 70
    Clear (.AQC), 65             .Chat (.C), 66
    Insert (.AQI), 65            .Download (.D...), 22,
    Kill (.AQK), 65               66, 129
    List (.AQL), 65               Menu (.D?), 32, 33, 129
    Menu (.AQ?), 66              .Enter (.E...), 66
    Move (.AQM), 65               Application (.EA), 22,
    Room mark (.AQR), 65            25, 66
    Sort (.AQS), 66               Border (.EB), 67, 94,
    Verbose (.AQV), 66              120
  Rename file (.AR), 66           Configuration (.EC), 6,
  7, 12, 13, 28, 29, 30,            Exclusive message (.EE),
    31, 34, 44, 48, 67,             67
    71, 72, 86, 93, 96,           File-linked (.E*), 68
    148, 169                      Group-only (.EG), 67
    Message Editor options        Hall (.EH), 67
     (E), 6, 7, 48, 71, 72        Local (.EL), 67
     Confirm Abort (A), 6,        Menu (.E?), 32, 68
      71                          Message (.EM), 9, 67
     Confirm Save (S), 7,         Name (.EN), 28, 67
      72                          Old (.EO), 6, 66, 67, 71
     Verbose Continue (V),        Password (.EP), 67
      6, 71                       Room (.ER), 9, 67, 168
    Terminal settings (T),        Surname / Title (.ES),
     13                             67, 94
     ANSI color (C), 13           Text file (.ET), 67
     ANSI mode (A), 13            With protocol (.EW...),
     Attributes (R), 13             5, 67
  Door (.ED), 105                   Menu (.EW?), 32, 67
  Door (.ED...), 22, 24,         .Expert toggle (.X), 70
    67, 104                      .Finger (.F...)
    Menu (.ED?), 32               Menu (.F?), 32
  Exclude room (.EX), 68         .Goto (.G), 57
 .Goto (.G...), 68                Exclusive message (.KE),
 .Help                              69
  Menu (.H?), 33                  Group-only (.KG), 68
 .Help (.H), 34                   Halls (.KH), 68
 .Help (.H...), 68                Hidden (.K)), 69
 .Invite                          Local (.KL), 69
  Menu (.I?), 33                  Menu (.K?), 69
 .Invite (.I...), 70              New (.KN), 69
  List users (.IL), 70            Number of messages
  Menu (.I?), 70                    (.K#), 69
  Room list (.IR), 70             Old (.KO), 69
  User (.IU), 70                  Permanent (.KP), 68
 .Jumpback (.J), 68               Room information (.KI),
 .Known                             69
  Menu (.K?), 33                  Rooms (.KR), 68, 69
 .Known (.K...), 68               Shared (.KS), 69
  Anonymous (.KY), 68             This hall only (.KT), 69
  Application (.KA), 68           Verbose (.KV), 69
  BIO (.KB), 69                   Window (.KW), 69
  Directory (.KD), 68            .Login (.L...), 69
  Empty (.K0), 69                .Mal serach (.M), 69
  Excluded (.KX), 69             .Menu (.?), 33, 71
 .Personal hall (.P...)           Configuration (.RC), 58,
  Add                               63
    Menu (.PA?), 33               Directory (.RD), 5, 59
  Menu (.P?), 33                  Exclusive (.RE), 59
 .Queue (.Q...), 70               Forward (.RF), 59
  Add (.QA), 70                   Group-only (.RG), 10, 59
  Clear (.QC), 70                   Messages (.RGM), 10
  Download (.QD), 70              Group-only (.RG...)
  Download (.QD?), 33               Userlog (.RGU), 100
  List (.QL), 71                  Halls (.RH), 59
  Menu (.Q?), 32, 71              Header scan (.R!), 58
  Remove (.QR), 71                Info file (.RI), 5, 59,
 .Read (.R), 57                     62
 .Read (.R...), 58                Keyword search (.RK), 58
  All (.RA), 58                   Local (.RL), 59
  All (.RA...), 100               Menu (.R?), 33, 60
  Archive file (.RZ), 59,         Messages (.RM), 58, 100
    60, 104                       New (.RN), 59
  By date (.R&), 58               Number (.R##), 58
  By message number (.R#),        Old (.RO), 59
    58                            Public (.RP), 59
  By user (.RB), 58               Reverse (.RR), 59
  Status (.RS), 59, 78, 96        Abort (.SA), 60
  Text file (.RT), 59             Aide function (.SF), 61
  Userlog (.RU), 58, 59           Auxmem memory status
  Verbose (.RV...), 59              (.S^), 64
    Status (.RVS), 128,           Config file (.SE), 61
     245, 259, 261                Create PATH.DAT (.S>),
  With protocol (.RW...),           60
    5, 60                         Cron (.SC...), 60
    Menu (.RW?), 33, 60             All done (.SCA), 60
 .Sysop (.S...)                     Done (.SCD), 60
  6.9 net command                   Enter (.SCE), 60
    (.S6...), 42, 64                Force (.SCF), 61
    Build address (.S6@),           List (.SCL), 61
     64                             Menu (.SC?), 32, 61
    Fetch (.S6F), 42, 64            Next event set (.SCN),
    Generate room request            61
     (.S6R), 64                     Pause (.SCP), 61
    Incorporate (.S6I),             Reset event (.SCR), 61
     42, 64                         Set success time
    Menu (.S6?), 34, 64              (.SCS), 61
    Room request (.S6R),            Zap event toggle
     42                              (.SCZ), 61
  Date set (.SD), 61                membership (.SGG), 62
  Enter config file                 Kill (.SGK), 9, 62
    (.SE...)                        List (.SGL), 9, 62
    All (.SEA), 61                  Menu (.SG?), 33, 62
    CONFIG.CIT (.SEC), 61           New (.SGN), 9, 62
    CRON.CIT (.SET), 60,            Operator-specific
     61                              membership (.SGO), 62
    EXTERNAL.CIT (.SEE),            User-specific
     61                              membership (.SGU), 62
    GRPDATA.CIT (.SEG), 61        Hall (.SH...), 62
    MCI.CIT (.SEI), 61              Edit (.SHE), 9, 62
    MDMRESLT.CIT (.SEM),            Force access (.SHF),
     61                              62
    Menu (.SE?), 33, 61             Global room (.SHG), 62
    PROTOCOL.CIT (.SEP),            Kill (.SHK), 62
     61                             List (.SHL), 62
  Exit Citadel (.SX), 63            Menu (.SH?), 33, 62
  Full path file download           Move hall backward
    (.S%), 64                        (.SH-), 62
  Group (.SG...), 61                Move hall forward
    Edit (.SGE), 9, 61               (.SH+), 62
    Group-specific                  New (.SHN), 9, 62
    Info file reset (.SI),        (.S+...), 63
    62                              Menu (.S+?), 34
  Journal room (.SJ), 63            Message (.S+M), 63
  Kill user (.SK), 63               Room (.S+R), 64
  Login enable (.SL), 63          Userlog edit (.SU), 11,
  Mass delete (.SM), 63             12, 27, 30, 36, 63,
  Menu (.S?), 34, 64                102
  New user verify (.SN),            Node (O), 36
    63                            Zap empty rooms (.SZ),
  Off hook (.SO), 61                63
  Purge userlog (.SP), 63        .Terminate (.T...), 70
  Read by message number          Menu (.T?), 34, 70
    (.S#), 64                     Quit-also (.TQ), 70
  Reset Maintenance hall          Stay (.TS), 70, 100
    (.S1), 60                     Verbose (.TV), 70
  Run script (.SR), 63,          .Upload (.U...), 22, 70,
    138                           129
  Shell to DOS (.S!), 63          Menu (.U?), 34, 129
  Show user (.SS), 63            .Volkswagen (.V...)
  Super-shell to DOS              Menu (.V?), 34
    (.S@), 63                    Console-only, 73
  Table debugging                 Accounting toggle
    (Alt+A)                         Ignore up-time toggle
  Aide toggle (Alt+F6), 74          (Alt+U), 75
  Bells toggle (F7), 74           Less time (PgDn), 11, 76
  Chat mode (F8 or Alt+C),        More time (PgUp), 11, 76
    74                            Printing toggle (Alt+P),
  Chat toggle (F9), 74              75
  Clear screen (Alt+F1),          Repeat event (Alt+R), 75
    74                            Request (F3), 74
  Console / Modem mode            Request with an attitude
    (F5), 74                        (Alt+F3), 74
  Console lock (Alt+L), 75        Reset (F2), 74
  Console sysop (Ctrl+F6),        Screen saver (Alt+S), 75
    74                            Scroll-back buffer
  Debug toggle (Alt+D), 75          (Alt+K), 75
  Event time-out (Alt+E),         Second status line
    75                              toggle (Alt+F10), 75
  Exit (Alt+X or Alt+F4),         Shutdown (F1), 73
    75                            Speech toggle (Ctrl+F1),
  Filter toggle (Alt+B),            73
    75                            Status line toggle
  Force event (Alt+F), 75           (Sft+F10), 75
  Help (F10 or Alt+H), 75         Status screen (F4), 74
  Sysop function (F6), 74         76
  Sysop toggle (Sft+F6),          Super-shell (Alt+S), 76
    74                           Menu (?), 32, 33
  Time-out (Alt+Z), 75           Multiple-key (extended),
  Toggle input focus              57
    (Ctrl+F2), 74                Output commands, 73
  Twit toggle (Alt+T), 75         Header scan (!), 73
  Verified toggle (Alt+V),        Jump (J), 73
    75                            Kill (K), 73
 Dial-out, 76                     Mark (M), 73
  Debug toggle (Alt+D), 76        Next (N), 73
  Duplix toggle (Alt+P),          Pause (P), 73
    76                            Reverse (R), 73
  Exit dial-out mode              Stop (S), 73
    (Alt+Q), 76                   Verbose toggle (V), 73
  Hang-up (Alt+H), 76            Single-key, 55, 56
  Macros (Fkeys), 76              Small chat (, 57
  Scroll-back (Alt+K), 76         Aide edit room (A), 56,
  Shell (Alt+E), 76                 65
  Slow down (PgDn), 76            Auto verbose (V), 60
  Speed up (PgUp), 76             Auto verbose toggle (V),
  Status screen (Alt+V),            57
    Bypass (B), 55, 57, 70,       Next room (+), 57
    87                            Old messages (O), 56
  Chat (C), 55, 64, 66,           Previous hall (<), 56,
    74, 193, 212, 219               67
  Download (D), 5, 56             Previous room (-), 57
  Enter exclusive (M), 57         Reverse messages (R), 56
  Enter message (E), 4, 5,        Terminate (T), 5, 56
    55, 56                        Upload (U), 5, 57
  Exclude (X), 57                Sysop (.S...), 60, 74,
  Forward messages (F), 55        233
  Goto new messages (G),         Window, 76
    4, 5, 55, 56, 57, 70,       COMSPEC, 22, 130
    87                          CONFIG.CIT, 78, 107, 120
  Help (H), 55                   #ACCOUNTING, 11, 95, 97,
  Information (I), 35             102
  Introduction (I), 56           #ADCHANCE, 27, 91
  Jumpback (J), 55, 68           #ADDRESS, 79
  Known rooms (K), 56            #ADTIME, 27, 91
  Login  (L), 57                 #AIDECHATHRS, 64, 91
  Menu (?), 56                   #AIDEHALL, 65, 66, 100,
  New messages (N), 4, 56         153
  Next hall (>), 5, 56, 67       #ALLOWCRYPT, 6, 71, 102
 #ALTF3MSG, 92                   #CHECKSYSMAIL, 49, 91
 #ALTF3TIME, 92                  #CIT86COUNTRY, 90, 154
 #ANONAUTHOR, 95, 153            #CIT86DOMAIN, 90, 154
 #APPLICPATH, 23, 39, 79,        #CONNECTWAIT, 86, 155
  80, 104, 130, 159              #CONSOLETIMEOUT, 89
 #ATTR, 81, 153                  #COUNTBEEP, 89, 155
 #AUTOANSI, 85, 122, 153,        #CREDIT_NYM, 11, 95, 155
  193                            #DATESTAMP, 44, 93, 121
 #BADPWPAUSE, 102                #DIAL_INIT, 84, 111
 #BATTR, 81, 153                 #DIAL_PREF, 84, 107, 111,
 #BAUDPAUSE, 86                   151, 156
 #BIOS, 47, 89, 154              #DIAL_RING, 84, 85, 86
 #BORDER, 94, 95                 #DIALMACRO, 76, 90, 236
 #BORDERFREQ, 96                 #DIALRING, 156
 #CALLLIMIT, 30, 102             #DICTIONARY, 48, 80
 #CATTR, 81, 154                 #DIRPATH, 80, 156
 #CENSOR, 12, 94                 #DISKFREE, 90, 156
 #CHATBELL, 97                   #DLPATH, 41, 80, 156
 #CHATFLASH, 91                  #DOWNSHIFT, 84
 #CHATMAIL, 28, 91               #DUMB_MODEM, 83, 84, 85,
 #CHATWHY, 91                     156, 158
 #CHECKCTS, 85, 154              #ECCOLOR, 96
 #ECSIGNATURE, 96                34, 79, 80, 158
 #ECTWIRLY, 96                   #HELPPATH2, 34, 79, 158
 #ECUSERLOG, 96                  #HOMEPATH, 16, 77, 78,
 #ENTER_NAME, 94                  79, 80, 98, 128, 149,
 #ENTER_NYM, 157                  158, 190, 259, 261
 #ENTEROK, 100, 157              #IDLE_WAIT, 83, 86, 114
 #EXPIRE, 90, 157                #INIT_BAUD, 83, 84, 107
 #F6PASSWORD, 60, 64, 74,        #LEXPATH, 48, 80
  75, 88, 99                     #LOGEXTDIR, 80, 159
 #FASTLOGIN, 92                  #LOGIN, 28, 29, 63, 97,
 #FASTSCRIPTS, 92                 98, 159, 235
 #FILEBUFSIZE, 90                 CLOSED_SYSTEM, 28, 97,
 #FILTER, 75, 97                    159
 #FORCELOGIN, 57, 100, 157        SYSOP_MESSAGE, 29, 98,
 #FORWARD, 79, 88                   159
 #FUELBAR, 96                    #MAXBORDERS, 82, 162
 #FULLCONLOCK, 74, 99            #MAXERROR, 96
 #GROUP_NYM, 97                  #MAXFILES, 82, 162
 #HALL_NYM, 97                   #MAXGROUPS, 82, 162, 271
 #HANGUP, 84, 85                 #MAXHALLS, 82, 162
 #HANGUPDELAY, 85                #MAXJUMPBACK, 89, 162
 #HELPPATH, 27, 31, 33,          #MAXLOGTAB, 81, 82, 162,
  2                               #MSGPATH, 80, 164
 #MAXROOMS, 81, 82, 162,         #MUSIC, 96, 123
  267, 271, 272, 274             #NET_PREFIX, 93, 123
 #MAXSTAT, 89, 169               #NETMAIL, 86
 #MCI_DATE, 95                   #NEWBAL, 97
 #MCI_FIRSTNAME, 95              #NEWNODEALERT, 92
 #MCI_NAME, 95                   #NEWUSERAPP, 25, 98
 #MCI_POOP, 95                   #NEWUSERQUESTIONS, 29, 98
 #MCI_TIME, 95                   #NMESSAGES, 81, 82, 88,
 #MDATA, 78                       165
 #MEMFREE, 92                    #NOBELLS, 91
 #MESSAGE_NYM, 94, 95, 164       #NOCHAT, 91
 #MESSAGE_ROOM, 100              #NOCONSOLETRAP, 103
 #MESSAGEK, 81, 82, 163          #NODECOUNTRY, 78, 165
 #MIN_BAUD, 83                   #NODENAME, 78, 165
 #MINBAUD, 30                    #NODEPHONE, 78, 165
 #MODERATE, 100, 153             #NODEREGION, 78, 165
 #MODSETUP, 83, 84, 85,          #NOPWECHO, 101, 165, 200
  86, 163                        #NUMROOMS, 102
 #MODUNSETUP, 83, 163            #OFFHOOK, 85
 #MOREPROMPT, 93, 123            #OFFHOOKSTR, 85, 165
 #MSGCOMPRESS, 81, 88            #OLDCOUNT, 86
 #OVREMS, 91                     #SHOWMOVED, 92
 #OVREXT, 91                     #SHOWSYSOP, 102
 #PERSONALHALLOK, 96             #SIGNATURE, 94, 165
 #POOP!, 95, 166, 201            #SLEEPCOUNT, 89, 194
 #PRINTER, 80, 166, 201          #SLEEPPROMPT, 89, 96
 #PROMPT, 93                     #SOFTVERB, 96
 #PWDAYS, 102                    #SPEECHON, 91
 #READALL, 100, 166, 202         #SUBHUBS, 55, 87, 169,
 #READLLOG, 100                   203
 #READLOG, 102                   #SWAPNOTE, 92
 #READOK, 100, 167               #SYSOP, 19, 79, 89, 157,
 #RESTORE_MODE, 89                170, 196, 214
 #RLMPATH, 80                    #SYSOPOK, 102
 #ROOM_NYM, 97                   #TEMPPATH, 80, 170
 #ROOMOK, 100, 174               #TIMEOUT, 89
 #ROOMPATH, 79                   #TRANSPATH, 41, 42, 64,
 #ROOMTELL, 79, 86                80, 107, 108, 114, 170
 #SAVEJB, 92                     #TRAP, 101, 102, 110, 235
 #SAVERMSG, 88                   #TRAP_FILE, 80, 101, 170
 #SCREENSAVE, 87, 88             #TWIRLY, 96, 170
 #SCRIPTPATH, 79                 #TWIT_FEATURES, 15, 65,
 #SCROLL_BACK, 46, 75, 88         67, 94, 95, 154, 162,
 164                              #DO, 25, 114, 115, 142,
  BORDER_LINES, 95                237
 #TWITCOUNTRY, 95                 CHAT_OFF, 114
 #TWITREGION, 95                  CHAT_ON, 114
 #TWITREV, 96                     COMMAND, 114, 138, 142
 #UNLOGGEDBALANCE, 11, 97         NET69_IN, 42, 114
 #UNLOGTIMEOUT, 89                NET69_OUT, 42, 114
 #UP_DAYS, 75, 84, 86             NET86_IN, 115
 #UP_HOURS, 75, 84, 86            NET86_OUT, 115
 #USER_NYM, 97                    NETWORK, 36, 114
 #UTTR, 81, 173                   SHELL_1, 25, 114
 #VDATESTAMP, 44, 93, 126         SHELL_2, 25, 114
 #VIRTMEM, 93                     SHUTDOWN, 114
 #WATTR, 81, 173                 #HOURS, 115
 #WYSIWYG, 91                    #MONTHS, 115
 Modem keywords, 83              #REDO_TIME, 116
CONSOLE.APL. See Shell           #RETRY_TIME, 114, 116
 Files                          CRON.TAB, 77
CRASH.CIT, 279                  CTDL.DAT, 233, 234, 235,
CRON.CIT, 114                    243
 #DATES, 116                    CTDLDAT.EXE, 234
 #DAYS, 115                     CTDLDATA.DEF, 234, 235
                                 #DSTAMP, 44, 121
            _D_                  #EXCLUDEENCRYPTED, 121
daylight saving time, 44         #EXPERT, 121
DEFUSER.CIT, 120                 #FINGER, 121
 #ADDR1, 120                     #FORWARD, 121
 #ADDR2, 120                     #FORWARDNODE, 121
 #ADDR3, 120                     #HALLTELL, 121
 #AIDE, 120                      #HIDEEXCL, 121
 #BLINK, 120                     #IBMANSI, 122, 123
 #BOLD, 120                      #IBMCOLOR, 122
 #BORDERS, 120                   #IBMGRAPH, 122
 #CALLLIMIT, 120                 #IBMROOM, 122
 #CHECKALLCAPS, 120              #INVERSE, 122
 #CHECKAPS, 120                  #KNODE, 122
 #CHECKDIGITS, 120               #KREG, 122
 #CONFIRMABORT, 120              #KTEXT, 122
 #CONFIRMEOABORT, 121            #KUSER, 122
 #CONFIRMSAVE, 121               #LFMASK, 122
 #CREDITS, 11, 121               #LINESSCREEN, 123
 #DEFAULTHALL, 121               #LOCKHALL, 123
 #DICTWORD, 121                  #LOCKUSIG, 123
 #DISPLAYTS, 121                 #MINIBIN, 123
 #MOREPROMPT, 123                #PROBLEM, 125
 #MSGCLS, 123                    #PROMPT, 125
 #MSGPAUSE, 123                  #PROTOCOL, 125
 #MUSIC, 123                     #PSYCHO, 125
 #NETPREFIX, 123                 #PUNPAUSES, 125
 #NETUSER, 123                   #REALNAME, 125
 #NEXTHALL, 123                  #REPLACE, 125
 #NOACCOUNT, 124                 #ROOMINFO, 125
 #NOCHAT, 124                    #ROOMTELL, 125
 #NODE, 124                      #SEEBORDERS, 125
 #NODOWNLOAD, 124                #SHOWCOMMAS, 125
 #NOMAIL, 124                    #SIGNATURE, 125
 #NOMAKEROOM, 124                #SIGNATURES, 125
 #NOUPLOAD, 124                  #SPELLCHECK, 125
 #NULLS, 124                     #SUBJECTS, 125
 #NUMUSERSHOW, 124               #SURNAME, 126
 #OLDTOO, 124                    #SURNAMLOK, 126
 #OUT300, 124                    #SYSOP, 126
 #PERMANENT, 124                 #TABS, 126
 #PHONENUM, 124                  #TITLE, 126
 #POOP, 124                      #TUSER, 126
 #PRINTFILE, 125                 #TWIRLY, 126
 #UCMASK, 126                   ETC.TAB, 77
 #UNDERLINE, 126                EXTERNAL.CIT, 104
 #UNLISTED, 126                  #ARCHIVER, 24, 60, 104
 #USEPERSONAL, 126               #AUTO_EDITOR, 24, 104
 #VDSTAMP, 44, 126               #CENSOR_AUTHOR, 12, 104
 #VERBOSE, 126                   #CENSOR_NODE, 12, 104
 #VERBOSECONT, 126               #CENSOR_TEXT, 12, 104
 #VERBOSELOGOUT, 127             #DIRECTORY, 64, 104
 #VERIFIED, 127                  #DOOR, 24, 67, 104
 #VIEWCENSOR, 127                #EDITOR, 24, 104, 105
 #WIDEROOM, 127                  #EVENT, 22, 25, 105, 155,
 #WIDTH, 127                      236, 261
 #YOUAREHERE, 127                #HOLIDAY, 45, 104, 106
DOOR.SYS. See Shell Files        #NETCOMMAND, 106, 149,
DORINFO1.BBS. See Shell           164
 Files                           #REFUSER, 104
DOS PATH, 39, 79                 #REPLACE, 104, 106
DragCit, 36, 37, 38              #USERAPP, 25, 104, 106
                                             
            _E_                             _F_
EMS, 1, 22, 46, 51, 63, 64,     File Transfer Protocols
 88, 91, 93, 130, 280, 281       1K Xmodem, 5, 131
 Xmodem, 5, 131                  Meta-groups
 Xmodem CRC, 5, 131               *AIDE, 10
 Ymodem, 131                      *NETWORK, 10
 Zmodem, 5, 131                   *NODE, 10
FILE69, 41, 42, 107, 283,         *NOMAIL, 10
 284                              *PERMANENT, 10
FILEINFO.DAT, 62                  *SYSOP, 10
FILEQTMP.CIT, 279                 *TWIT, 10
FOSSIL, 259                       *UNLISTED, 10
                                 Null, 10, 117, 118, 119
            _G_                  Reserved_2, 10, 110
Groups, 9, 11                   GRPDATA.CIT, 11, 117
 Auto-add, 9                     #DAY_INC, 118
 Boolean Expressions             #DAYS, 117, 118
  AND, 10                        #DL_MULT, 118
  Begin group ((), 10            #GROUP, 117, 118
  End group ()), 10              #HOURS, 117, 118
  NOT, 10                        #MAX_BAL, 118
  OR, 10                         #PRIORITY, 117, 118
  XOR, 10                        #SPECIAL, 117, 118
 Hidden, 9                       #UL_MULT, 118
 Lock from aides, 9                          
                                            _H_
Hard disk, 1                      ENTERNYM.BLB, 28, 240
HARDWARE.CIT, 128                 ENTRY.BLB, 28, 239
 #COMDRIVER, 128, 259             GOODBYE.BLB, 28, 239
 #KBDDRIVER, 128                  HELLO###.BLB, 28
 #SNDDRIVER, 128, 261             JOKE####.BLB, 28
Help Files, 27                    LENGTH.BLB, 29, 240
 Blurbs                           LOGOUT##.BLB, 29
  AD######.BLB, 27                MOREPRMP.BLB, 29, 240
  ADDRESS.BLB, 27, 240            MSGNYM.BLB, 29, 240
  BULLETIN.BLB, 27, 31,           NETPREFX.BLB, 29, 240
    239                           NEWMSG.BLB, 29, 239
  CALLIMIT.BLB, 27, 240           NEWQUEST.BLB, 29, 239
  CENSOR.BLB, 12, 27, 240         NEWROOM.BLB, 29, 239
  CHAT####.BLB, 27                NOANSWER.BLB, 29
  CHATTED.BLB, 28, 240            NOCHAT##.BLB, 29
  CLOSESYS.BLB, 28, 97,           NOCHAT.BLB, 55, 74, 239
    239                           NOLOGIN.BLB, 29, 117,
  COLORS.BLB, 28, 240               239
  DIALOUT.BLB, 28                 NOROUTE.BLB, 29, 240
  DISCLAIM.BLB, 12, 28,           NULLS.BLB, 29, 240
    240                           NUMUSERS.BLB, 30, 241
  ENCRYPT.BLB, 28, 240            PASSWORD.BLB, 30, 239
  PHONENUM.BLB, 30, 240           FILES.HLP, 35, 241
  PROMPT.BLB, 30, 93, 240         GROUPS.HLP, 35, 241
  REALNAME.BLB, 30, 240           HALLS.HLP, 35, 241
  RESUME.BLB, 30, 240             HELP.HLP, 35, 241
  TEXTUP.BLB, 30, 239             INTRO.HLP, 35, 56, 241
  TIME.BLB, 30, 240               LOGIN.HLP, 35, 241
  TOOLOW.BLB, 30, 83, 239         MESSAGES.HLP, 35, 241
  TOOMANY.BLB, 30, 240            NETWORK.HLP, 35, 241
  UNLINK.BLB, 30, 241             QUEUE.HLP, 35, 241
  USERINFO.BLB, 30, 239           ROOMS.HLP, 35, 241
  VERIFIED.BLB, 30, 239           ROOMSYS.HLP, 35, 241
  WCDOWN.BLB, 31, 240             SPECIAL.HLP, 35, 241
  WCUP.BLB, 31, 240               SPELL.HLP, 35, 242
  WIDTH.BLB, 31, 240              SYSOP.HLP, 35, 242
  WOWCOUNT.BLB, 31, 240          Menus, 31
 Help Files, 34                   #AIDE, 31, 238
  ACCOUNT.HLP, 34, 241            #AIDEQUEUE, 31, 238
  AIDE.HLP, 34, 241               #BULLETINS, 31, 238
  ANSI.HLP, 34, 241               #CRON, 32, 60, 238
  CONFIG.HLP, 34, 241             #DOOR, 32, 238
  DOHELP.HLP, 34, 241             #DOWNLOAD, 32
  DOORS.HLP, 34                   #EDIT, 32, 238
  #EDITTEXT, 32, 239              #TERMINATE, 34, 238
  #ENTERWC, 32, 239               #UPLOAD, 34
  #ENTOPT, 32, 238                #VOLKSWAGEN, 34, 238
  #FILEQUEUE, 32, 238             CTDL.MN@, 31
  #FINGER, 32, 239                CTDL.MNU, 27, 31, 79,
  #GRPGLOB, 33, 238                 238
  #HELP, 33, 238                             
  #INVITE, 33, 238                          _I_
  #KNOWN, 33, 238, 241          IBM AT, 1
  #MAINDOT, 33, 238             IBM PC, 1, 78, 81, 128, 246
  #MAINOPT, 33, 238             INPUT.APL. See Shell Files
  #PERSONAL, 33, 238                         
  #PERSONALADD, 33, 239                     _M_
  #READOPT, 33, 238             MAILLIST.CIT, 135
  #READWC, 33, 239               #INFOFILE, 135
  #RESPONSEDOWNLOAD, 33          #INFOLINE, 135
  #SYSENTER, 33, 238             #MAILLIST, 135
  #SYSGROUP, 33, 238             #MAYLIST, 135
  #SYSHALL, 33, 238              #MAYSUBSCRIBE, 135
  #SYSNET, 34, 238               #MAYTELL, 135
  #SYSOP, 34, 238                #USER, 135
  #SYSTABLE, 34, 239
MDMRESLT.CIT, 132                #CONNECT230400C, 133
 #BUSY, 132                      #CONNECT230400E, 133
 #COMPRESSION, 132               #CONNECT2400, 132
 #CONNECT115200, 132             #CONNECT2400C, 133
 #CONNECT115200C, 133            #CONNECT2400E, 133
 #CONNECT115200E, 133            #CONNECT28800, 132
 #CONNECT1200, 132               #CONNECT28800C, 133
 #CONNECT12000, 132              #CONNECT28800E, 133
 #CONNECT12000C, 133             #CONNECT300, 132
 #CONNECT12000E, 133             #CONNECT38400, 132
 #CONNECT1200C, 133              #CONNECT38400C, 133
 #CONNECT1200E, 133              #CONNECT38400E, 133
 #CONNECT14400, 132              #CONNECT4800, 132
 #CONNECT14400C, 133             #CONNECT4800C, 133
 #CONNECT14400E, 133             #CONNECT4800E, 133
 #CONNECT16800, 132              #CONNECT57600, 132
 #CONNECT16800C, 133             #CONNECT57600C, 133
 #CONNECT16800E, 133             #CONNECT57600E, 133
 #CONNECT19200, 132              #CONNECT7200, 132
 #CONNECT19200C, 133             #CONNECT7200C, 133
 #CONNECT19200E, 133             #CONNECT7200E, 133
 #CONNECT230400, 133             #CONNECT9600, 132
 #CONNECT9600C, 133              71
 #CONNECT9600E, 133              Find and replace (F), 4,
 #CORRECTION, 132                 6, 7, 71, 72
 #ERROR, 132                     Insert file (<), 8, 72
 #NOANSWER, 132                  Link application (!), 7,
 #NOCARRIER, 132                  25, 72
 #NODIALTONE, 132                Location (L), 7, 71
 #RING, 132                      Menu (?), 8, 73
 #RUNAPPLIC, 133                 Print formatted (P), 4,
Menus. See Help Files             7, 72
Message Censoring, 12            Replace (R), 4, 7, 72
Message Command Interpreter      Save (S), 4, 7, 72
 (MCI) Commands, 15              Signature (I), 7, 71
Message editor, 6, 71            Special delivery options
 Abort (A), 6, 71                 (#), 7, 72
 Address message (@), 7,         Subject (U), 7, 72
  72                             Verify spelling (V), 4,
 Allow ESC (~), 7, 72             7, 48, 72
 Change name (*), 8, 73          Word count (W), 7, 72
 Continue (C), 4, 6, 71         MESSAGE.APL. See Shell
 Delete buffer (D), 6, 71        Files
 Encrypt message (E), 6,        Modem, 1
                                 #GROUP, 38, 108, 110
            _N_                  #LOGIN, 25, 37, 38, 108,
NETID.CIT, 40, 41, 148,           109, 110, 112
 154, 175, 191, 283               Download (D), 37, 109
Networking, 36                    Pause (P), 37, 109
 Protocols                        Repeat (R), 37, 109
  Citadel-86 compatible,          Script (@), 38, 110
    43                            Send (S), 37, 109
  DragCit 1.0/1.1, 36             Shell (!), 38, 109
  DragCit 1.5/1.6, 38             Upload (U), 37, 109
  Net 6.9, 39                     Wait (W), 37, 109
NODES.CIT, 107                   #MAPUNKGROUP, 108, 110
 #AUTOGROUP, 41, 107             #MOREINFO69, 110
 #AUTOHALL, 41, 69, 107          #NETFAIL, 110
 #AUTOROOM, 40, 41, 69,          #NETWORK, 37, 39, 40,
  107, 283                        110, 237
 #BAUD, 37, 84, 107               CIT86, 110, 113
 #DIAL_TIMEOUT, 37, 107           DRAGCIT1_0, 110, 112
 #DIALOUT, 107, 110, 111          DRAGCIT1_1, 37, 110, 112
 #FETCH, 42, 107                  DRAGCIT1_5, 39, 110, 112
 #FETCH_TIMEOUT, 108              DRAGCIT1_6, 39, 110, 112
 #GATEWAY, 108, 276               HENGE, 110, 112
  NET6_9, 40, 110, 112            ROOMCREATED, 112
  NET6_9a, 40, 110, 112           ROOMNOTCREATED, 112
 #NODE, 37, 110                  #WAIT_TIMEOUT, 37, 109,
  Default, 40                     112
 #OUTPUTPACE, 110                #ZIP, 24, 25, 39, 41, 112
 #PHONE, 37, 110                             
 #PREDIAL, 111                              _O_
 #PROTOCOL, 37, 40, 111         OUTPUT.APL. See Shell Files
 #REDIAL, 111                                
 #REQUEST, 41, 111                          _P_
 #ROOM, 38, 39, 40, 111         PCBOARD.SYS. See Shell
 #VERBOSE, 40, 41, 111,          Files
  112, 238                      PROTOCOL.CIT, 129
  0, 112                         #AUTO_UPLOAD, 129
  1, 112                         #BATCH, 129
  2, 112                         #BLOCK_SIZE, 129
  ALL, 112                       #CHECK_TRANSFER, 130
  FILE69IN, 111                  #COMMAND_KEY, 129
  FILE69INFULL, 112              #MENU_NAME, 129
  NETIDNOTFOUND, 112             #NET_ONLY, 129
  NOACCESS, 112                  #PROTOCOL, 24, 32, 129
  NONETIDONSYSTEM, 112
 #RECEIVE, 129                   Functions, 140
 #RESPONSE_SEND, 129              Recursion, 139
 #RESPONSEDOWNLOAD, 70           Internal functions, 148
 #SEND, 129                      Keywords, 141
Pseudonyms, 30                    #ADD, 141
                                  #AND, 141
            _R_                   #ASGN, 138, 141
RAM, 1, 82, 89, 93                #CALL, 141, 148, 191,
README.APL. See Shell Files         205
Receipt confirmation              #CHAIN, 141
 requested, 7, 72, 185            #DIV, 141
Regular version, 1, 64, 82,       #DO, 141, 142, 143
 92, 93, 188, 267                 #ELSE, 141, 142, 143
Room editing, 53                  #ENDFUNC, 140, 142
ROUTE.CIT, 134                    #ENDIF, 141, 142, 143
 #ADDRESS, 134                    #EQ, 142
 #ROUTE, 134                      #EXIT, 142
                                  #FUNC, 140, 142
            _S_                   #GE, 142
Script files, 137                 #GOTO, 142, 143
 Debugging, 146                   #GT, 142
                                  #GVAR, 139, 143
  #IF, 138, 141, 142, 143        Overview, 138
  #IFNOT, 138, 141, 142,         Variables, 139
    143                           Types
  #LABEL, 142, 143                  Boolean, 139
  #LE, 143                          Integer, 139
  #LOOP, 138, 141, 143              Long, 139
  #LOOPNOT, 138, 141, 143           String, 139
  #LT, 143                          UInteger, 139
  #LVAR, 139, 144                   ULong, 139
  #MOD, 144                     Scroll-Back Buffer, 46
  #MUL, 144                     Setup, 1
  #NE, 144                      Shell Files
  #OR, 144                       CALLINFO.BBS, 22, 25
  #RET, 140, 144                 CHAIN.TXT, 22, 25
  #RUN, 144                      CONSOLE.APL, 26
  #STR, 144, 148, 191            DOOR.SYS, 22, 25
  #SUB, 145                      DORINFO1.BBS, 22, 25
  #VERSION, 145                  INPUT.APL, 25, 228
  #WEND, 145                     MESSAGE.APL, 25
  #WHILE, 138, 145               OUTPUT.APL, 22, 25
  #WHILENOT, 138, 145            PCBOARD.SYS, 22, 25
  #XOR, 145                      README.APL, 25, 104
 TRIBBS.SYS, 22, 25             123, 184, 187, 225, 227
 USERINFO.DAT, 22, 25           USERINFO.DAT. See Shell
Sound Blaster, 128, 246,         Files
 250, 261                                    
Source code, 285                            _V_
Spell checker, 4, 7, 35,        Virtual memory, 1, 46, 51,
 48, 72, 80, 219, 225, 233       88, 93, 173, 282
Status line and screen, 49                   
System requirements, 1                      _W_
                                Wow., 18, 19, 21, 32, 36,
            _T_                  38, 39, 43, 44, 45, 52,
Time and Date Formatting,        53, 54, 62, 64, 66, 68,
 44                              70, 74, 76, 82, 83, 84,
Time zones, 44                   85, 91, 96, 97, 102, 110,
TRIBBS.SYS. See Shell Files      120, 122, 125, 126, 130,
TZ environment variable, 44      190, 206, 283, 284
                                             
            _U_                             _X_
User configuration, 52          XMS, 1, 22, 46, 51, 63, 64,
User editing, 54                 88, 93, 130, 281, 282
User signature, 7, 71, 96,