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