Переглянути джерело

Merged revisions 7133-7135,7141,7146-7147 via svnmerge from
svn+ssh://[email protected]/FPC/svn/fpc/trunk

........
r7133 | pierre | 2007-04-18 18:23:14 +0200 (Wed, 18 Apr 2007) | 1 line

* Also align table headers in html tables
........
r7134 | pierre | 2007-04-19 00:24:16 +0200 (Thu, 19 Apr 2007) | 1 line

* try to get nicer html index for our docs
........
r7135 | ivost | 2007-04-19 11:56:01 +0200 (Thu, 19 Apr 2007) | 2 lines

* fixed TCustomInifile.WriteBinaryStream

........
r7141 | pierre | 2007-04-20 11:57:09 +0200 (Fri, 20 Apr 2007) | 1 line

* enhance html display
........
r7146 | pierre | 2007-04-20 17:36:33 +0200 (Fri, 20 Apr 2007) | 1 line

* clean up assembler switches
........
r7147 | pierre | 2007-04-20 17:38:11 +0200 (Fri, 20 Apr 2007) | 1 line

* try to fix assmebler highlighting for different cpus
........

git-svn-id: branches/fixes_2_2@7225 -

joost 18 роки тому
батько
коміт
9589702d5c
6 змінених файлів з 212 додано та 64 видалено
  1. 1 0
      ide/fpmopts.inc
  2. 73 18
      ide/fpswitch.pas
  3. 60 24
      ide/fpviews.pas
  4. 33 9
      ide/whtml.pas
  5. 44 12
      ide/whtmlhlp.pas
  6. 1 1
      packages/fcl-base/src/inc/inifiles.pp

+ 1 - 0
ide/fpmopts.inc

@@ -259,6 +259,7 @@ begin
     Dec(R2.B.X,4);
     R2.B.Y:=R2.A.Y+Count;
     Items:=nil;
+    UpdateAsmOutputSwitches;
     for I:=Count-1 downto 0 do
       Items:=NewSItem(AsmOutputSwitches^.ItemName(I), Items);
     New(RB6, Init(R2, Items));

+ 73 - 18
ide/fpswitch.pas

@@ -184,6 +184,8 @@ var
 procedure WriteSwitches(const fn:string);
 procedure ReadSwitches(const fn:string);
 
+procedure UpdateAsmOutputSwitches;
+
 { initialize }
 procedure InitSwitches;
 procedure SetDefaultSwitches;
@@ -267,15 +269,23 @@ const
       opt_listsource = '~L~ist source';
       opt_listregisterallocation = 'list ~r~egister allocation';
       opt_listtempallocation = 'list ~t~emp allocation';
+      opt_listnodeallocation = 'list ~n~ode allocation';
+      opt_useasmpipe = 'use ~p~ipe with assembler';
       opt_usedefaultas = 'Use ~d~efault output';
       opt_usegnuas = 'Use ~G~NU as';
       opt_usenasmcoff = 'Use ~N~ASM coff';
-      opt_usenasmelf = 'Use NASM ~e~lf';
+      opt_usenasmwin32 = 'Use NASM ~w~in32';
+      opt_usenasmwdosx= 'Use ~N~ASM w~d~osx';
+      opt_usenasmelf = 'Use NASM el~f~';
+      opt_usenasmbeos = 'Use NASM ~b~eos';
       opt_usenasmobj = 'Use NASM ~o~bj';
       opt_usemasm = 'Use ~M~ASM';
       opt_usetasm = 'Use ~T~ASM';
-      opt_usecoff = 'Use ~c~off';
-      opt_usepecoff = 'Use ~p~ecoff';
+      opt_usewasm = 'Use ~W~ASM';
+      opt_usecoff = 'Use internal ~c~off';
+      opt_usepecoff = 'Use internal ~p~ecoff';
+      opt_usepecoffwdosx = 'Use internal pewdos~x~';
+      opt_useelf= 'Use internal ~e~lf';
       { Browser options }
       opt_nobrowser = 'N~o~ browser';
       opt_globalonlybrowser = 'Only Glob~a~l browser';
@@ -1063,6 +1073,63 @@ begin
     GetSourceDirectories:=SourceDirs+';'+S+';';
 end;
 
