Browse Source

* Gabor changes: see fixes.txt

pierre 25 years ago
parent
commit
ddee9c4979

+ 10 - 0
ide/text/fixes.txt

@@ -1,3 +1,13 @@
+Gabors's log to 22/6/2000 commits
+========================== Other improvements ============================
+
+ [+] added support for reading .NG (Norton Guide) in the help system
+
+========================== Misc modifications ============================
+
+ [?] the VESA unit now uses the routines of PMODE, instead of it's owns
+ [?] constants (255) changed to High()s in checks for maximum string lengths
+
 Gabors's log to 16/6/2000 commits
 Gabors's log to 16/6/2000 commits
 ========================= Already fixed ================================
 ========================= Already fixed ================================
 
 

+ 5 - 2
ide/text/fpcatch.pas

@@ -43,7 +43,7 @@ uses
   drivers,
   drivers,
 {$endif FPC}
 {$endif FPC}
   app,commands,msgbox,
   app,commands,msgbox,
-  FPString,FPViews,FPIDE;
+  FPString,FPIDE;
 
 
 
 
 {$ifdef HasSignal}
 {$ifdef HasSignal}
@@ -112,7 +112,10 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.5  2000-05-02 08:42:26  pierre
+  Revision 1.6  2000-06-22 09:07:11  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.5  2000/05/02 08:42:26  pierre
    * new set of Gabor changes: see fixes.txt
    * new set of Gabor changes: see fixes.txt
 
 
   Revision 1.4  2000/03/07 21:09:20  pierre
   Revision 1.4  2000/03/07 21:09:20  pierre

+ 0 - 2
ide/text/fpcodcmp.pas

@@ -186,8 +186,6 @@ function TCodeCompleteDialog.Execute: Word;
 var R: word;
 var R: word;
     C: PCodeCompleteWordList;
     C: PCodeCompleteWordList;
     I: integer;
     I: integer;
-    S1,S2,S3: string;
-    W: word;
 begin
 begin
   New(C, Init(10,20));
   New(C, Init(10,20));
   if Assigned(CodeCompleteWords) then
   if Assigned(CodeCompleteWords) then

+ 1 - 8
ide/text/fpcodtmp.pas

@@ -72,7 +72,7 @@ procedure RegisterCodeTemplates;
 
 
 implementation
 implementation
 
 
-uses Commands,Views,MsgBox,App,
+uses Commands,Views,App,
      FPConst,FPString;
      FPConst,FPString;
 
 
 {$ifndef NOOBJREG}
 {$ifndef NOOBJREG}
@@ -252,8 +252,6 @@ end;
 
 
 constructor TCodeTemplateDialog.Init(const ATitle: string; ATemplate: PCodeTemplate);
 constructor TCodeTemplateDialog.Init(const ATitle: string; ATemplate: PCodeTemplate);
 var R,R2,R3: TRect;
 var R,R2,R3: TRect;
-    Items: PSItem;
-    I,KeyCount: sw_integer;
 begin
 begin
   R.Assign(0,0,52,15);
   R.Assign(0,0,52,15);
   inherited Init(R,ATitle);
   inherited Init(R,ATitle);
@@ -276,7 +274,6 @@ function TCodeTemplateDialog.Execute: Word;
 var R: word;
 var R: word;
     S: string;
     S: string;
     L: PUnsortedStringCollection;
     L: PUnsortedStringCollection;
-    W: word;
 begin
 begin
   New(L, Init(10,10));
   New(L, Init(10,10));
   S:=Template^.GetShortCut;
   S:=Template^.GetShortCut;
@@ -392,8 +389,6 @@ var R: word;
     C: PCodeTemplateCollection;
     C: PCodeTemplateCollection;
     L: PUnsortedStringCollection;
     L: PUnsortedStringCollection;
     I: integer;
     I: integer;
-    S1,S2,S3: string;
-    W: word;
 begin
 begin
   New(C, Init(10,20));
   New(C, Init(10,20));
   if Assigned(CodeTemplates) then
   if Assigned(CodeTemplates) then
@@ -423,8 +418,6 @@ var P,P2: PCodeTemplate;
     IC: boolean;
     IC: boolean;
     S: string;
     S: string;
     L: PUnsortedStringCollection;
     L: PUnsortedStringCollection;
-    I: sw_integer;
-    W: word;
     Cmd: word;
     Cmd: word;
     CanExit: boolean;
     CanExit: boolean;
 begin
 begin

+ 5 - 3
ide/text/fpcompil.pas

@@ -93,7 +93,7 @@ uses
 {$endif}
 {$endif}
   Dos,Video,
   Dos,Video,
   App,Commands,tokens,
   App,Commands,tokens,
-  CompHook, Compiler, systems, browcol, switches,
+  CompHook, Compiler, systems, browcol,
   WEditor,
   WEditor,
   FPString,FPRedir,FPDesk,FPUsrScr,FPHelp,
   FPString,FPRedir,FPDesk,FPUsrScr,FPHelp,
   FPConst,FPVars,FPUtils,FPIntf,FPSwitch;
   FPConst,FPVars,FPUtils,FPIntf,FPSwitch;
@@ -641,7 +641,6 @@ var
   Error,LinkErrorCount : longint;
   Error,LinkErrorCount : longint;
   E : TEvent;
   E : TEvent;
   DummyView: PView;
   DummyView: PView;
-  R: TRect;
 const
 const
   PpasFile = 'ppas';
   PpasFile = 'ppas';
 
 
@@ -912,7 +911,10 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.59  2000-06-16 08:50:40  pierre
+  Revision 1.60  2000-06-22 09:07:11  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.59  2000/06/16 08:50:40  pierre
    + new bunch of Gabor's changes
    + new bunch of Gabor's changes
 
 
   Revision 1.58  2000/05/29 10:44:56  pierre
   Revision 1.58  2000/05/29 10:44:56  pierre

+ 6 - 2
ide/text/fpconst.pas

@@ -49,8 +49,9 @@ const
 
 
      HTMLIndexExt         = '.htx';
      HTMLIndexExt         = '.htx';
      HTMLExt              = '.htm';
      HTMLExt              = '.htm';
-     HelpFileExts         = '*.tph;*.htm*;*'+HTMLIndexExt;
      TemplateExt          = '.pt';
      TemplateExt          = '.pt';
+     NGExt                = '.ng';
+     HelpFileExts         = '*.tph;*.htm*;*'+HTMLIndexExt+';*'+NGExt;
 
 
      EnterSign            = #17#196#217;
      EnterSign            = #17#196#217;
 
 
@@ -405,7 +406,10 @@ implementation
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.40  2000-06-16 08:50:40  pierre
+  Revision 1.41  2000-06-22 09:07:11  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.40  2000/06/16 08:50:40  pierre
    + new bunch of Gabor's changes
    + new bunch of Gabor's changes
 
 
   Revision 1.39  2000/05/30 07:18:33  pierre
   Revision 1.39  2000/05/30 07:18:33  pierre

+ 5 - 3
ide/text/fpdebug.pas

@@ -342,7 +342,7 @@ procedure UpdateDebugViews;
 implementation
 implementation
 
 
 uses
 uses
-  Dos,Mouse,Video,
+  Dos,Video,
   App,Commands,Strings,
   App,Commands,Strings,
 {$ifdef win32}
 {$ifdef win32}
   Windebug,
   Windebug,
@@ -1650,7 +1650,6 @@ var R,R2: TRect;
     S: String;
     S: String;
     X,X1 : Sw_integer;
     X,X1 : Sw_integer;
     Btn: PButton;
     Btn: PButton;
-const White = 15;
 begin
 begin
   Desktop^.GetExtent(R); R.A.Y:=R.B.Y-18;
   Desktop^.GetExtent(R); R.A.Y:=R.B.Y-18;
   inherited Init(R, dialog_breakpointlist, wnNoNumber);
   inherited Init(R, dialog_breakpointlist, wnNoNumber);
@@ -3347,7 +3346,10 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.62  2000-06-11 07:01:32  peter
+  Revision 1.63  2000-06-22 09:07:11  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.62  2000/06/11 07:01:32  peter
     * give watches window also a number
     * give watches window also a number
     * leave watches window in the bottom when cascading windows
     * leave watches window in the bottom when cascading windows
 
 

+ 5 - 4
ide/text/fpdesk.pas

@@ -47,15 +47,13 @@ uses Dos,
      Objects,Drivers,Video,
      Objects,Drivers,Video,
      Views,App,HistList,BrowCol,
      Views,App,HistList,BrowCol,
      WResourc,WViews,WEditor,
      WResourc,WViews,WEditor,
-     WUtils,
 {$ifndef NODEBUG}
 {$ifndef NODEBUG}
      fpdebug,
      fpdebug,
 {$endif ndef NODEBUG}
 {$endif ndef NODEBUG}
-     FPConst,FPVars,FPString,FPUtils,FPViews,FPCompile,FPTools,FPHelp,
+     FPConst,FPVars,FPString,FPUtils,FPViews,FPHelp,
      FPCodCmp,FPCodTmp;
      FPCodCmp,FPCodTmp;
 
 
 type
 type
-     PWindowInfo = ^TWindowInfo;
      TWindowInfo = packed record
      TWindowInfo = packed record
        HelpCtx   : word;
        HelpCtx   : word;
        Bounds    : TRect;
        Bounds    : TRect;
@@ -797,7 +795,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.28  2000-05-02 08:42:27  pierre
+  Revision 1.29  2000-06-22 09:07:12  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.28  2000/05/02 08:42:27  pierre
    * new set of Gabor changes: see fixes.txt
    * new set of Gabor changes: see fixes.txt
 
 
   Revision 1.27  2000/04/25 08:42:33  pierre
   Revision 1.27  2000/04/25 08:42:33  pierre

+ 15 - 2
ide/text/fphelp.pas

@@ -282,6 +282,14 @@ procedure InitHelpSystem;
     {$IFDEF DEBUG}SetStatus(msg_LoadingHelpFile);{$ENDIF}
     {$IFDEF DEBUG}SetStatus(msg_LoadingHelpFile);{$ENDIF}
   end;
   end;
 
 
+  procedure AddNGFile(HelpFile: string);
+  begin
+    {$IFDEF DEBUG}SetStatus(msg_LoadingHelpFile+' ('+SmartPath(HelpFile)+')');{$ENDIF}
+    if HelpFacility^.AddNGHelpFile(HelpFile)=false then
+      ErrorBox(FormatStrStr(msg_failedtoloadhelpfile,HelpFile),nil);
+    {$IFDEF DEBUG}SetStatus(msg_LoadingHelpFile);{$ENDIF}
+  end;
+
   procedure AddHTMLIndexFile(HelpFile: string);
   procedure AddHTMLIndexFile(HelpFile: string);
   begin
   begin
     {$IFDEF DEBUG}SetStatus(msg_LoadingHelpFile+' ('+SmartPath(HelpFile)+')');{$ENDIF}
     {$IFDEF DEBUG}SetStatus(msg_LoadingHelpFile+' ('+SmartPath(HelpFile)+')');{$ENDIF}
@@ -301,12 +309,14 @@ begin
       S:=HelpFiles^.At(I)^; TopicTitle:='';
       S:=HelpFiles^.At(I)^; TopicTitle:='';
       P:=Pos('|',S);
       P:=Pos('|',S);
       if P>0 then
       if P>0 then
-        begin TopicTitle:=copy(S,P+1,255); S:=copy(S,1,P-1); end;
+        begin TopicTitle:=copy(S,P+1,High(S)); S:=copy(S,1,P-1); end;
       if TopicTitle='' then TopicTitle:=S;
       if TopicTitle='' then TopicTitle:=S;
       if copy(UpcaseStr(ExtOf(S)),1,length(HTMLExt))=UpcaseStr(HTMLExt) then { this recognizes both .htm and .html }
       if copy(UpcaseStr(ExtOf(S)),1,length(HTMLExt))=UpcaseStr(HTMLExt) then { this recognizes both .htm and .html }
           AddHTMLFile(TopicTitle,S) else
           AddHTMLFile(TopicTitle,S) else
       if UpcaseStr(ExtOf(S))=UpcaseStr(HTMLIndexExt) then
       if UpcaseStr(ExtOf(S))=UpcaseStr(HTMLIndexExt) then
           AddHTMLIndexFile(S) else
           AddHTMLIndexFile(S) else
+      if UpcaseStr(ExtOf(S))=UpcaseStr(NGExt) then
+          AddNGFile(S) else
         AddOAFile(S);
         AddOAFile(S);
     end;
     end;
   PopStatus;
   PopStatus;
@@ -480,7 +490,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.33  2000-06-16 08:50:40  pierre
+  Revision 1.34  2000-06-22 09:07:12  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.33  2000/06/16 08:50:40  pierre
    + new bunch of Gabor's changes
    + new bunch of Gabor's changes
 
 
   Revision 1.32  2000/05/30 07:18:33  pierre
   Revision 1.32  2000/05/30 07:18:33  pierre

+ 5 - 3
ide/text/fpide.pas

@@ -154,9 +154,8 @@ uses
 {$endif WinClipSupported}
 {$endif WinClipSupported}
   Video,Mouse,Keyboard,
   Video,Mouse,Keyboard,
   Dos,Memory,Menus,Dialogs,StdDlg,ColorSel,Commands,HelpCtx,
   Dos,Memory,Menus,Dialogs,StdDlg,ColorSel,Commands,HelpCtx,
-  AsciiTab,
   Systems,
   Systems,
-  WUtils,WHelp,WHlpView,WINI,WViews,
+  WUtils,WHlpView,WViews,
   FPConst,FPVars,FPUtils,FPSwitch,FPIni,FPIntf,FPCompile,FPHelp,
   FPConst,FPVars,FPUtils,FPSwitch,FPIni,FPIntf,FPCompile,FPHelp,
   FPTemplt,FPCalc,FPUsrScr,FPTools,{$ifndef NODEBUG}FPDebug,{$endif}FPRedir,
   FPTemplt,FPCalc,FPUsrScr,FPTools,{$ifndef NODEBUG}FPDebug,{$endif}FPRedir,
   FPDesk,FPCodCmp,FPCodTmp;
   FPDesk,FPCodCmp,FPCodTmp;
