home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Software / Vyzkuste / Hackman / _SETUP.1 / CHECKLNG.PAS < prev    next >
Pascal/Delphi Source File  |  1998-11-21  |  6KB  |  265 lines

  1. {$A+,B-,D+,E+,F-,G-,I-,L+,N-,O-,R-,S+,V+,X+}
  2. {$M 16384,0,655360}
  3.  
  4. PROGRAM CheckLng;
  5. {
  6.     Author    : Zweistein
  7.     Version    : 1.1
  8.     Date    : 21-November-1998
  9.  
  10.     Tab Width : 4
  11.  
  12. History:
  13.  
  14. 1.0 June 6th, 1998:
  15.     First Version, nothing special
  16.  
  17. 1.1 November 21st, 1998
  18.     Added check for empty strings
  19.     Comparison of two files
  20.  
  21. Warning:
  22.  
  23. Please do NOT regard this piece of software as an example for a good
  24. programming style. This program was made in state of pure frustration
  25. during a ".LNG-file error search night shift" ;-)
  26. }
  27.  
  28. USES Crt;
  29.  
  30. CONST
  31.   MAX_ID = 1000;
  32.  
  33. TYPE
  34.   InfoField = ARRAY[1..MAX_ID] OF Boolean;
  35.  
  36. VAR
  37.   Missing, ErrorFnd    : ARRAY [0..1] OF InfoField;
  38.   Empty             : ARRAY [0..1] OF InfoField;
  39.  
  40.  
  41. PROCEDURE DisplayInfo;
  42. BEGIN
  43.   WriteLn;
  44.   WriteLn('CheckLng 1.1 - A simple program to check HackMan LNG files');
  45.   WriteLn;
  46.   WriteLn('Synopsis : CHKLNG LanguageFile <OriginalFile>');
  47.   WriteLn;
  48.   WriteLn('Example  : CHKLNG GERMAN.LNG ENGLISH.LNG');
  49.   WriteLn;
  50.   WriteLn('This will read the files GERMAN.LNG, and ENGLISH.LNG,');
  51.   WriteLn('check all the lines, count the number of correct, incorrect,');
  52.   WriteLn('and empty strings.');
  53.   WriteLn('The statistics files will be created in the same directory using');
  54.   WriteLn('the file names GERMAN.STT and ENGLISH.STT.');
  55.   WriteLn('Besides, there will be a comparison file named "PROBLEMS.TXT" which');
  56.   WriteLn('shows errors and differences between the two files.');
  57.   WriteLn;
  58.   WriteLn('Press any key to quit ...');
  59.   ReadKey;
  60. END;
  61.  
  62.  
  63. FUNCTION WriteField(VAR OutputFile : TEXT; Info : InfoField): Integer;
  64. VAR
  65.   Error, Len, Cnt : Integer;
  66. BEGIN
  67.   Error := 0;
  68.   Cnt := 1;
  69.   Len := 0;
  70.   WHILE (Cnt < MAX_ID) AND (Error = 0) DO
  71.     BEGIN
  72.       IF Info[Cnt] THEN
  73.         BEGIN
  74.           Len := Len + 5;
  75.           Write(OutputFile, Cnt:5);
  76.         END;
  77.  
  78.       IF (Len > 45) THEN
  79.         BEGIN
  80.           WriteLn(OutputFile);
  81.           Len := 0;
  82.         END;
  83.       Error := IOResult;
  84.       INC(Cnt);
  85.     END;
  86.  
  87.   IF (Error = 0) THEN
  88.     WriteLn(OutputFile, #13#10#13#10);
  89.   Error := IOResult;
  90.  
  91.   WriteField := Error;
  92. END;
  93.  
  94.  
  95. PROCEDURE Process(FileName : STRING; FileNum : Integer);
  96. VAR
  97.   LngFile, StatFile    : TEXT;
  98.   ProblemsFile      : TEXT;
  99.   CntOK, CntError    : Integer;
  100.   Error, Cnt, Len    : Integer;
  101.   TextID, TextErr    : Integer;
  102.   CommaPos, QM_Cnt    : Integer;
  103.   StatName, Line, ID: STRING;
  104.   LngOpen, StatOpen    : Boolean;
  105.   OK                : Boolean;
  106.   QuotePos          : ARRAY[0..3] OF Integer;
  107.  
  108. PROCEDURE ShowProblems;
  109. VAR
  110.   Cnt : Integer;
  111. BEGIN
  112.   FOR Cnt := 1 TO MAX_ID DO
  113.     BEGIN
  114.       IF (Missing[0, Cnt]) THEN
  115.         WriteLn(ProblemsFile, 'Missing TextID ', Cnt,' in File "',
  116.           ParamStr(1),'"');
  117.       IF (Missing[1, Cnt]) THEN
  118.         WriteLn(ProblemsFile, 'Missing TextID ', Cnt,' in File "',
  119.           ParamStr(2),'"');
  120.  
  121.       IF (ErrorFnd[0, Cnt]) THEN
  122.         WriteLn(ProblemsFile, 'Error in TextID ', Cnt,' in File "',
  123.           ParamStr(1),'"');
  124.       IF (ErrorFnd[1, Cnt]) THEN
  125.         WriteLn(ProblemsFile, 'Error in TextID ', Cnt,' in File "',
  126.           ParamStr(2),'"');
  127.  
  128.       IF (Empty[0, Cnt] <> Empty[1, Cnt]) THEN
  129.         WriteLn(ProblemsFile, 'Difference found in TextID ', Cnt);
  130.     END;
  131. END;
  132.  
  133. BEGIN
  134.   LngOpen := False;
  135.   StatOpen := False;
  136.   OK := False;
  137.  
  138.   { init information fields }
  139.   FillChar(Missing[FileNum], SizeOf(InfoField), True);
  140.   FillChar(ErrorFnd[FileNum], SizeOf(InfoField), False);
  141.   FillChar(Empty[FileNum], SizeOf(InfoField), False);
  142.  
  143.   { open/create files }
  144.   Assign(LngFile, FileName);
  145.   IF (IOResult = 0) THEN
  146.     Reset(LngFile);
  147.   Error := IOResult;
  148.  
  149.   IF (Error = 0) THEN
  150.     BEGIN
  151.       LngOpen := True;
  152.       StatName := FileName;
  153.       DEC(StatName[0],3);
  154.       StatName := StatName + 'STT';
  155.       Assign(StatFile, StatName);
  156.       IF (IOResult = 0) THEN
  157.         Rewrite(StatFile);
  158.       Error := IOResult;
  159.       IF (Error = 0) THEN
  160.         StatOpen := True;
  161.       WriteLn(StatFile, 'Language File : ', FileName,#13#10);
  162.       WriteLn(StatFile, 'Lines with no or erroneous ID:'#13#10);
  163.     END;
  164.  
  165.   { check language file }
  166.   Cnt := 0;
  167.   Line := '';
  168.   QM_Cnt := 0;
  169.  
  170.   WHILE NOT EoF(LngFile) AND (Error = 0) DO
  171.     BEGIN
  172.       IF (Length(Line) < 255) THEN
  173.         INC(Cnt);
  174.  
  175.       ReadLn(LngFile, Line);
  176.       Error := IOResult;
  177.  
  178.       IF (Error = 0) THEN
  179.         BEGIN
  180.           CommaPos := Pos(',', Line);
  181.           ID := Copy(Line, 1, CommaPos-1);
  182.           Val(ID, TextID, TextErr);
  183.           IF (TextErr <> 0) OR
  184.              ((TextId < 1) AND (TextID > MAX_ID)) THEN
  185.             WriteLn(StatFile, Cnt:4, ': ',Line)
  186.           ELSE
  187.             BEGIN
  188.               Missing[FileNum, TextID] := False;
  189.  
  190.               Len := Length(Line);
  191.  
  192.               WHILE (CommaPos <= Len) DO
  193.                 BEGIN
  194.                   IF (Line[CommaPos] = '"') THEN
  195.                     BEGIN
  196.                       QuotePos[QM_Cnt] := CommaPos;
  197.                       INC(QM_Cnt);
  198.                       IF (QM_Cnt > 2) THEN
  199.                         ErrorFnd[FileNum, TextID] := True;
  200.                     END;
  201.                   INC(CommaPos);
  202.                 END;
  203.  
  204.               IF (QM_Cnt < 2) THEN
  205.                 BEGIN
  206.                   IF (Length(Line) < 255) THEN
  207.                     BEGIN
  208.                       ErrorFnd[FileNum, TextID] := True;
  209.                       QM_Cnt := 0;
  210.                     END
  211.                 END
  212.               ELSE
  213.                 BEGIN
  214.                   IF (QM_Cnt = 2) AND (QuotePos[0] = QuotePos[1]-1) THEN
  215.                     Empty[FileNum, TextID] := True;
  216.                   QM_Cnt := 0;
  217.                 END
  218.             END;
  219.  
  220.           Error := IOResult;
  221.         END;
  222.     END;
  223.  
  224.   { display result }
  225.   IF (Error = 0) THEN
  226.     BEGIN
  227.       WriteLn(StatFile, #13#10'Missing strings:'#13#10);
  228.       IF (WriteField(StatFile, Missing[FileNum]) = 0) THEN
  229.         BEGIN
  230.           WriteLn(StatFile, #13#10'Incorrect strings:'#13#10);
  231.           IF (WriteField(StatFile, ErrorFnd[FileNum]) = 0) THEN
  232.             BEGIN
  233.               WriteLn(StatFile, #13#10'Empty strings:'#13#10);
  234.               WriteField(StatFile, Empty[FileNum]);
  235.               OK := True;
  236.             END;
  237.         END;
  238.     END;
  239.  
  240.   IF OK AND (FileNum = 1) THEN
  241.     BEGIN
  242.       Assign(ProblemsFile, 'PROBLEMS.TXT');
  243.       Rewrite(ProblemsFile);
  244.       ShowProblems;
  245.       Close(ProblemsFile);
  246.     END;
  247.  
  248.  
  249.   IF LngOpen THEN
  250.     Close(LngFile);
  251.   IF StatOpen THEN
  252.     Close(StatFile);
  253. END;
  254.  
  255.  
  256. BEGIN
  257.   CASE ParamCount OF
  258.     0: DisplayInfo;
  259.     1: Process(ParamStr(1), 0);
  260.     2: BEGIN
  261.          Process(ParamStr(1), 0);
  262.          Process(ParamStr(2), 1);
  263.        END;
  264.   END;
  265. END.