home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / BBS / MISC / XDOC_117.ZIP / COMMANDS.DOC next >
Encoding:
Text File  |  1990-12-09  |  98.0 KB  |  2,324 lines

  1.  
  2.         ╔══╗╔══╗╔═════╗╔═════╗╔════╗    ╓──╖   ╓──╖╓──────╖
  3.         ║  ║║  ║║ ┌┐  ║║ ┌┐  ║║    ║    ║  ║   ║  ║║      ║
  4.         ║  ╚╝  ║║ └┘  ║║ └┘  ║║  ╔═╝    ╙╖ ║   ╙╖ ║║ ╓──╖ ║
  5.         ╚╗    ╔╝║    ╔╝║    ╔╝║  ╚═╗     ║ ║    ║ ║╙─╜  ║ ║
  6.         ╔╝    ╚╗║ ┌┐ ╚╗║ ┌┐ ╚╗╚═╗  ║     ║ ║    ║ ║     ║ ║
  7.         ║  ╔╗  ║║ ││  ║║ ││  ║╔═╝  ║     ║ ║    ║ ║     ║ ║
  8.         ║  ║║  ║║ └┘  ║║ └┘  ║║    ║    ╓╜ ╙╖╓╖╓╜ ╙╖    ║ ║
  9.         ╚══╝╚══╝╚═════╝╚═════╝╚════╝    ╙───╜╙╜╙───╜    ╙─╜
  10.  
  11.           "For he knew no words in the language of the Damned..."
  12.  
  13.  --Text Files, the driving force behind XBBS:
  14.  
  15.    XBBS is controlled entirely by text files.  There are no "menus" like
  16. QuickBBS sysops are used to using.  You write a text file (with your
  17. favorite ASCII text editor or word-processor in ASCII or non-document
  18. mode) containing embedded text commands, and these commands tell XBBS to
  19. do certain things.  You are, in effect, writing a program in which any
  20. non-command is printed.  This results in free-flowing "menus" with
  21. almost total control in your hands.
  22.  
  23.    XBBS's embedded text commands are _always_ preceded by a Control-A,
  24. sometimes written as ^A or ^a or CTRL-A.  This is ASCII 1, and is
  25. represented on most clones as an open smiley-face.  BASIC programmers
  26. know it as CHR$(1), C programmers know it as '\x1', and I don't know
  27. what the heck Pascal programmers call it.  Most text editors will insert
  28. one if you hold down the ALT key and type '001' on the numeric keypad.
  29. In the following discussion of embedded text commands, we'll replace the
  30. ^A character with the @ sign just to make things easier to look at.
  31.  
  32. Since ^A is the only ASCII character that XBBS considers "proprietary,"
  33. you may use the rest of the ASCII/High ASCII character set as you would
  34. normally. The ASCII and any ANSI character strings will have much the
  35. same effect that they would in a text file or in a screen display: ASCII
  36. character #8 is a backspace, and ANSI cursor sequences will cause the
  37. cursor to move to wherever you tell it to, change colors, and so forth
  38. (as in ANSI animation).
  39.  
  40. The character that immediately follows the ^A determines what the command
  41. is.  This following character is Case Sensitive (when it's an alphabetic
  42. character).  After this character there may be additional characters
  43. which give more information to XBBS.  Hopefully, someday there will be a
  44. "precompiler" to make writing XBBS menus a little easier (hint, hint).
  45.  
  46. Remember, text files ending with .XBS are assumed to be in the Menu
  47. directory unless you include a path in the name you call (i.e. there's a
  48. backslash or colon in there somewhere).  If the user has ANSI graphics
  49. enabled, XBBS will try to find a file ending with .GBS first, and go
  50. with it if found, although it's fairly simple to mix ANSI and ASCII in
  51. the same .XBS file.
  52.  
  53.    XBBS has several replaceable arguments (metastrings) you can use in
  54. the arguments to many calls.  Metastrings are prefaced by * (i.e. *B
  55. translates to baudrate):
  56.  
  57.   *A Arq (Reliable Conn)   *B Baudrate              *C Credit
  58.   *D D/L Path\             *E Menu path             *F First Name Handle
  59.   *G Graphics              *H Errorlevel as hex     *I Data from ^aINFO:
  60.                                                        kludge line
  61.   *L Last Name Handle      *M(0-9) Current Msg. Data: Fm/To/Subj/Date
  62.                                    /Orig/Dest/Times/Cost/Attr/XBBS_Attr
  63.   *N Real Name             *O<args> (see @O)        *P Commport
  64.   *Q Unique user id (as a filename)                 *R User number
  65.   *S Special Flag          *T Time Remaining        *U U/L Path\
  66.   *V# User string vars     *Z Zone:Net/Node         *a Age
  67.   *c Associated File       *d D/L Path              *e Errorlevel
  68.   *f Flag2 word            *g Last u/d filestring   *h BBS Home path
  69.   *k Key message           *l Screen Length         *m Message Area #
  70.   *n Node ID #             *o Total system calls    *p Commport+1
  71.   *r Last caller's handle  *s# Security             *t Time Left-2
  72.   *u U/L Path              *v# User numeric vars    *w Screen Width
  73.   *z Alt Zone:Net/Node     *0...*9 Variables        *! City
  74.   *@ State                 *: Current msg path      *% Date/Time string
  75.   *& Message area attr     *$ Fileboard name        ** Message area name
  76.   *^ Fidonet-style date    *( User's last calldate  *) User's last calltime
  77.   *#<#> User's phone #'s   *| CR/LF                 *~ CR
  78.   *{<variable name > Named variable
  79.  
  80.           Notes:  In *s#, # determines which security level is used. For
  81.           instance, *s0 would use security level 0, *s9 would use
  82.           security level 9, etc.  Same sort of setup for phone #'s (*#)
  83.           and message header fields (*M#). *O should be the last thing
  84.           on a line, as nothing more will be translated after one is
  85.           encountered.  It's more for getting the strings into a
  86.           variable with @#= than for passing arguments to programs.  *{
  87.           will skip over an intervening space used as a delimiter
  88.           ("*{THISVAR  *F *L" (note 2 spaces) would produce "Hi Joe
  89.           Blow" (note single space) if THISVAR contained "Hi" and
  90.           username was "Joe Blow").  However, "*{THISVAR*s" will produce
  91.           the expected results (* being a non-alphanumeric character
  92.           will 'terminate' the variable name).
  93.  
  94.  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  95.  
  96.    "The ice cream lady wet her drawers to see you in the Passion Play."
  97.  
  98.  --XBBS Embedded Text File Commands:
  99.  
  100.    Following is a brief listing of the XBBS commands, together with
  101. brief samples.  This stuff is technical.  For more in-depth coverage,
  102. see the sample "menus" in the distribution archive.  Also see the
  103. section after this, "Basic Menu Making".  Remember, @ == ^A unless
  104. specifically referred to as "the commercial 'at' sign".
  105.  
  106.  
  107. A...Add string to logfile.  Metastrings are translated.
  108.  
  109.         @AUser entered File Area #1
  110.  
  111.  
  112. B...Break connection (hang up)  Flushes FOSSIL send buffer first
  113.  
  114.         @B
  115.   
  116.  
  117. C...Check message board statistics
  118.  
  119.         @C0
  120.          Output format:  Area #<#>: Board Name * # messages  New messages
  121.          (see XBBS.TXT prompt #27)
  122.  
  123.         @C1lLabel
  124.          Outputs as @C0, branches to lLabel if there are new messages
  125.  
  126.         @C2lLabel
  127.          No output, just the branch
  128.  
  129.  
  130. D...Set label to seek to on abort
  131.  
  132.         @DlLabelname
  133.         Useful for ensuring that an input is not skipped even though
  134.         prefacing text output may be.
  135.         Example:
  136.          Skip to lSkipHere and restart if file is aborted with "S"
  137.             @DlSkipHere
  138.  
  139.  
  140. E...External command
  141.  
  142.         There are a variety of ways to run external programs.
  143.         Metastrings are translated here.
  144.  
  145.         S...Spawn
  146.              @ESProgram.EXE arg1 arg2 etc.
  147.                (XBBS stays in memory, very fast, but you cannot run a
  148.                 batch file or intrinsic DOS command with this...see D
  149.                 or use @ESCOMMAND.COM /c Program.EXE etc.)
  150.  
  151.         E...Exec
  152.              @EEProgram.EXE arg1 arg2 etc.
  153.                (Removes XBBS from memory, very fast)
  154.  
  155.         D...DOS (through COMMAND.COM (COMSPEC))
  156.              @EDDothis.BAT arg1 arg2 etc.
  157.                (Runs batch files or executes DOS commands and
  158.                 keeps XBBS in memory, not quite as fast as spawn)
  159.  
  160.         X...Exit with ERRORLEVEL
  161.              @EX25
  162.                (Would exit to calling batch file with ERRORLEVEL 25)
  163.  
  164.         B...Write a batch file and exit with ERRORLEVEL
  165.              @EB25 arg1 arg2 etc.
  166.                (arg1 arg2 etc. would be written to XBBS.BAT and then
  167.                 XBBS would exit to calling batch file with ERRORLEVEL 25)
  168.  
  169.         W...Write a string to a file (doesn't exit, but does replace
  170.             parameters in the string before writing)
  171.              @EWXBBS.LOG arg1 arg2 etc.
  172.                (arg1 arg2 etc. would be written to XBBS.LOG)
  173.  
  174.         w...Write a string to a file, no *replacement.
  175.  
  176.         I...Spawn with Swap.  Forces swapping if swapping is not enabled
  177.             in Config.BBS.  Remember that the executable's extension
  178.             *must* always be included when swapping.  If you have XBBS
  179.             set to swap normally, this command is reversed and will
  180.             _not_ swap.
  181.              @EIProgram.EXE arg1 arg2 etc.
  182.  
  183.         O...Spawn with FOSSIL hot.
  184.              @EOProgram.EXE arg1 arg2 etc.
  185.  
  186.         s...Same as Spawn above, but updates CONFIG.BBS and ONLINE.XBS
  187.             before exit and rereads upon return.  *You only need to use
  188.             this if a Door author tells you that you should.*
  189.  
  190.         d...Same as DOS above, but updates CONFIG.BBS and ONLINE.XBS
  191.             before exit and rereads upon return.  *You only need to use
  192.             this if a Door author tells you that you should.*
  193.  
  194.  
  195.  
  196. F...Set up file area
  197.  
  198.         @FArea Name,Drive:\DownloadPath\,Drive:\UploadPath\,Flags,Leech%
  199.           The Area Name should not contain commas, which are used as the
  200.           delimiter.  Area names are limited to 48 characters, paths to
  201.           80 characters.  Leech% determines what u/d percentage, if any,
  202.           is required to be maintained in order to download from the
  203.           area.  For instance, 10 would mean a 10% u/d ratio would have
  204.           to be met before allowing download.  0 disables.  It's
  205.           calculated like this:  if Leech% < downloadK/uploadK disallow
  206.           download.  Therefore, if Leech% is 9 and the user has uploaded
  207.           10K and downloaded 100K, his ratio is 10 (100/10) and he can't
  208.           download (9 is less than 10).  If he's uploaded 20K and
  209.           downloaded 100K, he can (100/20=5).  Actually, what happens is
  210.           this:  first, no check is made at all if the user's
  211.           ignoreratio bit is set or the number of files specified in the
  212.           configuration haven't been downloaded yet.  Then the u/dK
  213.           ratio is calculated.  Then the #uploads/#downloads ratio is
  214.           calculated.  If both fail, the download is disallowed.  Clear
  215.           as mud?
  216.  
  217.           Flags can have the following values or combination thereof:
  218.  
  219.              1......Track number of downloads by timestamp
  220.              2......Free file area
  221.              4......Is Associated with message area
  222.                     See notes at @M.
  223.  
  224.           There is no built-in limit on the number of file areas you may
  225.           have.
  226.  
  227.  
  228. G...Graphic Menu
  229.  
  230.         @G<var#><color><truncate><prompt_1 prompt_2 ... prompt_33) Sets
  231.           up a point-and-press menu for ANSI users.  Variable # is
  232.           0-9...the selection will be returned in this variable for
  233.           examination.  Color is an ANSI-style number from 31-37...the
  234.           current selection is highlighted with highvideo, others are
  235.           lowvideo.  Truncate is 0 if you want the entire prompt
  236.           (uppercased, with spaces instead of underlines) returned on
  237.           selection, ORed with 1 if you want only the first letter of
  238.           each prompt.  Prompts are strings with underlines instead of
  239.           spaces (true spaces are delimiters). XBBS replaces the
  240.           underlines with spaces when displaying the line.  Users select
  241.           input with the arrow keys and [Enter].  For convenience's
  242.           sake, non-ANSI users will get a menu of sorts if they run
  243.           through this command, and ANSI users who have the ANSI cursor
  244.           menus bit off will get one with a little color, but no cursor
  245.           movement.  If you set the truncate parameter, the ANSI cursor
  246.           users can select an option by its first letter (so make them
  247.           unique).  This is not really meant as something to write the
  248.           whole BBS with, it's just a little flash.  You can change up
  249.           the way this command returns values by ORing <truncate> with
  250.           4, which will cause values to be returned as the number of the
  251.           entered option's position.  You can OR <truncate> with 2 to
  252.           force the no-graphic style of input.
  253.  
  254.  
  255. H...Set up hot keys
  256.  
  257.         @HlLableName <hotkeylist>
  258.           There can be up to 36 hotkeys entered (i.e. ABCDEF123)
  259.           XBBS will check for a hotkey between each line printed and
  260.           branch to lLablename if one is encountered.  This should be the
  261.           first statement in a menu.  Input or finding a key clears the
  262.           hotkey "register".  The hotkey hit will be entered into the
  263.           first XBBS variable (variable #0) for testing at lLablename.
  264.  
  265.  
  266. I...Scan Nodelist
  267.  
  268.         @I<0 or 1><[Enter] or Zone:Net/Node or @#>
  269.           If 0, lists nodes in a net.  Otherwise, lists a particular
  270.           node.  If no string follows, prompt user for input.
  271.  
  272.  
  273. J...Gosub to another file
  274.  
  275.         @JFilename.ext
  276.           If the filename ends in .XBS and is in the menu area (i.e.
  277.           there is no path given), this gives no warning if the file is
  278.           not found.  You can use this to your advantage by having
  279.           external processes write a menu dynamically which XBBS will
  280.           interpret when it hits this command _if_ the menu exists.  For
  281.           a hairbrained example, suppose you got input from the user
  282.           that requested that a file be extracted from an archive.  You
  283.           then exitted to a batch file which would try to extract the
  284.           file.  If the extract was successful, the batch file could
  285.           then dynamically build (or copy in) an XBBS download menu with
  286.           a certain name.  On return from the batch file, XBBS would
  287.           attempt to gosub (@J) to that menu to allow the download.  If
  288.           there was a problem with the extraction, the menu would not
  289.           exist and the gosub would not be performed.  If Filename.ext
  290.           is a digit (i.e. @J0), the contents of the appropriate
  291.           variable will be used as the filename.
  292.  
  293.  
  294. K...Upload/Download commands
  295.  
  296.         @Ku  (Upload a file to the current file area's upload dir)
  297.  
  298.         @KV<filename.ext> (Upload named file to the current file area's
  299.                            upload dir.  If filename begins with @
  300.                            (commercial at sign, not ^a) it is assumed to
  301.                            be a file containing a list of files to be
  302.                            uploaded.  How you write the list file is up
  303.                            to you.)
  304.  
  305.         @Kv<#>,[key] (Upload file named in variable # to the current
  306.                       file area's upload dir.  List files apply.  If
  307.                       [key] follows, it will be used to find the
  308.                       protocol with the matching key-to-select (i.e. Z
  309.                       would find ZModem's protocol entry if ZModem was
  310.                       normally selected by the user via the Z key))
  311.  
  312.         @Kd  (Download a file from the current file area's download dir
  313.               Any file in the directory, whether listed in FILES.BBS or
  314.               not, can be downloaded if the user enters the proper name.
  315.               You could, for instance, put all your downloads in one
  316.               directory and read different FILES.BBS-style files to make
  317.               it appear to be multiple areas, and this would allow
  318.               downloading of any file in any area from a single download
  319.               prompt.)
  320.  
  321.         @KD<NULL or drive:path/filename.ext>,<seclvl>,<flsearch.ctl>
  322.               (DL a specific file OR DL a file from a scan of areas
  323.                Generally speaking, give NULL for a filename to get XBBS
  324.                to prompt the user for a filename.  Give the name of a
  325.                FLSEARCH.CTL-style file if you want XBBS to scan
  326.                directories for a match.  seclvl is used to determine if
  327.                a user has access to a given directory.  seclvl is 0-9
  328.                to indicate one of XBBS's security levels to use for
  329.                the comparison.  List files apply here, but don't try to
  330.                use a list with the FLSEARCH option; it won't work.)
  331.  
  332.         @Kk#,<seclvl>,<flsearch.ctl>,[key] (D/L a specific file named
  333.                in variable #...same notes.  [key] works as with @Kv
  334.                above.  The leech% figure you pass with @F will *not*
  335.                affect this command; check with @Lk and @L# if desired.
  336.                                                                       
  337.         @KU#  (Add u/l credits for file named in variable # (wildcards
  338.                accepted, list file applies))
  339.  
  340.         @KK#  (Set download credits for file named in variable #
  341.                (wildcards accepted, list files apply))
  342.  
  343.         @Ka#  (Set upload K today to saved errorlevel #)
  344.  
  345.         @KA#  (Set download K today to saved errorlevel #)
  346.  
  347.         @Kl#<Filename.EXT> (Print a list of file areas to which the user
  348.                             has access from a FLSEARCH.CTL-type file.  #
  349.                             is the user's security level # (0-9) to use
  350.                             for the access test.)
  351.  
  352.         @Kn#<Filename.EXT> (Find the next file area to which the user
  353.                             has access from a FLSEARCH.CTL-type file. If
  354.                             wraparound occurs (after EOF), the internal
  355.                             ERRORLEVEL is set.  # is the user's security
  356.                             level # (0-9) to use for the access test.)
  357.  
  358.         @KN#<Filename.EXT> (Reset the FLSEARCH.TXT file to the start of
  359.                             file for @Kn calls as described above.  The
  360.                             arguments are dummies.)
  361.  
  362.         @Km<Filename.EXT>  (Hah, hid one from you.  Like @Kn# for
  363.                             message areas, except you don't need the
  364.                             security level # (XBBS uses seclvl #0 for
  365.                             msgs).)
  366.  
  367.         @KM<Filename.EXT>  (Like @KN# except it's for message areas.)
  368.  
  369.  
  370.           Note:  FLSEARCH.CTL-type files have the following format (one
  371.           entry per line):
  372.  
  373.           D:\PATH\ SECLVL# Name_of_area <flags> <D:\upload_path\> <Description>,<age>,<userflags>
  374.  
  375.           For example: C:\XBBS\ 9 XBBS_Programs 3 C:\XBBS\UPLOADS\
  376.           Note that a "true" FLSEARCH.CTL-type file does not contain the
  377.           <flags> parameter or an upload path, but it should be ignored
  378.           by well-behaved programs that do not use it.  XBBS won't choke
  379.           if you don't include the extra parameters (the ones between
  380.           the <>), except that @Kl won't list areas properly without
  381.           them.  Note that parameters after <Description> are separated
  382.           by commas instead of a space.
  383.  
  384.  
  385. L...Branch on user parameters
  386.  
  387.         @LMlLabel  (Branch if user's ARQ flag set)
  388.         @LTlLabel  (Branch if user's Twit flag set)
  389.         @LGlLabel  (Branch if user has ANSI Graphics on)
  390.         @LNlLabel  (Branch if user's NoKill flag set)
  391.         @LSlLabel  (Branch if Special flag is set)
  392.         @LElLabel  (Branch if Expert flag is set)
  393.         @LHlLabel  (Branch if Ignore Hours flag is set)
  394.         @LDlLabel  (Branch if Deleted flag is set)
  395.         @LRlLabel  (Branch if Ignore Ratio flag is set)
  396.         @LglLabel  (Branch if Full Screen Editor flag is set)
  397.         @LslLabel  (Branch if Screen Clear flag is set)
  398.         @LAlLabel  (Branch if ANSI cursor menus are on)
  399.         @LnUser Name,lLabel (Branch if user's name=User Name)
  400.         @LhHandle,lLabel    (Branch if user's handle=Handle)
  401.         @LC<arg><type>,lLabel
  402.              Branch on user's computer type
  403.              If arg is !, branch if not equal
  404.              If arg is =, branch if equal
  405.         @Lk<arg><ratio>,lLabel
  406.              Branch on user's u/d kilobyte ratio (the percentage of
  407.                 kilobytes uploaded to kilobytes downloaded)
  408.              If arg is <, branch if less than ratio%
  409.              If arg is >, branch if greater than ratio%
  410.              Takes into account the starting # of downloads set in
  411.                 Config.BBS
  412.              Ratio is a whole number representing a percentage (i.e.
  413.                 10=10%)
  414.              See sample menus for more info.
  415.         @L#<arg><ratio>,lLabel
  416.              Branch on user's u/d number ratio
  417.              If arg is <, branch if less than ratio%
  418.              If arg is >, branch if greater than ratio%
  419.              Same notes as above for @Lk
  420.         @Lb<arg><baud>,lLabel
  421.              Branch on user's baudrate
  422.              If arg is <, branch if baud is less than user's baudrate
  423.              If arg is >, branch if baud is greater than user's baudrate
  424.         @Lv<arg><#violations>,lLabel
  425.              Branch on number of user violations
  426.              Arg can be < or >
  427.         @Lw<arg><#cols>,lLabel
  428.              Branch on user's screen width
  429.              Arg can be < or >
  430.         @Ll<arg><#lines>,lLabel
  431.              Branch on user's screen length
  432.              Arg can be < or >
  433.         @La<arg><age>,lLabel
  434.              Branch on user's age
  435.              Arg can be < or >
  436.         @Lu<arg><#>,lLabel
  437.              Branch on user's upload kilobytes for the day
  438.              Arg can be < or >
  439.         @Ld<arg><#>,lLabel
  440.              Branch on user's download kilobytes for the day
  441.              Arg can be < or >
  442.         @LF<arg>,lLabel
  443.              Arg is 1 to 16, one of the sysop-defined user flags
  444.         @Lf<arg>,lLabel
  445.              Arg is 1 to 3, one of the general flags
  446.  
  447.         Note: for some of these commands it is much easier to use more
  448.         specific commands like @ESC to skip a line if the user doesn't
  449.         have graphics on.  The @ESC line could contain a branch
  450.         (@blLabel) command, thereby giving you a branch-if-graphics-on.
  451.  
  452.  
  453.  
  454. M...Set up message area
  455.  
  456.         @MArea Name,Attribute,Maximum,Number,SubStat0,SubStat1,ForceTo,MinimumWriteAccess
  457.  
  458.           Area Name should not contain commas, which are used as
  459.           delimiters.  Maximum refers to the maximum number of messages
  460.           you want to allow in the area; overwrite will occur when the
  461.           area is full.  Number is the number associated with the area,
  462.           and should normally be unique for each area.  SubStat0 and
  463.           SubStat1 refer to the security levels #0 and 1 required for
  464.           XBBS to consider a user a subop in a given area.  ForceTo is
  465.           the name of the user you want to Force an entered message to
  466.           be addressed to.  MinimumWriteAccess is the minimum access the
  467.           user must have in security level #0 to post.
  468.  
  469.           Attribute can be one or more of the following (add the values
  470.           together to get multiple attributes):
  471.  
  472.           1     No Origin or tear in this echomail conference
  473.                   Use this with care, as almost all echomail conferences
  474.                   today require a tear line and an origin line.
  475.           2     ANSI Graphics
  476.           4     Private
  477.           8     Public
  478.           16    Echo
  479.           32    Net
  480.           64    MCI
  481.                 MCI is a way for users to enter some of the more
  482.                 harmless special print routines that you have available
  483.                 as SysOp in the text files.
  484.                MCI Commands:
  485.                     ^H# (print # backspaces)
  486.                     ^U# (print name...#=0=full name, #=1=first, #=2=last)
  487.                     ^B  (print a bell)
  488.                     ^T  (print the current time)
  489.                     ^D  (print the current date)
  490.                     ^R  (print user's remaining time in minutes)
  491.                     ^S  (slow-print this line)
  492.                     ^A# (change screen colors and attributes for ANSI users.
  493.                          Possible values for #, and results:
  494.                          0...restore normal attributes (bright green on black)
  495.                          1...bright
  496.                          2...dim
  497.                          3...flash on
  498.                          4...reverse on
  499.                          5...red
  500.                          6...green
  501.                          7...yellow
  502.                          8...blue
  503.                          9...magenta
  504.                          A...cyan
  505.                         )
  506.           128   ReadOnly
  507.           256   Alternate Net Area
  508.           512   Alternate Echo Area
  509.           1024  Anonymous
  510.           2048  Real Names
  511.           4096  Is Associated with file area
  512.                 If both the current message area and the current file
  513.                 area have the Associated flag set, when a user uploads a
  514.                 file, the user is given the opportunity to post a
  515.                 descriptive message as well as give the description for
  516.                 FILES.BBS.  This message a ^AASSOC: FileName.EXT kludge
  517.                 line prepended to it. When this message is read later,
  518.                 an extra [V]iew option pops up at end-of-message.  If
  519.                 selected, this begins reading VIEWFILE.XBS.  This can
  520.                 call Peeker, allow a download, or whatever else you can
  521.                 think of.  See sample menu XBBS.XBS for an idea of how
  522.                 to implement this.
  523.           8192  Gives Extern prompt
  524.                 As with the Associated flag, this causes a new prompt to
  525.                 pop up at end-of-message: [E]xtra.  This will read
  526.                 EXTRAMSG.XBS with KeyMess set to the message's number.
  527.                 You could then use XPort to get the message as an ASCII
  528.                 file and easily write a simple program to extract
  529.                 information from it.  Possible uses might be to provide
  530.                 more information about the user who posted the message
  531.                 or the node that an echomail message originated from.
  532.          16384  Causes message to be forced to force-to name even in
  533.                 Bulls-mode.  Use with care; may make it impossible to
  534.                 reply to a user's message without addressing it to
  535.                 yourself.
  536.          32768  Messages in this area may be compressed using the LZSS
  537.                 compression method.  Messages must also meet or exceed
  538.                 the length specified in CONFIG.BBS (wouldn't do much
  539.                 good to compress a 12 byte message).  Message
  540.                 compression takes up a lot of memory, so you might not
  541.                 want to activate it if you're operating under RAM-tight
  542.                 circumstances like multi-tasking.  How XBBS compresses
  543.                 messages:  First, the length of the original message is
  544.                 stored as an ASCII number.  This is followed by a
  545.                 carriage return.  Then, the relevant portion of any
  546.                 MSGID string is stored, followed by another CR.
  547.                 Finally, the relevant portion of any REPLYID and a final
  548.                 CR.  CR's are always present even if MSGID and REPLYID
  549.                 fields weren't available.  Following all this is the
  550.                 compressed message.  This allows XBBS to thread using
  551.                 MSGID/REPLY without having to uncompress the messages
  552.                 first.
  553.  
  554.  
  555.           Area names are limited to 48 characters.  Note that you can
  556.           multiply identify the same area, if you can think of a reason
  557.           to do so, and treat the area differently at different times
  558.           (private, public, etc.)
  559.           Note that XBBS can have up to 4095 message areas (1-4095).
  560.  
  561.  
  562. N...Loop read through all message areas
  563.  
  564.         @N<msgareas.xbs-style file>,<type of read>,<newonly>,<abortok>,<startat>
  565.         @NMSGAREAS.001,2,1,1,1    (Type 2 read through eligible areas
  566.                                    listed in MSGAREAS.001, stop for
  567.                                     new only, allow aborting, start at
  568.                                     area #1)
  569.  
  570.  
  571. O...Set system variables
  572.  
  573.        Examples: @O1,Joe Blow
  574.                  @1AJane Smith
  575.                  @O2,@1
  576.  
  577.        0:   Message header subject
  578.        1:   Message header to
  579.        2:   Message header from
  580.        3:   Message header date
  581.        4:   Message header Fidonet attribute
  582.        5:   Message header XBBS extended attribute
  583.        6:   Message header times-read
  584.        7:   Message header cost
  585.        8:   Message header origin node
  586.        9:   Message header origin net
  587.        10:  Message header origin zone
  588.        11:  Message header origin point
  589.        12:  Message header destination node
  590.        13:  Message header destination net
  591.        14:  Message header destination zone
  592.        15:  Message header destination point
  593.        16:  Message header date (YY/MM/DD, YY=year-1989)
  594.        17:  Config system name
  595.        18:  Config sysop name
  596.        19:  Config logfile name
  597.        20:  Config commport
  598.        21:  Config node
  599.        22:  Config net
  600.        23:  Config zone
  601.        24:  Config alternate node
  602.        25:  Config alternate net
  603.        26:  Config alternate zone
  604.        27:  Config BBS directory
  605.        28:  Config menu directory
  606.        29:  Config message directory
  607.        30:  Config idleseconds
  608.        31:  Config number of pages allowed
  609.        32:  Config sysop in
  610.        33:  Config touchup filedates
  611.        34:  Config return upload time
  612.        35:  Config return download time
  613.        36:  Config use direct video
  614.        37:  Config use bios video
  615.        38:  Config use bios writes for ANSI
  616.        39:  Config debug mode
  617.        40:  Config ANSI available?
  618.        41:  Config status line #
  619.        42:  Config say prompts #'s?
  620.        43:  Config fullscreen editor string
  621.        44:  Config line editor string
  622.        45:  Config local editor string
  623.        46:  Config minimum baud for ANSI
  624.        47:  Config quote string
  625.        48:  Config number of system calls
  626.        49:  Config last caller's name
  627.        50:  Config netmail board
  628.        51:  Config alternate netmail board
  629.        52:  Config default origin line
  630.        53:  Config number of carbons
  631.        54:  Config jumpfiles (requires 3 args, second is jumpfile #,
  632.             third is jumpfile string, i.e. @O54,1,THATFILE.XBS)
  633.        55:  Config jumpkeys (requires 3 args, second is jumpfile #,
  634.             third is jumpfile key (first char of string))
  635.        56:  Config subfiles (requires 3 args, second is subfile #,
  636.             third is subfile string)
  637.        57:  Config subkeys (requires 3 args, second is subfile #,
  638.             third is subfile key (first char of string))
  639.        58:  Config number of LMRs
  640.        59:  Config current position in indexed quote file
  641.        60:  Config name of indexed quote file
  642.        61:  Config number of downloads at which to start enforcing
  643.        62:  Config number of computer types to track
  644.        63:  Config ANSI Graphics editor string
  645.        64:  Config number of comment lines for uploads
  646.        65:  Config maximum purgebaud
  647.        66:  Config generic phone input?
  648.        67:  Config generic state/zip field?
  649.        68:  Config use Share file locking?
  650.        69:  Config use fast ANSI output?
  651.        70:  Config log menu changes?
  652.        71:  Config log file listings?
  653.        72:  Config log areas when messages read?
  654.        73:  Config log text files when read?
  655.        74:  Config nodelist directory
  656.        75:  Config last user's record number
  657.        76:  Config letter of swapdisk
  658.        77:  Config use LIMEMS for swap?
  659.        78:  Config swap?
  660.        79:  User's name
  661.        80:  User's handle
  662.        81:  User's birthdate (4 args required, 2=month, 3=day, 4=year
  663.                               i.e. @O81,12,23,1955)
  664.        82:  User's password
  665.        83:  User's city
  666.        84:  User's state
  667.        85:  User's zipcode
  668.        86:  User's phone number1
  669.        87:  User's phone number2
  670.        88:  User's screen length
  671.        89:  User cold input?
  672.        90:  User's screen width
  673.        91:  User ANSI?
  674.        92:  User fullscreen editor default?
  675.        93:  User screen clearing?
  676.        94:  User special flag
  677.        95:  User expert flag
  678.        96:  User more flag
  679.        97:  User ignore hours flag
  680.        98:  User ignore ratio flag
  681.        99:  User nokill flag
  682.        100: User deleted flag
  683.        101: User arq flag
  684.        102: User twit flag
  685.        103: User ansimenu flag
  686.        104: User gen1 flag
  687.        105: User gen2 flag
  688.        106: User gen3 flag
  689.        107: User attribute2 flags (unsigned integer)
  690.        108: User security levels (3 args, 2=stat# to set, 3=level)
  691.        109: User upload K
  692.        110: User download K
  693.        111: User upload #
  694.        112: User download #
  695.        113: User # posts
  696.        114: User credit
  697.        115: User violations
  698.        116: User lastdate (4 args required, 2=month, 3=day, 4=year)
  699.             Example: @O116,01,01,1980
  700.        117: User logondate (4 args required, 2=month, 3=day, 4=year)
  701.        118: User lasttime (4 args required, 2=hour, 3=min, 4=sec)
  702.        119: User logontime (4 args required, 2=hour, 3=min, 4=sec)
  703.        120: User total calls
  704.        121: User calls per day
  705.        122: User time per call
  706.        123: User total time per day
  707.        124: User calls today
  708.        125: User time today
  709.        126: User computer type
  710.        127: User upload K today
  711.        128: User download K today
  712.        129: User string variable (3 args req'd, 2=var #, 3=var string)
  713.        130: User numeric variable (3 args req'd, 2=var #, 3=var)
  714.        131: Message area name
  715.        132: Message area force-to name
  716.        133: Message area attribute
  717.        134: Message area maximum
  718.        135: Message area number
  719.        136: Message area security 0
  720.        137: Message area security 1
  721.        138: File area name
  722.        139: File area flags
  723.        140: File area download directory
  724.        141: File area upload directory
  725.        142: User number
  726.        143: Baud
  727.        144: Pages
  728.        145: Age
  729.        146: Timer off/on
  730.        147: XBBS variables (3 args req'd, 2=var #, 3=var string)
  731.        148: XBBS events (4 args req'd, 2=event #, 3=filename, 4=secsleft)
  732.        149: Lastread (3 args req'd, 2=area, 3=msg #)
  733.        171: Current message directory
  734.        172-223: same as 79-130 for other user structure (see FINDAUSER
  735.                 and UPDATE)
  736.        235:     same as 142 for other user number
  737.        236: RESERVED
  738.        237: Configuration Domain
  739.        238: Alternate Domain
  740.        239: Next msg's "To" Domain
  741.        240: Number of current node (for multitaskers)
  742.        241: User's unique id #
  743.        242: Nodenumber user initially logged onto
  744.        243: Other user's unique id #
  745.        244: Nodenumber other user initially logged onto
  746.        245: Next unique user id to be assigned
  747.        246: 1 if RBBS-style DORINFO?.DEF is made, else 0
  748.        247: Can user take high-ASCII characters? (1=yes)
  749.        248: Can shadow user take high-ASCII?
  750.        253: Last INFO: encountered while reading msgs
  751.             Also used to make INFO: when writing a msg
  752.        254: Last ASSOC: encountered while reading msgs
  753.             Also used to make ASSOC: when writing a msg
  754.        255: Last msg area user was in last call
  755.        256: Last msg area for shadow user
  756.        257: User's point id#
  757.        258: Shadow user's point id#
  758.  
  759.        UTSL
  760.  
  761.  
  762. P...Pause # seconds
  763.  
  764.         @P2  (Pause 2 seconds)
  765.   
  766.  
  767. Q...Query user's list
  768.  
  769.         @Q0  (List handles)
  770.         @Q1  (List real names)
  771.         @Q4  (List user in msg.from field) *
  772.         @Q8  (List user in msg.to field) *
  773.  
  774.            *Be sure something valid is in the msg fields (i.e. a message
  775.             has been read).  Messages not locally entered will cause an
  776.             abort; the user isn't on your system.  Handles or Real Names
  777.             are searched according to the message board attribute.
  778.  
  779.  
  780. R...Restart file at a label
  781.  
  782.         @RlLabelname
  783.  
  784.         If you're branching backwards (to a point above where the branch
  785.         occurs), this is faster and more reliable than @blLabel.
  786.  
  787.  
  788. S...Security level branching
  789.  
  790.         @S<06 lLabelname   (Branch to @lLabelname if seclvl #0 < 6)
  791.         @S>399 lLabelname  (Branch to @lLabelname if seclvl #3 > 99)
  792.  
  793.  
  794. T...Slow printing.
  795.  
  796.        @T5 Hi there.
  797.        @T@3 (uses contents of variable 3 as a number)
  798.        @Te2 (uses saved errorlevel 2)
  799.  
  800.        Delays printing of each letter by the number of clock ticks (apx.
  801.        18.2/sec) specified.  You have to manually turn it off with @T0.
  802.        If you have text behind the @T#, you must follow it with a space
  803.        which XBBS uses to find the end of the following number.  See sample
  804.        menu NEWUSER.XBS.
  805.  
  806.  
  807. U...Update user's record in USERS.BBS
  808.  
  809.         @U0  (Updates user record)
  810.         @U1  (Reloads LMRs)
  811.         @U2  (Saves LMRs)
  812.  
  813.         There's normally no reason to use this command.
  814.  
  815.  
  816. V...Variables.  Named variables (see *{ and @e=$<variable name>)
  817.  
  818.        Assignment:
  819.         @VA<variable name>=<string>
  820.         @Va<variable name>=<converted string>
  821.        Delete variable:
  822.         @VD<variable name>
  823.        Free (remove) all variables:
  824.         @VF
  825.        Print variable:
  826.         @VP     (Unconverted)
  827.         @Vp     (converted)
  828.  
  829.        Note:  Named variables must use only alpha and/or numeric
  830.               characters.
  831.  
  832.  
  833.  
  834. W...Mark Where you are or return to a marked spot
  835.  
  836.         @W<0=Return, 1=Mark><Mark ID, 0-9>
  837.  
  838.         See sample menu CONFIGUR.GBS for example usage.  This is an
  839.         extremely fast way to do branching.
  840.  
  841.  
  842. X...Write Exit files
  843.  
  844.         @X0     (Writes USERINFO.XBS, DORINFO1.DEF, LASTUSER.BBS and
  845.                  DOOR.SYS using Real Name in name field)
  846.         @X9600  (Does the same, but uses 9600 as baud rate in exit files
  847.                  unless local, for high-speed modem usage with Doors
  848.                  that can't accept unsigned integers as baud rates or
  849.                  whatever other use you can think of.)
  850.         @X0 1   (Does the same as first example, but uses Handle in name
  851.                  field)
  852.  
  853.  
  854. Y...Cancel Embedded Commands for file being read
  855.  
  856.         @Y
  857.    
  858.  
  859. Z...Set file to read next or top file or reset nextfile pointer
  860.  
  861.         @Z0              (Unset nextfile pointer)
  862.         @Z1Filename.ext  (Set nextfile pointer to Filename.ext)
  863.         @Z2Filename.ext  (Set topfile pointer to Filename.ext)
  864.  
  865.  
  866. a...Turn file aborting on/off
  867.  
  868.         @a0  (Turn aborting on)
  869.         @a1  (Turn aborting off)
  870.  
  871.  
  872. b...Branch down to a label in current file
  873.  
  874.         @blLabelname  (Branch down to @lLabelname)
  875.            This can be useful to form the "ELSE" in an IF...THEN...ELSE
  876.            type of menu paragraph.  It can also be used to skip a block
  877.            of comments (see also @;):
  878.  
  879.              @blSkipComments--------+
  880.              This is a comment.     |
  881.              More comments.         |
  882.              @lSkipComments<--------+
  883.    
  884.              @0AlLabel
  885.              @b@0       (Branch to label lLabel)
  886.  
  887.              @b#0       (If saved errorlevel pos #0 = 50, would branch
  888.                          to label l50)
  889.  
  890.             An example of using @b to form the "ELSE" in an IF...THEN...
  891.  
  892.       +----- @LF1 lFlag1On   (Branch to label lFlag1On if flag 1 is on)
  893.       |  +-- @blFlag1Off     (else branch to label lFlag1Off)
  894.       +--|-> @lFlag1On
  895.          |      (do stuff here)
  896.       +--|-- @blSkipFlag1Off    (skip else code)
  897.       |  +-> @lFlag1Off
  898.       |         (do stuff here)
  899.       +----> @lSkipFlag1Off
  900.  
  901.         See also @R
  902.  
  903.  
  904.  
  905. c...Chat request
  906.  
  907.         @c  Reads the file CHAT.XBS in the Menu directory if you're
  908.             In, or NOCHAT.XBS if you're Out.
  909.             If the user has paged more times than allowed in XConfig,
  910.             GETLOST.XBS is read instead.  NOTE:  XBBS does _not_ produce
  911.             a default bell or page tone.. you will have to create your
  912.             own "pager" either with a series of ASCII 7 (Ctrl-G)
  913.             characters, or with a spawn to a simple program that sounds
  914.             the bells and "whistles" (even a GWBASIC program will do).
  915.  
  916.  
  917. d...Date printing/branching/checking
  918.  
  919.         @dc          (Print current date in ANSI C standard format)
  920.         @dw          (Print day of week as Monday, Tuesday, etc.)
  921.         @dd<arg> lLabel (Branch if day of week is equal to <arg> (Sun-Sat))
  922.         @da# lLabel  (Branch if day of month not equal to #)
  923.         @dm# lLabel  (Branch if month not equal to #)
  924.         @dl          (Set internal errorlevel to # days since user's last call)
  925.  
  926.  
  927. e...Errorlevel branching
  928.  
  929.         @e=<###> or <@#> or <$<variable name> (Set errorlevel to <###>.
  930.                  If <###> begins with @ (the commercial at sign, not
  931.                  ^a), assigns the number represented by variable <#>.
  932.                  If <###> begins with $, assigns the number represented
  933.                  by named variable <variable name>.
  934.             Examples: @e=55  (Errorlevel is set to 55)
  935.                       @9A45[Enter] (Var 9 is set to "45")
  936.                       @e=@9  (Errorlevel is set to 45)
  937.                       @e=$KEEPTHIS
  938.         @e--    (Decrement errorlevel by 1)
  939.         @e++    (Increment errorlevel by 1)
  940.         @e-#<#> (Decrement saved errorlevel <#> by 1)
  941.         @e+#<#> (Increment saved errorlevel <#> by 1)
  942.         @e~     Errorlevel = NOT errorlevel
  943.         @et     Errorlevel = time remaining (in minutes)
  944.         @eR     Errorlevel = random # (0-32767)
  945.         @eU     Errorlevel = Upload K
  946.         @eu     Errorlevel = # of uploads
  947.         @eD     Errorlevel = Download K
  948.         @ed     Errorlevel = # of downloads
  949.         @eK     Errorlevel = Download K for today
  950.         @ek     Errorlevel = Upload K for today
  951.         @eL     Errorlevel = Lastread in current area
  952.         @el     Lastread for current area = Errorlevel
  953.         @eE     Errorlevel = #minutes spent in last spawn/shell
  954.         @eV<#>  Errorlevel = user numeric variable <#>
  955.         @eS<#>  User numeric variable <#> = Errorlevel
  956.         @en     Errorlevel = # of calls for this user
  957.         @eF     Errorlevel = user flag word
  958.         @ef     user flag word = Errorlevel
  959.         @eP     Errorlevel = # user posts ('ware the wraparound!)
  960.         @ea     Errorlevel = last message area user was in on previous call
  961.         @em     Errorlevel = # msgs in current area
  962.         @eM     Minimum write access (for msgs curr. area) = Errorlevel
  963.         @eO     Errorlevel = # of shadow user (0 if none)
  964.         @e0     Errorlevel = scroll lock status
  965.         @e<+-/*|&% or ^><e or @(at sign)><# or constant>
  966.                 Perform numeric computations (result in errorlevel)
  967.             Examples: @e+5  (Add 5 to errorlevel)
  968.                       @9A45 (Put "45" in var 9)
  969.                       @e/@9 (Divide errorlevel by 45)
  970.                       @e=8  (Errorlevel = 8)
  971.                       @es1  (Save in position 1)
  972.                       @e&e1 (Errorlevel = errorlevel AND 8)
  973.         @e?     (Errorlevel=last XBBS.TXT prompt # accessed)
  974.         @es<#>  (Save errorlevel in save position <#> (0-9) )
  975.         @er<#>  (Retrieve errorlevel from save position <#> (0-9) )
  976.         @e0     (Zero internal errorlevel)
  977.         @e@<#>  (Set errorlevel to len of variable <#> (0-9))
  978.         @e==3   (Branch if ERRORLEVEL == 3)
  979.         @e<1 lLabelname    (Branch if ERRORLEVEL < 1)
  980.         @e>253 lLabelname  (Branch if ERRORLEVEL > 253)
  981.            This is useful for branching on the returned ERRORLEVEL of a
  982.            Spawned program.  Some internal functions, like
  983.            write-a-message, findfirst, findnext, etc. also return an
  984.            ERRORLEVEL.  Syntax @e<e# should also work.
  985.            
  986.  
  987. f...Files.BBS reading, raw directory, read-any, read-new, read-text, etc.
  988.  
  989.         @ff<type> <filename> <datestring> <searchstring>
  990.                      Read file <filename> FILES.BBS-style
  991.                      Values for <type>:
  992.                         0=download dir
  993.                         1=upload dir
  994.                         OR with 2=new d/l
  995.                         OR with 4=use <searchstring>
  996.                         OR with 8=if D hit at paged prompt, return
  997.                            with errorlevel 3.  This lets you "ask" the
  998.                            user if he's seen a file he wants to download
  999.                            after every page if you're feeling ingenious.
  1000.                         OR with 16=if M hit at paged prompt, read file
  1001.                            MARKFILE.XBS.  Lets you do anything you want,
  1002.                            and resumes reading FILES.BBS where you left
  1003.                            off when finished.
  1004.                      <datestring> is used for new file searches, and
  1005.                      defaults to the user's lastdate if no string is
  1006.                      passed.  <datestring> must be in mm/dd/yyyy format.
  1007.                      See sample menus FILES.XBS and IBMCOM.XBS
  1008.                      <searchstring> is used as the mask (usually user
  1009.                      input) if type is ORed with 4. If the file is not
  1010.                      read all the way through (aborted), the internal
  1011.                      ERRORLEVEL is set to 1.  If no files are listed
  1012.                      (weren't any in FILES.BBS or none new), the
  1013.                      internal ERRORLEVEL is set to 2.  A return of 3
  1014.                      indicates that [D] was pressed at the paged prompt
  1015.                      line.  A return of 4 means there wasn't any file to
  1016.                      list (bogus, dude).  See sample menus FILES.XBS and
  1017.                      IBMCOM.XBS
  1018.  
  1019.         @fr<type (0-2)> <directory(\mask)>
  1020.                      Raw directory.  If <type> is greater than 1, don't
  1021.                      ask for a mask (mask included in <directory>
  1022.                      string) and don't display the file's extension. If
  1023.                      <type> is 1, allow directory+filename mask.  If
  1024.                      <type> is 0, allow only filename mask.
  1025.                      Example:
  1026.                       Display directory of all files in C:\XBBS\NEWS
  1027.                       matching "*.NWS":
  1028.                          @fr2 C:\XBBS\NEWS\*.NWS
  1029.  
  1030.         @fa<directory> <extension (optional)> <type>
  1031.                      Read any file in a directory
  1032.                      Passing an extension limits files that can be read
  1033.                      to files having that extension
  1034.                      If <type> is not 0, use paged read, otherwise use
  1035.                      embedded command read.
  1036.                      Example:
  1037.                       Allow reading of any file in C:\XBBS\NEWS that has
  1038.                       a ".NWS" extension:
  1039.                          @fa .NWS C:\XBBS\NEWS\
  1040.  
  1041.         @fn<directory\mask> <type>
  1042.                      Read new files in directory (newer than last call)
  1043.                      If <type> is not 0, use paged read, otherwise, use
  1044.                      embedded command read.
  1045.                      Example:
  1046.                       Read any new files in C:\XBBS\NEWS matching *.NWS:
  1047.                          @fnC:\XBBS\NEWS\*.NWS
  1048.  
  1049.         @fd
  1050.                      Output file description of last file found
  1051.                      (see @0...@9 and sample menu BIMODEM.XBS)
  1052.  
  1053.         @fD<drive><arg>
  1054.                      Branch if space on <drive> is less than <arg>
  1055.                      See sample menu IBMCOM.XBS
  1056.  
  1057.         @ft<var #> or @ft<filename>
  1058.                      Paged read of the file named in variable #, or of
  1059.                      filename
  1060.                      See sample menu HELP-.XBS
  1061.  
  1062.  
  1063. g...Assign following string to *g return (last u/d filestring)
  1064.  
  1065.         @gFilename.EXT
  1066.  
  1067.  
  1068.  
  1069. h...Pause until [Enter] pressed (prints prompt from XBBS.TXT #194,
  1070.                                  then #273 after Enter pressed)
  1071.         @h
  1072.     
  1073.  
  1074. i...File input/output
  1075.  
  1076.     @i<o[@# or filename], c<i or w>, r, a or m[@# or filename],
  1077.                                            w[# or text] or i[#]>
  1078.         You have one input file and one output file available.
  1079.  
  1080.       @iofilename.ext or @# (at sign+variable #)
  1081.         Open filename.ext for input (SHARE-compatible).  If a file is
  1082.         already open, it's closed first.  Return 0 in internal
  1083.         errorlevel if opened without error, otherwise return 1.
  1084.       @ic<i or w>
  1085.         Close an open file.  If <i>, close input file else close output
  1086.         file.
  1087.       @ir
  1088.         Reposition an open input file to the start of the file.  Returns
  1089.         0 on success, non-zero on error.
  1090.       @ii#
  1091.         Input from open file into variable #.  If successful, internal
  1092.         errorlevel is 0, otherwise it's 1 (usually file not open or EOF).
  1093.         Up to 80 chars may be read or until a CR/LF is encountered (not
  1094.         retained).
  1095.       @imfilename.ext or @# (at sign+variable #)
  1096.         Create filename.ext for output (deny write to other processes).
  1097.         If a file is already open, it's closed first.  Returns 0 on
  1098.         success, 1 on error.
  1099.       @iafilename.ext or @#
  1100.         Open a file for append (seek to end after opening.  Must exist.)
  1101.       @iw@# or @iwText to write
  1102.         Write variable # to file created with @im, followed by a CR/LF.
  1103.  
  1104.  
  1105. j...Jump to another file (GOTO)
  1106.  
  1107.         @jFilename.ext  (Close current file and begin reading Filename.ext)
  1108.         @jFilename.ext lLabelName (Same, but starts at lLabelName)
  1109.         @j0 lLabelName (Same, but reads filename in variable #0)
  1110.         @j01 (Same, but starts in label contained in variable #1)
  1111.  
  1112.  
  1113. k...Stuff/clear key macro buffer
  1114.  
  1115.         @kc  (Clear macro buffer)
  1116.         @ka<text or @var#> (Append to macro buffer)
  1117.  
  1118.         XBBS will attempt to access the macro buffer for keypresses
  1119.         whenever an input is called for.  If the macro buffer contains
  1120.         keys, they are used as if entered by the user.  You can use this
  1121.         feature to create macros.  The character '|' (vertical pipe) is
  1122.         translated to a carriage return (usually end-of-input).
  1123.  
  1124.  
  1125. l...Label (marker)
  1126.  
  1127.         @lLabelname  Label names must always be CTRL-A followed by
  1128.                      lowercase "l" followed by label name.  They are
  1129.                      ignored when file is being read except when they
  1130.                      are the object of a branch-to.  Labels must start
  1131.                      at beginning of a line and be only object on
  1132.                      line...EXCEPTION: you can put a @lFakeName at the
  1133.                      end of a line to suppress CR/LF for that line. You
  1134.                      can use "meaningless" labels to comment your menus
  1135.                      (see @; for a better way to do comments).
  1136.  
  1137.  
  1138. m...Manipulate user file (shadow user)
  1139.  
  1140.         @m<User Name> (Find User Name -- internal errorlevel set if
  1141.                        not found)
  1142.         @m0<#>     (Load user <#>)
  1143.         @m1<#>     (Save user <#>)
  1144.         @m2        (Save *current user's* last message read pointers)
  1145.         @m3        (Load *current user's* last message read pointers
  1146.                     This could be used to refresh a user's LMRs
  1147.                     after an extract or whatever.)
  1148.  
  1149.  
  1150. n...Run a .MNU file
  1151.  
  1152.         @nC:\XBBS\MNU\MENU.MNU
  1153.  
  1154.         If XBBS finds no MAIN.XBS but does find a MAIN.MNU, it invokes
  1155.         Mijit-mode (so called because you can't do as much with a
  1156.         menu-based BBS as the 'standard' XBBS) by processing it as if
  1157.         it was called with this command.
  1158.  
  1159.         UTSL (Use the Source, Luke).
  1160.  
  1161.  
  1162. o...Advanced ANSI interface
  1163.  
  1164.     @o<###>,<params>
  1165.  
  1166.         @o1,text
  1167.             Display an error message window.  Pause until a key is pressed.
  1168.         @o2,text
  1169.             Display an error message window.  Pause until a key is
  1170.             pressed or two minutes elapse.
  1171.         @o3,text
  1172.             Display an error message window.  Pause one second.
  1173.         @o4,text
  1174.         @o5,text
  1175.         @o6,text
  1176.             Display a note message window.
  1177.         @o7,title,text
  1178.         @o8,title,text
  1179.         @o9,title,text
  1180.             Display a generic one-line window.
  1181.         @o10,filename,topic
  1182.         @o11,filename,topic
  1183.         @o12,filename,topic
  1184.             Display a help window.
  1185.         @o13,<var#>,title,prompt,mask,default,foreground color,background
  1186.           color,top-left x,top-left y,type
  1187.             Display an input window and accept input.  Variable <var#> gets
  1188.             the returned string.  Errorlevel is set if user ESCapes out
  1189.             of the window without entering anything.  Colors are:
  1190.  
  1191.             RED         4
  1192.             GREEN       2
  1193.             BLUE        1
  1194.             WHITE       7
  1195.             YELLOW      6
  1196.             AQUA        3
  1197.             MAGENTA     5
  1198.             BLACK       0
  1199.  
  1200.             The mask string should be composed of underlines (_) where you
  1201.             want user input.  Other characters may be included; they serve
  1202.             as delimiters in the input field, but are not included in the
  1203.             returned string.  A sample for USA phone numbers: (___)___-____
  1204.  
  1205.             The type should be one of the following:
  1206.                 A...Uppercased anything-goes
  1207.                 a...Anycased anything-goes
  1208.                 N...Numeric
  1209.                 D...Date field with auto-validation (USA format, sorry)
  1210.                 Z...Zero-filled numeric
  1211.                 C...Cash
  1212.                 O...X or - (bit field)
  1213.  
  1214.         @o14,x,y,h,w,keys
  1215.             Treats what's on the screen as a pick-list.  x,y is the top
  1216.             left corner of the 'window' (from 0,0 for the top left corner
  1217.             of the screen), and h,w are the height and width of the 'window'.
  1218.             The internal errorlevel is set to indicate the selection (0
  1219.             means ESCape or CTRL-K aborted; HOME, PGUP, PGDN, CTRL-HOME
  1220.             and CTRL-END return their values--left and right arrows
  1221.             return 203 and 205 respectively).  keys is a list of keys
  1222.             that XBBS will allow for quick selection (not necessarily
  1223.             the first letter of the text on the screen); if one is
  1224.             pressed, its order in the list is returned.
  1225.         @o255,
  1226.             Invoke the built-in user editor in remote mode (for what
  1227.             it's worth).
  1228.         @o254,
  1229.             Invoke the other-options menu in remote mode (for what it's
  1230.             worth).
  1231.  
  1232.  
  1233. p...Pause mode on or off
  1234.  
  1235.         @p0  (Pausing allowed)
  1236.         @p1  (Pause not allowed)
  1237.  
  1238.  
  1239. q...Quit reading (close) file being read.  If a nextfile pointer has
  1240.     been set, the nextfile will be read; otherwise, the topfile will
  1241.     be read.  If the topfile doesn't exist for some reason, MAIN.XBS
  1242.     gets read.  If that doesn't exist, Ijit-mode is invoked.
  1243.  
  1244.         @q
  1245.  
  1246.  
  1247. r...Read a message
  1248.  
  1249.      @r0,0   (Read anything public and personal)
  1250.      @r1,0   (Read only personal)
  1251.      @r2,0   (Quiet check for personal messages)
  1252.      @r4,0   (Non-stop read)
  1253.      @r8,0   (Selective read, preset)
  1254.      @r16,0  (Selective read)
  1255.      @r64,0  (Extract instead of read)
  1256.      @r128,0 (Scan instead of read)
  1257.  
  1258.       You can add values together to get the desired effect (though
  1259.       obviously not all additions will be practical)
  1260.  
  1261.     You can also pass a non-zero number as the second parameter (or @#
  1262.     or e#) to bypass the "Start at #:" prompt and begin reading at a
  1263.     specified location.
  1264.  
  1265.  
  1266. s...Get message header
  1267.  
  1268.     @s<msg#>
  1269.  
  1270.     This gets the header for <msg#> in the current message area.
  1271.     You can then display/analyze with *M#.  If an error occurs,
  1272.     internal errorlevel is set; otherwise, it's 0.
  1273.  
  1274.     Examples:
  1275.         @s12    (Get msg header for msg #12)
  1276.         @s@0    (Get msg header for msg #<numeric value of var 0>)
  1277.         @se3    (Get msg header for msg #<saved errorlevel 3>)
  1278.  
  1279.     Note:  This command was once an undocumented "scan messages" command.
  1280.            If you have used it in that manner, replace with @r128,...
  1281.  
  1282.  
  1283. t...Time printing/branching/checking
  1284.  
  1285.      @tc   (Echos current time)
  1286.      @tr   (Echos minutes remaining)
  1287.            Example: @tr mins remaining.
  1288.      @to   (Controls system timer)
  1289.            (0=off & save, 1=on & restore, 2=on)
  1290.      @tl   (Sets internal errorlevel to # minutes since last call to system)
  1291.      @texx:xx:xx yy:yy:yy lLabel
  1292.            (Should branch to label during offhours...maybe)
  1293.      @t<operator><[@(at sign) or e][#]minutes> (Set/branch on time remaining)
  1294.       Examples:
  1295.        @t=30 would set the user's timelimit to 30 minutes
  1296.        @t+30 would add 30 minutes to user's time
  1297.        @t-30 would subtract 30 minutes from user's time
  1298.        @t<30lLabel would branch to lLabel if the user had less than
  1299.                    30 minutes remaining.
  1300.        @t>30lLabel would branch to lLabel if the user had more than
  1301.                    30 minutes remaining.
  1302.        @t=@0       would set user's timelimit to whatever # was
  1303.                    represented by the string in variable #0
  1304.        @t-e4       would subtract saved errorlevel position #4 from
  1305.                    the user's time.
  1306.  
  1307.  
  1308. u...Display user parameters (see also metastrings)
  1309.  
  1310.         @uf  (First name handle)
  1311.         @ul  (Last name handle)
  1312.         @uw  (Whole handle)
  1313.         @uN  (Real name)
  1314.         @un  (Number of total calls)
  1315.         @um  (Number of calls today)
  1316.         @uo  (Number of calls remaining)
  1317.         @up  (Number of calls allowed per day)
  1318.         @uc  (Time allowed per call)
  1319.         @ut  (Total time allowed per day)
  1320.         @us  (Last call date)
  1321.         @ua  (Last call time)
  1322.         @uF  (Time used so far today)
  1323.         @uu  (# of uploads)
  1324.         @uU  (Uploaded Kb)
  1325.         @ud  (# of downloads)
  1326.         @uD  (Downloaded Kb)
  1327.         @uA  (Age)
  1328.         @uL  (Lastread message pointer for current message area)
  1329.         @uC  (City)
  1330.         @uS  (State)
  1331.         @uZ  (Zipcode)
  1332.  
  1333.  
  1334. v...Set user parameters
  1335.  
  1336.         @vp  (Change password)
  1337.         @vh  (Change handle)
  1338.         @vl  (Change screen length)
  1339.         @vw  (Change screen width)
  1340.         @v1  (Change phone #1)
  1341.         @v2  (Change phone #2)
  1342.         @vz  (Change zipcode)
  1343.         @vs  (Change state)
  1344.         @vc  (Change city)
  1345.         @vC  (Change Computer Type)
  1346.         @vg  (Toggle ANSI)
  1347.         @vf  (Toggle ANSI Fullscreen editor preference)
  1348.         @vm  (Toggle More?)
  1349.         @vr  (Toggle Screen Clearing)
  1350.         @vx  (Toggle Expert bit)
  1351.         @vo  (Toggle Special bit)
  1352.         @vt  (Toggle Twit bit)
  1353.         @vM  (Toggle ARQ bit)
  1354.         @vk  (Toggle Deleted bit)
  1355.         @vn  (Toggle NoKill bit)
  1356.         @vR  (Toggle IgnoreRatio bit)
  1357.         @vH  (Toggle IgnoreHours bit)
  1358.         @vA  (Toggle ANSI cursor menu bit)
  1359.         @vu<arg>  (Add <arg> to number of uploads)
  1360.         @vd<arg>  (Add <arg> to number of downloads)
  1361.         @vU<arg>  (Add <arg> to uploaded kilobyte total)
  1362.         @vD<arg>  (Add <arg> to downloaded kilobyte total)
  1363.         @vF<arg>  (Arg is 1 to 16, a sysop-defined flag, or 17, cold
  1364.                    input flag, or 18, hi-ASCII flag)
  1365.         @vG<arg>  (Arg is 1 to 3, one of the general flags)
  1366.         @vK       Adds k from last @0D to user's download k
  1367.         @vL       Adds # of files from last @0D to user's download #
  1368.  
  1369.  
  1370. w...Write a message
  1371.  
  1372.       @w<type1> <type2>
  1373.       Where type1 is one of the following:
  1374.             0=normal (ask for info, write message, import to message
  1375.                       base)
  1376.             1=ask and write message but don't import*
  1377.             2=ask but don't write or import*
  1378.             4=import MSGTMP? to message base*
  1379.       and type2 has one of the following values:
  1380.             0=Standard first-posting
  1381.             1=is a reply
  1382.             2=Force to message board's Force-to name
  1383.             4=Upload message to BBS via XModem (Can be ORed with any
  1384.                                                 type2)
  1385.             8=Not used, reserved
  1386.             16=Offer private as default option
  1387.  
  1388.         *Not yet fully implemented
  1389.  
  1390.          Note that for the upload option to work, you must have a batch
  1391.          file in the default directory named MSGUL.BAT (see XBBS.TXT
  1392.          prompt #322) which accepts the following parameters:
  1393.              *B *p *P *T <filename, usually MSGTMP>
  1394.          The batch file can rearrange these parameters as required, and
  1395.          is expected to download <filename> into the default directory
  1396.          via XModem (usually with DSZ).  Note that XModem is used as it
  1397.          will not allow the filename to be changed during the download,
  1398.          as could happen with ZModem and other protocols.  The line
  1399.          editor is invoked after the upload for minor touch-ups.
  1400.          See FDBK.XBS sample menu for examples.
  1401.  
  1402.  
  1403. x...Logoff current user
  1404.  
  1405.         @x or @x0  (logoff and drop DTR if remote)
  1406.         @x1        (logoff, leave DTR high, for use as Door)
  1407.         @x2        (logoff, set baud to 0, don't terminate XBBS...can be
  1408.                     used to run clean-up menu)
  1409.  
  1410.  
  1411. y...Print system parameters (see also metastrings)
  1412.  
  1413.         @yl  (print name of last caller)
  1414.         @ys  (print sysop's name)
  1415.         @yn  (print system's name)
  1416.         @y#  (print number of messages in current message area)
  1417.         @yc  (print total system calls)
  1418.         @ydA (print free bytes on drive A:  substitute letter of desired
  1419.               drive)
  1420.         @yM  (print name of current message area)
  1421.         @yF  (print name of current file area)
  1422.  
  1423.  
  1424. z...Print a quote from a quote file
  1425.  
  1426.         @z#,<filename.ext> (if # is other than 0, if a random number
  1427.                            between 1 and 10 is less that #, a quote is
  1428.                            printed; otherwise, it is not. If # is 0, a
  1429.                            quote is always printed)
  1430.           Examples:
  1431.            @z0,QUOTES.BBS (print a quote from QUOTES.BBS)
  1432.            @z5,QUOTES.XBS (about 50% chance a quote will be output)
  1433.  
  1434.           Note:  Quote file is "standard" format with blank line between
  1435.                  quotes.
  1436.  
  1437.  
  1438. 0-9...Variable manipulation/input/output/testing & Events
  1439.  
  1440.         @0A<string>[Enter]
  1441.            Assigns <string> to variable #0.
  1442.  
  1443.         @0=<letter/symbol>  Assign a system variable to a user variable
  1444.            All the metastring letters/symbols are available.
  1445.           Examples (quote marks are for clarity only):
  1446.             @0=B  (If caller is 2400 baud, puts "2400" in var 0
  1447.             @0=r  (If last caller's handle was George, puts "George" in
  1448.                    var 0)
  1449.  
  1450.         @0C<operand><string>[Enter]<lLabelName>[Enter]
  1451.            Compare variable #0 to <string>.  If <operand> is ! then branch
  1452.            if variable #0 is not equal to <string>.  If <operand> is =
  1453.            then branch if variable _is_ equal to <string>.
  1454.           Examples:
  1455.             If variable #0 is not equal to "^" branch to lANSIMESS:
  1456.                @0C!^
  1457.                lANSIMESS
  1458.             If variable #0 is equal to "READ MESSAGES" branch to lRead:
  1459.                @0C=READ MESSAGES
  1460.                lRead
  1461.  
  1462.         @0S<string>[Enter]<lLabel>
  1463.            Branch if string is equal to variable #0.  Only the length of
  1464.            string is compared (for instance, if variable #0 contained
  1465.            ALUMINUM, @0SALUM[Enter]lLabel would branch to lLabel.
  1466.  
  1467.         @0P
  1468.            Prints variable #0.
  1469.  
  1470.         @0I#<length>,<pword>,<caps>,<hot>,<type>
  1471.            Inputs into variable #0 up to <length-1> characters (80 max),
  1472.            masks echo if <pword> is not 0, forces input to uppercase if
  1473.            <caps> is not 0, is "hot" (doesn't need [Enter] to terminate)
  1474.            if <hot> is not 0, and is of one of the following types (<type>):
  1475.              1=ALL (all printable chars)
  1476.              2=ALPHA (alphabetical chars)
  1477.              3=NUM (decimal digits)
  1478.              4=ALPHANUM (alpha and digits)
  1479.              5=YESNO (Y or N)
  1480.              6=FILE SPEC
  1481.              7=FILE SPEC w/ PATH
  1482.              8=FILE SPEC w/ WILDCARDS
  1483.              9=FILE SPEC w/ PATH & WILDCARDS
  1484.             10=NAME (2 words, both capitalized)
  1485.             11=NEAT (first char of each word capitalized)
  1486.             12=PHONE (a phone number, with mask if conf.genphone=NO)
  1487.             13=DATE (a date, with mask)
  1488.             14=SUBJECT (first char capitalized)
  1489.             15=YESNO (no echo)
  1490.             16=FILE SPEC no extension
  1491.             17=[reserved]
  1492.             18=ANSIIN  (cursor keys inc/dec # represented by var)
  1493.             19=Set default for ANSIIN  (see sample CONFIGUR.GBS)
  1494.             20=FILE SPEC (BATCH)
  1495.             21=FILE SPEC (BATCH w/ WILDCARDS)
  1496.             22=FILE SPEC (BATCH w/ WILDCARDS & PATH)
  1497.             23=FILE SPEC (BATCH w/ PATH)
  1498.             24=TRUEANSI (cursor key sequences, i.e. ESC[1C)
  1499.             25=WORD (no spaces, alpha only)
  1500.             26=WORDNUM  (no spaces alpha or digit)
  1501.             27=BITS (- or X)
  1502.             28=ANY (anything)
  1503.             29=ANYNOECHO (same, no echo)
  1504.             30=HYPER (Used by hypertext reader)
  1505.             31=THRU (INKEY$-like)
  1506.             32-64=[Reserved]
  1507.             65=YESNOQ (Y N or Q)
  1508.             66-127=[Reserved]
  1509.             128=RECORD (or any type with 128, input *won't* use macro buff)
  1510.             129-255=[Reserved]
  1511.             Examples:
  1512.                      Input a single uppercased character "hot":
  1513.                      @0I1 0 1 1 1
  1514.                      Input a word up to 32 characters long:
  1515.                      @0I33 0 0 0 2
  1516.                      Input a filespec:
  1517.                      @013 0 1 0 6
  1518.  
  1519.         @0F<U,D or N>
  1520.           Do a FindFirst on the file spec in variable #0.  Set
  1521.           Errorlevel variable if not found; otherwise, return actual
  1522.           filename in variable #0.  If extra arg is U, searches Upload
  1523.           path.  If D, searches Download path.  If N, no path is
  1524.           prepended.  See BIMODEM.XBS sample menu for examples.
  1525.  
  1526.         @0f
  1527.           Do a FindNext and react as for @0F.  See BIMODEM.XBS sample
  1528.           menu for example.
  1529.  
  1530.         @0+
  1531.           Increment the time stamp of all files matching the file spec
  1532.           in variable #0 in the current download path by 1 (the # of
  1533.           downloads pointer).  See BIMODEM.XBS sample menu for example.
  1534.  
  1535.         @0c<arg>
  1536.           Copy the contents of variable #0 into variable #<arg>.
  1537.  
  1538.         @0t<arg1> <arg2>
  1539.           Test the string in variable #0 as a number.  If less than
  1540.           <arg1> or greater than <arg2> it will fail the test, and the
  1541.           errorlevel variable will be set.  This can be tested with @e.
  1542.  
  1543.         @0T<lLabel1>,<lLabel2>,...<lLabel255>
  1544.           Does an "ON...GOTO" based on the number represented by the
  1545.           string in variable #0.  If variable #0 is "1", lLabel1 would
  1546.           be sought, and so forth.  Don't exceed 255 character width per
  1547.           line.
  1548.           Example:
  1549.               @0TlNull,lPass1,lLen1,lWid1,lGra1,lMore1,lFull1,lScrn1,lComp1
  1550.             (See sample menu CONFIGUR.GBS)
  1551.  
  1552.         @0D
  1553.           Lists the files as contained in variable name (works with
  1554.           batches and wildcards).  If the user doesn't have enough time
  1555.           to download everything, internal errorlevel is set to 2.  If
  1556.           no files were found, internal errorlevel is set to 1.
  1557.  
  1558.         @0a1
  1559.           Parse through variable 0 one character at a time with
  1560.           character copied to variable 1 (in this case).  For instance,
  1561.           if variable 0 contained "Hello", the first call would result
  1562.           in variable 0 containing "ello" and variable 1 containing "H";
  1563.           the second call would produce "llo" and "e", etc.
  1564.  
  1565.         @0p1<delimiters>
  1566.           Parse through variable 0 by delimiter string.  For instance,
  1567.           if variable 0 contained "Here,There" and "@0p1 ," was called,
  1568.           variable 0 would contain "There" and variable 1 would contain
  1569.           "Here".
  1570.  
  1571.         @0s
  1572.           Strip leading and trailing blanks from variable 0.
  1573.  
  1574.         @0|<#>
  1575.           Concatenate variable 0 with variable <#>.
  1576.  
  1577.         @0/<[e]#>[[e]#]
  1578.           Return in variable 0 the string currently in variable 0
  1579.           starting at position <#> for [#] characters.  If <#> is out of
  1580.           range, the internal errorlevel is set and no change is made to
  1581.           the variable.  If [#] is missing or out of range, the
  1582.           remainder of the string is returned. If # is preceded by the
  1583.           letter e, the corresponding saved errorlevel is used.
  1584.  
  1585.         @0V<#><lLabel>
  1586.           Branch to <lLabel> if variable 0 exactly matches variable <#>.
  1587.  
  1588.         @0Z<string>[Enter]<lLabel>
  1589.           Branch to <lLabel> if <string> is found within variable 0.
  1590.           The internal errorlevel is set to the position within variable
  1591.           0 where <string> starts.
  1592.  
  1593.         @0i<#><lLabel>
  1594.           Branch to <lLabel> if variable <#> is found within variable 0.
  1595.           The internal errorlevel is set to the position within variable
  1596.           0 where variable <#> starts.
  1597.  
  1598.         @0e<#>
  1599.           Assign string representing saved errorlevel #<#> to variable 0.
  1600.  
  1601.         @0U<#>
  1602.           Copy variable 0 into user string variable #.
  1603.  
  1604.         @0d<#>
  1605.           Print variable 0 after converting any metastrings contained in
  1606.           it.
  1607.  
  1608.         @0l
  1609.           Lowercase variable 0.
  1610.  
  1611.         @0u
  1612.           Uppercase variable 0.
  1613.  
  1614.         @0k
  1615.           Copy contents of keyboard macro buffer into variable 0.
  1616.  
  1617.         @0g<environment_variable or @#>
  1618.           Copy value of environment variable into variable 0.  Can be
  1619.           used to make menus for distribution portable.
  1620.  
  1621.         @0b
  1622.           Copy value of variable 0 into the associated filename.  Can be
  1623.           used to be sure associated filename is cleared before posting
  1624.           a non-associated message in an associated area.
  1625.  
  1626.       Note that 0 could have been any digit between 0 and 9 in the
  1627.       above, and would have affected the variable represented by the
  1628.       changed digit.
  1629.  
  1630.       Events:
  1631.  
  1632.        There is one additional @<#> command that relates to Events
  1633.        instead of variables.  Events are set up with this command, and
  1634.        XBBS tracks the event and executes the named file when the
  1635.        timelimit drops to below what you specify with this command.
  1636.       Format:
  1637.        @<#>E<seconds>,<filename.ext>
  1638.       Example:
  1639.        @0E360,THRMIN.XBS (would gosub to THRMIN.XBS at the earliest
  1640.        possible moment after 360 seconds remaining to the user...event
  1641.        #0) To turn an event off, set <seconds> to 0.  Events are
  1642.        automatically turned off after they occur.
  1643.  
  1644.  
  1645. ~...Clear screen if user parameter allows screen clearing in either
  1646.     graphics or ASCII mode
  1647.  
  1648.         @~
  1649.  
  1650.  
  1651. ESC...(an actual escape character, 0x01b or 27 decimal)  Send text to
  1652.        ANSI users
  1653.  
  1654.        Example:
  1655.         @ESCESC[0;1;32m  (Set green text on black background if user
  1656.                           has ANSI graphics enabled...otherwise ignore)
  1657.  
  1658.           Text followed by the @ is ignored by XBBS if the user is _not_
  1659.      in ANSI graphics mode.  Text files with ANSI codes in them (i.e.
  1660.      the "pretty" or "sharp" screens and menus you might want your users
  1661.      to see) can be easily edited with ANSI editors (like TheDraw or
  1662.      PCCrayon) and integrated into your menus, if you like.  Note that
  1663.      the ESC directly behind the @ is *not* sent (different as of 1.14)!
  1664.  
  1665.      You can set color/graphics attributes by entering:  ESC[#;#;#m
  1666.      where the first number is normal, bold or dim, the second number is
  1667.      the desired foreground attribute or color, and the third is the
  1668.      desired background color.  Here are some suggested attributes and
  1669.      colors
  1670.  
  1671.               0  Normal (white against black background)
  1672.               1  Bold/intensity ON (bright foreground)
  1673.               2  Bold/intensity OFF (normal foreground)
  1674.  
  1675.           30  black foreground          40  black background
  1676.           31  red foreground            41  red background
  1677.           32  green foreground          42  green background
  1678.           33  yellow foreground         43  yellow background
  1679.           34  blue foreground           44  blue background
  1680.           35  magenta foreground        45  magenta foreground
  1681.           36  cyan foreground           46  cyan background
  1682.           37  white foreground          47  white background
  1683.  
  1684.      You can position the cursor at a particular position on the screen
  1685.      with ESC[#;#H (i.e. ESC[1;1H to put the cursor at the top left
  1686.      corner of the screen).
  1687.  
  1688.      For more details on ANSI graphics attributes, as well as ANSI
  1689.      cursor movement sequences, you should consult your DOS user's
  1690.      guide or technical reference manual.  You would be amazed at
  1691.      all the things you can do with ANSI sequences. See the sample
  1692.      menus for more examples and usages.  Don't overlook the fact
  1693.      that you can do @ESC@blIfANSI
  1694.  
  1695.  
  1696. !...Turn FOSSIL carrier detect watchdog on/off
  1697.  
  1698.         @!
  1699.       Be very careful using this function with Opus!Comm.  OCOM_530 has
  1700.       a bug that doesn't allow the watchdog to be turned on.  OCOM_531
  1701.       has a bug that doesn't allow the watchdog to be turned back off.
  1702.       This means your computer will reboot at carrier loss at any time
  1703.       after turning watchdog on, possibly even before XBBS can finish
  1704.       updating the user file during a normal logoff!  BNU should work
  1705.       reliably for you if you need the watchdog, or there are external
  1706.       programs to do the job (WATCHBIRD purports to force a return to
  1707.       DOS instead of a reboot).
  1708.  
  1709.  
  1710. $...Miscellaneous control functions
  1711.  
  1712.        @$0Filename.Ext[Enter]
  1713.          Set name of startfile and quit current file (back up a gosub
  1714.          then goto)
  1715.        @$1Filename.Ext[Enter]
  1716.          Set name of startfile and restart XBBS from the beginning
  1717.          Don't use this until logon is complete!
  1718.        @$2<0 or 1>
  1719.          Turn on/off gosubfile keys
  1720.          Please note that you should be careful with Gosub files.
  1721.          You should not use them in a situation where you will not
  1722.          return to them!  Stack space will be eaten and your BBS would
  1723.          probably crash.
  1724.        @$3<0 or 1>
  1725.          Turn on/off gotofile keys
  1726.          Please note that you should be careful with Goto files.  It is
  1727.          still possible to get into a situation that can only be cleared
  1728.          up by reexecuting LOGON with a suitable -R<filename> argument.
  1729.  
  1730.  
  1731. @...Set up Selected Read search strings (for @r type 8)
  1732.  
  1733.        @@<#><var # or text> (where we're talking about ctrl-a+@)
  1734.          @@0 (Resets all search strings to null)
  1735.          @@1<var # or text>  (Copies var # or text to the From: search
  1736.                               string)
  1737.          @@2<var # or text>  (Set the To: search string)
  1738.          @@3<var # or text>  (Set the Subj: search string)
  1739.          @@4<var # or text>  (Set the Msg. Body: search string)
  1740.        Examples:
  1741.          @@10 (Copy contents of variable #0 into the From: search string
  1742.                When a type 8 read is executed, messages From: whatever
  1743.                is in the search string will be read; others will be
  1744.                skipped.)
  1745.          @@3IBM (Copy "IBM" into Subj: search string)
  1746.  
  1747.  
  1748. &...Look up message area or file area
  1749.  
  1750.     @&<arg><Filename.EXT or var #>,<Area Name or var #>[,Security level #]
  1751.          @&M<Filename.EXT>,<Area Name> looks up Area Name in the
  1752.              MSGAREAS.XBS-style file designated by Filename.EXT.
  1753.              The internal errorlevel is set if there is no match.
  1754.              If the area is found, the message board structure is
  1755.              set up with the information from the file.  Security
  1756.              information works the same way it does in Bulls-mode, i.e.
  1757.              no access (a no-match) if seclvl #0<substat1 for that area.
  1758.  
  1759.          @&m<Filename.EXT>,<var #> looks up Area Number in var # in the
  1760.              MSGAREAS.XBS-style file designated by Filename.EXT.  Other
  1761.              than using area # instead of area name, works as above.
  1762.              Note you must use a variable with this version of the
  1763.              command.
  1764.  
  1765.          @&F<Filename.EXT>,<Area Name>,<Security level #> looks up
  1766.              Area Name in the FLSEARCH.CTL-style file designated by
  1767.              Filename.EXT (with extended fields Flags and Upload path).
  1768.              The internal errorlevel is set if there is no match.
  1769.              If the area is found, the file board structure is set up
  1770.              with the information from the file.  The user's security
  1771.              level #<Security level #> is tested against the area's
  1772.              security and access is denied (no-match) if too low.
  1773.              (There is no corresponding @&f because file areas don't
  1774.               have numbers.  However, you can have XBBS search for a
  1775.               file area by number if the Area Name begins with a # sign.
  1776.               KEEP IN MIND:  The number can be different for every user,
  1777.               as it hinges on both the file used to look up the areas
  1778.               and the user's security number.  For instance, if the user
  1779.               has access to the first and fourth areas listed, the
  1780.               fourth area will be #2 to him.  Therefore, this should be
  1781.               used only for user input and not relied upon in
  1782.               programming.)
  1783.  
  1784.          @&L<Filename.EXT> lists all msg areas to which the user has
  1785.               access; Area #, Area Name, Area Description
  1786.  
  1787.          @&l<Filename.EXT>,,<Security level #>  lists all file areas to
  1788.               which the user has access; Area #, Area Name, Area
  1789.               Description
  1790.  
  1791.  
  1792.           Examples:
  1793.                    @&FFLSEARCH.CTL,XBBS Programs,0
  1794.                    @&MMSGAREAS.XBS,XBBS Echo
  1795.                    @&mMSGAREAS.XBS,5
  1796.                    @&LMSGAREAS.XBS
  1797.                    @&lFLSEARCH.CTL,,0
  1798.  
  1799.             See also sample menus AREAMSFL.XBS, SETAREA.XBS and
  1800.             FILEMESS.XBS
  1801.  
  1802.  
  1803. +...Change current filename and restart or just restart
  1804.  
  1805.         @+Filename.Ext
  1806.         @+
  1807.           In the first example, the current filename is changed to
  1808.           Filename.Ext and the file is closed then restarted.  In the
  1809.           second example, the current filename is unaffected, but the
  1810.           file is still closed and restarted.
  1811.  
  1812.  
  1813. -...Change user's security level
  1814.  
  1815.         @-<arg1><arg1>
  1816.           Sets user's security level #<arg1> to <arg2>.
  1817.  
  1818.  
  1819. *...Go to Bulls-mode
  1820.  
  1821.         @*Drive:\Path\Filename.Ext
  1822.         @*
  1823.         @*Drive:\Path\Filename.Ext 1
  1824.         @*Drive:\Path\Filename.Ext 2
  1825.         @*Drive:\Path\Filename.Ext 3
  1826.       In the first example, areas would be read from Filename.Ext. Areas
  1827.       are kept in the same basic format as an @M line (without the
  1828.       leading @M, and with a few extra optional parameters--just use
  1829.       XEdit, okay?). In the second example, the default MSGAREAS.XBS
  1830.       would be used (in the current message directory).  In the third
  1831.       example, the [U]pload message command will be active.  In the
  1832.       fourth example, the [X]tract option is active, and in the fifth
  1833.       example, both [U]ploading and [X]tracting are permissible.
  1834.       Bulls-mode approximates the style of the XBBS Bulls door, allowing
  1835.       users to read messages in any of the listed areas.  One thing is
  1836.       slightly different:  The first security level for each area
  1837.       determines whether the user will have access to that area (see @M
  1838.       entry). Therefore, if SubStat0 is greater than the user's security
  1839.       level 0, that area will be ignored.  You must set the starting
  1840.       area with an @M statement before entering Bulls-mode.  A sample
  1841.       MSGAREAS.XBS file can be found in HEADEDIT.PAK in the distribution
  1842.       archive.  If you are allowing Xtraction, you must set up the file
  1843.       area before invoking Bulls-mode.  The file area directories should
  1844.       be .\MPORT for incoming reply packets and .\XPORT for outgoing
  1845.       mail packets (append node number if other than 1).
  1846.  
  1847.  
  1848.  \...Change Alternate Zone:Net/Node
  1849.  
  1850.         @\Zone:Net/Node@Domain
  1851.           Example:  @\1:380/16@FidoNet
  1852.  
  1853.         Note that XBBS insists on a fully qualified address including
  1854.         domain (except for point designator.  XBBS will not function as
  1855.         a point (it's always .0, or the boss).  HeadEdit will.) and
  1856.         doesn't bother checking to see if you messed it up, so use this
  1857.         carefully.
  1858.  
  1859.  
  1860.  :...Change message directory
  1861.  
  1862.         @:Drive:\Path\
  1863.           Example: @:D:\XBBS\MESS\
  1864.  
  1865.  
  1866.  @...(Control-a) Turn "Cold Input" option on/off
  1867.  
  1868.         @@0 turns cold keys off
  1869.         @@1 turns cold keys on
  1870.  
  1871.  
  1872.  ^B...(Control-b) Display line if and only if the user's Special flag is
  1873.        set
  1874.  
  1875.         @^B^V^Y@; (Emit an Avatar sequence if Special flag is set.
  1876.                    For information on Avatar, see FSC-0037)
  1877.  
  1878.  
  1879.  ^C...(Control-c)  Put the contents of a variable into the input stream
  1880.        and process as if it was a line in the .?BS file.
  1881.  
  1882.         @0A@r0,0
  1883.         @^C0        (Reads a message)
  1884.  
  1885.  
  1886.  ^D...(Control-d)  Display line locally only after translating any
  1887.        metastrings
  1888.  
  1889.  
  1890.  ^E...(Control-e)  Display line normally after translating any
  1891.        metastrings
  1892.  
  1893.  
  1894.  ^F...(Control-f)  Set the prompt number to be displayed when the help
  1895.        key (CTRL-T) is pressed.  Numbers should be from 601-???.  XBBS
  1896.        will display that prompt when CTRL-T is pressed at an input
  1897.        point.  Set to 0 to disable help ("Sorry, no help" is displayed)
  1898.        or 65535 to completely disable (only a beep is sent if the help
  1899.        key is pressed).  Note help won't work with ansi cursor menues
  1900.        (it'd destroy the display), so build it in if you need it.
  1901.  
  1902.  
  1903.  ^K...(Control-k)  Display line if and only if user's expert flag is
  1904.        set.
  1905.  
  1906.  
  1907.  ^L...(Control-l)  Display line if and only if user's twit flag is set.
  1908.  
  1909.  
  1910.  ^N...(Control-n)  Display line if and only if user can receive high
  1911.        ASCII characters (either high-ASCII or graphics set)
  1912.  
  1913.  
  1914.  ^O...(Control-o)  Display line if and only if flag x (1-16) is set:
  1915.         @^O<##>,line_to_display
  1916.  
  1917.  
  1918.  ^P...(Control-p)  Display line if and only if user cannot receive high
  1919.        ASCII characters (neither high-ASCII nor graphics set)
  1920.  
  1921.  
  1922.  ^Q...(Control-q)  Display line if and only if user has high-ASCII
  1923.        set
  1924.  
  1925.  ^R...(Control-r)  Display line if and only if user arq flag is set
  1926.  
  1927.  
  1928.  ^S...(Control-s)  Display line if and only if user generic flag x (1-3)
  1929.        is set
  1930.         @^S<#>,line_to_display
  1931.  
  1932.  ^T...(Control-t)  Send line to modem; do not echo locally.  CR/LF is
  1933.        stripped but may be added with metastring.
  1934.         @^T<-[6n   (Send ANSI DSR to remote without local echo)
  1935.  
  1936.  
  1937.  ^U...(Control-u)  Set/Reset/Test/Clear user variable as a bit field
  1938.  
  1939.         @^Us112  (Set bit 12 in user variable #1)
  1940.         @^Ur044  (Reset bit 44 in user variable #0)
  1941.         @^Ut044  (Test bit 44 in user variable #0--return in internal
  1942.                   errorlevel)
  1943.         @^Uc1    (Reset all bits in user variable #1)
  1944.  
  1945.         Remember that user strings are 76 bytes long (total) with 8 bit
  1946.         'flags' in each byte.  There are 5 user strings (0-4).  This
  1947.         function does no error checking, so don't screw up.
  1948.  
  1949.  
  1950.  ;...Put a comment in your .?BS file.  This is skipped (not displayed).
  1951.      You could also use @l, but this is less likely to cause confusion
  1952.      later (is it a label or a comment?)
  1953.  
  1954.  
  1955.  ?...Random branching.
  1956.      @?5lLabel0,lLabel1,lLabel2,lLabel3,lLabel4,lLabel5
  1957.  
  1958.     Branch randomly to one of the following labels.
  1959.  
  1960.  
  1961.  /<c or #>...Keyboard recording buffer (for use w/ macros)
  1962.      @/c...Clears keyboard recording buffer
  1963.      @/#...Copies keyboard recording buffer into variable #
  1964.  
  1965.  
  1966.  =<@# or text>...Assign text to msginfo variable
  1967.      @=Delete
  1968.      @=@1
  1969.  
  1970.      If the msginfo variable has information in it before a msg is
  1971.      written, it will be inserted into the next msg written as a ^aINFO:
  1972.      <variable><cr> kludge line.  When a msg with a ^aINFO: kludge line
  1973.      is read, the information is placed into the msginfo variable
  1974.      (however, replying to the msg zeros the variable).  This can allow
  1975.      you to place special hidden information in a msg for use by
  1976.      after-msg functions like EXTRAMSG.XBS and VIEWFILE.XBS.  Note that
  1977.      text after a ^aINFO: line, although hidden, can be "found" when
  1978.      searching the msg body while Selected Reading.
  1979.  
  1980.  
  1981.  '<title color>,<color>,<title>,<top prompt bar>[,<top pos>,[<down pos>],[<helpfile>]]
  1982.     @'37,36,CHOOSE,Read_Msg Write_Msg Quit<cr>
  1983.  
  1984.     Make a crude pull-down menu.  Variables are assumed to hold the
  1985.     pull-down prompts (var #0 would hold prompts for first selection,
  1986.     var #1 for second, etc.  If var is empty, choice alone is
  1987.     sufficient).  Returns (in internal errorlevel) selection #*10 if top
  1988.     choice with no var prompts is selected, selection #*10+pull down
  1989.     choice, or 0 (aborted with ESC or CTRL-K).  Screen is cleared on
  1990.     abort, not on valid selection.  ANSI graphics are required for this
  1991.     function, so test the user's ANSI before calling it.  See sample
  1992.     file PULLDOWN.XBS.  Note that this probably shouldn't be used with
  1993.     speeds below 2400 baud (and might be too slow for that, too...).
  1994.     The pull-down menus are a compromise between speed and looks, but
  1995.     they don't look all that bad.  They use positive cursor positioning
  1996.     in an attempt to minimize bad screens caused by line noise.
  1997.  
  1998.     As of XBBS 1.12, there is a variation on the pull-down menus (just a
  1999.     tree-structured menu) which can be sent to ASCII users, so you don't
  2000.     have to worry too much about blocking non-ANSI users from this.
  2001.  
  2002.     As of XBBS 1.14, you can pass a top-position and a down-position for
  2003.     the menu to start at.  These fields are optional to maintain
  2004.     backward compatibility.
  2005.  
  2006.     Again, it's not really intended that you write your entire BBS using
  2007.     pulldown menus, but it does add some flash.
  2008.  
  2009.     About the helpfile parameter:  XBBS will used named help to try to
  2010.     help the user out if you pass this.  How it works:
  2011.         If the user has pulldowns, hitting ? or the coniguration help
  2012.         key on any item gets help for that item by its name; for
  2013.         example, if the user is on a top-line item "Msgs", XBBS will try
  2014.         to find a help entry "Msgs" in the helpfile.  If the user is on
  2015.         a pulldown item under "Msgs" called "Read", XBBS tries to find a
  2016.         help entry "Msgs|Read".  It works a little differently for
  2017.         non-graphics users (using the ASCII tree-menu instead of the
  2018.         pulldown).  Since the tree-menu isn't "on" a particular item,
  2019.         just either at the main prompt or a subtree, what you get is
  2020.         either topic "@Main" if the user is at the main prompt or, for
  2021.         example, "Msgs" if in the "Msgs" subtree.  Clear as mud?
  2022.  
  2023.  
  2024.  "...Clear to end of screen from current cursor position
  2025.  
  2026.  
  2027.  .(a period)<sec lvl #><Filename.EXT>
  2028.     Invoke XBBS' built-in Door-mode.  Uses DOORLIST.XBS (or as indicated
  2029.     in XBBS.TXT) and security level 3 as a default.  DOORLIST.XBS should
  2030.     have the following format (one entry per line):
  2031.  
  2032.     Security_level Name Type<Errorlevel> String_to_spawn/exec Description_Text
  2033.  
  2034.     Types can be:
  2035.  
  2036.     S=Spawn
  2037.     E=Exec
  2038.     X=Exit
  2039.     D=Dos
  2040.     d=Dos - write/read exit files
  2041.     s=Spawn - write/read exit files
  2042.     I=Spawn reverse swapsetting
  2043.     H=Spawn leave FOSSIL hot
  2044.  
  2045.     For example:
  2046.  
  2047.     5   Peeker S    PEEKER.EXE_B*B_C*P_AFLSEARCH.CTL_D:\XBBS\ Archive_Door
  2048.     6   Maze   X15  Nothing Messages_and_Adventure
  2049.  
  2050.     With this, users with a security level 5 could run Peeker but not
  2051.     Maze, which would require 6 or greater.  Peeker is spawned, Maze is
  2052.     exitted to with an ERRORLEVEL of 15.  Note the String_to_spawn/exec
  2053.     is not used with exit types, but you must put something there if you
  2054.     want to have a description.  Descriptions are optional.
  2055.  
  2056.     Example:  @.3DOORLIST.XBS
  2057.  
  2058.  
  2059.  ,<sec lvl #><Filename.EXT>
  2060.     Invoke XBBS' built-in Files-mode.  Uses FLSEARCH.CTL as the default
  2061.     (or as indicated in XBBS.TXT) and security level #2.
  2062.  
  2063.  
  2064.  
  2065.  `...'Rolling' prompt
  2066.     @`Text_one Text_two Text_n
  2067.       XBBS replaces the underlines with spaces and displays the first
  2068.       'word' of text.  Cursor keys cause the next/previous word of text
  2069.       to be shown.  [Enter] selects.  Internal errorlevel is set to
  2070.       indicate the selection.  First character of a 'word' can also be
  2071.       pressed to select.
  2072.  
  2073.  
  2074.  [<variable #>,<title>,<filename>,<ANSI color string>
  2075.     Invoke an ANSI-only list-pick screen.  Displays all lines of file
  2076.     (21 per page) and allows user to position a reversed video bar atop
  2077.     a line and strike [Enter] to select it.  Returns the string selected
  2078.     in the variable # specified.  Internal errorlevel is set on error or
  2079.     abort by [ESCape/CTRL-K].
  2080.  
  2081.  
  2082.  ]<0 or 1, append if 1>,<filename>,<mask>,<path to include>
  2083.     Invoke a function that makes a list of filenames that can be used
  2084.     with @[ above.  If <path to include> is not nul, prepends that
  2085.     string to each entry.  Internal errorlevel is set if the file cannot
  2086.     be opened.
  2087.  
  2088.  
  2089.  {<0 or 1, append if 1>,<title>,<filein>,<ANSI color string>,<fileout>,
  2090.   <prepend>
  2091.  
  2092.     Invoke an ANSI-only list-mark screen.  Displays all lines of filein
  2093.     (21 per page) and allows user to position a reversed video bar atop
  2094.     a line and strike [Enter] to mark it.  When all entries desired are
  2095.     marked, the user can strike [CTRL-K] to create fileout containing
  2096.     only the marked entries.  If prepend is not nul, it is prepended to
  2097.     each line of fileout as it is written.  Internal errorlevel is set
  2098.     on error or abort by [ESCape].  Note that this function preloads all
  2099.     lines into memory (up to 4096 lines), so it can use a lot of RAM.
  2100.     It can quite possibly require more with very large lists than you
  2101.     have available.  Beware.
  2102.  
  2103.       Example:
  2104.          @;Make a file to select from
  2105.          @]0,temp.,*.*,
  2106.          @;Let user mark files from temp and create temp2
  2107.          @{0,Pick a file; any file,temp.,,temp2.
  2108.  
  2109.  
  2110.  }<filename>,<topic>
  2111.  
  2112.     Looks up a topic in a file and reads all lines under that topic until
  2113.     the next topic.  Topics are delimited by <> brackets (flush left).
  2114.     A topic name <end> indicates no more topics are available.  Example
  2115.     of a named help file:
  2116.  
  2117.         <hi>
  2118.         Hello.
  2119.         <bye>
  2120.         Goodbye.
  2121.         Come again.
  2122.         <end>
  2123.  
  2124.  
  2125. ><area#><starting#>...Fidonet export
  2126.  
  2127.     Export messages from area <area#> starting at message <starting#> to
  2128.     a Fidonet(tm) packet.  The packet is created in the Xport directory
  2129.     with a filename of <4-digit-net-in-hex><4-digit-node-in-hex>.PKT.  It
  2130.     is *not* archived; you'll probably want to archive it into a filename
  2131.     00000000.MO? to sorta follow Fidonet conventions.
  2132.  
  2133.     If the area# parameter is 0, all areas are exported from
  2134.     sequentially.  The currently defined message area is used if the
  2135.     area# parameter is non-zero.  If starting# is zero, export begins
  2136.     from the first new message.  If a packet exists, it is appended to,
  2137.     so don't leave packets from users laying around in the Xport
  2138.     directory after a user logs off.
  2139.  
  2140.     All messages will have the MSGAREAS.XBS name in them as an AREA: tag.
  2141.  
  2142.     A few notes on this type of extraction:
  2143.  
  2144.     Advantages:
  2145.     1.  You don't have packets for all your points lying around taking
  2146.         up disk space until they pick them up.
  2147.     2.  Points don't need a mailer.
  2148.     3.  Points can use any point message reading software (HeadEdit,
  2149.         MsgEd, etc.) they choose and upload reply packets in Fidonet
  2150.         format for you to import with your echomail import software
  2151.         (probably XST).
  2152.  
  2153.     Disadvantages:
  2154.     1.  The user has to wait while messages are extracted.  It's a
  2155.         pretty fast process, but not instantaneous.
  2156.     2.  You lose security.  You can't be sure what the user's software
  2157.         will let him put into messages, or that the user can properly
  2158.         handle his software.
  2159.     3.  Messages sent to local areas will have origin lines unless the
  2160.         user's software allows originless echos (HeadEdit does).
  2161.  
  2162.     Local areas do not have to be marked as echos on your system for
  2163.     XBBS to export from them.  They probably *do* have to be marked as
  2164.     echoes on the point's system so that replies can be exported back to
  2165.     you. This could result in local messages with tear/origin lines
  2166.     unless the user's software allows him to turn tear/origin lines off
  2167.     on a conference-by-conference basis.
  2168.  
  2169.     A user cannot use this function unless you've assigned him a point
  2170.     number with XUser.
  2171.  
  2172.     Note that if you intend to forward echo messages returned from
  2173.     points by this process your MSGAREAS.XBS-type file must contain the
  2174.     AREA: tag of the echo in the name field.  This is because other echo
  2175.     mail processors down the line won't understand some arbitrary name
  2176.     you decide to give to an area.  For instance, if you're pointing the
  2177.     NET_DEV echo out, name it NET_DEV, not The Network Developer's Echo
  2178.     Conference or NET_FLAME (however appropriate it might be).
  2179.  
  2180.  
  2181.  |#<args>...Hypertext links
  2182.         @|0<name of hypertext (topic) file>
  2183.             This loads the hypertext file index.  The internal
  2184.             errorlevel is set if this fails.  A variable may be used for
  2185.             the filename as @|0*0
  2186.         @|1<topic name>
  2187.             This sets the first topic for a hypertext read.  The
  2188.             internal errorlevel is set if this fails to find the topic.
  2189.             A variable may be used for the topic name as above.
  2190.         @|2<#>
  2191.             This reads the hypertext file (be sure you set it up as
  2192.             above first!). <#> is mandatory and determines which
  2193.             security level (0-9) will be used to regulate access to
  2194.             various topics in the file if you are using the security
  2195.             function.  XBBS.TXT-spawned hypertext reads always use
  2196.             security level 0.  Hypertext files are *not* reentrable,
  2197.             that is you can't run one, then call another from an
  2198.             XBBS.TXT prompt or menu file and return to the one you left
  2199.             and expect the world as we know it to continue.
  2200.  
  2201.     About hypertext formats:
  2202.         Hypertext files have the following format:
  2203.  
  2204.         Topic line 1
  2205.         Text...
  2206.         Topic line 2
  2207.         Text...
  2208.         ...
  2209.         Topic line 100
  2210.         Text...
  2211.         <end>
  2212.  
  2213.         Here's a breakdown of a topic line:
  2214.  
  2215.       ┌───Topic name (up to 22 characters)
  2216.       │
  2217.  ┌┬┬┬┬┼┬┬┬┐┌───Literal '>' character
  2218.  │││││││││││
  2219. <topic name> K### min### flags###
  2220. │            ││││ ││││││ ││││││││
  2221. │            │└┴┤ └┴┴┴┴┤ └┴┴┴┴┴┴┴───(Future) flags req'd
  2222. │            │  │      │
  2223. │            │  │      └───Minimum security req'd (0-65535)
  2224. │            │  │
  2225. │            │  └───Type of link (0-15)
  2226. │            │
  2227. │            └───The key that selects this topic
  2228. └───Literal `<' character flush left
  2229.  
  2230. The 16 types of links currently supported are:
  2231.  
  2232.     0.  Displays text, doesn't run through metastring converter
  2233.     1.  Displays text, does run through metastring converter
  2234.     2.  Send command on first text line to DOS
  2235.         Link to topic on second text line
  2236.     3.  Load new hypertext file named on first text line
  2237.         Start at topic on second text line
  2238.     4.  Place text from first text line into menu file input stream
  2239.         Point to topic on second text line
  2240.         Return to menu file called from
  2241.     5.  Switch start menu file to name on first text line
  2242.         Point to topic on second text line
  2243.         Begin reading new menu file
  2244.     6.  Paged-read text file named on first text line
  2245.         Link to topic on second text line
  2246.     7.  Gosub to menu named on first text line
  2247.         Link to topic on second text line
  2248.     8.  Spawn string on first text line
  2249.         Link to topic on second text line
  2250.     9.  Exec string on first text line
  2251.     10. Send string on first text line to DOS
  2252.         Link to topic on second text line
  2253.     11. Exit at errorlevel indicated on first text line
  2254.     12. Spawn string on first text line, leave FOSSIL hot
  2255.         Link to topic on second text line
  2256.     13. Spawn string on first text line, swap if swap is off (reverse
  2257.         swap setting)
  2258.         Link to topic on second text line
  2259.     14. Spawn string on first text line, save & reload ONLINE.XBS
  2260.         Link to topic on second text line
  2261.     15. Send string on first text line to DOS, save & reload ONLINE.XBS
  2262.         Link to topic on second text line
  2263.  
  2264. Text lines for type 0 and 1 can contain link text in {} brackets which
  2265. will cause it to be reverse highlighted when read to ANSI users (don't
  2266. use the brackets for types 2+).  Text lines ending with ; will not be
  2267. cr/lf terminated.  "Invisible" links may be put into topic text by
  2268. putting the topic name within [] brackets on a line by themselves, flush
  2269. left.
  2270.  
  2271. Additionally, as with XBBS.TXT lines, a leading control character on a
  2272. text line can change its effect:
  2273.  
  2274. ASCII value     Effect                                   XLate    Used
  2275. ===========     =======================================  =======  ====
  2276.  2              Put text in menu buffer                   no       no
  2277.  3              Sent to log file                          yes      no
  2278.  4              Printed local only                        yes      yes
  2279.  5              ANSI users only                           yes      no
  2280.  6              ASCII users only                          yes      no
  2281. 11              Gosub to this file                        yes      no
  2282. 14              Paged-read this file                      yes      no
  2283. 15              Send this text to DOS (shell)             yes      no
  2284. 16              Put text in menu buffer                   yes      no
  2285. 17              Pause until return hit (line ignored)     n/a      n/a
  2286. 18              Set a new topic and go to it              no       no
  2287. 19              Clear screen (line ignored)               n/a      n/a
  2288. 20              Say a prompt                              no       no
  2289. 21              Use line only if twit flag is on          yes      no
  2290. 22              Use line only if special flag is on       yes      no
  2291. 23              Read named help from file,topic           no       n/a
  2292. 24              Read a .MNU menu file                     no       n/a
  2293. 25              Right-justify line                        no       no
  2294. 28              Center line                               no       no
  2295.   
  2296. Here's a brief, simple, meaningless sample:
  2297.  
  2298. -------------------Cut---------------------
  2299. <Start> S0
  2300. Well, this is the start of the whole thing.  From here,
  2301. you can go to the {Middle} or the {End}.
  2302. <Middle> M0
  2303. [Link]
  2304. This here is the middle.  You can go to the {Start} or
  2305. the {End}.
  2306. <End> E0
  2307. And, finally, this is the end.  You can get back to
  2308. the {Start} or just to the {Middle} from here.
  2309. <Link> L3
  2310. tester2.tpc
  2311. Middle
  2312. <end>
  2313. -------------------Cut---------------------
  2314.  
  2315. Hypertext files can contain a maximum of 100 topics.  If you don't pass a
  2316. path with the hypertext filename, XBBS figures you put them in
  2317. (BBS's homepath)\HYPER, and if you didn't, it won't read them.
  2318.  
  2319. If you're interested in more flexible hypertext files, look for
  2320. XHYPER*.*, written by Ariel Szczcupak of 2:4177/1.  This is a
  2321. sophisticated hypertext system written in XBASIC, including source.
  2322.  
  2323.