+{*****************************************************************************
+             AsmOutputInitialize
+*****************************************************************************}
+
+procedure UpdateAsmOutputSwitches;
+var
+  ta : tasm;
+  st : string;
+begin
+  if assigned(AsmOutputSwitches) then
+    dispose(AsmOutputSwitches,Done);
+  New(AsmOutputSwitches,InitSelect('A'));
+  with AsmOutputSwitches^ do
+   begin
+
+     AddDefaultSelect(opt_usedefaultas);
+     for ta:=low(tasm) to high(tasm) do
+       if assigned(asminfos[ta]) and
+         ((asminfos[ta]^.supported_target=target_info.system) or
+         (asminfos[ta]^.supported_target=system_any)) then
+         begin
+           st:='Asm '+asminfos[ta]^.idtxt;
+           if asminfos[ta]^.idtxt='AS' then
+             st:=opt_usegnuas;
+{$ifdef I386}
+           if asminfos[ta]^.idtxt='NASMCOFF' then
+             st:=opt_usenasmcoff;
+           if asminfos[ta]^.idtxt='NASMOBJ' then
+             st:=opt_usenasmobj;
+           if asminfos[ta]^.idtxt='NASMWIN32' then
+             st:=opt_usenasmwin32;
+           if asminfos[ta]^.idtxt='NASMWDOSX' then
+             st:=opt_usenasmwdosx;
+           if asminfos[ta]^.idtxt='NASMELF' then
+             st:=opt_usenasmelf;
+           if asminfos[ta]^.idtxt='NASMBEOS' then
+             st:=opt_usenasmbeos;
+           if asminfos[ta]^.idtxt='MASM' then
+             st:=opt_usemasm;
+           if asminfos[ta]^.idtxt='TASM' then
+             st:=opt_usetasm;
+           if asminfos[ta]^.idtxt='WASM' then
+             st:=opt_usewasm;
+           if asminfos[ta]^.idtxt='COFF' then
+             st:=opt_usecoff;
+           if asminfos[ta]^.idtxt='PECOFF' then
+             st:=opt_usepecoff;
+           if asminfos[ta]^.idtxt='PEWDOSX' then
+             st:=opt_usepecoffwdosx;
+           if asminfos[ta]^.idtxt='ELF' then
+             st:=opt_useelf;
+{$endif I386}
+           AddSelectItem(st,asminfos[ta]^.idtxt,idNone);
+         end;
+   end;
+end;
+
 {*****************************************************************************
              Initialize
 *****************************************************************************}
@@ -1185,22 +1252,10 @@ begin
      AddBooleanItem(opt_listsource,'l',idNone);
      AddBooleanItem(opt_listregisterallocation,'r',idNone);
      AddBooleanItem(opt_listtempallocation,'t',idNone);
+     AddBooleanItem(opt_listnodeallocation,'n',idNone);
+     AddBooleanItem(opt_useasmpipe,'p',idNone);
    end;
-  New(AsmOutputSwitches,InitSelect('A'));
-  with AsmOutputSwitches^ do
-   begin
-     AddDefaultSelect(opt_usedefaultas);
-     AddSelectItem(opt_usegnuas,'as',idNone);
-{$ifdef I386}
-     AddSelectItem(opt_usenasmcoff,'nasmcoff',idNone);
-     AddSelectItem(opt_usenasmelf,'nasmelf',idNone);
-     AddSelectItem(opt_usenasmobj,'nasmobj',idNone);
-     AddSelectItem(opt_usemasm,'masm',idNone);
-     AddSelectItem(opt_usetasm,'tasm',idNone);
-     AddSelectItem(opt_usecoff,'coff',idNone);
-     AddSelectItem(opt_usepecoff,'pecoff',idNone);
-{$endif I386}
-   end;
+  UpdateAsmOutputSwitches;
   New(BrowserSwitches,InitSelect('b'));
   with BrowserSwitches^ do
    begin

+ 60 - 24
ide/fpviews.pas

@@ -542,9 +542,13 @@ uses
   Video,Strings,Keyboard,Validate,
   globtype,Tokens,Version,
   systems,cpubase,
+  itcpugas,
   {$if defined(I386) or defined(x64_86)}
      rax86,
   {$endif}
+  {$ifdef m68k}
+     ag68kgas,
+  {$endif}
 {$ifdef USE_EXTERNAL_COMPILER}
    fpintf, { superseeds version_string of version unit }
 {$endif USE_EXTERNAL_COMPILER}
