Retro video games delivered to your door every month!
Click above to get retro games delivered to your door ever month!
X-Hacker.org- MOD File Format - <b>.ndx files</b> http://www.X-Hacker.org [<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 .NDX files

 Index files are named XXX.NDX (where XXX is the conference number padded
 with leading zeros to make it three characters long.  There is one *.NDX
 file for each conference chosen that contains messages in the MESSAGES.DAT
 file.

 The *.NDX file contain records five characters long that point to each
 message in that conference.

   NdxRecord = Record       
     MsgPointer : BasicReal;
     Conference : Byte;     
   End;                     

  The BasicReal is a four byte number in BASIC MKS$ format.


  The following is a sample procedure for Turbo Pascal that converts
  between BasicReal format and LongInt format.

 Function BasicReal2Long(InValue: LongInt): LongInt;
  Var
     Temp : LongInt;
    Expon : Integer;
  Begin
    Expon := ((InValue shr 24) and $ff) - 152;
    Temp := (InValue and $007FFFFF) or $00800000;
    If Expon < 0 Then Temp := Temp shr Abs(Expon)
      Else Temp := Temp shl Expon;
    If (InValue and $00800000) <> 0 Then BasicReal2Long := -Temp
      Else BasicReal2Long := Temp;
    If Expon = 0 Then BasicReal2Long := 0;
  End;


 Function Long2BasicReal(InValue: LongInt): LongInt;
  Var
    Negative : Boolean;
       Expon : LongInt;
  Begin
    If InValue = 0 Then Long2BasicReal := 0
      Else
        Begin
          If InValue < 0 Then
            Begin
              Negative := True;
              InValue := Abs(InValue);
            End
          Else Negative := False;
        Expon := 152;
        If InValue < $007FFFFF Then
          While ((InValue and $00800000) = 0) Do
            Begin
              InValue := InValue shl 1;
              Dec(Expon);
            End
           Else
             While ((InValue And $FF000000) <> 0) Do
               Begin
                 InValue := InValue shr 1;
                 Inc(Expon);
               End;
             InValue := InValue And $007FFFFF;
             If Negative Then InValue := InValue Or $00800000;
           Long2BasicReal := InValue + (Expon shl 24);
        End;
  End;

 A quick and dirty conversion (handles positive numbers only) is possible
 with the following expression:

 MKSToNum := ((x AND NOT $ff000000) OR $00800000)
              SHR (24 - ((x SHR 24) AND $7f));

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

 The number contained in the MsgPointer is the record number (128 byte
 records - starting numbering from record 1 not 0) of the message header.
 Note that since the 1st record contains packet header, the lowest
 MsgPointer that can exist is 2.

 Some message readers will reformat the *.NDX files so that the MsgPointer
 becomes a LongInt fileseek position (using a record size of 1).  To
 determine which type of index you are reading you should look at the size
 of the number.  Any BasicReal will appear as a huge number that would
 unlikely ever be a byte seek positon.

 An additional file PERSONAL.NDX is also optionally added to the QWK
 archive.  This file has the same record format as the other *.NDX files.
 It contains index records pointing to messages to the caller from all
 conferences (ie it is used by the mail reader to do a quick search for
 personal mail in all areas).



Online resources provided by: http://www.X-Hacker.org --- NG 2 HTML conversion by Dave Pearson