������ ����� �����������  ����������  ���������  ���������    �����������
 ������ ����� ����� ������ ����� ���� ����� ����� ����� ����  ������ ������
 ������ ����� ����� ��۲�� ��۲� ���� ����� ����� ����� ����� ������ ��۲��
 ������ ����� ۲��� ������ ��۲� ���� ۲��� ����� ��۲� ����� �۲��� ������
 �۲��� ����� ۲��� ������ ����� ���� ۲��� ����� ��۲� ����� �۲��� ������ �
� ����� ����  ۲���������� ����� ���� ۲��� ����� ��۲� ����� �۲���������
   ��������   ����������   ����� ���� ����� ����� ����� ����� �������������
  ܲ��� ����  ����� ����� ������ ���������������� ������������������ ������ �
 �۲��� ����� ����� ������ ��۲� ���� ����� ����� ����� ����� ������ ������ �
��۲��� ����� ۲��� ��۲�� ��۲� ���� ����� ����� ����� ����� �۲��� ��۲�� �
������� ����� ۲��� ��۲�� ��۲� ���� ۲��� ����� ��۲� ����� �۲��� ��۲�� �
 ������ ����� ����� ������ ����� ���� ۲��� ����� ��۲� ����� ������ ������ �
������� ����� ����� ������ ����� ���� ۲��� ����� ��۲� ����� ������ ������ �
������� ����� ����� ������ ���������� ����� ����� ����� ���� � ������������ �
������� ����� ����� ������  ��������  ����� ����� �������� �� ��  ������ ���
�����������������������������������������������������������     �SQUiZZY�
          �����������������������������������������������������Ŀ
  �������[�     [   x R O A D s    1    9    9    7   !  ]      �]�����ķ
��ĺ��������������������������������������������������������������������ĺ��Ŀ
�  �                                                                     �   �
�  �         The Desire Development Pack #1 by Rapido/xROADs             �   �
�  �                                                                     �   �
������������������������������������������������������������������������
  �������ij                                                    ��������Ľ
          ������������������������������������������������������

Contents


1. How to get started

2. The Doorkit Explained

3. The Newuser Application Viewer 1.1 (Full Pascal Source included!)

4. Notes


����������������������������������������������������������������������������Ŀ
�  �                                                                     �   �
�  �                    1. How to get started                            �   �
�  �                                                                     �   �
������������������������������������������������������������������������������

What you need is: Borland Pascal 7.0 and the Desire Doorkit 1.2 (or the most
recent version). The Desire Doorkit consists of a set of UNITS for Borland
Pascal 7.0, these are:

Deskit.TPU   this is the 'main' unit. You always need to 'include' this one!
             (uses Dos,Crt,Deskit,.....;)


Desstr.TPU   for operations on strings, chars, time, date.
             This one you can use if you want to use the desire own
             string/date/time operations, but is not neccessary!

Desuart.TPU  this one is only by Deskit.TPU for the UART communications.
             but forget this, you don't need this.
Desfos.TPU   this one too is only used by Deskit.TPU for the FOSSIL
             communications, you don't need this one either!

             Maybe you did some coding for System/X before where you
             needed 2 different .TPU-files for UART and FOSSIL ?
             Well Desire supports both at one time, no need to make
             a FOSSIL and a seperate UART version! Desire doors are
             both FOSSIL and UART!

Dessys.TPU   Some System&Keyboard routines, only of you want to use it!

����������������������������������������������������������������������������Ŀ
�  �                                                                     �   �
�  �                    2. The Doorkit Explained                         �   �
�  �                                                                     �   �
������������������������������������������������������������������������������


= Deskit.TPU ==============================================================

A unit contains VARS, TYPES, PROCEDURES and FUNCTIONS you can access in
your program called a 'DOOR'

Const
-----

Const Version='1.2';
Const STRLINES=200;   { number of strings in STRSx.x }

Types
-----