@@ -1061,7 +1060,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.64  2000-06-16 21:19:41  pierre
+  Revision 1.65  2000-06-22 09:07:12  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.64  2000/06/16 21:19:41  pierre
    * Use Open instead of OpenSearch if OpenFileName is empty
    * Use Open instead of OpenSearch if OpenFileName is empty
 
 
   Revision 1.63  2000/06/16 08:50:40  pierre
   Revision 1.63  2000/06/16 08:50:40  pierre

+ 9 - 6
ide/text/fpini.pas

@@ -27,9 +27,9 @@ function  WriteINIFile: boolean;
 implementation
 implementation
 
 
 uses
 uses
-  Dos,Objects,Drivers,App,
+  Dos,Objects,Drivers,
   WINI,{$ifndef EDITORS}WEditor,WCEdit{$else}Editors{$endif},
   WINI,{$ifndef EDITORS}WEditor,WCEdit{$else}Editors{$endif},
-  {$ifndef NODEBUG}FPDebug,{$endif}FPConst,FPVars,FPViews,
+  {$ifndef NODEBUG}FPDebug,{$endif}FPConst,FPVars,
   FPIntf,FPTools,FPSwitch;
   FPIntf,FPTools,FPSwitch;
 
 
 const
 const
@@ -84,7 +84,7 @@ const
   ieWatchCount       = 'Count';
   ieWatchCount       = 'Count';
   ieWatchName        = 'Watch';
   ieWatchName        = 'Watch';
   ieSourceList       = 'SourceList';
   ieSourceList       = 'SourceList';
-  ieVideoMode        = 'VideoMode';
+{  ieVideoMode        = 'VideoMode';}
   ieAutoSave         = 'AutoSaveFlags';
   ieAutoSave         = 'AutoSaveFlags';
   ieMiscOptions      = 'MiscOptions';
   ieMiscOptions      = 'MiscOptions';
   ieDesktopLocation  = 'DesktopLocation';
   ieDesktopLocation  = 'DesktopLocation';
@@ -125,11 +125,11 @@ begin
   begin
   begin
     Inc(I); Hex:=false;
     Inc(I); Hex:=false;
     if S[I]='$' then begin Inc(I); Hex:=true; end;
     if S[I]='$' then begin Inc(I); Hex:=true; end;
-    P:=Pos('#',copy(S,I,255)); if P>0 then P:=I+P-1 else P:=length(S)+1;
+    P:=Pos('#',copy(S,I,High(S))); if P>0 then P:=I+P-1 else P:=length(S)+1;
     if Hex=false then
     if Hex=false then
       begin
       begin
         X:=StrToInt(copy(S,I,P-I));
         X:=StrToInt(copy(S,I,P-I));
-        OK:=(LastStrToIntResult=0) and (0<=X) and (X<=255);
+        OK:=(LastStrToIntResult=0) and (0<=X) and (X<=High(S));
       end
       end
     else
     else
       begin
       begin
@@ -528,7 +528,10 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.29  2000-06-16 08:50:41  pierre
+  Revision 1.30  2000-06-22 09:07:12  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.29  2000/06/16 08:50:41  pierre
    + new bunch of Gabor's changes
    + new bunch of Gabor's changes
 
 
   Revision 1.28  2000/03/21 23:30:22  pierre
   Revision 1.28  2000/03/21 23:30:22  pierre

+ 6 - 3
ide/text/fpintf.pas

@@ -30,11 +30,11 @@ procedure SetPrimaryFile(const fn:string);
 implementation
 implementation
 
 
 uses
 uses
-  Compiler,CompHook,
+  Compiler,
 {$ifndef NODEBUG}
 {$ifndef NODEBUG}
   FPDebug,
   FPDebug,
 {$endif NODEBUG}
 {$endif NODEBUG}
