home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / RADOOR30.ZIP / ML-MOD.ZIP / LANGUAGE.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-04-10  |  9.0 KB  |  304 lines

  1. {╔═════════════════════════════════════════════════════════════════════════╗
  2.  ║                                                                         ║
  3.  ║                   (c) CopyRight LiveSystems 1990, 1994                  ║
  4.  ║                                                                         ║
  5.  ║ Author    : Gerhard Hoogterp                                            ║
  6.  ║ FidoNet   : 2:282/100.5   2:283/7.33                                    ║
  7.  ║ BitNet    : GERHARD@LOIPON.WLINK.NL                                     ║
  8.  ║                                                                         ║
  9.  ║ SnailMail : Kremersmaten 108                                            ║
  10.  ║             7511 LC Enschede                                            ║
  11.  ║             The Netherlands                                             ║
  12.  ║                                                                         ║
  13.  ║        This module is part of the RADoor BBS doorwriters toolbox.       ║
  14.  ║                                                                         ║
  15.  ╚═════════════════════════════════════════════════════════════════════════╝}
  16.  
  17. Unit Language;
  18. Interface
  19. Uses Dos,
  20.      GlobInfo,
  21.      LowLevel;
  22.  
  23. { The results which are passed back }
  24.  
  25. Const Lang_Ok                        =  0;
  26.       Lang_CannotOpenFile            = -1;
  27.       Lang_CannotReadHeader          = -2;
  28.       Lang_CannotReadIndex           = -3;
  29.       Lang_CannotReadLanguage        = -4;
  30.       Lang_NotEnoughMemory           = -5;
  31.       Lang_IncorrectLangFileVersion  = -6;
  32.  
  33.       CurrentLangFileVersion         = $100;
  34.  
  35. { The record with the global language information }
  36.  
  37. Type SpecialRecord  = Record
  38.                        FileId    : Array[1..32] Of Char;
  39.                        VersionNr : Word;              { CurrLanguage version }
  40.                        ProgName  : String[8];         { using programname    }
  41.                        LanguageID: String[3];         { ENG/NL     }
  42.                        YesDef    : Char;              { %Y         }
  43.                        NoDef     : Char;              { %N         }
  44.                        StopDef   : Char;              { %S         }
  45.                        YesNorm   : Char;              { %y         }
  46.                        NoNorm    : Char;              { %n         }
  47.                        StopNorm  : Char;              { %s         }
  48.                        BrackRgt  : Char;              { %L         }
  49.                        BrackLft  : Char;              { %R         }
  50.                        ENTER     : String[10];        { %E         }
  51.                        Colors    : Array[0..9] Of Byte; { Colortable }
  52.                        Entries   : Word;              { No strings }
  53.                       End;
  54.  
  55. Var Specials  : SpecialRecord;
  56.  
  57. {----------------------------------------------------------------------------|
  58. InitLanguageData  reads the languagefile and prepares the index and language
  59.                   buffer
  60. |----------------------------------------------------------------------------}
  61. Function InitLanguageData(FileName : PathStr):Integer;
  62.  
  63. {----------------------------------------------------------------------------|
  64. CleanUpHeap       Clears the buffers. Finalize the language support.
  65. |----------------------------------------------------------------------------}
  66. Procedure CleanUpHeap;
  67.  
  68. {----------------------------------------------------------------------------|
  69. GrabLine          Returns the string which is defined by the given number.
  70. |----------------------------------------------------------------------------}
  71. Function GrabLine(Nr : Word):String;
  72.  
  73. {----------------------------------------------------------------------------|
  74. ExpandString      Expand the macro's (%Y,%E etc) in the given string. Handy
  75.                   for example when you want to center the string!
  76. |----------------------------------------------------------------------------}
  77. Function ExpandString(S : String):String;
  78.  
  79. Implementation
  80.  
  81. Var ExitSave : Pointer;
  82.  
  83. Const MaxSentence = 500;
  84.  
  85. Type  IndexEntryRec  = Record
  86.                         Nr    : Word;
  87.                         Start : Word;
  88.                         Len   : Byte;
  89.                        End;
  90.  
  91.       LanguageArray  = Array[0..$FFFE] Of Char;
  92.       LanguagePtr    = ^LanguageArray;
  93.  
  94.       IndexArray     = Array[1..MaxSentence] of IndexEntryRec;
  95.       IndexPtr       = ^IndexArray;
  96.  
  97. Var LangData  : LanguagePtr;
  98.     LangSize  : Word;
  99.     Index     : IndexPtr;
  100.     IdxSize   : Word;
  101.  
  102. Function InitLanguageData(FileName : PathStr):Integer;
  103. Var Data   : File;
  104.     Entry  : IndexEntryRec;
  105.  
  106. Begin
  107. LangData:=NIL;
  108. Index:=NIL;
  109.  
  110. Assign(Data,FileName);
  111. Reset(Data,1);
  112. If IoResult<>0
  113.    Then Begin
  114.         InitLanguageData:=Lang_CanNotOpenFile;
  115.         Exit;
  116.         End;
  117.  
  118. BlockRead(Data,Specials,SizeOf(Specials));
  119. If IoResult<>0
  120.    Then Begin
  121.         Close(Data);
  122.         InitLanguageData:=Lang_CannotReadHeader;
  123.         Exit;
  124.         End;
  125.  
  126. If Specials.VersionNr<>CurrentLangFileVersion
  127.    Then Begin
  128.         Close(Data);
  129.         InitLanguageData:=Lang_IncorrectLangFileVersion;
  130.         Exit;
  131.         End;
  132.  
  133. IdxSize:=Specials.Entries*SizeOf(Entry);
  134. GetMem(Index,IdxSize);
  135. If Index=NIL
  136.    Then Begin
  137.         Close(Data);
  138.         InitLanguageData:=Lang_NotEnoughMemory;
  139.         Exit;
  140.         End;
  141.  
  142. FillChar(Index^,IdxSize,$00);
  143. BlockRead(Data,Index^,IdxSize);
  144. If IoResult<>0
  145.    Then Begin
  146.         Close(Data);
  147.         CleanUpHeap;
  148.         InitLanguageData:=Lang_CannotReadIndex;
  149.         Exit;
  150.         End;
  151.  
  152. LangSize:=FileSize(Data)-IdxSize-SizeOf(Specials);
  153. GetMem(LangData,LangSize);
  154. If LangData=NIL
  155.    Then Begin
  156.         Close(Data);
  157.         CleanUpHeap;
  158.         InitLanguageData:=Lang_NotEnoughMemory;
  159.         Exit;
  160.         End;
  161.  
  162. FillChar(LangData^,LangSize,#00);
  163. BlockRead(Data,LangData^,LangSize);
  164. If IoResult<>0
  165.    Then Begin
  166.         Close(Data);
  167.         CleanUpHeap;
  168.         InitLanguageData:=Lang_CannotReadLanguage;
  169.         Exit;
  170.         End;
  171.  
  172. Close(Data);
  173. InitLanguageData:=Lang_Ok;
  174. End;
  175.  
  176. Procedure CleanUpHeap;
  177. Begin
  178. If LangData<>NIL
  179.    Then Begin
  180.         FreeMem(LangData,LangSize);
  181.         LangData:=Nil;
  182.         End;
  183. If Index<>NIL
  184.    Then Begin
  185.         FreeMem(Index,IdxSize);
  186.         Index:=Nil;
  187.         End;
  188. FillChar(Specials,SizeOf(Specials),#00);
  189. End;
  190.  
  191. Function PrepareString(S : String):String;
  192. Var Count : Byte;
  193.     Temp  : String;
  194. Begin
  195. Count:=1;
  196. Temp:='';
  197. While Count<=Length(S) Do
  198.  Begin
  199.  If S[Count]<>'%'
  200.     Then Begin
  201.          Temp:=Temp+S[Count];
  202.          Inc(Count);
  203.          End
  204.     Else Begin
  205.          With Specials Do
  206.            Case S[Count+1] Of
  207.              'Y' : Temp:=Temp+YesDef;
  208.              'N' : Temp:=Temp+NoDef;
  209.              'S' : Temp:=Temp+StopDef;
  210.              'y' : Temp:=Temp+YesNorm;
  211.              'n' : Temp:=Temp+NoNorm;
  212.              's' : Temp:=Temp+StopNorm;
  213.              'L' : Temp:=Temp+ BrackLft;
  214.              'R' : Temp:=Temp+BrackRgt;
  215.              'E' : Temp:=Temp+ENTER;
  216.              '%' : Temp:=Temp+'%';
  217.            End; {Case}
  218.          Inc(Count,2);
  219.          End; {Else}
  220.  End; {For}
  221. PrepareString:=Temp;
  222. End;
  223.  
  224. Function GrabLine(Nr : Word):String;
  225. Var Temp    : Word;
  226.     TempStr : String;
  227. Begin
  228. If NR=0
  229.    Then Begin
  230.         LogIt('Programmers error!!');
  231.         GrabLine:='** ERROR **';
  232.         Exit;
  233.         End;
  234. Temp:=0;
  235. GrabLine:='';
  236. While (Temp<=Specials.Entries) And (Index^[Temp].Nr<>Nr) Do
  237.  Inc(Temp);
  238. If Temp>Specials.Entries
  239.    Then Exit;
  240. Move(LangData^[Index^[Temp].Start],TempStr[1],Index^[Temp].Len);
  241. TempStr[0]:=Chr(Index^[Temp].Len);
  242. GrabLine:=PrepareString(TempStr);
  243. End;
  244.  
  245. Function ExpandString(S : String):String;
  246. Var StrNr : Word;
  247.     Temp  : Byte;
  248.     Count : Byte;
  249. Begin
  250. S:=PrepareString(S);
  251. Count:=1;
  252. While Count<Length(S) Do
  253.  Begin
  254.  If (S[Count]=']') And
  255.     ( (Count+1)<Length(S) ) And
  256.     (S[Count+1] in ['0'..'9'])
  257.     Then Begin
  258.          StrNr:=Str2Nr(Copy(S,Count+1,3));
  259.          Delete(S,Count,4);
  260.          Insert(GrabLine(StrNr),S,Count);
  261.          Count:=Count+Length(GrabLine(StrNr));
  262.          End
  263.     Else Inc(Count);
  264.  End;
  265. ExpandString:=S;
  266. End;
  267.  
  268.  
  269. {$F+}
  270. Procedure langExitProc;
  271. {$F-}
  272. Begin
  273. ExitProc:=ExitSave;    { Chain to old Exit Procedure }
  274. If (ErrorAddr<>Nil) Or
  275.    (ExitCode<>0)
  276.    Then Begin
  277.         Dispose(HeapOrg);
  278.         LogIt('ExitCode : '+S(ExitCode,0));
  279.         LogIt('ErrorAddr: $'+S(Seg(ErrorAddr),0)+':$'+S(Ofs(ErrorAddr),0));
  280.         LogIt('MemAvail : '+Sl(MemAvail,0));
  281.         ErrorAddr:=Nil;
  282.         ExitCode:=0;
  283.         End;
  284. End;
  285.  
  286. {$F+}
  287. Function LangHeapFunc(Size : Word):Integer;
  288. {$F-}
  289. Begin
  290. LangHeapFunc:=1;
  291. If Size>MemAvail
  292.    Then Begin
  293.         LogIt('Requested '+SL(Size,0));
  294.         LogIt('Available '+SL(MemAvail,0));
  295.         End;
  296. End;
  297.  
  298.  
  299. Begin
  300. HeapError:=@LangHeapFunc; { Set the Heap Function            }
  301. ExitSave:=ExitProc;       { Store the Current Exit procedure }
  302. ExitProc:=@LangExitProc;  { Set My own Exit Procedure        }
  303. End.
  304.