TYPE
       ConfigRec = RECORD                    (* C:\DESIRE\CONFIG.<Node>   *)
       LastCall = RECORD                     (* C:\BBS\DATA\LASTCALL.DAT  *)
       BBSrecord = Record                    (* C:\BBS\DATA\BBS<node>.DAT *)
       ConfUserRecord = RECORD               (* C:\BBS\CONFDIR\USERS.CNF  *)
       TransferRecord = RECORD               (* C:\BBS\DATA\TRANSFER.xxx  *)
       MultiNodeRecord = RECORD              (* C:\BBS\DATA\NODE.xxx      *)
       DoorRecord = RECORD                   (* C:\BBS\DATA\SXDOOR.xxx    *)
       MsgRecord = RECORD                    (* C:\BBS\MSGBASE\HEADERS.DAT*)
       FlagRecord = RECORD                   (* C:\BBS\FILEFLAG.xx        *)
       XferLogRecord = RECORD                (* C:\BBS\LOGFILES\UPLOAD.DAT*)
       StringRecord = RECORD                 (* C:\BBS\STRSx.xxx          *)
       GlobalFlagRecord = Record

       { all the above RECORDS structures can be found in STRUCTS.130, in
         this case STRUCT.130 because Doorkit version 1.2 supports the
         structures of Desire Version 1.3 (at this point not yet released),
         and is compatible with any next version of Desire!
       }

       InternalRec = RECORD  { used internal }

       StringBaseArray1 = Array[1..50]         of StringRecord;
       StringBaseArray2 = Array[51..99]        of StringRecord;
       StringBaseArray3 = Array[100..150]      of StringRecord;
       StringBaseArray4 = Array[151..STRLINES] of StringRecord;

       { the above contain all the menuset strings!, as they appear
         in STRDES.TXT or in the MENUSET.EXE editor! you can access
         all these strings by the function GetString(Nr:Integer):String;
       }

TYPE   MCIRptr   = ^MCIRecord;
       MCIRecord = Record

       { the above are to pass information into a @MCIx@ MCI-code!

         If you want to show you own .PCB-file which has variable
         fields in it, you can build up a list of values for all the
         @MCIx@-codes that should appear on that position (up to 10 max.)

         When we show a .PCB-file with the Procedure
         TypeMCIFile(Name:String) the doorkit looks if there exists
         a list Control^.MCI^ (or in other words: if Control^.MCI^<>NIL)

         (Be carefull: Control^.MCI points to the MCIRECORD which hold
          a pointer to the first element Control^.MCI^^, thats why there
          is an extra ^ !)

         For instance: (see NAV.PAS, included in this PACK!)
         -------------------------------------------------------------------
         Var AidMCI:MCIRPTR;

         Begin

          GetMem(Control^.MCI^,SizeOf(MCIRecord));
             { here it creates the first element of a list }

          AidMCI:=Control^.MCI^;
             { AidMCI now points to that first element }

          AidMCI^.Mcistr:='RAPIDO';
             { now fill the 1st record with a string, in this case
               @MCI1@ will be replaced by RAPIDO! }

          AidMCI^.NExt:=NIL;
             { ok, tell the doorkit this was the last element in the list!
              }

          TypeMCIFile('NAVSRCH.PCB');
            { show the file, @MCI1@ in that file will now be replaced with
              'RAPIDO' }

          AidMCI:=Control^.MCI^;
          FreeMem(Control^.MCI^,SizeOf(MCIRECORD));
            { now free the 1st MCIRECORD, becarefull and don't forget
              the ^ in Control^MCI^ <---- because it's the 1st element
              we are removing and NOT the Control^.MCI }

          CloseAll;
         End;

       }

TYPE   EventRecord = RECORD

               Time:String[5]; {HH:MM}
               Action:Byte;

               {  Set Bit 7 OFF-HOOK
                      Bit 6 ON-HOOK
                      Bit 5 ONLINE
                      Bit 4 OFFLINE
                      Bit 3..0 = 0..31 Actions

               Actions:

               0 IDLE
               1 RESET DAYSTATS
               2 EXIT            +  <Errorlevel>
               3 RUN DOOR        +  <Filename>
               4 CD PLAY         +  <Track>
               5 CD STOP
               6 TYPE            +  <Filename>
               7 RUN UTIL        +  <Filepath>
               8 BEEP            +  <# Times>
               9 LOGOFF

               }


              Extern:String[30];  { DOORNAME }
       End;

       { The eventrecord contains a time and a action byte. The action
         byte contains the information about which action should occure and
         whether or not the modem should be turned on- or off-hook or
         if the action may only occur if the bbs is off- or online.
         the 4 least significant bytes represent the action number
         as show above.

         This data is read from the EVENTS.x, for instance:
         ----------------------------------
         05:40 TYPE WARNING
         05:45 OFFHOOK
         06:00 RUN NETMAIL
         06:15 ONHOOK
         ----------------------------------
         This could be an event-script for the NETMAIL-door. At 5.40 a door
         is executed while a user might be online. At 5.45 the BBS goes
         actually OFFLINE. at 6.00 a door called NETMAIL is started.
         This door could actually take over the modem to communicate with
         another remote NETMAIL-server/BBS. At 6.15 the board goes online again.
         Commands for events:
         TYPE    <filename>      for showing textfiles from the TEXT-dir online.
         RUN     <filename>      for executing programs offline.
         RUNDOOR <filename>      for executing programs online.
         OFFHOOK                 for modem-offhook (busy.)
         ONHOOK                  for modem-onhook (online.)
         CDPLAY  <track>         for playing a cd-track.
         CDSTOP                  for stopping the cd.
         RESET                   for BBS-reset (usually at 00:00)
         EXIT                    for exiting the bbs (reset)
         QUIT                    for quiting the bbs (shutdown)

         While creating a EVENTS.x file make sure you put the line :
         ----------------------------------
         RESET xx:xx
         ----------------------------------
         (Where xx:xx indicates the time of the day statistics reset)
         Otherwise the statistics reset will be ignored!

       }