@@ -946,47 +950,68 @@ begin
   GetReservedWord:=S;
 end;
 
+
+{$ifdef powerpc}
+  {$define USE_TasmCondFlag}
+  {$define Use_gas_op2str}
+{$endif}
+{$ifdef powerpc64}
+  {$define USE_TasmCondFlag}
+  {$define Use_gas_op2str}
+{$endif}
+{$ifdef i386}
+  {$define USE_TasmCond}
+  {$define Use_std_op2str}
+{$endif}
+{$ifdef m68k}
+  {$define USE_None}
+  {$define Use_gas_op2str}
+{$endif}
+
 function GetAsmReservedWordCount: integer;
 begin
   GetAsmReservedWordCount:=ord(lastop) - ord(firstop)
-{$ifndef x86_64}
-{$ifndef powerpc}
-{$ifndef powerpc64}
-{$ifndef arm}
+{$ifdef Use_TasmCond}
     + CondAsmOps*(ord(high(TasmCond))-ord(low(TasmCond)));
-{$else arm}
-   { the arm has an incredible amount of combinations of opcodes,
-     we've to solve this different }
-   ;
-{$endif arm}
-{$else powerpc64}
-   + CondAsmOps*(ord(high(TAsmCondFlag))-ord(low(TAsmCondFlag)));
-{$endif powerpc64}
-{$else powerpc}
-   + CondAsmOps*(ord(high(TAsmCondFlag))-ord(low(TAsmCondFlag)));
-{$endif powerpc}
-{$endif x86_64}
+{$endif Use_TasmCond}
+{$ifdef Use_TasmCondFlag}
+    + CondAsmOps*(ord(high(TasmCondFlag))-ord(low(TasmCondFlag)));
+{$endif Use_TasmCondFlag}
+{$ifdef Use_None}
+    ;
+{$endif Use_None}
 end;
 
 
+{$define NOASM}
 function GetAsmReservedWord(Index: integer): string;
 var
   CondNum,CondOpNum : integer;
 begin
-{$ifdef I386}
+{$ifdef m68k}
+{$undef NOASM}
   if index <= ord(lastop) - ord(firstop) then
-    GetAsmReservedWord:=std_op2str[tasmop(Index+ord(firstop))]
+    GetAsmReservedWord:=gas_op2str[tasmop(Index+ord(firstop))]
   else
+    GetAsmReservedWord:='';
+  (*
     begin
       index:=index - (ord(lastop) - ord(firstop) );
       CondOpNum:= index div (ord(high(TasmCond))-ord(low(TasmCond)));
       CondNum:=index - (CondOpNum * (ord(high(TasmCond))-ord(low(TasmCond))));
       GetAsmReservedWord:=CondAsmOpStr[CondOpNum]+cond2str[TasmCond(CondNum+ord(low(TAsmCond))+1)];
     end;
-{$else not I386}
-{$ifdef m68k}
+    *)
+{$else not m68k}
   if index <= ord(lastop) - ord(firstop) then
-    GetAsmReservedWord:=mot_op2str[tasmop(Index+ord(firstop))]
+{$ifdef Use_gas_op2str}
+    GetAsmReservedWord:=gas_op2str[tasmop(Index+ord(firstop))]
+{$endif Use_gas_op2str}
+{$ifdef Use_std_op2str}
+    GetAsmReservedWord:=std_op2str[tasmop(Index+ord(firstop))]
+{$endif Use_std_op2str}
+{$ifdef Use_TASMCond}
+{$undef NOASM}
   else
     begin
       index:=index - (ord(lastop) - ord(firstop) );
@@ -994,10 +1019,21 @@ begin
       CondNum:=index - (CondOpNum * (ord(high(TasmCond))-ord(low(TasmCond))));
       GetAsmReservedWord:=CondAsmOpStr[CondOpNum]+cond2str[TasmCond(CondNum+ord(low(TAsmCond))+1)];
     end;
-{$else not m68k}
+{$endif Use_TASMCond}
+{$ifdef Use_TASMCondFlag}
+{$undef NOASM}
+  else
+    begin
+      index:=index - (ord(lastop) - ord(firstop) );
+      CondOpNum:= index div (ord(high(TasmCondFlag))-ord(low(TasmCondFlag)));
+      CondNum:=index - (CondOpNum * (ord(high(TasmCondFlag))-ord(low(TasmCondFlag))));
+      GetAsmReservedWord:=CondAsmOpStr[CondOpNum]+AsmCondFlag2Str[TasmCondFlag(CondNum+ord(low(TAsmCondFlag))+1)];
+    end;
+{$endif Use_TASMCond}
+{$endif not m68k}
+{$ifdef NOASM}
   GetAsmReservedWord:='';
-{$endif m68k}
-{$endif I386}
+{$endif NOASM}
 end;
 
 procedure InitReservedWords;

+ 33 - 9
ide/whtml.pas

@@ -103,10 +103,10 @@ type
       procedure   DocDiv(Entered: boolean); virtual;
       procedure   DocList(Entered: boolean); virtual;
       procedure   DocOrderedList(Entered: boolean); virtual;
-      procedure   DocListItem; virtual;
+      procedure   DocListItem(Entered: boolean); virtual;
       procedure   DocDefList(Entered: boolean); virtual;
-      procedure   DocDefTerm; virtual;
-      procedure   DocDefExp; virtual;
+      procedure   DocDefTerm(Entered: boolean); virtual;
+      procedure   DocDefExp(Entered: boolean); virtual;
       procedure   DocTable(Entered: boolean); virtual;
       procedure   DocTableRow(Entered: boolean); virtual;
       procedure   DocTableHeaderItem(Entered: boolean); virtual;
@@ -593,11 +593,11 @@ begin
   { Unordered & ordered lists }
   if (ETagName='UL') then DocList(NotEndTag) else
   if (ETagName='OL') then DocOrderedList(NotEndTag) else
-  if (UTagName='LI') then DocListItem else
+  if (ETagName='LI') then DocListItem(NotEndTag) else
   { Definition list }
   if (ETagName='DL') then DocDefList(NotEndTag) else
-  if (UTagName='DT') then DocDefTerm else
-  if (UTagName='DD') then DocDefExp else
+  if (ETagName='DT') then DocDefTerm(NotEndTag) else
+  if (ETagName='DD') then DocDefExp(NotEndTag) else
   { Table }
   if (ETagName='TABLE') then DocTable(NotEndTag) else
   if (ETagName='TR') then DocTableRow(NotEndTag) else
@@ -793,7 +793,7 @@ procedure THTMLParser.DocOrderedList(Entered: boolean);
 begin
 end;
 
-procedure THTMLParser.DocListItem;
+procedure THTMLParser.DocListItem(Entered: boolean);
 begin
 end;
 
@@ -801,18 +801,42 @@ procedure THTMLParser.DocDefList(Entered: boolean);
 begin
 end;
 
-procedure THTMLParser.DocDefTerm;
+procedure THTMLParser.DocDefTerm(Entered: boolean);
 begin
 end;
 
-procedure THTMLParser.DocDefExp;
+procedure THTMLParser.DocDefExp(Entered: boolean);
 begin
 end;
 
 procedure THTMLParser.DocTable(Entered: boolean);
+var
+  S: String;
 begin
+  if Entered then
+    begin
+      if DocGetTagParam('CLASS',S) then
+        if S='bar' then
+          begin
+            DisableCrossIndexing:=true;
+{$ifdef DEBUG}
+          DebugMessage(GetFileName,'Bar table found, cross indexing disabled ',Line,LinePos);
+{$endif DEBUG}
+          end;
+    end
+  else
+    begin
+{$ifdef DEBUG}
+      if DisableCrossIndexing then
+        begin
+          DebugMessage(GetFileName,'Bar table end found',Line,LinePos);
+        end;
+{$endif DEBUG}
+      DisableCrossIndexing:=false;
+    end;
 end;
 
+
 procedure THTMLParser.DocTableRow(Entered: boolean);
 begin
 end;

+ 44 - 12
ide/whtmlhlp.pas

@@ -62,6 +62,7 @@ type
       GlobalOffset,
       GlobalTextBegin : sw_word;
       WithBorder : boolean;
+      IsBar : boolean;
       FirstLine : PTableLine;
       LastLine : PTableLine;
       PreviousTable : PTable;
@@ -105,12 +106,13 @@ type
       procedure DocSpan(Entered: boolean); virtual;
       procedure DocList(Entered: boolean); virtual;
       procedure DocOrderedList(Entered: boolean); virtual;
-      procedure DocListItem; virtual;
+      procedure DocListItem(Entered: boolean); virtual;
       procedure DocDefList(Entered: boolean); virtual;
-      procedure DocDefTerm; virtual;
-      procedure DocDefExp; virtual;
+      procedure DocDefTerm(Entered: boolean); virtual;
+      procedure DocDefExp(Entered: boolean); virtual;
       procedure DocTable(Entered: boolean); virtual;
       procedure DocTableRow(Entered: boolean); virtual;
+      procedure DocTableHeaderItem(Entered: boolean); virtual;
       procedure DocTableItem(Entered: boolean); virtual;
       procedure DocHorizontalRuler; virtual;
     public
@@ -125,6 +127,7 @@ type
       InAnchor: boolean;
       InParagraph: boolean;
       InPreformatted: boolean;
+      InDefExp: boolean;
       TopicTitle: string;
       Indent: integer;
       AnyCharsInLine: boolean;
@@ -261,6 +264,7 @@ begin
   LastLine:=nil;
 
   WithBorder:=false;
+  IsBar:=false;
 end;
 
 procedure TTable.AddLine(PL : PTableLine);
@@ -308,6 +312,9 @@ var
   TextBegin,TextEnd : sw_word;
   i,j,k,Length : sw_word;
 begin
+  { do nothing for single cell tables }
+  if (NumCols=1) and (NumLines=1) then
+    exit;
   GetMem(ColLengthArray,Sizeof(sw_word)*NumCols);
   FillChar(ColLengthArray^,Sizeof(sw_word)*NumCols,#0);
   GetMem(RowSizeArray,Sizeof(sw_word)*NumLines);
@@ -903,8 +910,10 @@ begin
   DocList(Entered);
 end;
 
-procedure THTMLTopicRenderer.DocListItem;
+procedure THTMLTopicRenderer.DocListItem(Entered: boolean);
 begin
+  if not Entered then
+    exit;
   if AnyCharsInLine then
     DocBreak;
   AddText('þ'+hscLineStart);
@@ -919,25 +928,38 @@ begin
   else
     begin
       if AnyCharsInLine then DocBreak;
+      InDefExp:=false;
     end;
 end;
 
-procedure THTMLTopicRenderer.DocDefTerm;
+procedure THTMLTopicRenderer.DocDefTerm(Entered: boolean);
 begin
+  if not Entered then
+    exit;
   DocBreak;
 end;
 
-procedure THTMLTopicRenderer.DocDefExp;
+procedure THTMLTopicRenderer.DocDefExp(Entered: boolean);
 begin
-  Inc(Indent,DefIndent);
-  DocBreak;
-  Dec(Indent,DefIndent);
+  if not Entered then
+    begin
+      if InDefExp then
+        Dec(Indent,DefIndent);
+      InDefExp:=false;
+    end
+  else
+    begin
+      if not InDefExp then
+        Inc(Indent,DefIndent);
+      InDefExp:=true;
+      DocBreak;
+    end;
 end;
 
 procedure THTMLTopicRenderer.DocTable(Entered: boolean);
 var
   ATable : PTable;
-  Border : String;
+  Param : String;
 begin
   if AnyCharsInLine then
     begin
@@ -950,9 +972,12 @@ begin
       New(ATable,Init(CurrentTable));
       CurrentTable:=ATable;
       CurrentTable^.Renderer:=@Self;
-      if DocGetTagParam('BORDER',border) then
-        if Border<>'0' then
+      if DocGetTagParam('BORDER',Param) then
+        if Param<>'0' then
           CurrentTable^.WithBorder:=true;
+      if DocGetTagParam('CLASS',Param) then
+        if Param='bar' then
+          CurrentTable^.IsBar:=true;
     end
   else
     begin
@@ -1026,6 +1051,13 @@ begin
     end;
 end;
 
+procedure THTMLTopicRenderer.DocTableHeaderItem(Entered: boolean);
+begin
+  { Treat as a normal item }
+  DocTableItem(Entered);
+end;
+
+
 procedure THTMLTopicRenderer.DocHorizontalRuler;
 var OAlign: TParagraphAlign;
 begin

+ 1 - 1
packages/fcl-base/src/inc/inifiles.pp

@@ -514,7 +514,7 @@ begin
       begin
       PB:=M.Memory;
       PC:=PChar(S);
-      For I:=1 to Length(S) do
+      For I:=1 to Length(S) div 2 do
         begin
         H:=HexStr(PB^,2);
         PC[0]:=H[1];