-  FPCompile,FPRedir,FPVars,
+  FPRedir,FPVars,
   FPUtils,FPSwitch;
   FPUtils,FPSwitch;
 
 
 {****************************************************************************
 {****************************************************************************
@@ -212,7 +212,10 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.11  2000-05-29 10:44:56  pierre
+  Revision 1.12  2000-06-22 09:07:12  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.11  2000/05/29 10:44:56  pierre
    + New bunch of Gabor's changes: see fixes.txt
    + New bunch of Gabor's changes: see fixes.txt
 
 
   Revision 1.10  2000/05/02 08:42:27  pierre
   Revision 1.10  2000/05/02 08:42:27  pierre

+ 5 - 2
ide/text/fpswitch.pas

@@ -172,7 +172,7 @@ implementation
 
 
 uses
 uses
   Dos,
   Dos,
-  GlobType,Tokens,Compiler,
+  GlobType,
   FPString,FPVars,FPUtils;
   FPString,FPVars,FPUtils;
 
 
 var
 var
@@ -1113,7 +1113,10 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.22  2000-05-02 08:42:28  pierre
+  Revision 1.23  2000-06-22 09:07:12  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.22  2000/05/02 08:42:28  pierre
    * new set of Gabor changes: see fixes.txt
    * new set of Gabor changes: see fixes.txt
 
 
   Revision 1.21  2000/04/25 08:42:33  pierre
   Revision 1.21  2000/04/25 08:42:33  pierre

+ 5 - 2
ide/text/fpsymbol.pas

@@ -868,7 +868,7 @@ end;
 
 
 procedure TSymbolReferenceView.HandleEvent(var Event: TEvent);
 procedure TSymbolReferenceView.HandleEvent(var Event: TEvent);
 var OldFocus: sw_integer;
 var OldFocus: sw_integer;
-    DontClear: boolean;
+{    DontClear: boolean;}
 begin
 begin
   OldFocus:=Focused;
   OldFocus:=Focused;
 {  case Event.What of
 {  case Event.What of
@@ -1692,7 +1692,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.28  2000-06-16 08:50:42  pierre
+  Revision 1.29  2000-06-22 09:07:12  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.28  2000/06/16 08:50:42  pierre
    + new bunch of Gabor's changes
    + new bunch of Gabor's changes
 
 
   Revision 1.27  2000/05/29 10:44:57  pierre
   Revision 1.27  2000/05/29 10:44:57  pierre

+ 6 - 3
ide/text/fptemplt.pas

@@ -169,11 +169,11 @@ begin
     ReadStringPos:=-1;
     ReadStringPos:=-1;
 end;
 end;
 
 
-function ReadString(const InS: string; StartP: sw_integer; var Expr: string): sw_integer;
+{function ReadString(const InS: string; StartP: sw_integer; var Expr: string): sw_integer;
 var P: sw_integer;
 var P: sw_integer;
 begin
 begin
   ReadString:=ReadStringPos(InS,StartP,Expr,P);
   ReadString:=ReadStringPos(InS,StartP,Expr,P);
-end;
+end;}
 
 
 function ProcessTemplateLine(var S: string): boolean;
 function ProcessTemplateLine(var S: string): boolean;
 var OK: boolean;
 var OK: boolean;
@@ -289,7 +289,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.9  2000-05-02 08:42:28  pierre
+  Revision 1.10  2000-06-22 09:07:12  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.9  2000/05/02 08:42:28  pierre
    * new set of Gabor changes: see fixes.txt
    * new set of Gabor changes: see fixes.txt
 
 
   Revision 1.8  1999/06/25 00:33:40  pierre
   Revision 1.8  1999/06/25 00:33:40  pierre

+ 15 - 12
ide/text/fptools.pas

@@ -149,8 +149,8 @@ implementation
 
 
 uses Dos,
 uses Dos,
      Commands,App,MsgBox,
      Commands,App,MsgBox,
-     WUtils,WINI,WEditor,
-     FPConst,FPString,FPVars,FPUtils,FPCodCmp,FPCodTmp;
+     WINI,WEditor,
+     FPConst,FPString,FPVars,FPUtils;
 
 
 {$ifndef NOOBJREG}
 {$ifndef NOOBJREG}
 const
 const
@@ -571,7 +571,7 @@ begin
   ReDraw;
   ReDraw;
 end;
 end;
 
 
-procedure ReplaceStr(var S: string; const What,NewS: string);
+(*procedure ReplaceStr(var S: string; const What,NewS: string);
 var I : integer;
 var I : integer;
 begin
 begin
   repeat
   repeat
@@ -597,7 +597,7 @@ begin
       Insert(NewS,S,I);
       Insert(NewS,S,I);
     end;
     end;
   until I=0;
   until I=0;
-end;
+end;*)
 
 
 function GetCoordEntry(F: PINIFile; Section, Entry: string; var P: TPoint): boolean;
 function GetCoordEntry(F: PINIFile; Section, Entry: string; var P: TPoint): boolean;
 var OK: boolean;
 var OK: boolean;
@@ -612,7 +612,7 @@ begin
   OK:=OK and (Px>0);
   OK:=OK and (Px>0);
   if OK then P.X:=StrToInt(copy(S,1,Px-1));
   if OK then P.X:=StrToInt(copy(S,1,Px-1));
   OK:=OK and (LastStrToIntResult=0);
   OK:=OK and (LastStrToIntResult=0);
-  if OK then P.Y:=StrToInt(copy(S,Px+1,255));
+  if OK then P.Y:=StrToInt(copy(S,Px+1,High(S)));
   OK:=OK and (LastStrToIntResult=0);
   OK:=OK and (LastStrToIntResult=0);
   GetCoordEntry:=OK;
   GetCoordEntry:=OK;
 end;
 end;
@@ -1008,7 +1008,7 @@ begin
         if (WordS='$CAP') then
         if (WordS='$CAP') then
           begin
           begin
             if (Pass=0) then
             if (Pass=0) then
-              if (Params[I]=' ') and (I<=255) then Params[I]:='_';
+              if (Params[I]=' ') and (I<=High(Params)) then Params[I]:='_';
           end else
           end else
         if (WordS='$CAP_MSG') then
         if (WordS='$CAP_MSG') then
           begin
           begin
@@ -1090,7 +1090,7 @@ begin
               if ReadTill(S,')')=false then Err:=I else
               if ReadTill(S,')')=false then Err:=I else
               begin
               begin
                 Consume(')');
                 Consume(')');
-                FSplit(S,D,N,E); E:=copy(E,2,255);
+                FSplit(S,D,N,E); E:=copy(E,2,High(E));
                 I:=I+ReplacePart(LastWordStart,I-1,E)-1;
                 I:=I+ReplacePart(LastWordStart,I-1,E)-1;
               end;
               end;
           end else
           end else
@@ -1167,9 +1167,9 @@ begin
                   I:=I+ReplacePart(LastWordStart,I-1,'')-1;
                   I:=I+ReplacePart(LastWordStart,I-1,'')-1;
                   if CheckOnly=false then
                   if CheckOnly=false then
                     begin
                     begin
-                      S:=copy(Params,I+1,255);
+                      S:=copy(Params,I+1,High(Params));
                       if InputBox(dialog_programarguments, label_enterprogramargument,
                       if InputBox(dialog_programarguments, label_enterprogramargument,
-                        S,255-I+1)=cmOK then
+                        S,High(Params)-I+1)=cmOK then
                         begin
                         begin
                           ReplacePart(LastWordStart,255,S);
                           ReplacePart(LastWordStart,255,S);
                           I:=255;
                           I:=255;
@@ -1182,7 +1182,7 @@ begin
         if (WordS='$SAVE') then
         if (WordS='$SAVE') then
           begin
           begin
             if (Pass=0) then
             if (Pass=0) then
-              if (Params[I]=' ') and (I<=255) then Params[I]:='_';
+              if (Params[I]=' ') and (I<=High(Params)) then Params[I]:='_';
           end else
           end else
         if (WordS='$SAVE_ALL') then
         if (WordS='$SAVE_ALL') then
           begin
           begin
@@ -1259,7 +1259,7 @@ procedure AddLine;
 begin
 begin
   Row:=ord(Line[1])+ord(Line[2]) shl 8;
   Row:=ord(Line[1])+ord(Line[2]) shl 8;
   Col:=ord(Line[3])+ord(Line[4]) shl 8;
   Col:=ord(Line[3])+ord(Line[4]) shl 8;
-  AddToolMessage(FileName,copy(Line,5,255),Row,Col);
+  AddToolMessage(FileName,copy(Line,5,High(Line)),Row,Col);
 end;
 end;
 begin
 begin
   New(S, Init(MsgFileName, stOpenRead, 4096));
   New(S, Init(MsgFileName, stOpenRead, 4096));
@@ -1507,7 +1507,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.19  2000-05-02 08:42:29  pierre
+  Revision 1.20  2000-06-22 09:07:12  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.19  2000/05/02 08:42:29  pierre
    * new set of Gabor changes: see fixes.txt
    * new set of Gabor changes: see fixes.txt
 
 
   Revision 1.18  2000/04/25 08:42:33  pierre
   Revision 1.18  2000/04/25 08:42:33  pierre

+ 5 - 2
ide/text/fputils.pas

@@ -126,7 +126,7 @@ function SmartPath(Path: string): string;
 var S: string;
 var S: string;
 begin
 begin
   GetDir(0,S); if copy(S,length(S),1)<>DirSep then S:=S+DirSep;
   GetDir(0,S); if copy(S,length(S),1)<>DirSep then S:=S+DirSep;
-  if (copy(Path,1,length(S))=S) {and (Pos('\',copy(Path,length(S)+1,255))=0)} then
+  if (copy(Path,1,length(S))=S) {and (Pos('\',copy(Path,length(S)+1,High(S)))=0)} then
      system.Delete(Path,1,length(S));
      system.Delete(Path,1,length(S));
   SmartPath:=Path;
   SmartPath:=Path;
 end;
 end;
@@ -664,7 +664,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.15  2000-04-18 11:42:37  pierre
+  Revision 1.16  2000-06-22 09:07:13  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.15  2000/04/18 11:42:37  pierre
    lot of Gabor changes : see fixes.txt
    lot of Gabor changes : see fixes.txt
 
 
   Revision 1.14  2000/01/03 11:38:34  michael
   Revision 1.14  2000/01/03 11:38:34  michael

+ 7 - 5
ide/text/fpviews.pas

@@ -440,8 +440,7 @@ procedure RegisterFPViews;
 implementation
 implementation
 
 
 uses
 uses
-  {$ifdef GABOR}crt,{$endif}
-  Video,Strings,Keyboard,Memory,MsgBox,Validate,
+  Video,Strings,Keyboard,Validate,
   Tokens,Version,
   Tokens,Version,
 {$ifndef NODEBUG}
 {$ifndef NODEBUG}
   gdbint,
   gdbint,
@@ -1389,8 +1388,8 @@ begin
       else if Editor^.GetModified then
       else if Editor^.GetModified then
         begin
         begin
           PA[1]:=@AFileName;
           PA[1]:=@AFileName;
-(*          longint(PA[2]):=Editor^.ChangedLine;
-          EditorDialog(edChangedOnloading,@PA);*)
+          longint(PA[2]):={Editor^.ChangedLine}-1;
+          EditorDialog(edChangedOnloading,@PA);
         end;
         end;
    end;
    end;
   Insert(Editor);
   Insert(Editor);
@@ -3472,7 +3471,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.72  2000-06-16 08:50:42  pierre
+  Revision 1.73  2000-06-22 09:07:13  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.72  2000/06/16 08:50:42  pierre
    + new bunch of Gabor's changes
    + new bunch of Gabor's changes
 
 
   Revision 1.71  2000/05/29 10:44:57  pierre
   Revision 1.71  2000/05/29 10:44:57  pierre

+ 4 - 2
ide/text/pmode.pas

@@ -581,7 +581,6 @@ end;
 
 
 procedure realcall(Proc: pointer; var r: registers);
 procedure realcall(Proc: pointer; var r: registers);
 var rr: trealregs;
 var rr: trealregs;
-const DPMI_INTR = $31;
 begin
 begin
   rr.realeax:=r.ax;
   rr.realeax:=r.ax;
   rr.realebx:=r.bx;
   rr.realebx:=r.bx;
@@ -718,7 +717,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.1  2000-04-20 08:47:39  pierre
+  Revision 1.2  2000-06-22 09:07:13  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.1  2000/04/20 08:47:39  pierre
    + new files from Gabor
    + new files from Gabor
 
 
 
 

+ 7 - 7
ide/text/readme.ide

@@ -76,13 +76,13 @@
   Documentation Ü
   Documentation Ü
  ßßßßßßßßßßßßßßßß
  ßßßßßßßßßßßßßßßß
  Although the IDE itself has no kind of "native"
  Although the IDE itself has no kind of "native"
- documentation or help, it is capable of reading both HTML
- and TPH format help files. That means, that you can use
- both the FPC documentation (included in your distribution,
- or downloadable from the Free Pascal HP) and/or the help
- files of your Turbo or Borland Pascal (from version 5.5
- thru 7.0) installation.
- You can install help files of both types in the on-line
+ documentation or help, it is capable of reading HTML,
+ Turbo Pascal (TPH), and Norton Guide (NG) format files.
+ That means, that you can use both the FPC documentation
+ (included in your distribution, or downloadable from the
+ Free Pascal HP) and/or the help files of your Turbo or
+ Borland Pascal (from version 5.5 thru 7.0) installation.
+ You can install help files of all types in the on-line
  help system by going to Help menu, selecting Files and
  help system by going to Help menu, selecting Files and
  adding them to the list.
  adding them to the list.
 
 

+ 21 - 244
ide/text/vesa.pas

@@ -19,16 +19,6 @@ interface
 
 
 uses
 uses
   Dos,
   Dos,
-  {$ifdef TP}
-    {$ifdef DPMI}
-    WinDos,WinAPI,
-    {$endif}
-  {$endif}
-  {$ifdef FPC}
-    {$ifdef GO32V2}
-    Go32,
-    {$endif}
-  {$endif}
   Objects,Strings,WUtils;
   Objects,Strings,WUtils;
 
 
 const
 const
@@ -136,170 +126,23 @@ function VESAGetMode(var Mode: word): boolean;
 function VESASelectMemoryWindow(Window: byte; Position: word): boolean;
 function VESASelectMemoryWindow(Window: byte; Position: word): boolean;
 function VESAReturnMemoryWindow(Window: byte; var Position: word): boolean;
 function VESAReturnMemoryWindow(Window: byte; var Position: word): boolean;
 
 
-function MemToStr(var B; Count: byte): string;
-
 implementation
 implementation
 
 
-{$IFDEF DPMI}
-const
-    DPMI_INTR      = $31;
-
-type
-    TDPMIRegisters = record     { DPMI call structure }
-      EDI     : LongInt;
-      ESI     : LongInt;
-      EBP     : LongInt;
-      Reserved: LongInt;
-      EBX     : LongInt;
-      EDX     : LongInt;
-      ECX     : LongInt;
-      EAX     : LongInt;
-      Flags   : Word;
-      ES      : Word;
-      DS      : Word;
-      FS      : Word;
-      GS      : Word;
-      IP      : Word;
-      CS      : Word;
-      SP      : Word;
-      SS      : Word;
-    end;
-
-  MemPtr = record
-  {$ifdef TP}
-    Selector: Word;  {Protected mode}
-    Segment : Word;  {Real mode}
-  {$endif}
-  {$ifdef FPC}
-    Selector: Word;  {Real mode}
-    Segment : Word;  {Protected mode}
-  {$endif}
-  end;
-
-  Function GetMem(var Mem : MemPtr; Size : Word): Boolean;
-    begin
-      if (Size > 0) then
-      begin
-      {$ifdef TP}
-        LongInt(Mem) := GlobalDOSAlloc(Size);
-      {$endif}
-      {$ifdef FPC}
-        longint(Mem) := global_dos_alloc(Size);
-        if int31error<>0 then longint(Mem):=0;
-      {$endif}
-        GetMem := (LongInt(Mem) <> 0);
-      end
-
-      else
-      begin
-        LongInt(Mem) := 0;
-        GetMem := True;
-      end;
-    end;
-
-  Procedure FreeMem(Mem : MemPtr; Size : Word);
-    begin
-      {$ifdef TP}
-      if (Size > 0) then
-        GlobalDOSFree(Mem.Selector);
-      {$endif}
-      {$ifdef FPC}
-      if (Size > 0) then
-        global_dos_free(Mem.Selector);
-      {$endif}
-    end;
-
-  Function MakePtr(Mem : MemPtr): Pointer;
-    begin
-      MakePtr := Ptr(Mem.Selector, 0);
-    end;
-
-  {$ifdef TP}
-  var
-    DPMIRegs: TDPMIRegisters;
-
-  procedure realintr(IntNo: byte; var r: tregisters);
-  var Regs: TRegisters;
-  begin
-    FillChar(DPMIRegs, SizeOf(TDPMIRegisters), 0);
-    DPMIRegs.EAX := r.ax;
-    DPMIRegs.EBX := r.bx;
-    DPMIRegs.ECX := r.cx;
-    DPMIRegs.EDX := r.dx;
-    DPMIRegs.EDI := r.di;
-    DPMIRegs.ESI := r.si;
-    DPMIRegs.EBP := r.bp;
-    DPMIRegs.DS := r.ds;
-    DPMIRegs.ES := r.es;
-    DPMIRegs.Flags := r.flags;
-    Regs.AX := $0300;
-    Regs.BL := IntNo;
-    Regs.BH := 0;
-    Regs.CX := 0;
-    Regs.ES := Seg(DPMIRegs);
-    Regs.DI := Ofs(DPMIRegs);
-    Dos.Intr(DPMI_INTR, Regs);
-    r.ax := DPMIRegs.EAX;
-    r.bx := DPMIRegs.EBX;
-    r.cx := DPMIRegs.ECX;
-    r.dx := DPMIRegs.EDX;
-    r.di := DPMIRegs.EDI;
-    r.si := DPMIRegs.ESI;
-    r.bp := DPMIRegs.EBP;
-    r.ds := DPMIRegs.DS;
-    r.es := DPMIRegs.ES;
-    r.Flags := DPMIRegs.Flags;
-  end;
-  {$endif}
-{$ENDIF}
-
-function MemToStr(var B; Count: byte): string;
-var S: string;
-begin
-  S[0]:=chr(Count);
-  if Count>0 then Move(B,S[1],Count);
-  MemToStr:=S;
-end;
-
-procedure StrToMem(S: string; var B);
-begin
-  if length(S)>0 then Move(S[1],B,length(S));
-end;
+uses pmode;
 
 
 function VESAGetInfo(var B: TVESAInfoBlock): boolean;
 function VESAGetInfo(var B: TVESAInfoBlock): boolean;
-{$IFNDEF DPMI}
-var r : registers;
-{$ELSE}
-var r : tregisters;
-    pB : MemPtr;
-{$ENDIF}
+var r: registers;
     OK: boolean;
     OK: boolean;
+    M: MemPtr;
 begin
 begin
   StrToMem('VBE2',B.Signature);
   StrToMem('VBE2',B.Signature);
+  GetDosMem(M,SizeOf(B));
+  M.MoveDataTo(B,sizeof(B));
   r.ah:=$4f; r.al:=0;
   r.ah:=$4f; r.al:=0;
-{$IFNDEF DPMI}
-  r.es:=seg(B); r.di:=ofs(B);
-  intr($10,r);
-{$ELSE}
-  GetMem(pB, SizeOf(B));
-  {$ifdef TP}
-  Move(B,MakePtr(pB)^,SizeOf(B));
-  {$endif}
-  {$ifdef FPC}
-  dosmemput(pB.Segment,0,B,SizeOf(B));
-  {$endif}
-  r.es:=pB.Segment; r.di:=0; r.ds:=r.es;
+  r.es:=M.DosSeg; r.di:=M.DosOfs;
   realintr($10,r);
   realintr($10,r);
-{$ENDIF}
-{$IFDEF DPMI}
-  {$ifdef TP}
-  Move(MakePtr(pB)^,B,SizeOf(B));
-  {$endif}
-  {$ifdef FPC}
-  dosmemget(pB.Segment,0,B,SizeOf(B));
-  {$endif}
-  FreeMem(pB, SizeOf(B));
-{$ENDIF}
+  M.MoveDataFrom(sizeof(B),B);
+  FreeDosMem(M);
   OK:=(r.ax=$004f){ and (MemToStr(B.Signature,4)='VESA')};
   OK:=(r.ax=$004f){ and (MemToStr(B.Signature,4)='VESA')};
   VESAGetInfo:=OK;
   VESAGetInfo:=OK;
 end;
 end;
@@ -307,36 +150,15 @@ end;
 function VESAGetModeList(var B: TVESAModeList): boolean;
 function VESAGetModeList(var B: TVESAModeList): boolean;
 var OK: boolean;
 var OK: boolean;
     VI: TVESAInfoBlock;
     VI: TVESAInfoBlock;
-    {$ifdef TP}
-    {$ifdef DPMI}
-    Sel: word;
-    {$endif}
-    {$endif}
 begin
 begin
   FillChar(B,SizeOf(B),0);
   FillChar(B,SizeOf(B),0);
   OK:=VESAGetInfo(VI);
   OK:=VESAGetInfo(VI);
   if OK then
   if OK then
   begin
   begin
-    {$ifdef TP}
-    {$ifdef DPMI}
-    Sel:=AllocSelector(0);
-    OK:=Sel<>0;
+    OK:=MoveDosToPM(VI.VideoModeList,@B.Modes,sizeof(B.Modes));
     if OK then
     if OK then
-    begin
-      SetSelectorBase(Sel,(longint(VI.VideoModeList) shr 16)*16+longint(VI.VideoModeList) and $ffff);
-      SetSelectorLimit(Sel,SizeOf(B.Modes));
-      Move(ptr(Sel,0)^,B.Modes,SizeOf(B.Modes));
-      FreeSelector(Sel);
-    end;
-    {$endif}
-    {$endif}
-    {$ifdef FPC}
-      with VI do
-      dosmemget(PtrRec(VideoModeList).Seg,PtrRec(VideoModeList).Ofs,B.Modes,SizeOf(B.Modes));
-    {$endif}
-    if OK then
-    while (B.Modes[B.Count+1]<>$ffff) and (B.Count<255) do
-          Inc(B.Count);
+      while (B.Modes[B.Count+1]<>$ffff) and (B.Count<High(B.Modes)) do
+            Inc(B.Count);
   end;
   end;
   VESAGetModeList:=OK;
   VESAGetModeList:=OK;
 end;
 end;
@@ -364,74 +186,26 @@ end;
 function VESAGetOemString: string;
 function VESAGetOemString: string;
 var OK: boolean;
 var OK: boolean;
     VI: TVESAInfoBlock;
     VI: TVESAInfoBlock;
-    {$ifdef TP}
-    {$ifdef DPMI}
-    Sel: word;
-    {$endif}
-    {$endif}
     S: array[0..256] of char;
     S: array[0..256] of char;
 begin
 begin
   FillChar(S,SizeOf(S),0);
   FillChar(S,SizeOf(S),0);
   OK:=VESAGetInfo(VI);
   OK:=VESAGetInfo(VI);
-  {$IFDEF DPMI}
   if OK then
   if OK then
-  begin
-    {$ifdef TP}
-    Sel:=AllocSelector(0);
-    OK:=Sel<>0;
-    if OK then
-    begin
-      SetSelectorBase(Sel,longint(PtrRec16(VI.OemString).Seg)*16+PtrRec16(VI.OemString).Ofs);
-      SetSelectorLimit(Sel,SizeOf(S));
-      Move(ptr(Sel,0)^,S,SizeOf(S));
-      FreeSelector(Sel);
-    end;
-    {$endif}
-    {$ifdef FPC}
-    dosmemget(PtrRec16(VI.OemString).Seg,PtrRec16(VI.OemString).Ofs,S,SizeOf(S));
-    {$endif}
-  end;
-  {$ELSE}
-    Move(VI.OemString^,S,SizeOf(S));
-  {$ENDIF}
+    OK:=MoveDosToPM(VI.OemString,@S,sizeof(S));
   VESAGetOemString:=StrPas(@S);
   VESAGetOemString:=StrPas(@S);
 end;
 end;
 
 
 function VESAGetModeInfo(Mode: word; var B: TVESAModeInfoBlock): boolean;
 function VESAGetModeInfo(Mode: word; var B: TVESAModeInfoBlock): boolean;
-{$IFNDEF DPMI}
 var r : registers;
 var r : registers;
-{$ELSE}
-var r : tregisters;
-{$ENDIF}
+    M : MemPtr;
     OK: boolean;
     OK: boolean;
-{$ifdef DPMI}
-    pB: MemPtr;
-{$endif}
 begin
 begin
   r.ah:=$4f; r.al:=$01; r.cx:=Mode;
   r.ah:=$4f; r.al:=$01; r.cx:=Mode;
-{$IFDEF DPMI}
-  GetMem(pB, SizeOf(B));
-  {$ifdef TP}
-  Move(B,MakePtr(pB)^,SizeOf(B));
-  {$endif}
-  {$ifdef FPC}
-  dosmemput(pB.Segment,0,B,SizeOf(B));
-  {$endif}
-  r.es:=pB.Segment; r.di:=0; {r.ds:=r.es;}
+  GetDosMem(M,sizeof(B));
+  r.es:=M.DosSeg; r.di:=M.DosOfs; {r.ds:=r.es;}
   realintr($10,r);
   realintr($10,r);
-{$ELSE}
-  r.es:=seg(B); r.di:=ofs(B);
-  intr($10,r);
-{$ENDIF}
-{$IFDEF DPMI}
-  {$ifdef TP}
-  Move(MakePtr(pB)^,B,SizeOf(B));
-  {$endif}
-  {$ifdef FPC}
-  dosmemget(pB.Segment,0,B,SizeOf(B));
-  {$endif}
-  FreeMem(pB, SizeOf(B));
-{$ENDIF}
+  M.MoveDataFrom(sizeof(B),B);
+  FreeDosMem(M);
   OK:=(r.ax=$004f);
   OK:=(r.ax=$004f);
   VESAGetModeInfo:=OK;
   VESAGetModeInfo:=OK;
 end;
 end;
@@ -490,7 +264,10 @@ BEGIN
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.7  2000-03-21 23:22:37  pierre
+  Revision 1.8  2000-06-22 09:07:13  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.7  2000/03/21 23:22:37  pierre
    Gabor fixes to avoid unused vars
    Gabor fixes to avoid unused vars
 
 
   Revision 1.6  2000/01/03 11:38:35  michael
   Revision 1.6  2000/01/03 11:38:35  michael

+ 0 - 2
ide/text/wansi.pas

@@ -735,7 +735,6 @@ begin
 end;
 end;
 
 
 procedure TANSIView.Draw;
 procedure TANSIView.Draw;
-type PDrawBuffer = ^TDrawBuffer;
 var I: integer;
 var I: integer;
     Pos: longint;
     Pos: longint;
     X,Y: integer;
     X,Y: integer;
@@ -940,7 +939,6 @@ begin
 end;
 end;
 
 
 procedure TANSIBackground.Draw;
 procedure TANSIBackground.Draw;
-type PDrawBuffer = ^TDrawBuffer;
 var I: integer;
 var I: integer;
     Pos: longint;
     Pos: longint;
     X,Y: integer;
     X,Y: integer;

+ 2 - 2
ide/text/wcedit.pas

@@ -533,8 +533,8 @@ begin
          begin
          begin
            PAdd:=TabSize-((p-1) mod TabSize);
            PAdd:=TabSize-((p-1) mod TabSize);
            if DF<>'' then
            if DF<>'' then
-            DF:=copy(DF,1,P-1)+CharStr(DF[p],PAdd)+copy(DF,P+1,255);
-           DT:=copy(DT,1,P-1)+CharStr(' ',PAdd)+copy(DT,P+1,255);
+            DF:=copy(DF,1,P-1)+CharStr(DF[p],PAdd)+copy(DF,P+1,High(DF));
+           DT:=copy(DT,1,P-1)+CharStr(' ',PAdd)+copy(DT,P+1,High(DF));
            inc(P,PAdd-1);
            inc(P,PAdd-1);
          end;
          end;
       end;
       end;

+ 44 - 31
ide/text/weditor.pas

@@ -55,7 +55,7 @@ const
       cmToggleCase           = 51263;
       cmToggleCase           = 51263;
 
 
       EditorTextBufSize = {$ifdef FPC}32768{$else} 4096{$endif};
       EditorTextBufSize = {$ifdef FPC}32768{$else} 4096{$endif};
-      MaxLineLength     = {$ifdef FPC}  255{$else}  255{$endif};
+      MaxLineLength     = 255;
       MaxLineCount      = {$ifdef FPC}2000000{$else}16380{$endif};
       MaxLineCount      = {$ifdef FPC}2000000{$else}16380{$endif};
 
 
       CodeCompleteMinLen = 4; { minimum length of text to try to complete }
       CodeCompleteMinLen = 4; { minimum length of text to try to complete }
@@ -933,7 +933,7 @@ begin
      if s[p]=TAB then
      if s[p]=TAB then
       begin
       begin
         PAdd:=TabSize-((p-1) mod TabSize);
         PAdd:=TabSize-((p-1) mod TabSize);
-        s:=copy(S,1,P-1)+CharStr(' ',PAdd)+copy(S,P+1,255);
+        s:=copy(S,1,P-1)+CharStr(' ',PAdd)+copy(S,P+1,High(s));
         inc(P,PAdd-1);
         inc(P,PAdd-1);
       end;
       end;
    end;
    end;
@@ -948,7 +948,7 @@ begin
   repeat
   repeat
     P:=Pos(TabS,S);
     P:=Pos(TabS,S);
     if P>0 then
     if P>0 then
-      S:=copy(S,1,P-1)+TAB+copy(S,P+TabSize,255);
+      S:=copy(S,1,P-1)+TAB+copy(S,P+TabSize,High(S));
   until P=0;
   until P=0;
   CompressUsingTabs:=S;
   CompressUsingTabs:=S;
 end;}
 end;}
@@ -1782,21 +1782,31 @@ begin
 end;
 end;
 
 
 function TCustomCodeEditorCore.UpdateAttrs(FromLine: sw_integer; Attrs: byte): sw_integer;
 function TCustomCodeEditorCore.UpdateAttrs(FromLine: sw_integer; Attrs: byte): sw_integer;
+var MinLine: sw_integer;
 procedure CallIt(P: PEditorBinding); {$ifndef FPC}far;{$endif}
 procedure CallIt(P: PEditorBinding); {$ifndef FPC}far;{$endif}
+var I: sw_integer;
 begin
 begin
-  DoUpdateAttrs(P^.Editor,FromLine,Attrs);
+  I:=DoUpdateAttrs(P^.Editor,FromLine,Attrs);
+  if (I<MinLine) or (MinLine=-1) then MinLine:=I;
 end;
 end;
 begin
 begin
+  MinLine:=-1;
   Bindings^.ForEach(@CallIt);
   Bindings^.ForEach(@CallIt);
+  UpdateAttrs:=MinLine;
 end;
 end;
 
 
 function TCustomCodeEditorCore.UpdateAttrsRange(FromLine, ToLine: sw_integer; Attrs: byte): sw_integer;
 function TCustomCodeEditorCore.UpdateAttrsRange(FromLine, ToLine: sw_integer; Attrs: byte): sw_integer;
+var MinLine: sw_integer;
 procedure CallIt(P: PEditorBinding); {$ifndef FPC}far;{$endif}
 procedure CallIt(P: PEditorBinding); {$ifndef FPC}far;{$endif}
+var I: sw_integer;
 begin
 begin
-  DoUpdateAttrsRange(P^.Editor,FromLine,ToLine,Attrs);
+  I:=DoUpdateAttrsRange(P^.Editor,FromLine,ToLine,Attrs);
+  if (I<MinLine) or (MinLine=-1) then MinLine:=I;
 end;
 end;
 begin
 begin
+  MinLine:=-1;
   Bindings^.ForEach(@CallIt);
   Bindings^.ForEach(@CallIt);
+  UpdateAttrsRange:=MinLine;
 end;
 end;
 
 
 function TCustomCodeEditorCore.DoUpdateAttrs(Editor: PCustomCodeEditor; FromLine: sw_integer; Attrs: byte): sw_integer;
 function TCustomCodeEditorCore.DoUpdateAttrs(Editor: PCustomCodeEditor; FromLine: sw_integer; Attrs: byte): sw_integer;
@@ -2538,7 +2548,7 @@ begin
     LineDelta:=0; LineCount:=(Editor^.SelEnd.Y-Editor^.SelStart.Y)+1;
     LineDelta:=0; LineCount:=(Editor^.SelEnd.Y-Editor^.SelStart.Y)+1;
     OK:=GetLineCount<MaxLineCount;
     OK:=GetLineCount<MaxLineCount;
     OrigS:=GetDisplayText(DestPos.Y);
     OrigS:=GetDisplayText(DestPos.Y);
-    AfterS:=Copy(OrigS,DestPos.X+1,255);
+    AfterS:=Copy(OrigS,DestPos.X+1,High(OrigS));
 
 
     while OK and (LineDelta<LineCount) do
     while OK and (LineDelta<LineCount) do
     begin
     begin
@@ -2559,13 +2569,13 @@ begin
       if (LineDelta=LineCount-1) or VerticalBlock then
       if (LineDelta=LineCount-1) or VerticalBlock then
         LineEndX:=Editor^.SelEnd.X-1
         LineEndX:=Editor^.SelEnd.X-1
       else
       else
-        LineEndX:=255;
+        LineEndX:=High(S);
 
 
       if LineEndX<LineStartX then
       if LineEndX<LineStartX then
         S:=''
         S:=''
       else if VerticalBlock then
       else if VerticalBlock then
         S:=RExpand(copy(Editor^.GetLineText(Editor^.SelStart.Y+LineDelta),LineStartX+1,LineEndX-LineStartX+1),
         S:=RExpand(copy(Editor^.GetLineText(Editor^.SelStart.Y+LineDelta),LineStartX+1,LineEndX-LineStartX+1),
-                   Min(LineEndX-LineStartX+1,255))
+                   Min(LineEndX-LineStartX+1,High(S)))
       else
       else
         S:=copy(Editor^.GetLineText(Editor^.SelStart.Y+LineDelta),LineStartX+1,LineEndX-LineStartX+1);
         S:=copy(Editor^.GetLineText(Editor^.SelStart.Y+LineDelta),LineStartX+1,LineEndX-LineStartX+1);
       if VerticalBlock=false then
       if VerticalBlock=false then
@@ -3161,7 +3171,7 @@ var SelectColor,
     LineText,Format: string;
     LineText,Format: string;
     isBreak : boolean;
     isBreak : boolean;
     C: char;
     C: char;
-    FreeFormat: array[0..255] of boolean;
+    FreeFormat: array[0..MaxLineLength] of boolean;
     Color: word;
     Color: word;
     ColorTab: array[coFirstColor..coLastColor] of word;
     ColorTab: array[coFirstColor..coLastColor] of word;
     ErrorLine: integer;
     ErrorLine: integer;
@@ -3240,7 +3250,7 @@ begin
 
 
 {    if FlagSet(efSyntaxHighlight) then MaxX:=length(LineText)+1
 {    if FlagSet(efSyntaxHighlight) then MaxX:=length(LineText)+1
        else }MaxX:=Size.X+Delta.X;
        else }MaxX:=Size.X+Delta.X;
-    for X:=1 to Min(MaxX,255) do
+    for X:=1 to Min(MaxX,High(LineText)) do
     begin
     begin
       AX:=Delta.X+X-1;
       AX:=Delta.X+X-1;
       if X<=length(LineText) then C:=LineText[X] else C:=' ';
       if X<=length(LineText) then C:=LineText[X] else C:=' ';
@@ -3403,7 +3413,7 @@ begin
       while (CurPos.X+Shift<length(PreS)) and (PreS[CurPos.X+Shift]<>' ') do
       while (CurPos.X+Shift<length(PreS)) and (PreS[CurPos.X+Shift]<>' ') do
        Inc(Shift);
        Inc(Shift);
     end;
     end;
-  SetLineText(CurPos.Y,RExpand(copy(S,1,CurPos.X+1),CurPos.X+1)+CharStr(' ',Shift)+copy(S,CurPos.X+2,255));
+  SetLineText(CurPos.Y,RExpand(copy(S,1,CurPos.X+1),CurPos.X+1)+CharStr(' ',Shift)+copy(S,CurPos.X+2,High(S)));
   SetCurPtr(CurPos.X+Shift,CurPos.Y);
   SetCurPtr(CurPos.X+Shift,CurPos.Y);
   UpdateAttrs(CurPos.Y,attrAll);
   UpdateAttrs(CurPos.Y,attrAll);
   DrawLines(CurPos.Y);
   DrawLines(CurPos.Y);
@@ -3736,7 +3746,7 @@ var SymIdx: integer;
     LineText,LineAttr: string;
     LineText,LineAttr: string;
     CurChar: char;
     CurChar: char;
     X,Y: sw_integer;
     X,Y: sw_integer;
-    P,LineCount: sw_integer;
+    LineCount: sw_integer;
     JumpPos: TPoint;
     JumpPos: TPoint;
     BracketLevel: integer;
     BracketLevel: integer;
 begin
 begin
@@ -3843,7 +3853,7 @@ begin
     end;
     end;
     SetDisplayText(CurPos.Y,copy(S,1,CurPos.X-1+1));
     SetDisplayText(CurPos.Y,copy(S,1,CurPos.X-1+1));
     CalcIndent(CurPos.Y);
     CalcIndent(CurPos.Y);
-    InsertLine(CurPos.Y+1,IndentStr+copy(S,CurPos.X+1,255));
+    InsertLine(CurPos.Y+1,IndentStr+copy(S,CurPos.X+1,High(S)));
     LimitsChanged;
     LimitsChanged;
 (*    if PointOfs(SelStart)<>PointOfs(SelEnd) then { !!! check it - it's buggy !!! }
 (*    if PointOfs(SelStart)<>PointOfs(SelEnd) then { !!! check it - it's buggy !!! }
       begin SelEnd.Y:=CurPos.Y+1; SelEnd.X:=length(GetLineText(CurPos.Y+1))-SelBack; end;*)
       begin SelEnd.Y:=CurPos.Y+1; SelEnd.X:=length(GetLineText(CurPos.Y+1))-SelBack; end;*)
@@ -3943,7 +3953,7 @@ begin
      S:=GetLineText(CurPos.Y);
      S:=GetLineText(CurPos.Y);
      OI:=LinePosToCharIdx(CurPos.Y,CurPos.X);
      OI:=LinePosToCharIdx(CurPos.Y,CurPos.X);
      CI:=LinePosToCharIdx(CurPos.Y,CP);
      CI:=LinePosToCharIdx(CurPos.Y,CP);
-     SetLineText(CurPos.Y,copy(S,1,CI-1)+copy(S,OI,255));
+     SetLineText(CurPos.Y,copy(S,1,CI-1)+copy(S,OI,High(S)));
      SetCurPtr(CP,CurPos.Y);
      SetCurPtr(CP,CurPos.Y);
 {$ifdef Undo}
 {$ifdef Undo}
      SetStoreUndo(HoldUndo);
      SetStoreUndo(HoldUndo);
@@ -3990,7 +4000,7 @@ begin
      CI:=LinePosToCharIdx(CurPos.Y,CurPos.X);
      CI:=LinePosToCharIdx(CurPos.Y,CurPos.X);
      if S[CI]=TAB then
      if S[CI]=TAB then
        begin
        begin
-         S:=Copy(S,1,CI-1)+CharStr(' ',GetTabSize-1)+Copy(S,CI+1,255);
+         S:=Copy(S,1,CI-1)+CharStr(' ',GetTabSize-1)+Copy(S,CI+1,High(S));
 {$ifdef Undo}
 {$ifdef Undo}
          SetStoreUndo(HoldUndo);
          SetStoreUndo(HoldUndo);
          Addaction(eaDeleteText,CurPos,CurPos,' ');
          Addaction(eaDeleteText,CurPos,CurPos,' ');
@@ -4044,7 +4054,7 @@ begin
   S:=GetLineText(CurPos.Y);
   S:=GetLineText(CurPos.Y);
   if (S<>'') and (CurPos.X<>0) then
   if (S<>'') and (CurPos.X<>0) then
   begin
   begin
-    SetLineText(CurPos.Y,copy(S,LinePosToCharIdx(CurPos.Y,CurPos.X),255));
+    SetLineText(CurPos.Y,copy(S,LinePosToCharIdx(CurPos.Y,CurPos.X),High(S)));
     SetCurPtr(0,CurPos.Y);
     SetCurPtr(0,CurPos.Y);
     UpdateAttrs(CurPos.Y,attrAll);
     UpdateAttrs(CurPos.Y,attrAll);
     DrawLines(CurPos.Y);
     DrawLines(CurPos.Y);
@@ -4073,13 +4083,13 @@ end;
 procedure TCustomCodeEditor.DelLine;
 procedure TCustomCodeEditor.DelLine;
 var
 var
   HoldUndo : boolean;
   HoldUndo : boolean;
-  SP : TPoint;
+{  SP : TPoint;}
 begin
 begin
   if IsReadOnly then Exit;
   if IsReadOnly then Exit;
   Lock;
   Lock;
   if GetLineCount>0 then
   if GetLineCount>0 then
   begin
   begin
-    SP:=CurPos;
+{    SP:=CurPos;}
     DeleteLine(CurPos.Y);
     DeleteLine(CurPos.Y);
     HoldUndo:=GetStoreUndo;
     HoldUndo:=GetStoreUndo;
     SetStoreUndo(false);
     SetStoreUndo(false);
@@ -4194,7 +4204,7 @@ begin
       StartX:=SelStart.X;
       StartX:=SelStart.X;
       EndX:=SelEnd.X;
       EndX:=SelEnd.X;
       SetDisplayText(CurLine,RExpand(copy(S,1,StartX),StartX)
       SetDisplayText(CurLine,RExpand(copy(S,1,StartX),StartX)
-        +copy(S,EndX+1,255));
+        +copy(S,EndX+1,High(S)));
       if GetStoreUndo then
       if GetStoreUndo then
         begin
         begin
           SPos.X:=StartX;
           SPos.X:=StartX;
@@ -4211,12 +4221,12 @@ begin
       StartX:=SelStart.X;
       StartX:=SelStart.X;
       EndX:=SelEnd.X;
       EndX:=SelEnd.X;
       SetDisplayText(CurLine,RExpand(copy(S,1,StartX),StartX)
       SetDisplayText(CurLine,RExpand(copy(S,1,StartX),StartX)
-        +copy(GetDisplayText(CurLine+LineCount-1),EndX+1,255));
+        +copy(GetDisplayText(CurLine+LineCount-1),EndX+1,High(S)));
       if GetStoreUndo then
       if GetStoreUndo then
         begin
         begin
           SPos.X:=StartX;
           SPos.X:=StartX;
           SPos.Y:=CurLine;
           SPos.Y:=CurLine;
-          AddAction(eaDeleteText,SPos,SPos,Copy(S,StartX+1,255));
+          AddAction(eaDeleteText,SPos,SPos,Copy(S,StartX+1,High(S)));
           S:=GetDisplayText(CurLine+LineCount-1);
           S:=GetDisplayText(CurLine+LineCount-1);
         end;
         end;
       Inc(CurLine);
       Inc(CurLine);
@@ -4230,7 +4240,7 @@ begin
         end;
         end;
       if GetStoreUndo then
       if GetStoreUndo then
         begin
         begin
-          AddAction(eaInsertText,SPos,SPos,Copy(S,EndX+1,255));
+          AddAction(eaInsertText,SPos,SPos,Copy(S,EndX+1,High(S)));
         end;
         end;
     end;
     end;
   HideSelect;
   HideSelect;
@@ -4552,15 +4562,15 @@ begin
         TabStart:=CharIdxToLinePos(CurPos.Y,CI-1)+1;
         TabStart:=CharIdxToLinePos(CurPos.Y,CI-1)+1;
       if SC=Tab then TabS:=Tab else
       if SC=Tab then TabS:=Tab else
         TabS:=CharStr(' ',CurPos.X-TabStart);
         TabS:=CharStr(' ',CurPos.X-TabStart);
-      SetLineText(CurPos.Y,copy(S,1,CI-1)+TabS+SC+copy(S,CI+1,255));
+      SetLineText(CurPos.Y,copy(S,1,CI-1)+TabS+SC+copy(S,CI+1,High(S)));
       SetCurPtr(CharIdxToLinePos(CurPos.Y,CI+length(TabS)+length(SC)),CurPos.Y);
       SetCurPtr(CharIdxToLinePos(CurPos.Y,CI+length(TabS)+length(SC)),CurPos.Y);
     end
     end
   else
   else
     begin
     begin
       if Overwrite and (CI<=length(S)) then
       if Overwrite and (CI<=length(S)) then
-        SetLineText(CurPos.Y,copy(S,1,CI-1)+SC+copy(S,CI+length(SC),255))
+        SetLineText(CurPos.Y,copy(S,1,CI-1)+SC+copy(S,CI+length(SC),High(S)))
       else
       else
-        SetLineText(CurPos.Y,copy(S,1,CI-1)+SC+copy(S,CI,255));
+        SetLineText(CurPos.Y,copy(S,1,CI-1)+SC+copy(S,CI,High(S)));
       SetCurPtr(CharIdxToLinePos(CurPos.Y,CI+length(SC)),CurPos.Y);
       SetCurPtr(CharIdxToLinePos(CurPos.Y,CI+length(SC)),CurPos.Y);
     end;
     end;
 {$ifdef Undo}
 {$ifdef Undo}
@@ -4691,7 +4701,7 @@ begin
   s:=GetLineText(i);
   s:=GetLineText(i);
   str_begin:=LinePosToCharIdx(i,SelStart.X);
   str_begin:=LinePosToCharIdx(i,SelStart.X);
   if SelEnd.Y>SelStart.Y then
   if SelEnd.Y>SelStart.Y then
-    str_end:=255
+    str_end:=High(S)
   else
   else
     str_end:=LinePosToCharIdx(i,SelEnd.X)-1;
     str_end:=LinePosToCharIdx(i,SelEnd.X)-1;
   s:=copy(s,str_begin,str_end-str_begin+1);
   s:=copy(s,str_begin,str_end-str_begin+1);
@@ -5136,15 +5146,15 @@ begin
 end;
 end;
 
 
 procedure TCustomCodeEditor.SetCurPtr(X,Y: sw_integer);
 procedure TCustomCodeEditor.SetCurPtr(X,Y: sw_integer);
-var OldPos,{OldSEnd,}OldSStart: TPoint;
+var OldPos{,OldSEnd,OldSStart}: TPoint;
     Extended: boolean;
     Extended: boolean;
 begin
 begin
   Lock;
   Lock;
   X:=Max(0,Min(MaxLineLength+1,X));
   X:=Max(0,Min(MaxLineLength+1,X));
   Y:=Max(0,Min(GetLineCount-1,Y));
   Y:=Max(0,Min(GetLineCount-1,Y));
   OldPos:=CurPos;
   OldPos:=CurPos;
-{  OldSEnd:=SelEnd;}
-  OldSStart:=SelStart;
+{  OldSEnd:=SelEnd;
+  OldSStart:=SelStart;}
   CurPos.X:=X;
   CurPos.X:=X;
   CurPos.Y:=Y;
   CurPos.Y:=Y;
   TrackCursor(false);
   TrackCursor(false);
@@ -5463,7 +5473,7 @@ begin
       S:=CompressUsingTabs(S,TabSize);
       S:=CompressUsingTabs(S,TabSize);
       }
       }
     if Line=EndP.Y then S:=copy(S,1,LinePosToCharIdx(Line,EndP.X));
     if Line=EndP.Y then S:=copy(S,1,LinePosToCharIdx(Line,EndP.X));
-    if Line=StartP.Y then S:=copy(S,LinePosToCharIdx(Line,StartP.X),255);
+    if Line=StartP.Y then S:=copy(S,LinePosToCharIdx(Line,StartP.X),High(S));
     Stream^.Write(S[1],length(S));
     Stream^.Write(S[1],length(S));
     if Line<EndP.Y then
     if Line<EndP.Y then
       Stream^.Write(EOL[1],length(EOL));
       Stream^.Write(EOL[1],length(EOL));
@@ -5848,7 +5858,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.94  2000-06-16 21:17:39  pierre
+  Revision 1.95  2000-06-22 09:07:13  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.94  2000/06/16 21:17:39  pierre
    + TCustoCodeEditorCore.GetChangedLine
    + TCustoCodeEditorCore.GetChangedLine
 
 
   Revision 1.93  2000/06/16 08:50:43  pierre
   Revision 1.93  2000/06/16 08:50:43  pierre

+ 96 - 42
ide/text/whelp.pas

@@ -37,13 +37,13 @@ const
       ncRawChar      = $F;
       ncRawChar      = $F;
       ncRepChar      = $E;
       ncRepChar      = $E;
 
 
-      rtFileHeader   = Byte ($0);
-      rtContext      = Byte ($1);
-      rtText         = Byte ($2);
-      rtKeyWord      = Byte ($3);
-      rtIndex        = Byte ($4);
-      rtCompression  = Byte ($5);
-      rtIndexTags    = Byte ($6);
+      oa_rtFileHeader   = Byte ($0);
+      oa_rtContext      = Byte ($1);
+      oa_rtText         = Byte ($2);
+      oa_rtKeyWord      = Byte ($3);
+      oa_rtIndex        = Byte ($4);
+      oa_rtCompression  = Byte ($5);
+      oa_rtIndexTags    = Byte ($6);
 
 
       ctNone         = $00;
       ctNone         = $00;
       ctNibble       = $02;
       ctNibble       = $02;
@@ -137,7 +137,7 @@ type
       end;
       end;
 
 
       TRecord = packed record
       TRecord = packed record
-        SClass   : byte;
+        SClass   : word;
         Size     : word;
         Size     : word;
         Data     : pointer;
         Data     : pointer;
       end;
       end;
@@ -197,6 +197,8 @@ type
         IndexEntries : PIndexEntryCollection;
         IndexEntries : PIndexEntryCollection;
         constructor Init(AID: word);
         constructor Init(AID: word);
         function    LoadTopic(HelpCtx: THelpCtx): PTopic; virtual;
         function    LoadTopic(HelpCtx: THelpCtx): PTopic; virtual;
+        procedure   AddTopic(HelpCtx: THelpCtx; Pos: longint; const Param: string);
+        procedure   AddIndexEntry(const Text: string; AHelpCtx: THelpCtx);
         destructor  Done; virtual;
         destructor  Done; virtual;
       public
       public
         function    LoadIndex: boolean; virtual;
         function    LoadIndex: boolean; virtual;
@@ -241,6 +243,7 @@ type
         constructor Init;
         constructor Init;
         function    AddOAHelpFile(const FileName: string): boolean;
         function    AddOAHelpFile(const FileName: string): boolean;
         function    AddHTMLHelpFile(const FileName, TOCEntry: string): boolean;
         function    AddHTMLHelpFile(const FileName, TOCEntry: string): boolean;
+        function    AddNGHelpFile(const FileName: string): boolean;
         function    AddHTMLIndexHelpFile(const FileName: string): boolean;
         function    AddHTMLIndexHelpFile(const FileName: string): boolean;
         function    LoadTopic(SourceFileID: word; Context: THelpCtx): PTopic; virtual;
         function    LoadTopic(SourceFileID: word; Context: THelpCtx): PTopic; virtual;
         function    TopicSearch(Keyword: string; var FileID: word; var Context: THelpCtx): boolean; virtual;
         function    TopicSearch(Keyword: string; var FileID: word; var Context: THelpCtx): boolean; virtual;
@@ -262,17 +265,21 @@ const TopicCacheSize    : sw_integer = 10;
 function  NewTopic(FileID: byte; HelpCtx: THelpCtx; Pos: longint; Param: string): PTopic;
 function  NewTopic(FileID: byte; HelpCtx: THelpCtx; Pos: longint; Param: string): PTopic;
 procedure DisposeTopic(P: PTopic);
 procedure DisposeTopic(P: PTopic);
 
 
+procedure RenderTopic(Lines: PUnsortedStringCollection; T: PTopic);
+procedure AddLinkToTopic(T: PTopic; AFileID: word; ACtx: THelpCtx);
+
 function  NewIndexEntry(Tag: string; FileID: word; HelpCtx: THelpCtx): PIndexEntry;
 function  NewIndexEntry(Tag: string; FileID: word; HelpCtx: THelpCtx): PIndexEntry;
 procedure DisposeIndexEntry(P: PIndexEntry);
 procedure DisposeIndexEntry(P: PIndexEntry);
 
 
+procedure DisposeRecord(var R: TRecord);
+
 implementation
 implementation
 
 
 uses
 uses
-  Dos,
 {$ifdef Linux}
 {$ifdef Linux}
   linux,
   linux,
 {$endif Linux}
 {$endif Linux}
-  WConsts,WViews,WHTMLHlp;
+  WConsts,WHTMLHlp,WNGHelp;
 
 
 
 
 Function GetDosTicks:longint; { returns ticks at 18.2 Hz, just like DOS }
 Function GetDosTicks:longint; { returns ticks at 18.2 Hz, just like DOS }
@@ -356,6 +363,51 @@ begin
   CloneTopic:=NT;
   CloneTopic:=NT;
 end;
 end;
 
 
+procedure RenderTopic(Lines: PUnsortedStringCollection; T: PTopic);
+var Size,CurPtr,I: sw_word;
+    S: string;
+begin
+  CurPtr:=0;
+  for I:=0 to Lines^.Count-1 do
+  begin
+    S:=GetStr(Lines^.At(I));
+    Size:=length(S)+1;
+    Inc(CurPtr,Size);
+  end;
+  Size:=CurPtr;
+  T^.TextSize:=Size; GetMem(T^.Text,T^.TextSize);
+  CurPtr:=0;
+  for I:=0 to Lines^.Count-1 do
+  begin
+    S:=GetStr(Lines^.At(I)); Size:=length(S);
+    Move(S[1],PByteArray(T^.Text)^[CurPtr],Size);
+    Inc(CurPtr,Size);
+    PByteArray(T^.Text)^[CurPtr]:=ord(hscLineBreak);
+    Inc(CurPtr);
+    if CurPtr>=T^.TextSize then Break;
+  end;
+end;
+
+procedure AddLinkToTopic(T: PTopic; AFileID: word; ACtx: THelpCtx);
+var NewSize: word;
+    NewPtr: pointer;
+begin
+  NewSize:=(T^.LinkCount+1)*sizeof(T^.Links^[0]);
+  GetMem(NewPtr,NewSize);
+  if Assigned(T^.Links) then
+  begin
+    Move(T^.Links^,NewPtr^,T^.LinkSize);
+    FreeMem(T^.Links,T^.LinkSize);
+  end;
+  T^.Links:=NewPtr;
+  with T^.Links^[T^.LinkCount] do
+  begin
+    FileID:=AFileID;
+    Context:=ACtx;
+  end;
+  Inc(T^.LinkCount);
+end;
+
 function NewIndexEntry(Tag: string; FileID: word; HelpCtx: THelpCtx): PIndexEntry;
 function NewIndexEntry(Tag: string; FileID: word; HelpCtx: THelpCtx): PIndexEntry;
 var P: PIndexEntry;
 var P: PIndexEntry;
 begin
 begin
@@ -457,6 +509,16 @@ begin
   New(IndexEntries, Init(200,100));
   New(IndexEntries, Init(200,100));
 end;
 end;
 
 
+procedure THelpFile.AddTopic(HelpCtx: THelpCtx; Pos: longint; const Param: string);
+begin
+  Topics^.Insert(NewTopic(ID,HelpCtx,Pos,Param));
+end;
+
+procedure THelpFile.AddIndexEntry(const Text: string; AHelpCtx: THelpCtx);
+begin
+  IndexEntries^.Insert(NewIndexEntry(Text,ID,AHelpCtx));
+end;
+
 function THelpFile.LoadTopic(HelpCtx: THelpCtx): PTopic;
 function THelpFile.LoadTopic(HelpCtx: THelpCtx): PTopic;
 var T: PTopic;
 var T: PTopic;
 begin
 begin
@@ -526,7 +588,7 @@ var OK: boolean;
     FS,L: longint;
     FS,L: longint;
     R: TRecord;
     R: TRecord;
 begin
 begin
-  inherited Init(AID);
+  if inherited Init(AID)=false then Fail;
   F:=New(PBufStream, Init(AFileName, stOpenRead, HelpStreamBufSize));
   F:=New(PBufStream, Init(AFileName, stOpenRead, HelpStreamBufSize));
   OK:=F<>nil;
   OK:=F<>nil;
   if OK then OK:=(F^.Status=stOK);
   if OK then OK:=(F^.Status=stOK);
@@ -542,12 +604,12 @@ begin
     OK:=ReadRecord(R,false);
     OK:=ReadRecord(R,false);
     if (OK=false) or (R.SClass=0) or (R.Size=0) then Break;
     if (OK=false) or (R.SClass=0) or (R.Size=0) then Break;
     case R.SClass of
     case R.SClass of
-      rtContext     : begin F^.Seek(L); OK:=ReadTopics; end;
-      rtText        : {Skip};
-      rtKeyword     : {Skip};
-      rtIndex       : begin IndexTablePos:=L; {OK:=ReadIndexTable; }end;
-      rtCompression : begin F^.Seek(L); OK:=ReadCompression; end;
-      rtIndexTags   : begin IndexTagsPos:=L; {OK:=ReadIndexTags; }end;
+      oa_rtContext     : begin F^.Seek(L); OK:=ReadTopics; end;
+      oa_rtText        : {Skip};
+      oa_rtKeyword     : {Skip};
+      oa_rtIndex       : begin IndexTablePos:=L; {OK:=ReadIndexTable; }end;
+      oa_rtCompression : begin F^.Seek(L); OK:=ReadCompression; end;
+      oa_rtIndexTags   : begin IndexTagsPos:=L; {OK:=ReadIndexTags; }end;
     else
     else
      begin
      begin
      {$ifdef DEBUGMSG}
      {$ifdef DEBUGMSG}
@@ -592,7 +654,7 @@ begin
     if OK then
     if OK then
     begin
     begin
       OK:=ReadRecord(R,true);
       OK:=ReadRecord(R,true);
-      OK:=OK and (R.SClass=rtFileHeader) and (R.Size=SizeOf(Header));
+      OK:=OK and (R.SClass=oa_rtFileHeader) and (R.Size=SizeOf(Header));
       if OK then Move(R.Data^,Header,SizeOf(Header));
       if OK then Move(R.Data^,Header,SizeOf(Header));
       DisposeRecord(R);
       DisposeRecord(R);
     end;
     end;
@@ -620,7 +682,7 @@ begin
     if (L=-1) and (Header.MainIndexScreen>0) then
     if (L=-1) and (Header.MainIndexScreen>0) then
        L:=GetCtxPos(Contexts[Header.MainIndexScreen]);
        L:=GetCtxPos(Contexts[Header.MainIndexScreen]);
     if (L>0) then
     if (L>0) then
-      Topics^.Insert(NewTopic(ID,I,L,''));
+      AddTopic(I,L,'');
   end;
   end;
   DisposeRecord(R);
   DisposeRecord(R);
   TopicsRead:=OK;
   TopicsRead:=OK;
@@ -652,7 +714,7 @@ begin
     S[0]:=chr(AddLen); Move(PByteArray(@Entries)^[CurPtr+1],S[1],AddLen);
     S[0]:=chr(AddLen); Move(PByteArray(@Entries)^[CurPtr+1],S[1],AddLen);
     LastTag:=copy(LastTag,1,CopyCnt)+S;
     LastTag:=copy(LastTag,1,CopyCnt)+S;
     HelpCtx:=PWord(@PByteArray(@Entries)^[CurPtr+1+AddLen])^;
     HelpCtx:=PWord(@PByteArray(@Entries)^[CurPtr+1+AddLen])^;
-    IndexEntries^.Insert(NewIndexEntry(LastTag,ID,HelpCtx));
+    AddIndexEntry(LastTag,HelpCtx);
     Inc(CurPtr,1+AddLen+2);
     Inc(CurPtr,1+AddLen+2);
   end;
   end;
   DisposeRecord(R);
   DisposeRecord(R);
@@ -855,9 +917,9 @@ begin
     FillChar(TextR,SizeOf(TextR),0); FillChar(KeyWR,SizeOf(KeyWR),0);
     FillChar(TextR,SizeOf(TextR),0); FillChar(KeyWR,SizeOf(KeyWR),0);
     F^.Seek(T^.FileOfs); OK:=F^.Status=stOK;
     F^.Seek(T^.FileOfs); OK:=F^.Status=stOK;
     if OK then OK:=ReadRecord(TextR,true);
     if OK then OK:=ReadRecord(TextR,true);
-    OK:=OK and (TextR.SClass=rtText);
+    OK:=OK and (TextR.SClass=oa_rtText);
     if OK then OK:=ReadRecord(KeyWR,true);
     if OK then OK:=ReadRecord(KeyWR,true);
-    OK:=OK and (KeyWR.SClass=rtKeyword);
+    OK:=OK and (KeyWR.SClass=oa_rtKeyword);
 
 
     if OK then
     if OK then
     begin
     begin
@@ -937,6 +999,13 @@ begin
   AddHTMLHelpFile:=AddFile(H);;
   AddHTMLHelpFile:=AddFile(H);;
 end;
 end;
 
 
+function THelpFacility.AddNGHelpFile(const FileName: string): boolean;
+var H: PHelpFile;
+begin
+  H:=New(PNGHelpFile, Init(FileName, LastID+1));
+  AddNGHelpFile:=AddFile(H);;
+end;
+
 function THelpFacility.AddHTMLIndexHelpFile(const FileName: string): boolean;
 function THelpFacility.AddHTMLIndexHelpFile(const FileName: string): boolean;
 var H: PHelpFile;
 var H: PHelpFile;
 begin
 begin
@@ -1026,24 +1095,6 @@ begin
   if S='' then S:=' ';
   if S='' then S:=' ';
   Lines^.Insert(NewStr(S));
   Lines^.Insert(NewStr(S));
 end;
 end;
-procedure RenderTopic;
-var Size,CurPtr,I: sw_word;
-    S: string;
-function CountSize(P: PString): boolean; {$ifndef FPC}far;{$endif}
-begin Inc(Size, length(P^)+1); CountSize:=Size>MaxHelpTopicSize-300; end;
-begin
-  Size:=0; Lines^.FirstThat(@CountSize);
-  T^.TextSize:=Size; GetMem(T^.Text,T^.TextSize);
-  CurPtr:=0;
-  for I:=0 to Lines^.Count-1 do
-  begin
-    S:=Lines^.At(I)^;
-    Size:=length(S)+1; S[Size]:=hscLineBreak;
-    Move(S[1],PByteArray(T^.Text)^[CurPtr],Size);
-    Inc(CurPtr,Size);
-    if CurPtr>=T^.TextSize then Break;
-  end;
-end;
 var Line: string;
 var Line: string;
 procedure FlushLine;
 procedure FlushLine;
 begin
 begin
@@ -1102,7 +1153,7 @@ begin
     FlushLine;
     FlushLine;
     AddLine('');
     AddLine('');
   end;
   end;
-  RenderTopic;
+  RenderTopic(Lines,T);
   Dispose(Lines, Done);
   Dispose(Lines, Done);
   Keywords^.DeleteAll; Dispose(Keywords, Done);
   Keywords^.DeleteAll; Dispose(Keywords, Done);
   BuildIndexTopic:=T;
   BuildIndexTopic:=T;
@@ -1134,7 +1185,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.23  2000-06-16 08:50:44  pierre
+  Revision 1.24  2000-06-22 09:07:14  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.23  2000/06/16 08:50:44  pierre
    + new bunch of Gabor's changes
    + new bunch of Gabor's changes
 
 
   Revision 1.22  2000/05/31 20:42:02  pierre
   Revision 1.22  2000/05/31 20:42:02  pierre

+ 8 - 5
ide/text/whlpview.pas

@@ -213,7 +213,7 @@ implementation
 
 
 uses
 uses
   Video,
   Video,
-  WConsts,WViews;
+  WConsts;
 
 
 const CommentColor = Blue;
 const CommentColor = Blue;
 
 
@@ -794,7 +794,7 @@ begin
   while (Y<=R.B.Y) do
   while (Y<=R.B.Y) do
   begin
   begin
     if Y=R.A.Y then StartX:=R.A.X else StartX:=Margin;
     if Y=R.A.Y then StartX:=R.A.X else StartX:=Margin;
-    if Y=R.B.Y then EndX:=R.B.X else EndX:=255;
+    if Y=R.B.Y then EndX:=R.B.X else EndX:=High(S);
     S:=S+copy(GetLineText(Y),StartX+1,EndX-StartX+1);
     S:=S+copy(GetLineText(Y),StartX+1,EndX-StartX+1);
     Inc(Y);
     Inc(Y);
   end;
   end;
@@ -1138,7 +1138,7 @@ begin
     MoveChar(B,' ',NormalColor,Size.X);
     MoveChar(B,' ',NormalColor,Size.X);
     if Y<GetLineCount then
     if Y<GetLineCount then
     begin
     begin
-      S:=copy(GetLineText(Y),Delta.X+1,255);
+      S:=copy(GetLineText(Y),Delta.X+1,High(S));
       S:=copy(S,1,MaxViewWidth);
       S:=copy(S,1,MaxViewWidth);
       MoveStr(B,S,NormalColor);
       MoveStr(B,S,NormalColor);
 
 
@@ -1196,7 +1196,7 @@ begin
       if ((SelR.A.X<>SelR.B.X) or (SelR.A.Y<>SelR.B.Y)) and (SelR.A.Y<=Y) and (Y<=SelR.B.Y) then
       if ((SelR.A.X<>SelR.B.X) or (SelR.A.Y<>SelR.B.Y)) and (SelR.A.Y<=Y) and (Y<=SelR.B.Y) then
       begin
       begin
         if Y=SelR.A.Y then MinX:=SelR.A.X else MinX:=0;
         if Y=SelR.A.Y then MinX:=SelR.A.X else MinX:=0;
-        if Y=SelR.B.Y then MaxX:=SelR.B.X-1 else MaxX:=255;
+        if Y=SelR.B.Y then MaxX:=SelR.B.X-1 else MaxX:=High(string);
         for DX:=MinX to MaxX do
         for DX:=MinX to MaxX do
         begin
         begin
           X:=DX;
           X:=DX;
@@ -1318,7 +1318,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.17  2000-06-16 08:50:45  pierre
+  Revision 1.18  2000-06-22 09:07:14  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.17  2000/06/16 08:50:45  pierre
    + new bunch of Gabor's changes
    + new bunch of Gabor's changes
 
 
   Revision 1.16  2000/05/30 07:18:33  pierre
   Revision 1.16  2000/05/30 07:18:33  pierre

+ 7 - 4
ide/text/whtml.pas

@@ -146,7 +146,7 @@ begin
 end;
 end;
 
 
 constructor TDOSTextFile.Init(AFileName: string);
 constructor TDOSTextFile.Init(AFileName: string);
-{$ifdef TPUNIXLF}
+(*{$ifdef TPUNIXLF}
   procedure readln(var t:text;var s:string);
   procedure readln(var t:text;var s:string);
   var
   var
     c : char;
     c : char;
@@ -167,7 +167,7 @@ constructor TDOSTextFile.Init(AFileName: string);
        dec(i);
        dec(i);
     s[0]:=chr(i);
     s[0]:=chr(i);
    end;
    end;
-{$endif}
+{$endif}*)
 var f: text;
 var f: text;
     S: string;
     S: string;
 begin
 begin
@@ -180,7 +180,7 @@ begin
   New(Lines, Init(500,2000));
   New(Lines, Init(500,2000));
   while (Eof(f)=false) and (IOResult=0) do
   while (Eof(f)=false) and (IOResult=0) do
     begin
     begin
-      readln(f,S);
+      readln(f,S); { this is the one in WUTILS.PAS }
       AddLine(S);
       AddLine(S);
     end;
     end;
   Close(f);
   Close(f);
@@ -711,7 +711,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.6  2000-04-25 08:42:35  pierre
+  Revision 1.7  2000-06-22 09:07:15  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.6  2000/04/25 08:42:35  pierre
    * New Gabor changes : see fixes.txt
    * New Gabor changes : see fixes.txt
 
 
   Revision 1.5  2000/03/21 23:20:47  pierre
   Revision 1.5  2000/03/21 23:20:47  pierre

+ 5 - 3
ide/text/whtmlhlp.pas

@@ -137,8 +137,7 @@ const HTMLGetSectionColor : THTMLGetSectionColorProc = DefHTMLGetSectionColor;
 
 
 implementation
 implementation
 
 
-uses WConsts,WUtils,WViews,WHTMLScn,
-     Dos;
+uses WConsts,WUtils,WViews,WHTMLScn;
 
 
 function DefHTMLGetSectionColor(Section: THTMLSection; var Color: byte): boolean;
 function DefHTMLGetSectionColor(Section: THTMLSection; var Color: byte): boolean;
 begin
 begin
@@ -744,7 +743,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.14  2000-06-16 08:50:45  pierre
+  Revision 1.15  2000-06-22 09:07:15  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.14  2000/06/16 08:50:45  pierre
    + new bunch of Gabor's changes
    + new bunch of Gabor's changes
 
 
 }
 }

+ 10 - 3
ide/text/whtmlscn.pas

@@ -128,13 +128,18 @@ const
   );
   );
 
 
 function TCustomHTMLLinkScanner.DocAddTextChar(C: char): boolean;
 function TCustomHTMLLinkScanner.DocAddTextChar(C: char): boolean;
+var Added: boolean;
 begin
 begin
+  Added:=false;
   if InAnchor then
   if InAnchor then
+  begin
     CurLinkText:=CurLinkText+C;
     CurLinkText:=CurLinkText+C;
+    Added:=true;
+  end;
+  DocAddTextChar:=Added;
 end;
 end;
 
 
 procedure TCustomHTMLLinkScanner.DocAnchor(Entered: boolean);
 procedure TCustomHTMLLinkScanner.DocAnchor(Entered: boolean);
-var P: sw_integer;
 begin
 begin
   if Entered then
   if Entered then
     begin
     begin
@@ -210,7 +215,6 @@ begin
 end;
 end;
 
 
 procedure THTMLLinkScanDocument.Store(var S: TStream);
 procedure THTMLLinkScanDocument.Store(var S: TStream);
-var I: integer;
 begin
 begin
   S.WriteStr(DocName);
   S.WriteStr(DocName);
   Aliases^.Store(S);
   Aliases^.Store(S);
@@ -449,7 +453,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.6  2000-05-29 11:09:14  pierre
+  Revision 1.7  2000-06-22 09:07:15  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.6  2000/05/29 11:09:14  pierre
    + New bunch of Gabor's changes: see fixes.txt
    + New bunch of Gabor's changes: see fixes.txt
 
 
   Revision 1.5  2000/05/17 08:49:16  pierre
   Revision 1.5  2000/05/17 08:49:16  pierre

+ 5 - 2
ide/text/wini.pas

@@ -161,7 +161,7 @@ begin
           Inc(P2);
           Inc(P2);
         end;
         end;
       Value:=NewStr(Trim(ValueS));
       Value:=NewStr(Trim(ValueS));
-      Comment:=NewStr(copy(S,P2+1,255));
+      Comment:=NewStr(copy(S,P2+1,High(S)));
     end else
     end else
     begin
     begin
       Tag:=nil;
       Tag:=nil;
@@ -478,7 +478,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.9  2000-04-18 11:42:39  pierre
+  Revision 1.10  2000-06-22 09:07:15  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.9  2000/04/18 11:42:39  pierre
    lot of Gabor changes : see fixes.txt
    lot of Gabor changes : see fixes.txt
 
 
   Revision 1.8  1999/03/08 14:58:21  peter
   Revision 1.8  1999/03/08 14:58:21  peter

+ 429 - 0
ide/text/wnghelp.pas

@@ -0,0 +1,429 @@
+{
+    $Id$
+    This file is part of the Free Pascal Integrated Development Environment
+    Copyright (c) 2000 by Berczi Gabor
+
+    Help support for Norton Guide (.NG) files
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+{$R-}
+unit WNGHelp;
+
+interface
+
+uses Objects,
+     WUtils,WHelp;
+
+const
+      NGFileSignature = 'NG';
+      NGXORByte       = $1a;
+
+      NGMinRecordSize = $1a;
+
+      ng_rtContainer    = Byte ($0);
+      ng_rtTopic        = Byte ($1);
+
+type
+      TNGFileHeader = packed record
+        Signature     : array[1..2] of char;
+        Unknown       : word;
+        Version       : word;
+        MenuCount     : word;
+        GuideName     : array[8..47] of char;
+        Credits       : array[48..377] of char;
+      end;
+
+      TNGRecordHeader = packed record
+        RecType      : word;
+        RecLength    : word;
+      end;
+
+      TNGContainerItem = packed record
+        EntryNameOfs  : word; { relative in record }
+        SubItemsOfs   : longint; { file offset to a new record header }
+      end;
+
+      PNGContainerRecord = ^TNGContainerRecord;
+      TNGContainerRecord = packed record
+        ItemCount     : word;
+        Unknown       : word;
+        IndexInParent : integer;
+        ParentOfs     : longint;
+        MenuNo        : integer;{ belongs to menu # }
+        MenuItemNo    : integer;{ belongs to menu item # }
+        Unknown2      : array[18..25] of byte;
+        Items         : array[0..0] of TNGContainerItem;
+      end;
+
+      TNGTopicRecord = packed record
+        NumberOfLines : word;
+        SeeAlsoOfs    : word;
+        IndexInParent : integer;
+        ParentOfs     : longint;
+        MenuNo        : integer;{ belongs to menu # }
+        MenuItemNo    : integer;{ belongs to menu item # }
+        PrevTopicOfs  : longint;
+        NextTopicOfs  : longint;
+        TopicLines    : record end;
+        { array of TNGSeeAlsoRec }
+      end;
+
+      TNGSeeAlsoRec = packed record
+        EntryCount    : word;
+        Entries       : record end;
+        { array of LinkedRecOfs  : longint; }
+        { array of LinkNames : ASCIIZ; }
+      end;
+
+      PContainerItemRec = ^TContainerItemRec;
+      TContainerItemRec = record
+        Name     : string;
+        FilePos  : longint;
+        Container: PNGContainerRecord;
+      end;
+
+      PNGHelpFile = ^TNGHelpFile;
+      TNGHelpFile = object(THelpFile)
+        constructor Init(AFileName: string; AID: word);
+        destructor  Done; virtual;
+      public
+        function    LoadIndex: boolean; virtual;
+        function    ReadTopic(T: PTopic): boolean; virtual;
+      private
+        F: PStream;
+        Header: TNGFileHeader;
+{        NextHelpCtx: longint;}
+        function ReadHeader: boolean;
+        function ReadContainer(EnumProc: pointer): boolean;
+        function ReadTopicRec(Lines: PUnsortedStringCollection): boolean;
+        function ReadRecord(var R: TRecord; ReadData: boolean): boolean;
+      end;
+
+implementation
+
+uses CallSpec;
+
+function NGDecompressStr(const S: string): string;
+var NS: string;
+    I: sw_integer;
+begin
+  NS:='';
+  I:=1;
+  while (I<=length(S)) do
+  begin
+    if S[I]=#255 then
+      begin
+        NS:=NS+CharStr(' ',ord(S[I+1]));
+        Inc(I);
+      end
+    else
+      NS:=NS+S[I];
+    Inc(I);
+  end;
+  NGDecompressStr:=NS;
+end;
+
+function TranslateStr(const S: string): string;
+var NS: string;
+    I: sw_integer;
+    InHiLite: boolean;
+begin
+  NS:=''; InHiLite:=false;
+  I:=1;
+  while (I<=length(S)) do
+  begin
+    case S[I] of
+      '^'  : begin
+               Inc(I);
+               case S[I] of
+                 '^' : NS:=NS+'^';
+                 'B' : begin
+                         if InHiLite then
+                           NS:=NS+hscNormText
+                         else
+                           NS:=NS+hscTextColor+chr(15);
+                         InHiLite:=not InHiLite;
+                       end;
+                 'b' : begin
+                         if InHiLite then
+                           NS:=NS+hscNormText
+                         else
+                           NS:=NS+hscTextColor+chr(11);
+                         InHiLite:=not InHiLite;
+                       end;
+                 'U' : begin
+                         if InHiLite then
+                           NS:=NS+hscNormText
+                         else
+                           NS:=NS+hscTextColor+chr(3);
+                         InHiLite:=not InHiLite;
+                       end;
+               else
+                 NS:=NS;
+               end;
+             end;
+    else NS:=NS+S[I];
+    end;
+    Inc(I);
+  end;
+  if InHiLite then NS:=NS+hscNormText;
+  TranslateStr:=NS;
+end;
+
+procedure TranslateLines(P: PUnsortedStringCollection);
+var S: string;
+    I: sw_integer;
+begin
+  for I:=0 to P^.Count-1 do
+  begin
+    S:=GetStr(P^.At(I));
+    P^.AtFree(I);
+    P^.AtInsert(I,NewStr(TranslateStr(S)));
+  end;
+end;
+
+constructor TNGHelpFile.Init(AFileName: string; AID: word);
+function FormatAlias(Alias: string): string;
+var StartP,EndP: sw_integer;
+begin
+  repeat
+    StartP:=Pos('  ',Alias);
+    if StartP>0 then
+    begin
+      EndP:=StartP;
+      while (EndP+1<=length(Alias)) and (Alias[EndP+1]=' ') do Inc(EndP);
+      Alias:=copy(Alias,1,StartP-1)+' | '+copy(Alias,EndP+1,High(Alias));
+    end;
+  until StartP=0;
+  if Assigned(HelpFacility) then
+    if length(Alias)>HelpFacility^.IndexTabSize-4 then
+      Alias:=Trim(copy(Alias,1,HelpFacility^.IndexTabSize-4-2))+'..';
+  FormatAlias:=Alias;
+end;
+procedure AddToIndex(P: PContainerItemRec); {$ifndef FPC}far;{$endif}
+var S: string;
+begin
+  S:=Trim(P^.Name);
+  S:=TranslateStr(S);
+  S:=Trim(FormatAlias(S));
+  if (S<>'') and (P^.FilePos<>-1) then
+    begin
+{      Inc(NextHelpCtx);}
+      AddIndexEntry(S,P^.FilePos);
+      AddTopic(P^.FilePos,P^.FilePos,'');
+    end;
+end;
+var OK: boolean;
+    FS: longint;
+    R: TRecord;
+    L: longint;
+begin
+  if inherited Init(AID)=false then Fail;
+  F:=New(PBufStream, Init(AFileName, stOpenRead, HelpStreamBufSize));
+  OK:=F<>nil;
+  if OK then OK:=(F^.Status=stOK);
+  if OK then
+    begin
+      FS:=F^.GetSize;
+      OK:=ReadHeader;
+    end;
+  while OK do
+  begin
+    L:=F^.GetPos;
+    if (L>=FS) then Break;
+    OK:=ReadRecord(R,false);
+    if (OK=false) then Break;
+    case R.SClass of
+      ng_rtContainer : begin F^.Seek(L); OK:=ReadContainer(@AddToIndex); end;
+{      ng_rtTopic     : begin F^.Seek(L); OK:=ReadTopicRec; end;}
+    else
+     begin
+     {$ifdef DEBUGMSG}
+       ClearFormatParams;
+       AddFormatParamInt(R.SClass);
+       AddFormatParamInt(L);
+       AddFormatParamInt(R.Size);
+       ErrorBox('Uknown help record tag %x encountered, '+
+                'offset %x, size %d',@FormatParams);
+     {$else}
+       {Skip};
+     {$endif}
+     end;
+    end;
+    if OK then
+       begin
+         Inc(L, sizeof(TNGRecordHeader)+R.Size); F^.Seek(L);
+         OK:=(F^.Status=stOK);
+       end;
+  end;
+  if OK=false then
+  begin
+    Done;
+    Fail;
+  end;
+end;
+
+function TNGHelpFile.ReadHeader: boolean;
+var OK: boolean;
+begin
+  F^.Read(Header,sizeof(Header));
+  OK:=(F^.Status=stOK);
+  OK:=OK and (Header.Signature=NGFileSignature);
+  ReadHeader:=OK;
+end;
+
+function KillSpecChars(const S: string): string;
+var I: sw_integer;
+    RS: string;
+begin
+  RS:='';
+  for I:=1 to length(S) do
+    if S[I]>=#32 then
+      RS:=RS+S[I];
+  KillSpecChars:=RS;
+end;
+
+function TNGHelpFile.ReadContainer(EnumProc: pointer): boolean;
+var OK: boolean;
+    R: TRecord;
+    I,L: longint;
+    CI: TNGContainerItem;
+    P: pointer;
+    CIR: TContainerItemRec;
+begin
+  OK:=ReadRecord(R, true);
+  if OK then
+  with TNGContainerRecord(R.Data^) do
+  begin
+    I:=0;
+    while (I<ItemCount) do
+    with Items[I] do
+    begin
+      P:=@(PByteArray(R.Data)^[NGMinRecordSize-sizeof(TNGRecordHeader)+EntryNameOfs]);
+      FillChar(CIR,sizeof(CIR),0);
+      with CIR do
+      begin
+        Container:=R.Data;
+        Name:=NGDecompressStr(StrPas(P));
+        FilePos:=SubItemsOfs;
+      end;
+      CallPointerLocal(EnumProc,PreviousFramePointer,@CIR);
+      Inc(I);
+    end;
+  end;
+  DisposeRecord(R);
+  ReadContainer:=OK;
+end;
+
+function TNGHelpFile.ReadTopicRec(Lines: PUnsortedStringCollection): boolean;
+var OK: boolean;
+    R: TRecord;
+    I: sw_integer;
+    LineP: pointer;
+    S: string;
+begin
+  OK:=ReadRecord(R, true);
+  if OK then
+  with TNGTopicRecord(R.Data^) do
+  begin
+    LineP:=@TopicLines;
+    for I:=1 to NumberOfLines do
+    begin
+      S:=StrPas(LineP);
+      Lines^.InsertStr(NGDecompressStr(S));
+      LineP:=pointer(longint(LineP)+length(S)+1);
+    end;
+  end;
+  DisposeRecord(R);
+  ReadTopicRec:=OK;
+end;
+
+function TNGHelpFile.ReadRecord(var R: TRecord; ReadData: boolean): boolean;
+var OK: boolean;
+    H: TNGRecordHeader;
+    I: sw_integer;
+begin
+  FillChar(R, SizeOf(R), 0);
+  F^.Read(H,SizeOf(H));
+  OK:=F^.Status=stOK;
+  if OK then
+    for I:=0 to SizeOf(H)-1 do
+      PByteArray(@H)^[I]:=PByteArray(@H)^[I] xor NGXORByte;
+  if OK then
+  begin
+    R.SClass:=H.RecType; R.Size:=H.RecLength+(NGMinRecordSize-sizeof(TNGRecordHeader));
+    if (R.Size>0) and ReadData then
+    begin
+      GetMem(R.Data,R.Size);
+      F^.Read(R.Data^,R.Size);
+      if R.Size>0 then
+      for I:=0 to R.Size-1 do
+        PByteArray(R.Data)^[I]:=PByteArray(R.Data)^[I] xor NGXORByte;
+      OK:=F^.Status=stOK;
+    end;
+    if OK=false then DisposeRecord(R);
+  end;
+  ReadRecord:=OK;
+end;
+
+function TNGHelpFile.LoadIndex: boolean;
+begin
+  LoadIndex:=false;
+end;
+
+function TNGHelpFile.ReadTopic(T: PTopic): boolean;
+var Lines: PUnsortedStringCollection;
+procedure AddToTopic(P: PContainerItemRec); {$ifndef FPC}far;{$endif}
+begin
+  Lines^.InsertStr(hscLink+P^.Name+hscLink);
+  AddLinkToTopic(T,ID,P^.FilePos);
+end;
+var OK: boolean;
+    R: TRecord;
+begin
+  New(Lines, Init(100,100));
+  F^.Seek(T^.FileOfs); OK:=F^.Status=stOK;
+  if OK then OK:=ReadRecord(R,false);
+  case R.SClass of
+      ng_rtContainer :
+        begin
+          F^.Seek(T^.FileOfs);
+          Lines^.InsertStr(' ');
+          OK:=ReadContainer(@AddToTopic);
+          RenderTopic(Lines,T);
+        end;
+      ng_rtTopic     :
+        begin
+          F^.Seek(T^.FileOfs);
+          Lines^.InsertStr(' ');
+          OK:=ReadTopicRec(Lines);
+          TranslateLines(Lines);
+          Lines^.InsertStr(' ');
+          RenderTopic(Lines,T);
+        end;
+  else OK:=false;
+  end;
+  Dispose(Lines, Done);
+  ReadTopic:=OK;
+end;
+
+destructor TNGHelpFile.Done;
+begin
+  if Assigned(F) then Dispose(F, Done); F:=nil;
+  inherited Done;
+end;
+
+END.
+{
+  $Log$
+  Revision 1.1  2000-06-22 09:07:15  pierre
+   * Gabor changes: see fixes.txt
+
+}

+ 49 - 8
ide/text/wutils.pas

@@ -127,6 +127,12 @@ function Now: longint;
 function FormatDateTimeL(L: longint; const Format: string): string;
 function FormatDateTimeL(L: longint; const Format: string): string;
 function FormatDateTime(const D: DateTime; const Format: string): string;
 function FormatDateTime(const D: DateTime; const Format: string): string;
 
 
+{$ifdef TP}
+function StrPas(C: PChar): string;
+{$endif}
+function MemToStr(var B; Count: byte): string;
+procedure StrToMem(S: string; var B);
+
 procedure GiveUpTimeSlice;
 procedure GiveUpTimeSlice;
 
 
 const LastStrToIntResult : integer = 0;
 const LastStrToIntResult : integer = 0;
@@ -164,7 +170,7 @@ const
      begin
      begin
       c:=#0;
       c:=#0;
       i:=0;
       i:=0;
-      while (not eof(t)) and (c<>#10) do
+      while (not eof(t)) and (c<>#10) and (i<High(S)) do
        begin
        begin
          read(t,c);
          read(t,c);
          if c<>#10 then
          if c<>#10 then
@@ -198,7 +204,9 @@ procedure ReadlnFromStream(Stream: PStream; var S:string;var linecomplete : bool
     i:=0;
     i:=0;
     { this created problems for lines longer than 255 characters
     { this created problems for lines longer than 255 characters
       now those lines are cutted into pieces without warning PM }
       now those lines are cutted into pieces without warning PM }
-    while (not eofstream(stream)) and (c<>#10) and (i<255) do
+    { changed implicit 255 to High(S), so it will be automatically extended
+      when longstrings eventually become default - Gabor }
+    while (not eofstream(stream)) and (c<>#10) and (i<High(S)) do
      begin
      begin
        stream^.read(c,sizeof(c));
        stream^.read(c,sizeof(c));
        if c<>#10 then
        if c<>#10 then
@@ -214,7 +222,7 @@ procedure ReadlnFromStream(Stream: PStream; var S:string;var linecomplete : bool
       end;
       end;
     if (c=#13) and (not eofstream(stream)) then
     if (c=#13) and (not eofstream(stream)) then
       stream^.read(c,sizeof(c));
       stream^.read(c,sizeof(c));
-    if (i=255) and not eofstream(stream) then
+    if (i=High(S)) and not eofstream(stream) then
       begin
       begin
         pos:=stream^.getpos;
         pos:=stream^.getpos;
         stream^.read(c,sizeof(c));
         stream^.read(c,sizeof(c));
@@ -228,6 +236,36 @@ procedure ReadlnFromStream(Stream: PStream; var S:string;var linecomplete : bool
     s[0]:=chr(i);
     s[0]:=chr(i);
   end;
   end;
 
 
+{$ifdef TP}
+{ TP's own StrPas() is buggy, because it causes GPF with strings longer than
+  255 chars }
+function StrPas(C: PChar): string;
+var S: string;
+    I: longint;
+begin
+  if Assigned(C)=false then
+    S:=''
+  else
+    begin
+      I:=StrLen(C); if I>255 then I:=255;
+      S[0]:=chr(I); Move(C^,S[1],I);
+    end;
+  StrPas:=S;
+end;
+{$endif}
+
+function MemToStr(var B; Count: byte): string;
+var S: string;
+begin
+  S[0]:=chr(Count);
+  if Count>0 then Move(B,S[1],Count);
+  MemToStr:=S;
+end;
+
+procedure StrToMem(S: string; var B);
+begin
+  if length(S)>0 then Move(S[1],B,length(S));
+end;
 
 
 function Max(A,B: longint): longint;
 function Max(A,B: longint): longint;
 begin
 begin
@@ -289,7 +327,7 @@ begin
   i:=1;
   i:=1;
   while (i<length(s)) and (s[i]=' ') do
   while (i<length(s)) and (s[i]=' ') do
    inc(i);
    inc(i);
-  LTrim:=Copy(s,i,255);
+  LTrim:=Copy(s,i,High(S));
 end;
 end;
 
 
 function RTrim(const S: string): string;
 function RTrim(const S: string): string;
@@ -482,7 +520,7 @@ begin
 {$ifdef win32}
 {$ifdef win32}
   hs:=n+#0;
   hs:=n+#0;
   i:=Windows.GetFullPathName(@hs[1],256,hs2,j);
   i:=Windows.GetFullPathName(@hs[1],256,hs2,j);
-  if (i>0) and (i<=255) then
+  if (i>0) and (i<=high(hs)) then
     begin
     begin
       hs:=strpas(hs2);
       hs:=strpas(hs2);
       GetLongName:=hs;
       GetLongName:=hs;
@@ -662,7 +700,7 @@ end;
 
 
 function TTextCollection.LookUp(const S: string; var Idx: sw_integer): string;
 function TTextCollection.LookUp(const S: string; var Idx: sw_integer): string;
 var OLI,ORI,Left,Right,Mid: integer;
 var OLI,ORI,Left,Right,Mid: integer;
-    LeftP,RightP,MidP: PString;
+    {LeftP,RightP,}MidP: PString;
     {LeftS,}MidS{,RightS}: string;
     {LeftS,}MidS{,RightS}: string;
     FoundS: string;
     FoundS: string;
     UpS : string;
     UpS : string;
@@ -676,7 +714,7 @@ begin
     begin
     begin
       OLI:=Left; ORI:=Right;
       OLI:=Left; ORI:=Right;
       Mid:=Left+(Right-Left) div 2;
       Mid:=Left+(Right-Left) div 2;
-      LeftP:=At(Left); RightP:=At(Right); MidP:=At(Mid);
+{      LeftP:=At(Left); RightP:=At(Right); }MidP:=At(Mid);
 {      LeftS:=UpCaseStr(LeftP^); }MidS:=UpCaseStr(MidP^);
 {      LeftS:=UpCaseStr(LeftP^); }MidS:=UpCaseStr(MidP^);
 {      RightS:=UpCaseStr(RightP^);}
 {      RightS:=UpCaseStr(RightP^);}
       if copy(MidS,1,length(UpS))=UpS then
       if copy(MidS,1,length(UpS))=UpS then
@@ -934,7 +972,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.24  2000-06-16 21:16:41  pierre
+  Revision 1.25  2000-06-22 09:07:15  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.24  2000/06/16 21:16:41  pierre
    * allow to read until 255 chars per line
    * allow to read until 255 chars per line
 
 
   Revision 1.23  2000/06/16 08:50:45  pierre
   Revision 1.23  2000/06/16 08:50:45  pierre

+ 8 - 5
ide/text/wviews.pas

@@ -557,10 +557,10 @@ procedure TrackMouse;
 var
 var
   Mouse: TPoint;
   Mouse: TPoint;
   R: TRect;
   R: TRect;
-  OldC: PMenuItem;
+{  OldC: PMenuItem;}
 begin
 begin
   MakeLocal(E.Where, Mouse);
   MakeLocal(E.Where, Mouse);
-  OldC:=Current;
+{  OldC:=Current;}
   Current := Menu^.Items;
   Current := Menu^.Items;
   while Current <> nil do
   while Current <> nil do
   begin
   begin
@@ -1272,7 +1272,7 @@ begin
     P:=Pos(#13,S);
     P:=Pos(#13,S);
     if P=0 then P:=length(S)+1;
     if P=0 then P:=length(S)+1;
     CurS:=copy(S,1,P-1);
     CurS:=copy(S,1,P-1);
-    CurS:=copy(CurS,Delta.X+1,255);
+    CurS:=copy(CurS,Delta.X+1,High(CurS));
     CurS:=copy(CurS,1,MaxViewWidth);
     CurS:=copy(CurS,1,MaxViewWidth);
     Delete(S,1,P);
     Delete(S,1,P);
     end;
     end;
@@ -1889,7 +1889,7 @@ begin
           if (ListBox<>nil) and (Event.InfoPtr=ListBox) then
           if (ListBox<>nil) and (Event.InfoPtr=ListBox) then
             begin
             begin
               FocusItem(ListBox^.Focused);
               FocusItem(ListBox^.Focused);
-              Text:=GetText(List^.At(Focused),255);
+              Text:=GetText(List^.At(Focused),High(Text));
               DrawView;
               DrawView;
               DropList(false);
               DropList(false);
             end;
             end;
@@ -2189,7 +2189,10 @@ end;
 END.
 END.
 {
 {
   $Log$
   $Log$
-  Revision 1.14  2000-06-16 08:50:45  pierre
+  Revision 1.15  2000-06-22 09:07:15  pierre
+   * Gabor changes: see fixes.txt
+
+  Revision 1.14  2000/06/16 08:50:45  pierre
    + new bunch of Gabor's changes
    + new bunch of Gabor's changes
 
 
   Revision 1.13  2000/05/02 08:42:29  pierre
   Revision 1.13  2000/05/02 08:42:29  pierre