TYPE   InternalRec = RECORD
              PosInUserBase   :       LongInt;   { for use with msgindex }
                { the position of this user in the userbase }
              CheckPause      :       Boolean;
                { check when length of screen is reached ? }
              Ypos:Byte;
                { the current number of lines enter without a pause }
              SysopHangup      :      Boolean;
                { ALT - H pressed ? }
              UserLockOut: Boolean;
                { ALT - L pressed ? }
              CorrectLogon:Boolean;
                { Is this a correct logon ? }
              Node:Byte;
                { The current node }
              Commands:Array [1..MaxDosKey] of String[30];
                { The last 20 commands }
              CommandPtr:Byte;
                { current command }
              BaudStr:String;
                { baudstr returned by modem }
              Lines:Byte;
                { howmany lines available on the screen
                  with or without the statistics bar etc. }
              TimeExpiredWarning:Boolean;
                { Did we have a warning yet ? }
              TimeLeft:LongInt; {original timeleft for a user}
                { Timeleft at start }
              NextEvent:EventRecord; { HH:MM }
                { When is the next event ? (see above) }
              LastEvent:EventRecord; { HH:MM }
                { What was the last event ? (see above) }
              StatBarType:Byte; { 1..9 }
                { which statbar is on ? }
              InputAvail:Byte;  { 0 none , 1 = local , 2 = remote }
              MainPrompt:String;
                { what's the current mainprompt in Desire ? }
              ForceLogoff:Boolean;
                { Force logoff after event ? }
              StopOutput:Boolean;
                { Stop output after 'More Y/N/NS = N' }
              SysopLogon:Boolean;
                { Sysoplogin ? }
              DontSendInit:Boolean;
                { -L as parameter for Desire ? }
              DontCheckInit:Boolean;
                { -DONTCHECK as parameter for Desire ? }
              DontHangUp:Boolean;
                { -D as parameter for Desire ? }
              NoDirCheck:Boolean;
                { -C as parameter for Desire ? }
              CheckCarrier:Boolean;
                { Is carrier checked now ? }
              CheckTime:Boolean;
                { Check for timeleft ? }
              LastLocalAction:String[8]; { HH:MM:SS }
                { Last time input from keyboard locally }
              SaveScreen:Boolean; { screensave active ?>! }
                { Screensaver active ? }
              DontShowFiles:Boolean;
                { Is flag G (ALT-G) Up or Down ? }
              CDTrackPlaying:Integer;
                { Which CD track is been played now ? }
              StatBarHelpPos:Byte;
                { Which help is shown ? }
              CaptureStart:Boolean;
                { Is capture on ? }
       End;


PROCEDURES and FUNCTIONS
------------------------

{ PUBLIC FUNCTIONS: }
Function  GetAreaName(No:Byte):String;
  { get the name of the current CONFERENCE! }
Procedure Pause;
  { prints a Pause, the pause directly from the menuset of the current
    user! }
Procedure More;
  { prints a More prompt Yes/No/Nonstop etc..

    If 'N' then Control^.Int^.StopOutput  is set TRUE !
    If 'NS' then Control^.Int^.CheckPause is set FALSE!

  }
Function  Default(YesIsDefault:Boolean):boolean;
  { Waits for input (y/n).

    YesIsDefault means if the key that is pressed
    was NOT a 'N' (but for instance an Enter) then Default gets TRUE!
    and the other way around!

    If Default is set TRUE then 'Yes' appears on the screen and 'NO'
    otherwise.

  }


{ OUTPUT LOCAL : }
Procedure LocalWrite(f:string);
Procedure LocalWriteln(f:string);     { local screen }
  { Writes locally, including PCB-codes!}
Procedure LocalCls;
  { just a ClrScr }

Function  TypeMCIFile(filename:string):Boolean;
  { to show a .PCB file with MCI-codes and ANSI-codes allowed }
Function  TypeTXTFile(filename:string):Boolean;
  { to show a plain textfile with no MCI/ANSI-codes allowed }

{ INPUT LOCAL & REMOTE : }

Function  AllReadln(Size:Integer):string;
  { reads input remote&local with a max. Size }
Function  AllRead(Size:Integer):string;
  { idem, now it only doesn't enter to the next line }
Function  AllReadlnFill(Size:Integer;Fill:Char):string;
  { does the same as AllReadln but fills spaces with Fill-chars,
    for instance '�' }
Function  AllGetCh:byte;
  { Waits for input! is used by Function Getch:Byte which does not wait! }

Function  AllKeypressed:Boolean;
  { gives True if ANY input is available from remote or local keyboard }

Function  GetCh:byte;
  { gives 0 when no key is pressed and the ASCII-value otherwise }

Function  Edit_String(f:string;size:integer;LF:Boolean):String;
  { let's you Edit a string.

    It prints the string on the current position and lets you edit it
    using Backspace and checks for the maximum size and finally enters
    if LF is true.
  }

{ OUTPUT LOCAL & REMOTE : }
Procedure AllBackSpace(L:Byte);
  { Moves the cursor and Deletes the last L charachters }
Procedure Allmoveleft(i:integer);
  { Moves the cursor  left i positions }
Procedure  AllmoveRight(i:integer);
  { Moves the cursor  right i positions }
Procedure Allmoveup(i:integer);
  { Moves the cursor  up i positions }
Procedure Allmovedown(i:integer);
  { Moves the cursor  down i positions }
Procedure AllCursorXY(x,y:integer);
  { Moves the cursor to (X,Y) from the top left position }
Procedure AllWrite(f:string);       { both local & com }
  { Prints a string f, MCI and ANSI-codes allowed }
Procedure AllWriteln(f:string);       { both local & com }
  { Prints a string f with a line-feed, MCI and ANSI-codes allowed  }
Procedure AllWriteNonMCI(f:string);       { both local & com }
  { Prints a string f, but no MCI/ANSI-codes allowed }
Procedure AllWritelnNonMCI(f:string);       { both local & com }
  { Prints a string f with a line-feed, but no MCI/ANSI-codes allowed }

Procedure CWriteMCI(f:string);       { both local & com }
  { same as AllWrite, for System/X compatibility }
Procedure CWriteMCIln(f:string);       { both local & com }
  { same as AllWriteln, for System/X compatibility }
Procedure CWrite(f:string);       { both local & com }
  { same as AllWriteNonMCI, for System/X compatibility }
Procedure CWriteln(f:string);       { both local & com }
  { same as AllWritelnNONMCI, for System/X compatibility }

{ OUTPUT REMOTE }
Procedure Com_string(f:string);
  { sends string f to the modem }
Function  Com_stringcheck(f:string):boolean;
  { sends string f to the modem, and checks if the modem is receiving
    it, in case of Com_string the system would hang until the modem
    receives the string }
Procedure Com_stringcrlf(f:string);
  { same a Com_string but gives an enter after it }

{ INPUT REMOTE }
Function  Com_receive:Char;
  { wait's for remote input }
Function  Com_inputavail:boolean;
  { is set TRUE if the remote user has pressed a key }

{ COMFUNCTIONS }
Procedure Allinit;
  { Do not use this! it's called once at the start of the doorkit
    by Deskit.TPU itself to init the comport }
Procedure Com_flush;
  { Flush the comport }
Procedure Com_hangup;
  { Drop the carrier }
Procedure Com_Atcmd(f:string);
  { Send an AT-command to the modem }
Procedure CloseAll;           (* Always use this as last command !! *)
  { Close the comport, Always call this last! in your doors!! }

{ DATAFILES }

Procedure WriteDropFile;
  { Write the current DOOR-record (in memory) to disk

    If you change values in this DOOR-record and you write it back to
    disk with WriteDropFile then Desire will notice that it's data
    has been changed and will read the DOOR-record and will take
    over it's values!

  }

Procedure ReadDropFile;
  { read the DOOR-record (user data), this is already read in by
    Deskit.TPU, so there is no need to execute this procedure unless you
    intend to
  }

Procedure WriteNodeFile(Status:Byte;ExtStatus:String);
  { Write's the NODE-file, to tell other nodes what this node is doing.

    for instance if you made a WHO-door you could call this at the
    beginning of the door:

    WriteNodeFile(18,'');

               0 - Node Inactive         ExtStatus: -
               1 - Waiting for Call      ExtStatus: -
               2 - Ring Detected         ExtStatus: -
               3 - Receiving Call        ExtStatus: -
               4 - Logging on            ExtStatus: -
               5 - Scanning Mail         ExtStatus: -
               6 - Normal BBS Use/IDLE   ExtStatus: -
               7 - Account Sequence      ExtStatus: -
               8 - MultiNode Chat        ExtStatus: -
               9 - Newuser               ExtStatus: NewUserName
              10 - Uploading             ExtStatus: FileName <Number>
              11 - Downloading           ExtStatus: FileName <Number>
              12 - Beginning Upload      ExtStatus: -
              13 - Beginning Download    ExtStatus: -
              14 - FileCheck             ExtStatus: FileName
              15 - FileID                ExtStatus: FileName
              16 - Logging Off           ExtStatus: -
              17 - Chatting with Sysop   ExtStatus: -
              18 - WHO                   ExtStatus: -
              19 - Joining Conference    ExtStatus: -
              20 - Viewing Bulletins     ExtStatus: -
              21 - Viewing TextFile      ExtStatus: -
              22 - Sysop Viewing File    ExtStatus: -
              23 - Viewing Userlist      ExtStatus: -
              24 - Editing User Setups   ExtStatus: -
              25 - Posting Message       ExtStatus: <ToWho>
              26 - Reading Messages      ExtStatus: -
              27 - Viewing Filelist      ExtStatus: -
              28 - Scanning New Files    ExtStatus: -
              29 - Paging Sysop          ExtStatus: -
              30 - Requested Relogon     ExtStatus: -
              31 - ZipScan               ExtStatus: -
              32 - Flagging Files        ExtStatus: -
  }
Procedure LogAction(Comment:String);
  { LogAction logs a comment into the LOGFILE of the current node,

    LogAction('xROADs' NEWUSERAPPLICATIONVIEWER 1.1 executed.');

    results in a line like this:
    --------------------------------------------------------
    14:00:22  xROADs' NEWUSERAPPLICATIONVIEWER 1.1 executed.
    --------------------------------------------------------

    LogAction('')  { with an empty string }

    results in a line like this:

    -------------------------03-29-97 14:00:10-----------------------------

Function  GetString(Nr:Integer):String;
  { Gives a MENUSET string

    When the normal Desire menuset(s) are used, GetString(73) would
    return the string:
    '@X07Sysop Jumped to DOS, please wait...'

    and GetString(74) would be: '@X07thanx for waiting...'

    Now, AllWrite(Getstring(73)) would print:
    @X07Sysop Jumped to DOS, please wait...

    See the STRDES.TXT or MENUSET.EXE for the corresponding numbers!

  }

Function GetConferencePath(ConfNumber:Integer):String;
  { returns the current FULL path to the conference like this:
    'C:\DESIRE\CONF1'
  }

= Desstr.TPU ==============================================================

Function ShortTIME:string;
  { prints the time like this: 10:00 }
Function DATE:string;
  { print the date like this: MM-DD-YY }
Function TIME:string;
  { prints the time like this: 10:00:00 }
Function StrToInt(Str:string):integer;
  { converts a string to an integer }
Function CutSpacesOff(str:string):string;
  { cuts the last spaces from a string }
Function ToLowcase(Str:String):string;
  { converts al chars in a string to lowercase }
Function LongToStr(i:longint;Width:Integer):String;
  { converts a LongInt i to a string with a particular Width }
Function intToStr(i:integer;Width:Integer):String;
  { converts a Integer i to a string with a particular Width }
Function DoubleToStr(i:double;Width:Integer):String;
  { converts a Double i to a string with a particular Width and no
    fraction }
Function ToUpcase(Str:String):string;
  { converts the string Str tp uppercase }
Function chobstring(source:string;from_length, to_length:integer;fill:boolean):string;
  { chobs a part of a string source which had a length of from_length and
    needs to be resized (either bigger or smaller) to to_length and
    if it needs to be bigger add it with characters of fill }
Function Parameter(f:string;N:byte):String;
  { returns the f-th parameter in a string, that is the f-th word
    surrounded by spaces }
Function swildcard(name:string):string;
  { converts a string (filename or username) to a string with length 30
    where 'FILE*' would result in 'FILE??????????????????????????'
    to see if two strings are the same if they are wildcarded
    (with equal)
  }
Function swildcardsused(f:string):boolean;
  { return TRUE if f contains a '*' or a '?' }
Function equal(name1,name2:string):boolean;
  { checks if two wildcarded strings are equal to each other

    Equal(Swildcard('FI*'),Swildcard('*')) = true
  }
Function fwildcard(name:string):string;
  { same as before, now for files

    fwildcard ('FIL*.TXT') = 'FIL?????.TXT'
  }
Function fwildcardsused(f:string):boolean;
Function FExpandFile(name1:String):String;
  { shapes a filename 'BLA*.*' into 8.3 ('BLA*    .*  ') }
Function Fequal(name1,name2:string):boolean;
  { return TRUE if two wildcardeds filenames are the same:

    Fequal(FWildcard('FIL*'),FWildcard('F*')) = True;

  }
Function LeadingSpace(w : Longint;Width:Byte) : String;
  { converts a LongInt to a string with a Width an aligns it to the
    right }
Function TimeUsed(LcLogonTime,LastTime:String):
         LongInt;
  { returns the amount of seconds between two time-strings :

    TimeUsed('09:00:00','10:00:00') = 3600

  }
Function LeadingZerof(w : LongInt) : String;
  { converts a LongInt to a string and puts zeros in front }

    LeadingZerof(8) = '00000008'
  }
Function Stripmcicode(var str:string):string;
  { removes @X00-codes from a string }
Function CompileTab(Var f:string):String;
  { converts #9 into 8 spaces }
Function RemoveUnderScore(f:string):String;
  { removes _ and replaces them by a space ' ' }
Function DateToDays(DateSt:String):LongInt;
  { converts a date to a number of days from 00-00-00 }
Function KillEndSlash(f:string):string;
  { removes the last \ that occurs in filepaths }
Function CharInString(St:String;Ch:Char):Boolean;
  { returns true if character Ch occurs in string St }

= Dessys.TPU ==============================================================

Procedure Pageon;
  { turns the screen on from PageOff }
Procedure Pageoff;
  { turns the screen output of and the screen appears black }
Function CapsOn: Boolean;
  { return TRUE when Capslock is on }
Function NumOn: Boolean;
  { return TRUE when Numlock is on }
Function ScrollOn: Boolean;
  { return TRUE when Scrolllock is on }
Procedure Set_Caps(On : boolean);
  { sets Capslock (and the led) on/off }
Procedure Set_Num(On : boolean);
  { sets Numlock (and the led) on/off }
Procedure Set_Scroll(On : boolean);
  { sets Scrolllock (and the led) on/off }

����������������������������������������������������������������������������Ŀ
�  �                                                                     �   �
�  � Example: 3. The xROADS Newuser Application Viewer 1.1 (FULL SOURCE) �   �
�  �                                                                     �   �
������������������������������������������������������������������������������

     This code is not Optimized and still contains bugs! Find them :)

-----------------------------------------------------------------------------
Program NewuserAppViewer;

Uses Deskit,Files,DesStr;

Var Username,Input,Temp_Str:String;
                         { input strings Temp_Str and Input
                         { output string Username as @MCI1@ in NAVFND.PCB }

   EndSubLoop,EndLoop:Boolean;
                         { variables to end loops lile WHILE/DO and
                           REPEAT/UNTIL }

   SearchNode:Byte;      { which ANSWERx.TXT file are we reading ? }
   Found:Boolean;        { we just found a user }
   F:Text;               { for textfiles }
   i:integer;            { aid counter }
   C:Byte;               { to read a byte from the user }

   AidMCI:MCIRPTR;       { for the @MCIx@-codes }

   ShowCont:Boolean;
   EverFound,            { did we ever find a user ? }
   JustShown:Boolean;    { did we just have a user on the screen or
                           were we looking for one ?
                           to estimate the amount of enters at
                           the end
                         }

Begin
EverFound:=false;
If ParamStr(2)<>'' then
If Door.SecLvl<StrToInt(ParamStr(2)) then
 Begin
  AllWriteln('No rights to execute this door.');
  AllWriteln('');
  CloseAll;
  Exit;
 End;


TypeMCIFile('NAVTOP.PCB');
Input:=Allreadln(30);


   If Input='' then
    Begin;
    EndSubLoop:=True;
    Endloop:=True;
    TypeMCIFile('NAVBORT.PCB');
    End else
     Begin;
       GetMem(Control^.MCI^,SizeOf(MCIRecord));
       AidMCI:=Control^.MCI^;
       AidMCI^.mcistr:=ToUpcase(Input);
       AidMCI^.NExt:=NIL;
       TypeMCIFile('NAVSRCH.PCB');
       AidMCI:=Control^.MCI^;

       AidMCI:=Control^.MCI^;
       FreeMem(Control^.MCI^,SizeOf(MCIRECORD));
     End;

EndLoop:=False;SearchNode:=1;Found:=False;
ShowCont:=True;
JustShown:=False;


While not EndLoop do
Begin
 If Exists(Config.Scripts+'\ANSWER'+IntToStr(SearchNode,0)+'.TXT') then
  Begin;
   { ok, list exists }
   Assign(f,Config.Scripts+'\ANSWER'+IntToStr(SearchNode,0)+'.TXT');
   Reset(f);

   Readln(f,Temp_str);
   EndSubLoop:=False;

   While not EndSubLoop do
    Begin
     If Eof(f) then EndSubLoop:=True else

     If (Chobstring(Temp_str,5,5,false)='\----') then
      Begin { this is a string, the next line gives the username }
       Readln(f,Temp_str);

       Username:='';
       i:=11;
       While (i<=Length(Temp_Str)) and (Temp_str[i]<>',') do
        Begin
         Username:=Username+Temp_str[i];
         Inc(i);
        End;

       For i:=1 to (Length(Username)-Length(Input))+1 do
        If ToUpcase(Copy(Username,i,Length(Input)))=
           ToUpcase(Input) then
            Begin { found! }
               { show it! }
             EverFound:=True;
             GetMem(Control^.MCI^,SizeOf(MCIRecord));
             AidMCI:=Control^.MCI^;
             AidMCI^.mcistr:=Username;
             AidMCI^.NExt:=NIL;
             TypeMCIFile('NAVFND.PCB');
             AidMCI:=Control^.MCI^;

             AidMCI:=Control^.MCI^;
             FreeMem(Control^.MCI^,SizeOf(MCIRECORD));

             C:=AllGetch;
             If Upcase(Chr(C))='Q' then
              Begin;
               EndLoop:=True;
               EndSubLoop:=True;
               AllWriteln('Quit');
               AllWriteln('');
               AllWriteln('');
              End else
             If Upcase(Chr(C))<>'N' then
              Begin
               JustShown:=True;
               AllWriteln('Yes');
               AllWriteln('');
               AllWriteln('');
             TypeMCIFile('NAVHDR.PCB'); { header }

               Found:=True;
                While (Chobstring(Temp_str,5,5,false)<>'\----') and (not Eof(F)) do
                 Begin
                  AllWriteln(Temp_Str);
                  Readln(f,Temp_Str);
                 End;
              {Show;}

             TypeMCIFile('NAVCONT.PCB'); { continue searching ? }
             C:=AllGetch;
             If (ToUpcase(Chr(C))<>'N') and (ToUpcase(Chr(C))<>'Q') then
              Begin
               Allwrite('Yes');
               AllWriteln('');
               AllWriteln('');
               Found:=False;
       GetMem(Control^.MCI^,SizeOf(MCIRecord));
       AidMCI:=Control^.MCI^;
       AidMCI^.mcistr:=ToUpcase(Input);
       AidMCI^.NExt:=NIL;
       TypeMCIFile('NAVSRCH.PCB');
       AidMCI:=Control^.MCI^;

       AidMCI:=Control^.MCI^;
       FreeMem(Control^.MCI^,SizeOf(MCIRECORD));
              End else
               Begin
                Allwrite('No');
               AllWriteln('');
               AllWriteln('');
                EndSubloop:=True;
                EndLoop:=True;
               End;

              End else
               Begin;
               ShowCont:=False;
               Found:=False;
               AllWriteln('No');
               AllMoveUp(3);
               JustShown:=False;
               End;



            End
      End else Readln(f,Temp_str);
    End; { sub }

   Close(f);
  End; { exist }

 Inc(SearchNode);
 If SearchNode>Config.Howmanynodes then EndLoop:=True;
end; {endloop }

If not Found then
 Begin
 If (not JustShown) and (Input<>'') and EverFound then
  Begin
   AllWriteln('');
   AllWriteln('');
   AllWriteln('');
   AllWriteln('');
  End;

 TypeMCIFile('NAVNOT.PCB');
 End;

CloseAll;
End.
-----------------------------------------------------------------------------
����������������������������������������������������������������������������Ŀ
�  �                                                                     �   �
�  �                          4. Notes                                   �   �
�  �                                                                     �   �
������������������������������������������������������������������������������

 If you have any valuable information that you want to share with other
 developers, send it to [email protected] and we'll publish it in the next
 issue!

 Thankz, Rapido

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

                ����������������������������������������Ŀ
  �������������[�        [*]  LEADING FORCE  [*]         �]������������ķ
��ĺ��������������������������������������������������������������������ĺ��Ŀ
�  �                    Rapido             Alibabba                      �   �
������������������������������������������������������������������������
  ��������������������������������������������������������������������Ľ

                ����������������������������������������Ŀ
  �������������[�        [*]  ACTIVE MEMBERS  [*]        �]������������ķ
��ĺ��������������������������������������������������������������������ĺ��Ŀ
�  �     Alibabba, Ampsul, Breakdown, Gannon, Grim, Highl/\nder, Inm     �   �
�  �      Ken8, The Killer, Mexx, Mr Bungle, Mushroom, Nighty, Omen,     �   �
�  �    Ooze, Pascal, Phreak Klass, Phasia, Predator, Rapido, Ripper,    �   �
�  �                Sludge, Squizzy, Star, Thc, Voyage, Wasted           �   �
������������������������������������������������������������������������
  ��������������������������������������������������������������������Ľ

                ����������������������������������������Ŀ
  �������������[�        [*] CODING DIVISION [*]         �]������������ķ
��ĺ��������������������������������������������������������������������ĺ��Ŀ
�  �           Rapido, Alibabba, Ampsul, Pascal ,Gannon, Inm             �   �
������������������������������������������������������������������������
  ��������������������������������������������������������������������Ľ

                ����������������������������������������Ŀ
  �������������[�  x R O A D s  H E A D Q U A R T E R S  �]������������ķ
��ĺ��������������������������������������������������������������������ĺ��Ŀ
�  � Eternal Damnation .......1 Node......+31...Davadian........WORLD HQ �   �
�  � Mystical Places .........6 Nodes.....+31...Thc............. EURO HQ �   �
�  � Rest In Peace ...........1 Node......+54...Sludge..........  ARG HQ �   �
�  � Central Park ............3 Nodes.....+61...Mr. Bungle........ OZ HQ �   �
�  � Point Break .............7 Nodes.....+49...Voyage........ GERMAN HQ �   �
�  � Magic Affair ............4 Nodes.....+7....Omen......... RUSSIAN HQ �   �
�  � Dead On Time ............2 Nodes.....+47...Nighty..... NORWEGIAN HQ �   �
�  � High Resolution .........1 Node......+44...Pascal............ UK HQ �   �
�  � Dark Forces .............3 Nodes.....+46...Gannon/Phasia SWEDISH HQ �   �
�  � Killertown ..............7 Nodes.....+32...The Killer... BELGIUM HQ �   �
�  � Unknown Area ............1 Node .....+48...Vibr8......... POLISH HQ �   �
�  ���������������������������������������������������������������������ĺ   �
�  �                 x R O A D s  M E M B E R S I T E S                  �   �
�  ���������������������������������������������������������������������ĺ   �
�  � Sector Seven ............2 Nodes.....+46...Inm/Rawlock. SWEDISH MBR �   �
�  � Tresor ..................1 Node......+46...Ken8........ SWEDISH MBR �   �
�  � Fireball ................2 Nodes.....+49...Star......... GERMAN MBR �   �
������������������������������������������������������������������������
  ��������������������������������������������������������������������Ľ

                ����������������������������������������Ŀ
  �������������[� T H A N K S   G R E E T S    N O T E S �]������������ķ
��ĺ��������������������������������������������������������������������ĺ��Ŀ
�  �       xROADs thanks & greets the following groups/persons:          �   �
�  �                                                                     �   �
�  �          Food, Goodspeed, Motiv8, Stf and many others               �   �
�  �                                                                     �   �
�  ���������������������������������������������������������������������ĺ   �
�  �         xROADs thanks & greets the following individuals :          �   �
�  �                                                                     �   �
�  �     Davadian, Darktrooper, Inm, Nighty, Mtl, Cyberkid, The Best     �   �
�  �                  and all others in #FOOD and #STF                   �   �
�  �                                                                     �   �
�  ���������������������������������������������������������������������ĺ   �
�  �                             N O T E S                               �   �
�  ���������������������������������������������������������������������ĺ   �
�  �                                                                     �   �
�  �   xROADs is looking for talented people like you for coding doors,  �   �
�  �     managing the xROADs doors coding division and for art work.     �   �
�  �     if you're interested in getting xROADs back up again email      �   �
�  �      to: [email protected] or join #xroads on Efnet and contact       �   �
�  �                       one of the leaders!                           �   �
�  �                                                                     �   �
�  �      xROADs changed WHQ! Our new world headquarters will be         �   �
�  �                Eternal Damnation +31-765-600721                     �   �
�  �                                                                     �   �
�  �                 Visit us on the Efnet on #XROADS                    �   �
�  �              and contact one of the council members                 �   �
�  �                                                                     �   �
�  �         You can contact us via E-mail :   [email protected]           �   �
�  �                     or call the xROADs WHQ at                       �   �
�  �                        +31-765-600721 (28K8)                        �   �
�  �                                                                     �   �
�  �      All new releases can be downloaded from our www-page at        �   �
�  �                      www.stack.nl/~xroads                           �   �
�  �                                                                     �   �
�  ���������������������������������������������������������������������ĺ   �
�  �  Nfo & Xrd Logo By SQUiZZY. Nfo Last Updated By RaPiDo on 03/23/97  �   �
������������������������������������������������������������������������
  �������������ij                                        ��������������Ľ
                � Please report bugs! By reporting bugs  �
                �   you help us to improve our work!     �
                �                                        �
                ������������������������������������������
@BEGIN_FILE_ID.DIZ
    ���     �       �             �
�  �۲��--�[Desire Development Mag #1]�--
  � ۲� � � � �   � � �     � � � � � �
������� �������  ������ ��� ������  �������
������� ������� �۲���� ��� ������� �������
۲� ۲� ۲����  ۲����� ��� ۲����� ۲���߰
۲� ۲� ۲� ۲� ��� ۲� ۲� ۲� ۲� ۲� ۲�
۲� ۲� ۲� ۲� ۲� ۲� ۲� ۲� ۲� ۲� ۲�
������� ������߰ �����߰��߰ �߰��߱ ������
�.-------------------------------------.sQZ
 |    Desire Development Magazine #1   |� �
 |     Download XRD-DEV1.ZIP too!      |�
 `-------------------------------------'
@END_FILE_ID.DIZ