Browse Source

* Several things added (I cannot commit them independently !)
+ added TBreakpoint and TBreakpointCollection
+ added cmResetDebugger,cmGrep,CmToggleBreakpoint
+ Breakpoint list in INIFile
* Select items now also depend of SwitchMode
* Reading of option '-g' was not possible !
+ added search for -Fu args pathes in TryToOpen
+ added code for automatic opening of FileDialog
if source not found

pierre 26 years ago
parent
commit
b4b1e80dff

+ 24 - 6
ide/text/Makefile

@@ -21,7 +21,7 @@ LIBDIR=/usr/lib/gcc-lib/i486-linux/2.7.2.3
 endif
 
 # We always need the API and FV
-NEEDUNITDIR=../../api ../../fv
+NEEDUNITDIR=../../api ../../fv ../../fv/base ../../fv/app ../../fv/dialogs
 
 # when making a full version include the compiler
 ifdef FULL
@@ -32,10 +32,14 @@ override NEEDUNITDIR+=../fake/compiler
 endif
 
 # when including debugger include the gdbinterface
+ifndef GDBINT
+GDBINT=gdbint
+endif
+
 ifdef GDB
-override NEEDUNITDIR+=../../gdbint
-NEEDLIBDIR+=../../gdbint/libgdb
-NEEDOBJDIR+=../../gdbint/libgdb
+override NEEDUNITDIR+=../../$(GDBINT)
+NEEDLIBDIR+=../../$(GDBINT)/libgdb
+NEEDOBJDIR+=../../$(GDBINT)/libgdb
 else
 override NEEDUNITDIR+=../fake/gdb
 endif
@@ -84,12 +88,26 @@ fp$(EXEEXT): $(wildcard *.pas) $(wildcard *.inc)
 full:
 	make all FULL=1
 
-fullgdb:
+fullgdb: clean_compiler
 	make all FULL=1 GDB=1
 
+clean_compiler:
+	make -C ../../compiler clean
+
 #
 # $Log$
-# Revision 1.6  1999-01-29 10:34:31  peter
+# Revision 1.7  1999-02-04 13:32:00  pierre
+#   * Several things added (I cannot commit them independently !)
+#   + added TBreakpoint and TBreakpointCollection
+#   + added cmResetDebugger,cmGrep,CmToggleBreakpoint
+#   + Breakpoint list in INIFile
+#   * Select items now also depend of SwitchMode
+#   * Reading of option '-g' was not possible !
+#   + added search for -Fu args pathes in TryToOpen
+#   + added code for automatic opening of FileDialog
+#     if source not found
+#
+# Revision 1.6  1999/01/29 10:34:31  peter
 #   + needobjdir,needlibdir
 #
 # Revision 1.5  1999/01/28 19:58:23  peter

+ 23 - 1
ide/text/fpcompil.pas

@@ -42,6 +42,9 @@ uses
   Dos,Video,
   Objects,Drivers,Views,App,
   CompHook,
+{$ifdef go32v2}
+  FPRedir,
+{$endif def go32v2}
   FPConst,FPVars,FPUtils,FPIntf,FPSwitches;
 
 constructor TCompileStatusDialog.Init;
@@ -207,7 +210,15 @@ begin
   do_stop:=CompilerStop;
   do_comment:=CompilerComment;
 
+{$ifdef go32v2}
+  ChangeRedir('fp$$$.out',false);
+  ChangeErrorRedir('fp$$$.err',false);
+{$endif def go32v2}
   Compile(FileName);
+{$ifdef go32v2}
+  RestoreRedir;
+  RestoreErrorRedir;
+{$endif def go32v2}
 
   if status.errorCount=0
      then CompilationPhase:=cpDone
@@ -233,7 +244,18 @@ end;
 end.
 {
   $Log$
-  Revision 1.7  1999-01-21 11:54:11  peter
+  Revision 1.8  1999-02-04 13:32:01  pierre
+    * Several things added (I cannot commit them independently !)
+    + added TBreakpoint and TBreakpointCollection
+    + added cmResetDebugger,cmGrep,CmToggleBreakpoint
+    + Breakpoint list in INIFile
+    * Select items now also depend of SwitchMode
+    * Reading of option '-g' was not possible !
+    + added search for -Fu args pathes in TryToOpen
+    + added code for automatic opening of FileDialog
+      if source not found
+
+  Revision 1.7  1999/01/21 11:54:11  peter
     + tools menu
     + speedsearch in symbolbrowser
     * working run command

+ 147 - 9
ide/text/fpdebug.pas

@@ -17,35 +17,61 @@ unit FPDebug;
 interface
 
 uses
-  GDBCon;
+  Objects,GDBCon;
 
 type
   PDebugController=^TDebugController;
   TDebugController=object(TGDBController)
+     Invalid_line : boolean;
+     LastFileName : string;
     constructor Init(const exefn:string);
     destructor  Done;
     procedure DoSelectSourceline(const fn:string;line:longint);virtual;
 {    procedure DoStartSession;virtual;
-    procedure DoBreakSession;virtual;
-    procedure DoEndSession(code:longint);virtual; }
+    procedure DoBreakSession;virtual;}
+    procedure DoEndSession(code:longint);virtual;
+    procedure AnnotateError;
     procedure DoDebuggerScreen;virtual;
     procedure DoUserScreen;virtual;
   end;
 
+  BreakpointType = (bt_function,bt_file_line,bt_invalid);
+  BreakpointState = (bs_enabled,bs_disabled,bs_invalid);
+
+  PBreakpointCollection=^TBreakpointCollection;
+
+  PBreakpoint=^TBreakpoint;
+  TBreakpoint=object(TObject)
+     typ  : BreakpointType;
+     state : BreakpointState;
+     owner : PBreakpointCollection;
+     Name : PString;  { either function name or file name }
+     Line : Longint; { only used for bt_file_line type }
+     constructor Init_function(Const AFunc : String);
+     constructor Init_file_line(Const AFile : String; ALine : longint);
+     destructor Done;virtual;
+  end;
+
+  TBreakpointCollection=object(TCollection)
+      function  At(Index: Integer): PBreakpoint;
+      function  ToggleFileLine(Const FileName: String;LineNr : Longint) : boolean;
+      procedure FreeItem(Item: Pointer); virtual;
+    end;
+
 var
   Debugger : PDebugController;
-
+  BreakpointCollection : PBreakpointCollection;
+  
 procedure InitDebugger;
 procedure DoneDebugger;
 
-
 implementation
 
 uses
   Dos,Mouse,Video,
   App,
   FPViews,FPVars,FPUtils,FPIntf,
-  FPCompile,FPIDe;
+  FPCompile,FPIde;
 
 
 {****************************************************************************
@@ -63,9 +89,21 @@ end;
 
 destructor TDebugController.Done;
 begin
+  { kill the program if running }
+  Reset;
   inherited Done;
 end;
 
+procedure TDebugController.AnnotateError;
+var errornb : longint;
+begin
+  if error then
+    begin
+       errornb:=error_num;
+       ErrorBox(#3'Error within GDB'#13#3'Error code = %d',@errornb);
+    end;
+end;
+
 
 procedure TDebugController.DoSelectSourceLine(const fn:string;line:longint);
 var
@@ -79,10 +117,25 @@ begin
    begin
      W^.Editor^.SetHighlightRow(Line);
      W^.Select;
-   end;
+     Invalid_line:=false;
+   end
+   { only search a file once }
+  else if fn<>LastFileName then
+   begin
+     if not MyApp.OpenSearch(fn+'*') then
+       Invalid_line:=true;
+   end
+  else
+    Invalid_line:=true;
+  LastFileName:=fn;
   Desktop^.UnLock;
 end;
 
+procedure TDebugController.DoEndSession(code:longint);
+begin
+   InformationBox(#3'Program exited with '#13#3'exitcode = %d',@code);
+end;
+
 
 procedure TDebugController.DoDebuggerScreen;
 begin
@@ -96,6 +149,79 @@ begin
 end;
 
 
+{****************************************************************************
+                                 TBreakpoint
+****************************************************************************}
+
+constructor TBreakpoint.Init_function(Const AFunc : String);
+begin
+  typ:=bt_function;
+  state:=bs_enabled;
+  GetMem(Name,Length(AFunc)+1);
+  Name^:=AFunc;
+end;
+
+constructor TBreakpoint.Init_file_line(Const AFile : String; ALine : longint);
+begin
+  typ:=bt_file_line;
+  state:=bs_enabled;
+  GetMem(Name,Length(AFile)+1);
+  Name^:=AFile;
+  Line:=ALine;
+end;
+
+
+destructor TBreakpoint.Done;
+begin
+  if assigned(Name) then
+    FreeMem(Name,Length(Name^)+1);
+  inherited Done;
+end;
+
+{****************************************************************************
+                        TBreakpointCollection
+****************************************************************************}
+
+function TBreakpointCollection.At(Index: Integer): PBreakpoint;
+begin
+  At:=inherited At(Index);
+end;
+
+procedure TBreakpointCollection.FreeItem(Item: Pointer);
+begin
+  if Item<>nil then Dispose(PBreakpoint(Item),Done);
+end;
+
+function TBreakpointCollection.ToggleFileLine(Const FileName: String;LineNr : Longint) : boolean;
+
+var PB : PBreakpoint;
+
+  function IsThere(P : PBreakpoint) : boolean;
+  begin
+    IsThere:=(P^.typ=bt_file_line) and (P^.Name^=FileName) and (P^.Line=LineNr);
+  end;
+begin
+    PB:=FirstThat(@IsThere);
+    ToggleFileLine:=false;
+    If Assigned(PB) then
+      if PB^.state=bs_disabled then
+        begin
+          PB^.state:=bs_enabled;
+          ToggleFileLine:=true;
+        end
+      else if PB^.state=bs_enabled then
+        PB^.state:=bs_disabled;
+    If not assigned(PB) then
+      begin
+        PB:= New(PBreakpoint,Init_file_line(FileName,LineNr));
+        if assigned(PB) then
+          Begin
+            Insert(PB);
+            ToggleFileLine:=true;
+          End;
+      end;
+end;
+
 {****************************************************************************
                                  Initialize
 ****************************************************************************}
@@ -124,12 +250,24 @@ begin
    dispose(Debugger,Done);
 end;
 
-
+begin
+  New(BreakpointCollection,init(10,10));
 end.
 
 {
   $Log$
-  Revision 1.3  1999-02-02 16:41:38  peter
+  Revision 1.4  1999-02-04 13:32:02  pierre
+    * Several things added (I cannot commit them independently !)
+    + added TBreakpoint and TBreakpointCollection
+    + added cmResetDebugger,cmGrep,CmToggleBreakpoint
+    + Breakpoint list in INIFile
+    * Select items now also depend of SwitchMode
+    * Reading of option '-g' was not possible !
+    + added search for -Fu args pathes in TryToOpen
+    + added code for automatic opening of FileDialog
+      if source not found
+
+  Revision 1.3  1999/02/02 16:41:38  peter
     + automatic .pas/.pp adding by opening of file
     * better debuggerscreen changes
 

+ 38 - 6
ide/text/fpide.pas

@@ -19,6 +19,7 @@ interface
 uses
   Drivers,Views,App,
   {$ifdef EDITORS}Editors,{$else}WEditor,{$endif}
+  Comphook,
   FPViews;
 
 type
@@ -27,6 +28,7 @@ type
       procedure   InitMenuBar; virtual;
       procedure   InitStatusLine; virtual;
       procedure   Open(FileName: string);
+      function    OpenSearch(FileName: string) : boolean;
       procedure   HandleEvent(var Event: TEvent); virtual;
       function    GetPalette: PPalette; virtual;
       procedure   DosShell; virtual;
@@ -48,11 +50,13 @@ type
       procedure DoStepOver;
       procedure DoTraceInto;
       procedure DoRun;
+      procedure DoResetDebugger;
       procedure Target;
       procedure PrimaryFile_;
       procedure ClearPrimary;
       procedure DoUserScreenWindow;
       procedure DoUserScreen;
+      procedure DoToggleBreak;
       procedure Information;
       procedure Calculator;
       procedure ExecuteTool(Idx: integer);
@@ -63,6 +67,7 @@ type
       procedure DoDebuggerSwitch;
       procedure Directories;
       procedure Tools;
+      procedure Grep;
       procedure EditorOptions(Editor: PEditor);
       procedure Mouse;
       procedure Colors;
@@ -105,7 +110,7 @@ uses
   Systems,BrowCol,
   WHelp,WHlpView,WINI,
   FPConst,FPVars,FPUtils,FPSwitches,FPIni,FPIntf,FPCompile,FPHelp,
-  FPTemplt,FPCalc,FPUsrScr,FPSymbol,FPTools,FPDebug;
+  FPTemplt,FPCalc,FPUsrScr,FPSymbol,FPTools,FPDebug,FPRedir;
 
 
 function IDEUseSyntaxHighlight(Editor: PFileEditor): boolean; {$ifndef FPC}far;{$endif}
@@ -113,9 +118,17 @@ begin
   IDEUseSyntaxHighlight:=(Editor^.FileName='') or MatchesFileList(NameAndExtOf(Editor^.FileName),HighlightExts);
 end;
 
+function IDEUseTabsPattern(Editor: PFileEditor): boolean; {$ifndef FPC}far;{$endif}
+begin
+  IDEUseTabsPattern:=(Editor^.FileName='') or MatchesFileList(NameAndExtOf(Editor^.FileName),TabsPattern);
+end;
+
 constructor TIDEApp.Init;
 begin
-  {$ifndef EDITORS}UseSyntaxHighlight:=IDEUseSyntaxHighlight;{$endif}
+  {$ifndef EDITORS}
+  UseSyntaxHighlight:=IDEUseSyntaxHighlight;
+  UseTabsPattern:=IDEUseTabsPattern;
+  {$endif}
   inherited Init;
   New(ClipboardWindow, Init);
   Desktop^.Insert(ClipboardWindow);
@@ -172,7 +185,8 @@ begin
       NewItem('~S~tep Over','F8', kbF8, cmStepOver, hcRun,
       NewItem('~T~race Into','F7', kbF7, cmTraceInto, hcRun,
       NewItem('P~a~rameters...','', kbNoKey, cmParameters, hcParameters,
-      nil))))),
+      NewItem('Reset ~P~rog','Ctrl+F2', kbCtrlF2, cmResetDebugger, hcResetDebugger,
+      nil)))))),
     NewSubMenu('~C~ompile',hcCompileMenu, NewMenu(
       NewItem('~C~ompile','Alt+F9', kbAltF9, cmCompile, hcCompile,
       NewItem('~M~ake','F9', kbF9, cmMake, hcMake,
@@ -187,11 +201,14 @@ begin
     NewSubMenu('~D~ebug', hcDebugMenu, NewMenu(
       NewItem('~O~utput','', kbNoKey, cmUserScreenWindow, hcUserScreenWindow,
       NewItem('~U~ser screen','Alt+F5', kbAltF5, cmUserScreen, hcUserScreen,
-      nil))),
+      NewItem('~B~reakpoint','Ctrl+F8', kbCtrlF8, cmToggleBreakpoint, hcToggleBreakpoint,
+      nil)))),
     NewSubMenu('~T~ools', hcToolsMenu, NewMenu(
       NewItem('~M~essages', '', kbNoKey, cmToolsMessages, hcToolsMessages,
+      NewLine(
+      NewItem('~G~rep', 'Shift+F2', kbShiftF2, cmGrep, hcGrep,
       NewItem('~C~alculator', '', kbNoKey, cmCalculator, hcCalculator,
-      nil))),
+      nil))))),
     NewSubMenu('~O~ptions', hcOptionsMenu, NewMenu(
       NewItem('Mode~.~..','', kbNoKey, cmSwitchesMode, hcSwitchesMode,
       NewItem('~C~ompiler...','', kbNoKey, cmCompiler, hcCompiler,
@@ -320,6 +337,8 @@ begin
              cmStepOver      : DoStepOver;
              cmTraceInto     : DoTraceInto;
              cmRun           : DoRun;
+             cmResetDebugger : DoResetDebugger;
+
            { -- Compile menu -- }
              cmCompile       : DoCompile(cCompile);
              cmBuild         : DoCompile(cBuild);
@@ -330,6 +349,7 @@ begin
              cmInformation   : Information;
            { -- Debug menu -- }
              cmUserScreen    : DoUserScreen;
+             cmToggleBreakpoint   : DoToggleBreak;
            { -- Options menu -- }
              cmSwitchesMode  : SetSwitchesMode;
              cmCompiler      : DoCompilerSwitch;
@@ -347,6 +367,7 @@ begin
              cmSaveAsINI     : SaveAsINI;
            { -- Tools menu -- }
              cmCalculator    : Calculator;
+             cmGrep          : Grep;
              cmToolsBase+1..
              cmToolsBase+MaxToolCount
                              : ExecuteTool(Event.Command-cmToolsBase);
@@ -623,7 +644,18 @@ end;
 END.
 {
   $Log$
-  Revision 1.6  1999-02-02 16:41:39  peter
+  Revision 1.7  1999-02-04 13:32:03  pierre
+    * Several things added (I cannot commit them independently !)
+    + added TBreakpoint and TBreakpointCollection
+    + added cmResetDebugger,cmGrep,CmToggleBreakpoint
+    + Breakpoint list in INIFile
+    * Select items now also depend of SwitchMode
+    * Reading of option '-g' was not possible !
+    + added search for -Fu args pathes in TryToOpen
+    + added code for automatic opening of FileDialog
+      if source not found
+
+  Revision 1.6  1999/02/02 16:41:39  peter
     + automatic .pas/.pp adding by opening of file
     * better debuggerscreen changes
 

+ 143 - 27
ide/text/fpini.pas

@@ -36,39 +36,55 @@ implementation
 uses
   Dos,Objects,Drivers,
   WINI,{$ifndef EDITORS}WEditor{$else}Editors{$endif},
-  FPConst,FPVars,FPIntf,FPTools;
+  FPDebug,FPConst,FPVars,
+  FPIntf,FPTools,FPSwitch;
 
 const
   { INI file sections }
-  secFiles           = 'Files';
-  secRun             = 'Run';
-  secCompile         = 'Compile';
-  secColors          = 'Colors';
-  secHelp            = 'Help';
-  secEditor          = 'Editor';
+  secFiles	   = 'Files';
+  secRun	     = 'Run';
+  secCompile	 = 'Compile';
+  secColors	  = 'Colors';
+  secHelp	    = 'Help';
+  secEditor	  = 'Editor';
+  secBreakpoint  = 'Breakpoints';
   secHighlight       = 'Highlight';
-  secMouse           = 'Mouse';
-  secSearch          = 'Search';
-  secTools           = 'Tools';
+  secMouse	   = 'Mouse';
+  secSearch	  = 'Search';
+  secTools	   = 'Tools';
 
   { INI file tags }
   ieRecentFile       = 'RecentFile';
   ieRunParameters    = 'Parameters';
   iePrimaryFile      = 'PrimaryFile';
-  iePalette          = 'Palette';
-  ieHelpFiles        = 'Files';
+  ieCompileMode      = 'CompileMode';																									
+  iePalette	     = 'Palette';
+  ieHelpFiles	     = 'Files';
   ieDefaultTabSize   = 'DefaultTabSize';
   ieDefaultEditorFlags='DefaultFlags';
   ieHighlightExts    = 'Exts';
+  ieTabsPattern      = 'NeedsTabs';
   ieDoubleClickDelay = 'DoubleDelay';
   ieReverseButtons   = 'ReverseButtons';
   ieAltClickAction   = 'AltClickAction';
   ieCtrlClickAction  = 'CtrlClickAction';
-  ieFindFlags        = 'FindFlags';
-  ieToolName         = 'Title';
+  ieFindFlags	= 'FindFlags';
+  ieToolName	 = 'Title';
   ieToolProgram      = 'Program';
   ieToolParams       = 'Params';
   ieToolHotKey       = 'HotKey';
+  ieBreakpointTyp    = 'Type';
+  ieBreakpointCount  = 'Count';
+  ieBreakpointState  = 'State';
+  ieBreakpointFunc   = 'Function';
+  ieBreakpointFile   = 'FileName';
+  ieBreakpointLine   = 'LineNumber';
+
+const
+     BreakpointTypeStr : Array[BreakpointType] of String[9]
+       = ( 'function','file-line','invalid' );
+     BreakpointStateStr : Array[BreakpointState] of String[8]
+       = ( 'enabled','disabled','invalid' );
 
 procedure InitINIFile;
 var S: string;
@@ -106,13 +122,13 @@ begin
     P:=Pos('#',copy(S,I,255)); if P>0 then P:=I+P-1 else P:=length(S)+1;
     if Hex=false then
       begin
-        X:=StrToInt(copy(S,I,P-I));
-        OK:=(LastStrToIntResult=0) and (0<=X) and (X<=255);
+	X:=StrToInt(copy(S,I,P-I));
+	OK:=(LastStrToIntResult=0) and (0<=X) and (X<=255);
       end
     else
       begin
-        X:=HexToInt(copy(S,I,P-I));
-        OK:=(LastHexToIntResult=0) and (0<=X) and (X<=255);
+	X:=HexToInt(copy(S,I,P-I));
+	OK:=(LastHexToIntResult=0) and (0<=X) and (X<=255);
       end;
     if OK then C:=C+chr(X);
     Inc(I,P-I);
@@ -120,11 +136,75 @@ begin
   StrToPalette:=C;
 end;
 
+procedure WriteOneBreakPointEntry(I : longint;INIFile : PINIFile);
+var PB : PBreakpoint;
+    S : String;
+begin
+  Str(I,S);
+  PB:=BreakpointCollection^.At(I);
+  If assigned(PB) then
+   With PB^ do
+    Begin
+      INIFile^.SetEntry(secBreakpoint,ieBreakpointTyp+S,BreakpointTypeStr[typ]);
+      INIFile^.SetEntry(secBreakpoint,ieBreakpointState+S,BreakpointStateStr[state]);
+      case typ of
+        bt_function :
+          INIFile^.SetEntry(secBreakpoint,ieBreakpointFunc+S,Name^);
+        bt_file_line :
+          begin
+            INIFile^.SetEntry(secBreakpoint,ieBreakpointFile+S,Name^);
+            INIFile^.SetIntEntry(secBreakpoint,ieBreakpointLine+S,Line);
+          end;
+      end;
+    end;
+end;
+
+procedure ReadOneBreakPointEntry(i : longint;INIFile : PINIFile);
+var PB : PBreakpoint;
+    S,S2 : string;
+    Line : longint;
+    typ : BreakpointType;
+    state : BreakpointState;
+    
+begin
+  Str(I,S2);
+  typ:=bt_invalid;
+  S:=INIFile^.GetEntry(secBreakpoint,ieBreakpointTyp+S2,BreakpointTypeStr[typ]);
+  for typ:=low(BreakpointType) to high(BreakpointType) do
+    If pos(BreakpointTypeStr[typ],S)>0 then break;
+  state:=bs_invalid;
+  S:=INIFile^.GetEntry(secBreakpoint,ieBreakpointState+S2,BreakpointStateStr[state]);
+  for state:=low(BreakpointState) to high(BreakpointState) do
+    If pos(BreakpointStateStr[state],S)>0 then break;
+  case typ of
+     bt_invalid :;
+     bt_function :
+       begin
+         S:=INIFile^.GetEntry(secBreakpoint,ieBreakpointFunc+S2,'');
+       end;
+     bt_file_line :
+       begin
+         S:=INIFile^.GetEntry(secBreakpoint,ieBreakpointFile+S2,'');
+         Line:=INIFile^.GetIntEntry(secBreakpoint,ieBreakpointLine+S2,0);
+       end;
+     end;
+   if (typ=bt_function) and (S<>'') then
+     new(PB,init_function(S))
+   else if (typ=bt_file_line) and (S<>'') then
+     new(PB,init_file_line(S,Line));
+   If assigned(PB) then
+     PB^.state:=state;
+   If assigned(PB) then
+     BreakpointCollection^.Insert(PB);
+end;
+
 function ReadINIFile: boolean;
 var INIFile: PINIFile;
     S,PS,S1,S2,S3: string;
     I,P: integer;
+    BreakPointCount:longint;
     OK: boolean;
+    ts : TSwitchMode;
     W: word;
 begin
   OK:=ExistsFile(INIPath);
@@ -138,16 +218,26 @@ begin
       if (S='') and (RecentFileCount>I-1) then RecentFileCount:=I-1;
       with RecentFiles[I] do
       begin
-        P:=Pos(',',S); if P=0 then P:=length(S)+1;
-        FileName:=copy(S,1,P-1); Delete(S,1,P);
-        P:=Pos(',',S); if P=0 then P:=length(S)+1;
-        LastPos.X:=Max(0,StrToInt(copy(S,1,P-1))); Delete(S,1,P);
-        P:=Pos(',',S); if P=0 then P:=length(S)+1;
-        LastPos.Y:=Max(0,StrToInt(copy(S,1,P-1))); Delete(S,1,P);
+	P:=Pos(',',S); if P=0 then P:=length(S)+1;
+	FileName:=copy(S,1,P-1); Delete(S,1,P);
+	P:=Pos(',',S); if P=0 then P:=length(S)+1;
+	LastPos.X:=Max(0,StrToInt(copy(S,1,P-1))); Delete(S,1,P);
+	P:=Pos(',',S); if P=0 then P:=length(S)+1;
+	LastPos.Y:=Max(0,StrToInt(copy(S,1,P-1))); Delete(S,1,P);
       end;
     end;
   SetRunParameters(INIFile^.GetEntry(secRun,ieRunParameters,GetRunParameters));
   PrimaryFile:=INIFile^.GetEntry(secCompile,iePrimaryFile,PrimaryFile);
+ {   SwitchesModeStr : array[TSwitchMode] of string[8]=
+      ('NORMAL','DEBUG','RELEASE');}
+  S:=INIFile^.GetEntry(secCompile,ieCompileMode,'');
+  for ts:=low(TSwitchMode) to high(TSwitchMode) do
+    begin
+      if SwitchesModeStr[ts]=S then
+	begin
+	  SwitchesMode:=ts;
+	end;
+    end;
   S:=INIFile^.GetEntry(secHelp,ieHelpFiles,'');
   repeat
     P:=Pos(';',S); if P=0 then P:=length(S)+1;
@@ -160,10 +250,17 @@ begin
   DefaultCodeEditorFlags:=INIFile^.GetIntEntry(secEditor,ieDefaultEditorFlags,DefaultCodeEditorFlags);
 {$endif}
   HighlightExts:=INIFile^.GetEntry(secHighlight,ieHighlightExts,HighlightExts);
+  TabsPattern:=INIFile^.GetEntry(secHighlight,ieTabsPattern,TabsPattern);
   DoubleDelay:=INIFile^.GetIntEntry(secMouse,ieDoubleClickDelay,DoubleDelay);
   MouseReverse:=boolean(INIFile^.GetIntEntry(secMouse,ieReverseButtons,byte(MouseReverse)));
   AltMouseAction:=INIFile^.GetIntEntry(secMouse,ieAltClickAction,AltMouseAction);
   CtrlMouseAction:=INIFile^.GetIntEntry(secMouse,ieCtrlClickAction,CtrlMouseAction);
+  FindFlags:=INIFile^.GetIntEntry(secSearch,ieFindFlags,FindFlags);
+  { Breakpoints }
+  BreakpointCount:=INIFile^.GetIntEntry(secBreakpoint,ieBreakpointCount,0);
+  for i:=1 to BreakpointCount do
+    ReadOneBreakPointEntry(i-1,INIFile);
+    
   for I:=1 to MaxToolCount do
     begin
       S:=IntToStr(I);
@@ -192,6 +289,7 @@ var INIFile: PINIFile;
     S: string;
     S1,S2,S3: string;
     W: word;
+    BreakPointCount:longint;
     I: integer;
     OK: boolean;
 procedure ConcatName(P: PString); {$ifndef FPC}far;{$endif}
@@ -204,13 +302,14 @@ begin
   for I:=1 to High(RecentFiles) do
     begin
       if I<=RecentFileCount then
-         with RecentFiles[I] do S:=FileName+','+IntToStr(LastPos.X)+','+IntToStr(LastPos.Y)
+	 with RecentFiles[I] do S:=FileName+','+IntToStr(LastPos.X)+','+IntToStr(LastPos.Y)
       else
-         S:='';
+	 S:='';
       INIFile^.SetEntry(secFiles,ieRecentFile+IntToStr(I),S);
     end;
   INIFile^.SetEntry(secRun,ieRunParameters,GetRunParameters);
   INIFile^.SetEntry(secCompile,iePrimaryFile,PrimaryFile);
+  INIFile^.SetEntry(secCompile,ieCompileMode,SwitchesModeStr[SwitchesMode]);
   S:='';
   HelpFiles^.ForEach(@ConcatName);
   INIFile^.SetEntry(secHelp,ieHelpFiles,'"'+S+'"');
@@ -219,11 +318,17 @@ begin
   INIFile^.SetIntEntry(secEditor,ieDefaultEditorFlags,DefaultCodeEditorFlags);
 {$endif}
   INIFile^.SetEntry(secHighlight,ieHighlightExts,'"'+HighlightExts+'"');
+  INIFile^.SetEntry(secHighlight,ieTabsPattern,'"'+TabsPattern+'"');
   INIFile^.SetIntEntry(secMouse,ieDoubleClickDelay,DoubleDelay);
   INIFile^.SetIntEntry(secMouse,ieReverseButtons,byte(MouseReverse));
   INIFile^.SetIntEntry(secMouse,ieAltClickAction,AltMouseAction);
   INIFile^.SetIntEntry(secMouse,ieCtrlClickAction,CtrlMouseAction);
   INIFile^.SetIntEntry(secSearch,ieFindFlags,FindFlags);
+  { Breakpoints }
+  BreakPointCount:=BreakpointCollection^.Count;
+  INIFile^.SetIntEntry(secBreakpoint,ieBreakpointCount,BreakpointCount);
+  for i:=1 to BreakpointCount do
+    WriteOneBreakPointEntry(I-1,INIFile);
   INIFile^.DeleteSection(secTools);
   for I:=1 to GetToolCount do
     begin
@@ -258,7 +363,18 @@ end;
 end.
 {
   $Log$
-  Revision 1.5  1999-01-21 11:54:15  peter
+  Revision 1.6  1999-02-04 13:32:04  pierre
+    * Several things added (I cannot commit them independently !)
+    + added TBreakpoint and TBreakpointCollection
+    + added cmResetDebugger,cmGrep,CmToggleBreakpoint
+    + Breakpoint list in INIFile
+    * Select items now also depend of SwitchMode
+    * Reading of option '-g' was not possible !
+    + added search for -Fu args pathes in TryToOpen
+    + added code for automatic opening of FileDialog
+      if source not found
+
+  Revision 1.5  1999/01/21 11:54:15  peter
     + tools menu
     + speedsearch in symbolbrowser
     * working run command

+ 40 - 3
ide/text/fpmfile.inc

@@ -80,10 +80,13 @@ begin
   OpenIt:=FileName<>'';
   if not OpenIt then
    begin
-     New(D, Init('*.pas','Open a file','*.pas',fdOpenButton,0));
+     New(D, Init(OpenFileLastExt,'Open a file','File to open',fdOpenButton,0));
      OpenIt:=Desktop^.ExecView(D)<>cmCancel;
      if OpenIt then
-       D^.GetFileName(FileName);
+       Begin
+         D^.GetFileName(FileName);
+         OpenFileLastExt:=D^.WildCard;
+       End;
      Dispose(D, Done);
    end;
   if OpenIt then
@@ -93,6 +96,29 @@ begin
    end;
 end;
 
+function TIDEApp.OpenSearch(FileName: string) : boolean;
+var D: PFileDialog;
+    OpenIt: boolean;
+begin
+  OpenIt:=False;
+  if not OpenIt then
+   begin
+     New(D, Init(FileName,'Open a file','File to open',fdOpenButton,0));
+     OpenIt:=Desktop^.ExecView(D)<>cmCancel;
+     if OpenIt then
+       Begin
+         D^.GetFileName(FileName);
+       End;
+     Dispose(D, Done);
+   end;
+  if OpenIt then
+   begin
+     FileName:=FExpand(LocatePasFile(FileName));
+     OpenEditorWindow(nil,FileName,0,0);
+   end;
+  OpenSearch:=OpenIt;
+end;
+
 
 procedure TIDEApp.OpenRecentFile(RecentIndex: integer);
 begin
@@ -121,7 +147,18 @@ end;
 
 {
   $Log$
-  Revision 1.6  1999-02-02 16:41:41  peter
+  Revision 1.7  1999-02-04 13:32:05  pierre
+    * Several things added (I cannot commit them independently !)
+    + added TBreakpoint and TBreakpointCollection
+    + added cmResetDebugger,cmGrep,CmToggleBreakpoint
+    + Breakpoint list in INIFile
+    * Select items now also depend of SwitchMode
+    * Reading of option '-g' was not possible !
+    + added search for -Fu args pathes in TryToOpen
+    + added code for automatic opening of FileDialog
+      if source not found
+
+  Revision 1.6  1999/02/02 16:41:41  peter
     + automatic .pas/.pp adding by opening of file
     * better debuggerscreen changes
 

+ 21 - 2
ide/text/fpmopts.inc

@@ -426,7 +426,7 @@ begin
   if Editor=nil
      then begin TabSize:=DefaultTabSize; EFlags:=DefaultCodeEditorFlags; end
      else begin TabSize:=Editor^.TabSize; EFlags:=Editor^.Flags; end;
-  R.Assign(0,0,56,15);
+  R.Assign(0,0,56,18);
   New(D, Init(R, 'Editor Options'));
   with D^ do
   begin
@@ -467,6 +467,14 @@ begin
     Insert(ExtIL);
     R2.Move(0,-1);
     Insert(New(PLabel, Init(R2, '~H~ighlight extensions', ExtIL)));
+
+    R.Move(0,(R.B.Y-R.A.Y)+1); R.B.Y:=R.A.Y+2;
+    R2.Copy(R); Inc(R2.A.Y);
+    New(ExtIL, Init(R2, 128));
+    ExtIL^.SetData(TabsPattern);
+    Insert(ExtIL);
+    R2.Move(0,-1);
+    Insert(New(PLabel, Init(R2, 'File ~p~atterns needing tabs', ExtIL)));
   end;
   InsertButtons(D);
   CB^.Select;
@@ -673,7 +681,18 @@ end;
 
 {
   $Log$
-  Revision 1.7  1999-01-22 10:24:04  peter
+  Revision 1.8  1999-02-04 13:32:06  pierre
+    * Several things added (I cannot commit them independently !)
+    + added TBreakpoint and TBreakpointCollection
+    + added cmResetDebugger,cmGrep,CmToggleBreakpoint
+    + Breakpoint list in INIFile
+    * Select items now also depend of SwitchMode
+    * Reading of option '-g' was not possible !
+    + added search for -Fu args pathes in TryToOpen
+    + added code for automatic opening of FileDialog
+      if source not found
+
+  Revision 1.7  1999/01/22 10:24:04  peter
     * first debugger things
 
   Revision 1.6  1999/01/21 11:54:19  peter

+ 62 - 4
ide/text/fpmrun.inc

@@ -26,6 +26,11 @@ begin
    end
   else
    Debugger^.TraceNext;
+  While (Debugger^.invalid_line and
+    Debugger^.Debugger_started and
+    not Debugger^.error) do
+   Debugger^.TraceNext;
+  Debugger^.AnnotateError;
 end;
 
 
@@ -40,6 +45,13 @@ begin
    end
   else
    Debugger^.TraceStep;
+  { I think we should not try to go deeper !
+    if the source is not found PM }
+  While (Debugger^.invalid_line and
+        Debugger^.Debugger_started and
+        not Debugger^.error) do
+   Debugger^.TraceNext;
+  Debugger^.AnnotateError;
 end;
 
 
@@ -61,9 +73,13 @@ begin
       Exit;
     end;
 
-  DoExecute(ExeFile,GetRunParameters,false);
-
-  LastExitCode:=DosExitCode;
+  if not assigned(Debugger) then
+    begin
+      DoExecute(ExeFile,GetRunParameters,false);
+      LastExitCode:=DosExitCode;
+    end
+  else
+    Debugger^.Continue;
 end;
 
 
@@ -93,9 +109,51 @@ begin
   Dispose(D, Done);
 end;
 
+procedure TIDEApp.DoResetDebugger;
+begin
+  if assigned(Debugger) then
+     DoneDebugger;
+end;
+
+procedure TIDEApp.DoToggleBreak;
+var
+  W : PSourceWindow;
+  FileName : string;
+  b : boolean;
+  LineNr : longint;
+  Info : record
+          F : pstring;
+          L : longint;
+         end;
+begin
+  W:=FirstEditorWindow;
+  If assigned(W) then
+    begin
+      FileName:=W^.Editor^.FileName;
+      LineNr:=W^.Editor^.CurPos.Y+1;
+      Info.F:=@FileName;
+      Info.L:=LineNr;
+      InformationBox(#3'Trying to set a breakpoint at'#13#3+
+         '%s : %d',@Info);
+      b:=BreakpointCollection^.ToggleFileLine(FileName,LineNr);
+      W^.Editor^.SetLineBreakState(LineNr-1,b);
+    end;
+end;
+
 {
   $Log$
-  Revision 1.6  1999-01-22 10:24:05  peter
+  Revision 1.7  1999-02-04 13:32:07  pierre
+    * Several things added (I cannot commit them independently !)
+    + added TBreakpoint and TBreakpointCollection
+    + added cmResetDebugger,cmGrep,CmToggleBreakpoint
+    + Breakpoint list in INIFile
+    * Select items now also depend of SwitchMode
+    * Reading of option '-g' was not possible !
+    + added search for -Fu args pathes in TryToOpen
+    + added code for automatic opening of FileDialog
+      if source not found
+
+  Revision 1.6  1999/01/22 10:24:05  peter
     * first debugger things
 
   Revision 1.5  1999/01/21 11:54:20  peter

+ 20 - 3
ide/text/fpmsrch.inc

@@ -22,7 +22,8 @@ procedure TIDEApp.Globals;
 var R: TRect;
     S: PSortedSymbolCollection;
     Overflow: boolean;
-
+    Level : longint;
+    
   procedure InsertInS(P: PSymbol); {$ifndef FPC}far;{$endif}
 
     procedure InsertItemsInS(P: PSymbolCollection);
@@ -33,14 +34,19 @@ var R: TRect;
     end;
 
   begin
+    Inc(level);
     if S^.Count=MaxCollectionSize then
        begin Overflow:=true; Exit; end;
     S^.Insert(P);
-    if P^.Items<>nil then
+    { this is wrong because it inserted args or locals of proc
+      in the globals list !! PM}
+    if (P^.Items<>nil) and (level=1) then
       InsertItemsInS(P^.Items);
+    Dec(level);
   end;
 
 begin
+  level:=0;
   if BrowCol.Modules=nil then
      begin ErrorBox('No debug info available.',nil); Exit; end;
   Overflow:=false;
@@ -70,7 +76,18 @@ end;
 
 {
   $Log$
-  Revision 1.2  1999-01-14 21:42:23  peter
+  Revision 1.3  1999-02-04 13:32:08  pierre
+    * Several things added (I cannot commit them independently !)
+    + added TBreakpoint and TBreakpointCollection
+    + added cmResetDebugger,cmGrep,CmToggleBreakpoint
+    + Breakpoint list in INIFile
+    * Select items now also depend of SwitchMode
+    * Reading of option '-g' was not possible !
+    + added search for -Fu args pathes in TryToOpen
+    + added code for automatic opening of FileDialog
+      if source not found
+
+  Revision 1.2  1999/01/14 21:42:23  peter
     * source tracking from Gabor
 
   Revision 1.1  1999/01/12 14:29:37  peter

+ 89 - 1
ide/text/fpmtools.inc

@@ -41,9 +41,97 @@ begin
     ErrorBox('Execution successful. Exit code '+IntToStr(DosExitCode),nil);
 end;
 
+procedure TIDEApp.Grep;
+
+  var PGrepDialog : PCenterDialog;
+      R,R2 : TRect;
+      IL : PInputLine;
+      p,lineNb : longint;
+      error : word;
+      GrepArgs,Line,ModuleName : String;
+      GrepOut : text;
+      Params : Array[0..4] of longint;
+      
+  Const GrepOutName = 'grep$$.out';
+{$ifdef linux}
+   GrepExeName = 'grep';
+{$else linux}
+   GrepExeName = 'c:\djgpp\bin\grep.exe';
+{$endif linux}
+begin
+  R.Assign(0,0,45,6);
+  new(PGrepDialog,Init(R,'Grep arguments'));
+  with PGrepDialog^ do
+    begin
+      R2.A.Y:=R.A.Y+3;
+      R2.B.Y:=R2.A.Y+1;
+      R2.A.X:=R.A.X+3;
+      R2.B.X:=R.B.X-3;
+      New(IL, Init(R2, 128));
+      If Assigned(DeskTop^.First) and
+         (DeskTop^.First^.HelpCtx=hcSourceWindow) then
+        GrepArgs:=PSourceWindow(DeskTop^.First)^.Editor^.GetCurrentWord
+      else
+        GrepArgs:='';
+      GrepArgs:='-n -i '+GrepArgs+' *.pas *.pp *.inc';
+      IL^.Data^:=GrepArgs;
+      Insert(IL);
+      R2.Move(0,-1);
+      Insert(New(PLabel, Init(R2, '~G~rep arguments', IL)));
+    end;
+
+  InsertButtons(PGrepDialog);
+    if Desktop^.ExecView(PGrepDialog)=cmOK then
+    begin
+      GrepArgs:=IL^.Data^;
+      { Linux ? }
+      if not ExecuteRedir(GrepExeName,GrepArgs,GrepOutName,'grep$$.err') then
+        Begin
+           { 2 as exit code just means that
+             some file vwere not found ! }
+           if (IOStatus<>0) or (ExecuteResult<>2) then
+             begin
+               Params[0]:=IOStatus;
+               Params[1]:=ExecuteResult;
+               WarningBox(#3'Error running Grep'#13#3'DosError = %d'#13#3'Exit code = %d',@Params);
+             end;
+        End;
+      Assign(GrepOut,GrepOutName);
+      Reset(GrepOut);
+      While not eof(GrepOut) do
+        begin
+          readln(GrepOut,Line);
+          p:=pos(':',line);
+          if p>0 then
+            begin
+              ModuleName:=copy(Line,1,p-1);
+              Line:=Copy(Line,p+1,255);
+              p:=pos(':',Line);
+              val(copy(Line,1,p-1),lineNb,error);
+              if error=0 then
+                ProgramInfoWindow^.AddMessage(V_Normal,Copy(Line,p+1,255),
+                  ModuleName,LineNb);
+                end;
+              ProgramInfoWindow^.Show;
+              ProgramInfoWindow^.MakeFirst;
+           end;
+         end;
+  Dispose(PGrepDialog, Done);
+end;
 {
   $Log$
-  Revision 1.2  1999-01-21 11:54:21  peter
+  Revision 1.3  1999-02-04 13:32:09  pierre
+    * Several things added (I cannot commit them independently !)
+    + added TBreakpoint and TBreakpointCollection
+    + added cmResetDebugger,cmGrep,CmToggleBreakpoint
+    + Breakpoint list in INIFile
+    * Select items now also depend of SwitchMode
+    * Reading of option '-g' was not possible !
+    + added search for -Fu args pathes in TryToOpen
+    + added code for automatic opening of FileDialog
+      if source not found
+
+  Revision 1.2  1999/01/21 11:54:21  peter
     + tools menu
     + speedsearch in symbolbrowser
     * working run command

+ 99 - 68
ide/text/fpswitch.pas

@@ -102,7 +102,7 @@ type
     private
       IsSel  : boolean;
       Prefix : char;
-      SelNr  : integer;
+      SelNr  : array[TSwitchMode] of integer;
       Items  : PCollection;
     end;
 
@@ -137,6 +137,7 @@ procedure ReadSwitches(const fn:string);
 { initialize }
 procedure InitSwitches;
 procedure DoneSwitches;
+function  GetUnitDirectories : string;
 
 
 implementation
@@ -150,7 +151,7 @@ var
   CfgFile : text;
 
 {*****************************************************************************
-                                TSwitchItem
+            TSwitchItem
 *****************************************************************************}
 
 constructor TSwitchItem.Init(const n,p:string);
@@ -179,7 +180,7 @@ end;
 
 
 {*****************************************************************************
-                                TSelectItem
+            TSelectItem
 *****************************************************************************}
 
 constructor TSelectItem.Init(const n,p:string);
@@ -190,7 +191,7 @@ end;
 
 
 {*****************************************************************************
-                               TBooleanItem
+                TBooleanItem
 *****************************************************************************}
 
 constructor TBooleanItem.Init(const n,p:string);
@@ -214,7 +215,7 @@ end;
 
 
 {*****************************************************************************
-                                TStringItem
+            TStringItem
 *****************************************************************************}
 
 constructor TStringItem.Init(const n,p:string;mult:boolean);
@@ -245,7 +246,7 @@ end;
 
 
 {*****************************************************************************
-                               TLongintItem
+                TLongintItem
 *****************************************************************************}
 
 constructor TLongintItem.Init(const n,p:string);
@@ -278,14 +279,14 @@ end;
 
 
 {*****************************************************************************
-                                   TSwitch
+               TSwitch
 *****************************************************************************}
 
 constructor TSwitches.Init(ch:char);
 begin
   new(Items,Init(10,5));
   Prefix:=ch;
-  SelNr:=0;
+  FillChar(SelNr,SizeOf(SelNr),#0);
   IsSel:=false;
 end;
 
@@ -294,7 +295,7 @@ constructor TSwitches.InitSelect(ch:char);
 begin
   new(Items,Init(10,5));
   Prefix:=ch;
-  SelNr:=0;
+  FillChar(SelNr,SizeOf(SelNr),#0);
   IsSel:=true;
 end;
 
@@ -428,7 +429,7 @@ end;
 function TSwitches.GetCurrSel:integer;
 begin
   if IsSel then
-   GetCurrSel:=SelNr
+   GetCurrSel:=SelNr[SwitchesMode]
   else
    GetCurrSel:=-1;
 end;
@@ -437,7 +438,7 @@ end;
 procedure TSwitches.SetCurrSel(index:integer);
 begin
   if IsSel then
-   SelNr:=index;
+   SelNr[SwitchesMode]:=index;
 end;
 
 
@@ -453,27 +454,27 @@ var
     if P^.NeedParam then
      begin
        if (P^.Typ=ot_string) and (PStringItem(P)^.Multiple) then
-        begin
-          s:=PStringItem(P)^.Str[SwitchesMode];
-          repeat
-            i:=pos(';',s);
-            if i=0 then
-             i:=255;
-            s1:=Copy(s,1,i-1);
-            if s1<>'' then
-             writeln(CfgFile,' -'+Pref+P^.Param+s1);
-            Delete(s,1,i);
-          until s='';
-        end
+   begin
+     s:=PStringItem(P)^.Str[SwitchesMode];
+     repeat
+       i:=pos(';',s);
+       if i=0 then
+        i:=256;
+       s1:=Copy(s,1,i-1);
+       if s1<>'' then
+        writeln(CfgFile,' -'+Pref+P^.Param+s1);
+       Delete(s,1,i);
+     until s='';
+   end
        else
-        Writeln(CfgFile,' -'+Pref+P^.Param+P^.ParamValue);
+   Writeln(CfgFile,' -'+Pref+P^.Param+P^.ParamValue);
      end;
   end;
 
 begin
   Pref:=Prefix;
   if IsSel then
-    writeln(CfgFile,' '+ItemParam(SelNr))
+    writeln(CfgFile,' '+ItemParam(SelNr[SwitchesMode]))
   else
     Items^.ForEach(@writeitem);
 end;
@@ -483,7 +484,9 @@ function TSwitches.ReadItemsCfg(const s:string):boolean;
 
   function checkitem(P:PSwitchItem):boolean;{$ifndef FPC}far;{$endif}
   begin
-    CheckItem:=(P^.Param=Copy(s,1,length(P^.Param)));
+    { empty items are not equivalent to others !! }
+    CheckItem:=((S='') and (P^.Param='')) or
+               ((Length(S)>0) and (P^.Param=Copy(s,1,length(P^.Param))));
   end;
 
 var
@@ -494,15 +497,15 @@ begin
   if assigned(FoundP) then
    begin
      case FoundP^.Typ of
-      ot_Select  : SelNr:=Items^.IndexOf(FoundP);
+      ot_Select  : SelNr[SwitchesMode]:=Items^.IndexOf(FoundP);
       ot_Boolean : PBooleanItem(FoundP)^.IsSet[SwitchesMode]:=true;
       ot_String  : begin
-                     if (PStringItem(FoundP)^.Multiple) and (PStringItem(FoundP)^.Str[SwitchesMode]<>'') then
-                      PStringItem(FoundP)^.Str[SwitchesMode]:=PStringItem(FoundP)^.Str[SwitchesMode]+';'+
-                        Copy(s,length(FoundP^.Param)+1,255)
-                     else
-                      PStringItem(FoundP)^.Str[SwitchesMode]:=Copy(s,length(FoundP^.Param)+1,255);
-                   end;
+           if (PStringItem(FoundP)^.Multiple) and (PStringItem(FoundP)^.Str[SwitchesMode]<>'') then
+            PStringItem(FoundP)^.Str[SwitchesMode]:=PStringItem(FoundP)^.Str[SwitchesMode]+';'+
+         Copy(s,length(FoundP^.Param)+1,255)
+           else
+            PStringItem(FoundP)^.Str[SwitchesMode]:=Copy(s,length(FoundP^.Param)+1,255);
+         end;
       ot_Longint : Val(Copy(s,length(FoundP^.Param)+1,255),PLongintItem(FoundP)^.Val[SwitchesMode],code);
      end;
      ReadItemsCfg:=true;
@@ -513,7 +516,7 @@ end;
 
 
 {*****************************************************************************
-                                 Read / Write
+             Read / Write
 *****************************************************************************}
 
 procedure WriteSwitches(const fn:string);
@@ -572,40 +575,40 @@ begin
    begin
      readln(CfgFile,s);
      s:=LTrim(s);
-     if (length(s)>2) and (s[1]='-') then
+     if (length(s)>=2) and (s[1]='-') then
       begin
-        c:=s[2];
-        Delete(s,1,2);
-        case c of
-         'd' : ConditionalSwitches^.ReadItemsCfg(s);
-         'X' : LibLinkerSwitches^.ReadItemsCfg(s);
-         'g' : DebugInfoSwitches^.ReadItemsCfg(s);
-         'p' : ProfileInfoSwitches^.ReadItemsCfg(s);
-         'S' : SyntaxSwitches^.ReadItemsCfg(s);
-         'F' : DirectorySwitches^.ReadItemsCfg(s);
-         'T' : TargetSwitches^.ReadItemsCfg(s);
-         'R' : AsmReaderSwitches^.ReadItemsCfg(s);
-         'C' : begin
-                 CodegenSwitches^.ReadItemsCfg(s);
-                 MemorySizeSwitches^.ReadItemsCfg(s);
-               end;
-         'v' : VerboseSwitches^.ReadItemsCfg(s);
-         'O' : begin
-                 if not OptimizationSwitches^.ReadItemsCfg(s) then
-                  ProcessorSwitches^.ReadItemsCfg(s);
-               end;
-        end;
+      c:=s[2];
+      Delete(s,1,2);
+      case c of
+       'd' : ConditionalSwitches^.ReadItemsCfg(s);
+       'X' : LibLinkerSwitches^.ReadItemsCfg(s);
+       'g' : DebugInfoSwitches^.ReadItemsCfg(s);
+       'p' : ProfileInfoSwitches^.ReadItemsCfg(s);
+       'S' : SyntaxSwitches^.ReadItemsCfg(s);
+       'F' : DirectorySwitches^.ReadItemsCfg(s);
+       'T' : TargetSwitches^.ReadItemsCfg(s);
+       'R' : AsmReaderSwitches^.ReadItemsCfg(s);
+       'C' : begin
+               CodegenSwitches^.ReadItemsCfg(s);
+               MemorySizeSwitches^.ReadItemsCfg(s);
+             end;
+       'v' : VerboseSwitches^.ReadItemsCfg(s);
+       'O' : begin
+               if not OptimizationSwitches^.ReadItemsCfg(s) then
+                 ProcessorSwitches^.ReadItemsCfg(s);
+             end;
+      end;
       end
      else
       if (Copy(s,1,7)='#IFDEF ') then
        begin
-         Delete(s,1,7);
-         for i:=low(TSwitchMode) to high(TSwitchMode) do
-          if s=SwitchesModeStr[i] then
-           begin
-             SwitchesMode:=i;
-             break;
-           end;
+    Delete(s,1,7);
+    for i:=low(TSwitchMode) to high(TSwitchMode) do
+     if s=SwitchesModeStr[i] then
+      begin
+        SwitchesMode:=i;
+        break;
+      end;
        end;
    end;
   close(CfgFile);
@@ -613,9 +616,25 @@ begin
 end;
 
 
+function  GetUnitDirectories : string;
+var
+  P : PStringItem;
+  function checkitem(P:PSwitchItem):boolean;{$ifndef FPC}far;{$endif}
+  begin
+    CheckItem:=(P^.Typ=ot_string) and (P^.Param='u');
+  end;
+begin
+  GetUnitDirectories:='';
+  P:=DirectorySwitches^.Items^.FirstThat(@CheckItem);
+  if assigned(P) then
+    Begin
+      GetUnitDirectories:=P^.Str[SwitchesMode];
+      exit;
+    End;
+end;
 
 {*****************************************************************************
-                                 Initialize
+             Initialize
 *****************************************************************************}
 
 procedure InitSwitches;
@@ -714,9 +733,10 @@ begin
   New(DebugInfoSwitches,InitSelect('g'));
   with DebugInfoSwitches^ do
    begin
-     AddSelectItem('~S~trip all symbols from executable','-');
-     AddSelectItem('Generate ~g~sym symbol information','g');
-     AddSelectItem('Generate ~d~bx symbol information','d');
+     AddSelectItem('~S~trip all debug symbols from executable','-');
+     AddSelectItem('Generate ~d~ebug symbol information','');
+     { AddSelectItem('Generate ~d~bx symbol information','d');
+       does not work anyhow (PM) }
    end;
   New(ProfileInfoSwitches,InitSelect('p'));
   with ProfileInfoSwitches^ do
@@ -755,7 +775,18 @@ end;
 end.
 {
   $Log$
-  Revision 1.3  1999-01-12 14:29:39  peter
+  Revision 1.4  1999-02-04 13:32:10  pierre
+    * Several things added (I cannot commit them independently !)
+    + added TBreakpoint and TBreakpointCollection
+    + added cmResetDebugger,cmGrep,CmToggleBreakpoint
+    + Breakpoint list in INIFile
+    * Select items now also depend of SwitchMode
+    * Reading of option '-g' was not possible !
+    + added search for -Fu args pathes in TryToOpen
+    + added code for automatic opening of FileDialog
+      if source not found
+
+  Revision 1.3  1999/01/12 14:29:39  peter
     + Implemented still missing 'switch' entries in Options menu
     + Pressing Ctrl-B sets ASCII mode in editor, after which keypresses (even
       ones with ASCII < 32 ; entered with Alt+<###>) are interpreted always as

+ 30 - 6
ide/text/fpviews.pas

@@ -317,6 +317,7 @@ const
       CalcClipboard  : extended = 0;
 
       OpenFileName   : string = '';
+      OpenFileLastExt : string = '*.pas';
       NewEditorOpened: boolean = false;
 
 var  MsgParms : array[1..10] of
@@ -330,7 +331,7 @@ implementation
 
 uses
   Keyboard,Memory,MsgBox,Validate,
-  Tokens,
+  Tokens,FPSwitch,
   FPVars,FPUtils,FPHelp,FPCompile;
 
 const
@@ -2165,6 +2166,7 @@ begin
   W:=TryToOpenFile(@R,P^.GetModuleName,0,P^.ID-1);
   if W<>nil then
     begin
+      W^.Select;
       W^.Editor^.SetHighlightRow(P^.ID-1);
     end;
   if Assigned(Owner) then
@@ -2315,7 +2317,7 @@ begin
   if ClassS<>'' then
    ClassS:=RExpand(ClassS,0)+': ';
   S:=ClassS;
-  if (Module<>nil) and (ID<>0) then
+  if (Module<>nil) {and (ID<>0)} then
      S:=S+Module^+' ('+IntToStr(ID)+'): ';
   if Text<>nil then S:=ClassS+Text^;
   if length(S)>MaxLen then S:=copy(S,1,MaxLen-2)+'..';
@@ -2951,6 +2953,8 @@ function TryToOpenFile(Bounds: PRect; FileName: string; CurX,CurY: integer): PSo
 var D : DirStr;
     N : NameStr;
     E : ExtStr;
+    DrStr : String;
+    
 function CheckDir(NewDir: DirStr; NewName: NameStr; NewExt: ExtStr): boolean;
 var OK: boolean;
 begin
@@ -2967,10 +2971,11 @@ begin
     if CheckDir('.'+DirSep,N,NewExt) then OK:=true;
   CheckExt:=OK;
 end;
-function TryToOpen: PSourceWindow;
+function TryToOpen(const DD : dirstr): PSourceWindow;
 var Found: boolean;
     W : PSourceWindow;
 begin
+  D:=DD;
   Found:=true;
   if E<>'' then Found:=CheckExt(E) else
     if CheckExt('.pp') then Found:=true else
@@ -2988,7 +2993,7 @@ function SearchOnDesktop: PSourceWindow;
 var W: PWindow;
     I: integer;
     Found: boolean;
-    SName: string;
+    SName : string;
 begin
   for I:=1 to 100 do
   begin
@@ -3031,7 +3036,15 @@ begin
     end
   else
     begin
-      W:=TryToOpen;
+      DrStr:=GetUnitDirectories;
+      While pos(';',DrStr)>0 do
+        Begin
+           W:=TryToOpen(Copy(DrStr,1,pos(';',DrStr)-1));
+           if assigned(W) then
+             break;
+           DrStr:=Copy(DrStr,pos(';',DrStr)+1,255);
+        End;
+      W:=TryToOpen(DrStr);
       NewEditorOpened:=W<>nil;
     end;
   TryToOpenFile:=W;
@@ -3041,7 +3054,18 @@ end;
 END.
 {
   $Log$
-  Revision 1.6  1999-01-21 11:54:27  peter
+  Revision 1.7  1999-02-04 13:32:11  pierre
+    * Several things added (I cannot commit them independently !)
+    + added TBreakpoint and TBreakpointCollection
+    + added cmResetDebugger,cmGrep,CmToggleBreakpoint
+    + Breakpoint list in INIFile
+    * Select items now also depend of SwitchMode
+    * Reading of option '-g' was not possible !
+    + added search for -Fu args pathes in TryToOpen
+    + added code for automatic opening of FileDialog
+      if source not found
+
+  Revision 1.6  1999/01/21 11:54:27  peter
     + tools menu
     + speedsearch in symbolbrowser
     * working run command

+ 2 - 3
ide/text/test.pas

@@ -9,8 +9,7 @@ var Hello : word;
     X: PRecord;
     T : TRecord;
 
-function Func1: shortint;
-var X: word;
+function Func1(x,z : word;y : boolean): shortint;
 begin
   if Hello=0 then X:=0 else X:=1;
   Func1:=X;
@@ -20,6 +19,6 @@ BEGIN
   X:=nil;
   writeln('Hello world!');
   writeln(IsOdd(3));
-  writeln(Func1);
+  writeln(Func1(5,5,true));
   Halt;
 END.