{
TIGCC Documentation Tools
Copyright (C) 2002-2004 Sebastian Reichelt
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
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. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
}
program ConvertTexi;
uses
Windows,
SysUtils,
Classes,
UtilsDos,
UtilsWin,
HelpSystemMasterUnit in '..\HelpSystemMasterUnit.pas';
function GetSecID(Ref: string): string;
begin
Ref := StringReplace (Ref, #13#10, ' ', [rfReplaceAll]);
Ref := StringReplace (Ref, #13, ' ', [rfReplaceAll]);
Ref := StringReplace (Ref, #10, ' ', [rfReplaceAll]);
Ref := StringReplace (Ref, ',, ', ',,', [rfReplaceAll]);
if Ref = 'Invoking GCC,,GCC Command Options' then
Result := 'comopts/comopts'
else if (Ref = 'Overall Options,,Options Controlling the Kind of Output') or (Ref = 'Overall Options,,Options Controlling the Kind of Output, gcc.info, Using GNU CC') then
Result := 'comopts/SEC4'
else if Ref = 'C Dialect Options,,Options Controlling C Dialect' then
Result := 'comopts/SEC6'
else if Ref = 'Warning Options,,Options to Request or Suppress Warnings' then
Result := 'comopts/SEC8'
else if (Ref = 'Debugging Options,,Options for Debugging Your Program or GCC') or (Ref = 'Debugging Options,,Options for Debugging Your Program or @command{gcc}') then
Result := 'comopts/SEC9'
else if Ref = 'Optimize Options,,Options That Control Optimization' then
Result := 'comopts/SEC10'
else if Ref = 'Preprocessor Options,,Options Controlling the Preprocessor' then
Result := 'comopts/SEC11'
else if Ref = 'Assembler Options,,Passing Options to the Assembler' then
Result := 'comopts/SEC12'
else if Ref = 'Directory Options,,Options for Directory Search' then
Result := 'comopts/SEC14'
else if Ref = 'Spec Files,,Specifying subprocesses and the switches to pass to them' then
Result := 'comopts/SEC15'
else if Ref = 'M680x0 Options,,M680x0 Options' then
Result := 'comopts/SEC16'
else if Ref = 'Code Gen Options,,Options for Code Generation Conventions' then
Result := 'comopts/SEC44'
else if Ref = 'Environment Variables,,Environment Variables Affecting GCC' then
Result := 'comopts/SEC45'
else if Ref = 'CPP Overview' then
Result := 'cpp/SEC2'
else if Ref = 'Initial processing' then
Result := 'cpp/SEC3'
else if Ref = 'Tokenization' then
Result := 'cpp/SEC3a'
else if Ref = 'The preprocessing language' then
Result := 'cpp/SEC3b'
else if Ref = 'Header Files' then
Result := 'cpp/SEC4'
else if Ref = 'Include Syntax' then
Result := 'cpp/SEC6'
else if Ref = 'Include Operation' then
Result := 'cpp/SEC7'
else if Ref = 'Once-Only Headers' then
Result := 'cpp/SEC8'
else if Ref = 'Computed Includes' then
Result := 'cpp/SEC8a'
else if Ref = 'Wrapper Headers' then
Result := 'cpp/SEC9'
else if Ref = 'System Headers' then
Result := 'cpp/SEC9a'
else if Ref = 'Macros' then
Result := 'cpp/SEC10'
else if Ref = 'Object-like Macros' then
Result := 'cpp/SEC11'
else if Ref = 'Function-like Macros' then
Result := 'cpp/SEC12'
else if Ref = 'Macro Arguments' then
Result := 'cpp/SEC12a'
else if Ref = 'Variadic Macros' then
Result := 'cpp/SEC13'
else if Ref = 'Predefined Macros' then
Result := 'cpp/SEC14'
else if Ref = 'Standard Predefined Macros' then
Result := 'cpp/SEC15'
else if Ref = 'Common Predefined Macros' then
Result := 'cpp/SEC15a'
else if Ref = 'System-specific Predefined Macros' then
Result := 'cpp/SEC16'
else if Ref = 'Stringification' then
Result := 'cpp/SEC17'
else if Ref = 'Concatenation' then
Result := 'cpp/SEC18'
else if Ref = 'Undefining and Redefining Macros' then
Result := 'cpp/SEC19'
else if Ref = 'Directives Within Macro Arguments' then
Result := 'cpp/SEC20'
else if Ref = 'Macro Pitfalls' then
Result := 'cpp/SEC22'
else if Ref = 'Misnesting' then
Result := 'cpp/SEC23'
else if Ref = 'Operator Precedence Problems' then
Result := 'cpp/SEC24'
else if Ref = 'Swallowing the Semicolon' then
Result := 'cpp/SEC25'
else if Ref = 'Duplication of Side Effects' then
Result := 'cpp/SEC26'
else if Ref = 'Self-Referential Macros' then
Result := 'cpp/SEC27'
else if Ref = 'Argument Prescan' then
Result := 'cpp/SEC28'
else if Ref = 'Newlines in Arguments' then
Result := 'cpp/SEC30'
else if Ref = 'Conditionals' then
Result := 'cpp/SEC31'
else if Ref = 'Conditional Uses' then
Result := 'cpp/SEC32'
else if Ref = 'Conditional Syntax' then
Result := 'cpp/SEC33'
else if Ref = 'If' then
Result := 'cpp/SEC34'
else if Ref = 'Else' then
Result := 'cpp/SEC35'
else if Ref = 'Elif' then
Result := 'cpp/SEC36'
else if Ref = 'Deleted Code' then
Result := 'cpp/SEC37'
else if Ref = 'Ifdef' then
Result := 'cpp/SEC38'
else if Ref = 'Defined' then
Result := 'cpp/SEC38a'
else if Ref = 'Assertions' then
Result := 'cpp/SEC39'
else if Ref = 'Diagnostics' then
Result := 'cpp/SEC40'
else if Ref = 'Line Control' then
Result := 'cpp/SEC41'
else if Ref = 'Pragmas' then
Result := 'cpp/SEC46'
else if Ref = 'Other Directives' then
Result := 'cpp/SEC42'
else if Ref = 'Preprocessor Output' then
Result := 'cpp/SEC43'
else if Ref = 'Traditional Mode' then
Result := 'cpp/SEC70'
else if Ref = 'Traditional lexical analysis' then
Result := 'cpp/SEC71'
else if Ref = 'Traditional macros' then
Result := 'cpp/SEC72'
else if Ref = 'Traditional miscellany' then
Result := 'cpp/SEC73'
else if Ref = 'Traditional warnings' then
Result := 'cpp/SEC74'
else if Ref = 'Implementation Details' then
Result := 'cpp/SEC80'
else if Ref = 'Implementation-defined behavior' then
Result := 'cpp/SEC81'
else if Ref = 'Implementation limits' then
Result := 'cpp/SEC82'
else if Ref = 'Obsolete Features' then
Result := 'cpp/SEC83'
else if Ref = 'Obsolete once-only headers' then
Result := 'cpp/SEC84'
else if Ref = 'Miscellaneous obsolete features' then
Result := 'cpp/SEC85'
else if Ref = 'Differences from previous versions' then
Result := 'cpp/SEC86'
else if Ref = 'Invocation' then
Result := 'cpp/SEC44'
else if Ref = 'Environment Variables' then
Result := 'cpp/SEC45'
else if Ref = 'C Extensions' then
Result := 'gnuexts/gnuexts'
else if Ref = 'Statement Exprs' then
Result := 'gnuexts/SEC63'
else if Ref = 'Local Labels' then
Result := 'gnuexts/SEC64'
else if Ref = 'Labels as Values' then
Result := 'gnuexts/SEC65'
else if Ref = 'Nested Functions' then
Result := 'gnuexts/SEC66'
else if Ref = 'Constructing Calls' then
Result := 'gnuexts/SEC67'
else if Ref = 'Naming Types' then
Result := 'gnuexts/SEC68'
else if Ref = 'Typeof' then
Result := 'gnuexts/SEC69'
else if Ref = 'Lvalues' then
Result := 'gnuexts/SEC70'
else if Ref = 'Conditional Extensions' then
Result := 'gnuexts/SEC71'
else if Ref = 'Long Long' then
Result := 'gnuexts/SEC72'
else if Ref = 'Complex' then
Result := 'gnuexts/SEC73'
else if Ref = 'Hex Floats' then
Result := 'gnuexts/SEC74'
else if Ref = 'Zero Length' then
Result := 'gnuexts/SEC75'
else if Ref = 'Variable Length' then
Result := 'gnuexts/SEC76'
else if Ref = 'Variadic Macro Extensions' then
Result := 'gnuexts/SEC77'
else if Ref = 'Subscripting' then
Result := 'gnuexts/SEC78'
else if Ref = 'Pointer Arith' then
Result := 'gnuexts/SEC79'
else if Ref = 'Initializers' then
Result := 'gnuexts/SEC80'
else if Ref = 'Compound Literals' then
Result := 'gnuexts/SEC81'
else if Ref = 'Designated Inits' then
Result := 'gnuexts/SEC82'
else if Ref = 'Case Ranges' then
Result := 'gnuexts/SEC83'
else if Ref = 'Cast to Union' then
Result := 'gnuexts/SEC84'
else if Ref = 'Function Attributes' then
Result := 'gnuexts/SEC85'
else if Ref = 'Attribute Syntax' then
Result := 'gnuexts/SEC85a'
else if Ref = 'Function Prototypes' then
Result := 'gnuexts/SEC86'
else if Ref = 'C++ Comments' then
Result := 'gnuexts/SEC87'
else if Ref = 'Dollar Signs' then
Result := 'gnuexts/SEC88'
else if Ref = 'Character Escapes' then
Result := 'gnuexts/SEC89'
else if Ref = 'Alignment' then
Result := 'gnuexts/SEC90'
else if Ref = 'Variable Attributes' then
Result := 'gnuexts/SEC91'
else if Ref = 'Type Attributes' then
Result := 'gnuexts/SEC92'
else if Ref = 'Inline' then
Result := 'gnuexts/SEC93'
else if Ref = 'Extended Asm,,Assembler Instructions with C Expression Operands' then
Result := 'gnuexts/SEC94'
else if Ref = 'Asm Labels' then
Result := 'gnuexts/SEC96'
else if Ref = 'Explicit Reg Vars' then
Result := 'gnuexts/SEC97'
else if Ref = 'Global Reg Vars' then
Result := 'gnuexts/SEC98'
else if Ref = 'Local Reg Vars' then
Result := 'gnuexts/SEC99'
else if Ref = 'Alternate Keywords' then
Result := 'gnuexts/SEC100'
else if Ref = 'Incomplete Enums' then
Result := 'gnuexts/SEC101'
else if Ref = 'Function Names' then
Result := 'gnuexts/SEC102'
else if Ref = 'Return Address' then
Result := 'gnuexts/SEC103'
else if Ref = 'Other Builtins' then
Result := 'gnuexts/SEC104'
else if Ref = 'Escaped Newlines' then
Result := 'gnuexts/SEC105'
else if Ref = 'Multi-line Strings' then
Result := 'gnuexts/SEC106'
else if Ref = 'Mixed Declarations' then
Result := 'gnuexts/SEC107'
else if Ref = 'Unnamed Fields' then
Result := 'gnuexts/SEC108'
else if Ref = 'Volatiles' then
Result := 'gnuexts/SEC109'
else if Ref = 'Empty Structures' then
Result := 'gnuexts/SEC111'
else if Ref = 'Acknowledgements,,GNU Assembler Acknowledgements' then
Result := 'gnuasm/acknowledge'
else if Ref = 'Command Line,,Command Line' then
Result := 'gnuasm/SEC9'
else if (Ref = 'Invoking,,Command-Line Options') or (Ref = 'Invoking,,Comand-Line Options') then
Result := 'gnuasm/SEC10'
else if Ref = 'Overview,,Overview' then
Result := 'gnuasm/SEC11'
else if Ref = 'M68K-Opts,,M680x0 Options' then
Result := 'gnuasm/SEC12'
else if Ref = 'a,,Enable Listings: @option{-a[cdhlns]}' then
Result := 'gnuasm/SEC13'
else if Ref = 'listing,,Configuring listing output: @option{--listing}' then
Result := 'gnuasm/SEC14'
else if Ref = 'o,,Name the Object File: @option{-o}' then
Result := 'gnuasm/SEC15'
else if Ref = 'W,,Control Warnings: @option{-W}, @option{--warn}, @option{--no-warn}, @option{--fatal-warnings}' then
Result := 'gnuasm/SEC16'
else if Ref = 'R,,Join Data and Text Sections: @option{-R}' then
Result := 'gnuasm/SEC17'
else if Ref = 'L,,Include Local Labels: @option{-L}' then
Result := 'gnuasm/SEC18'
else if Ref = 'traditional-format,,Compatible Output: @option{--traditional-format}' then
Result := 'gnuasm/SEC19'
else if Ref = 'M,,Assemble in MRI Compatibility Mode: @option{-M}' then
Result := 'gnuasm/SEC19a'
else if Ref = 'Input Files,,Input Files' then
Result := 'gnuasm/SEC21'
else if Ref = 'Input Files,,Filenames and Line-numbers' then
Result := 'gnuasm/SEC22'
else if Ref = 'Object,,Output (Object) File' then
Result := 'gnuasm/SEC23'
else if Ref = 'Errors,,Error and Warning Messages' then
Result := 'gnuasm/SEC24'
else if Ref = 'Syntax,,Syntax' then
Result := 'gnuasm/SEC25'
else if Ref = 'Preprocessing,,Preprocessing' then
Result := 'gnuasm/SEC26'
else if Ref = 'Whitespace,,Whitespace' then
Result := 'gnuasm/SEC27'
else if Ref = 'Comments,,Comments' then
Result := 'gnuasm/SEC28'
else if Ref = 'Symbol Intro,,Symbols' then
Result := 'gnuasm/SEC29'
else if Ref = 'Statements,,Statements' then
Result := 'gnuasm/SEC30'
else if Ref = 'Constants,,Constants' then
Result := 'gnuasm/SEC31'
else if Ref = 'Characters,,Character Constants' then
Result := 'gnuasm/SEC32'
else if (Ref = 'Strings,,Strings') or (Ref = 'Strings') then
Result := 'gnuasm/SEC33'
else if Ref = 'Chars,,Characters' then
Result := 'gnuasm/SEC34'
else if Ref = 'Numbers,,Number Constants' then
Result := 'gnuasm/SEC35'
else if Ref = 'Integers,,Integers' then
Result := 'gnuasm/SEC36'
else if Ref = 'Bignums,,Bignums' then
Result := 'gnuasm/SEC37'
else if Ref = 'Flonums,,Flonums' then
Result := 'gnuasm/SEC38'
else if Ref = 'M68K-Syntax,,Syntax' then
Result := 'gnuasm/SEC216'
else if Ref = 'M68K-Moto-Syntax,,Motorola Syntax' then
Result := 'gnuasm/SEC217'
else if Ref = 'M68K-Branch,,Branch Improvement' then
Result := 'gnuasm/SEC221'
else if Ref = 'M68K-Chars,,Special Characters' then
Result := 'gnuasm/SEC222'
else if (Ref = 'Sections,,Sections and Relocation') or (Ref = 'Secs Background,,Background') then
Result := 'gnuasm/SEC39'
else if Ref = 'Ld Sections,,Linker Sections' then
Result := 'gnuasm/SEC41'
else if Ref = 'As Sections,,Assembler Internal Sections' then
Result := 'gnuasm/SEC42'
else if Ref = 'Sub-Sections,,Sub-Sections' then
Result := 'gnuasm/SEC43'
else if Ref = 'bss,,bss Section' then
Result := 'gnuasm/SEC44'
else if (Ref = 'Symbols,,Symbols') or (Ref = 'Symbols') then
Result := 'gnuasm/SEC45'
else if Ref = 'Labels,,Labels' then
Result := 'gnuasm/SEC46'
else if Ref = 'Setting Symbols,,Giving Symbols Other Values' then
Result := 'gnuasm/SEC47'
else if (Ref = 'Symbol Names') or (Ref = 'Symbol Names,,Symbol Names') then
Result := 'gnuasm/SEC48'
else if Ref = 'Symbol Names,,Local Symbol Names' then
Result := 'gnuasm/SEC48L'
else if Ref = 'Symbol Names,,Dollar Local Labels' then
Result := 'gnuasm/SEC48LD'
else if Ref = 'Dot,,The Special Dot Symbol' then
Result := 'gnuasm/SEC49'
else if (Ref = 'Symbol Attributes') or (Ref = 'Symbol Attributes,,Symbol Attributes') then
Result := 'gnuasm/SEC50'
else if Ref = 'Symbol Value,,Value' then
Result := 'gnuasm/SEC51'
else if Ref = 'Symbol Type,,Type' then
Result := 'gnuasm/SEC52'
else if Ref = 'COFF Symbols,,Symbol Attributes for COFF' then
Result := 'gnuasm/SEC56'
else if Ref = 'COFF Symbols,,Primary Attributes' then
Result := 'gnuasm/SEC57'
else if Ref = 'COFF Symbols,,Auxiliary Attributes' then
Result := 'gnuasm/SEC58'
else if (Ref = 'Expressions') or (Ref = 'Expressions,,Expressions') then
Result := 'gnuasm/SEC60'
else if Ref = 'Empty Exprs,,Empty Expressions' then
Result := 'gnuasm/SEC61'
else if Ref = 'Integer Exprs,,Integer Expressions' then
Result := 'gnuasm/SEC62'
else if Ref = 'Arguments,,Arguments' then
Result := 'gnuasm/SEC63'
else if Ref = 'Operators,,Operators' then
Result := 'gnuasm/SEC64'
else if (Ref = 'Prefix Ops,,Prefix Operator') or (Ref = 'Prefix Ops,,Prefix Operators') then
Result := 'gnuasm/SEC65'
else if (Ref = 'Infix Ops,,Infix Operator') or (Ref = 'Infix Ops,,Infix Operators') then
Result := 'gnuasm/SEC66'
else if Ref = 'Pseudo Ops,,Assembler Directives' then
Result := 'gnuasm/SEC67'
else if Pos ('.abort', Ref) > 0 then
Result := 'gnuasm/SEC68'
else if Pos ('.ABORT', Ref) > 0 then
Result := 'gnuasm/SEC69'
else if Pos ('.align', Ref) > 0 then
Result := 'gnuasm/SEC70'
else if Pos ('.app-file', Ref) > 0 then
Result := 'gnuasm/SEC71'
else if Pos ('.ascii', Ref) > 0 then
Result := 'gnuasm/SEC72'
else if Pos ('.asciz', Ref) > 0 then
Result := 'gnuasm/SEC73'
else if Pos ('.balign', Ref) > 0 then
Result := 'gnuasm/SEC74'
else if Pos ('.byte', Ref) > 0 then
Result := 'gnuasm/SEC75'
else if Pos ('.comm', Ref) > 0 then
Result := 'gnuasm/SEC76'
else if Pos ('.data', Ref) > 0 then
Result := 'gnuasm/SEC77'
else if Pos ('.def', Ref) > 0 then
Result := 'gnuasm/SEC78'
else if Pos ('.desc', Ref) > 0 then
Result := 'gnuasm/SEC79'
else if Pos ('.dim', Ref) > 0 then
Result := 'gnuasm/SEC80'
else if Pos ('.double', Ref) > 0 then
Result := 'gnuasm/SEC81'
else if Pos ('.eject', Ref) > 0 then
Result := 'gnuasm/SEC82'
else if Pos ('.elseif', Ref) > 0 then
Result := 'gnuasm/SEC83IF'
else if Pos ('.else', Ref) > 0 then
Result := 'gnuasm/SEC83'
else if Pos ('.endef', Ref) > 0 then
Result := 'gnuasm/SEC84'
else if Pos ('.endif', Ref) > 0 then
Result := 'gnuasm/SEC84IF'
else if Pos ('.endfunc', Ref) > 0 then
Result := 'gnuasm/SEC84FUNC'
else if Pos ('.endm', Ref) > 0 then
Result := 'gnuasm/SEC84M'
else if Pos ('.endr', Ref) > 0 then
Result := 'gnuasm/SEC84R'
else if Pos ('.end', Ref) > 0 then
Result := 'gnuasm/SEC83b'
else if Pos ('.equiv', Ref) > 0 then
Result := 'gnuasm/SEC87'
else if Pos ('.equ', Ref) > 0 then
Result := 'gnuasm/SEC86'
else if Pos ('.err', Ref) > 0 then
Result := 'gnuasm/SEC88'
else if Pos ('.even', Ref) > 0 then
Result := 'gnuasm/SEC70E'
else if Pos ('.exitm', Ref) > 0 then
Result := 'gnuasm/SEC85'
else if Pos ('.extern', Ref) > 0 then
Result := 'gnuasm/SEC89'
else if Pos ('.fail', Ref) > 0 then
Result := 'gnuasm/SEC89a'
else if Pos ('.file', Ref) > 0 then
Result := 'gnuasm/SEC90'
else if Pos ('.fill', Ref) > 0 then
Result := 'gnuasm/SEC91'
else if Pos ('.float', Ref) > 0 then
Result := 'gnuasm/SEC92'
else if Pos ('.func', Ref) > 0 then
Result := 'gnuasm/SEC92a'
else if (Pos ('.globl', Ref) > 0) or (Pos ('.global', Ref) > 0) then
Result := 'gnuasm/SEC93'
else if Pos ('.hword', Ref) > 0 then
Result := 'gnuasm/SEC94'
else if Pos ('.ident', Ref) > 0 then
Result := 'gnuasm/SEC95'
else if Pos ('.ifdef', Ref) > 0 then
Result := 'gnuasm/SEC96D'
else if Pos ('.ifndef', Ref) > 0 then
Result := 'gnuasm/SEC96N'
else if Pos ('.ifnotdef', Ref) > 0 then
Result := 'gnuasm/SEC96ND'
else if (Pos ('.if ', Ref) > 0) or (Pos ('.if}', Ref) > 0) then
Result := 'gnuasm/SEC96'
else if Pos ('.incbin', Ref) > 0 then
Result := 'gnuasm/SEC97B'
else if Pos ('.include', Ref) > 0 then
Result := 'gnuasm/SEC97'
else if Pos ('.int', Ref) > 0 then
Result := 'gnuasm/SEC98'
else if Pos ('.irpc', Ref) > 0 then
Result := 'gnuasm/SEC100'
else if Pos ('.irp', Ref) > 0 then
Result := 'gnuasm/SEC99'
else if Pos ('.lcomm', Ref) > 0 then
Result := 'gnuasm/SEC101'
else if Pos ('.lflags', Ref) > 0 then
Result := 'gnuasm/SEC102'
else if Pos ('.line', Ref) > 0 then
Result := 'gnuasm/SEC103'
else if Pos ('.ln', Ref) > 0 then
Result := 'gnuasm/SEC105'
else if Pos ('.list', Ref) > 0 then
Result := 'gnuasm/SEC107'
else if Pos ('.long', Ref) > 0 then
Result := 'gnuasm/SEC108'
else if Pos ('.macro', Ref) > 0 then
Result := 'gnuasm/SEC109'
else if Pos ('.mri', Ref) > 0 then
Result := 'gnuasm/SEC106'
else if Pos ('.nolist', Ref) > 0 then
Result := 'gnuasm/SEC110'
else if Pos ('.octa', Ref) > 0 then
Result := 'gnuasm/SEC111'
else if Pos ('.org', Ref) > 0 then
Result := 'gnuasm/SEC112'
else if Pos ('.p2align[wl]', Ref) > 0 then
Result := 'gnuasm/SEC113'
else if Pos ('.print', Ref) > 0 then
Result := 'gnuasm/SEC113a'
else if Pos ('.psize', Ref) > 0 then
Result := 'gnuasm/SEC114'
else if Pos ('.purgem', Ref) > 0 then
Result := 'gnuasm/SEC114a'
else if Pos ('.quad', Ref) > 0 then
Result := 'gnuasm/SEC115'
else if Pos ('.rept', Ref) > 0 then
Result := 'gnuasm/SEC116'
else if Pos ('.sbttl', Ref) > 0 then
Result := 'gnuasm/SEC117'
else if Pos ('.scl', Ref) > 0 then
Result := 'gnuasm/SEC118'
else if Ref = 'Section,,COFF Version' then
Result := 'gnuasm/SEC119'
else if Pos ('.set', Ref) > 0 then
Result := 'gnuasm/SEC120'
else if Pos ('.short', Ref) > 0 then
Result := 'gnuasm/SEC121'
else if Pos ('.single', Ref) > 0 then
Result := 'gnuasm/SEC122'
else if Ref = 'Size,,COFF Version' then
Result := 'gnuasm/SEC123'
else if Pos ('.sleb128', Ref) > 0 then
Result := 'gnuasm/SEC124'
else if Pos ('.skip', Ref) > 0 then
Result := 'gnuasm/SEC125'
else if Pos ('.space', Ref) > 0 then
Result := 'gnuasm/SEC126'
else if Pos ('.stabd', Ref) > 0 then
Result := 'gnuasm/SEC127'
else if Pos ('.stabn', Ref) > 0 then
Result := 'gnuasm/SEC127N'
else if Pos ('.stabs', Ref) > 0 then
Result := 'gnuasm/SEC127S'
else if Pos ('.string', Ref) > 0 then
Result := 'gnuasm/SEC128'
else if Pos ('.struct', Ref) > 0 then
Result := 'gnuasm/SEC128a'
else if Pos ('.symver', Ref) > 0 then
Result := 'gnuasm/SEC129'
else if Pos ('.tag', Ref) > 0 then
Result := 'gnuasm/SEC130'
else if Pos ('.text', Ref) > 0 then
Result := 'gnuasm/SEC131'
else if Pos ('.title', Ref) > 0 then
Result := 'gnuasm/SEC132'
else if Ref = 'Type,,COFF Version' then
Result := 'gnuasm/SEC133'
else if Pos ('.uleb128', Ref) > 0 then
Result := 'gnuasm/SEC134'
else if Pos ('.val', Ref) > 0 then
Result := 'gnuasm/SEC135'
else if Pos ('.vtable_entry', Ref) > 0 then
Result := 'gnuasm/SEC135a'
else if Pos ('.word', Ref) > 0 then
Result := 'gnuasm/SEC136'
else if Ref = 'Bug Criteria,,Have You Found a Bug?' then
Result := 'Bug Criteria,,Have You Found a Bug'
else
Result := StringReplace (Ref, '/', '_', [rfReplaceAll]);
if Pos (':', Result) > 0 then
Delete (Result, Pos (':', Result), Length (Result));
end;
procedure PreProcessSource(var Source: string);
begin
Source := StringReplace (Source, '@value{AS}', 'as', [rfReplaceAll]);
Source := StringReplace (Source, '@value{LD}', 'ld', [rfReplaceAll]);
Source := StringReplace (Source, '@value{GCC}', 'gcc', [rfReplaceAll]);
Source := StringReplace (Source, '@value{CPP}', 'cpp', [rfReplaceAll]);
Source := StringReplace (Source, '''''', '"', [rfReplaceAll]);
Source := StringReplace (Source, '``', '"', [rfReplaceAll]);
Source := StringReplace (Source, '´´', '"', [rfReplaceAll]);
end;
procedure PostProcessDest(var Dest: string);
var
P,
I: Integer;
begin
Dest := StringReplace (Dest, '
'#13#10'
', '
', [rfReplaceAll]);
Dest := StringReplace (Dest, #13#10#13#10'
', #13#10'
', [rfReplaceAll]);
Dest := StringReplace (Dest, '
'#13#10#13#10, '
'#13#10, [rfReplaceAll]);
Dest := StringReplace (Dest, '
', '', [rfReplaceAll]); Dest := StringReplace (Dest, ''#13#10'', [rfReplaceAll]); Dest := StringReplace (Dest, '', '
'#13#10'
')) <> '') do
Dec (I);
if I > 0 then begin
Delete (Dest, I, Length (''));
Dec (I);
while (I > 0) and (Dest [I] <> '<') do
Dec (I);
if I > 0 then
Insert ('', Dest, I);
end;
P := Pos ('
', Dest);
end;
Dest := StringReplace (Dest, '. ', '. ', [rfReplaceAll]);
end;
function CountChars(Ch: Char; S: string): Integer;
var
I: Integer;
begin
Result := 0;
for I := 1 to Length (S) do
if S [I] = Ch then
Inc (Result);
end;
type
TListType = (ltNone, ltNormal, ltColumns, ltFiles);
var
FullContents,
NewContents,
CurFile,
CurNode,
CurSection,
CurSectionTitle,
CurSubFile: string;
P,
SecStart,
PreFormatted,
SCase,
CodeFormat: Integer;
InsertedSeeAlso: Boolean = False;
procedure ProcessSecID(var SecID: string);
begin
if (SecID = 'Overview') and (CurFile = 'cpp') then
SecID := 'CPP Overview'
else if (SecID = 'Conditionals') and (CurFile = 'gnuexts') then
SecID := 'Conditional Extensions'
else if (SecID = 'Variadic Macros') and (CurFile = 'gnuexts') then
SecID := 'Variadic Macro Extensions'
else if (SecID = 'Pragmas') and (CurFile = 'gnuexts') then
SecID := 'Pragma Extensions'
else if (SecID = 'Acknowledgements,,Acknowledgements') and (CurFile = 'gnuasm') then
SecID := 'Acknowledgements,,GNU Assembler Acknowledgements';
end;
function GetLinkTo(Ref: string): string;
begin
ProcessSecID (Ref);
Result := GetSecID (Ref);
if StartsWith (CurFile + '/', Result, True, 1, True) then
Result := '$$LINK(' + Result + ')'
else
Result := '$$INFOLINK(' + Result + ')';
end;
procedure FinishSection;
var
I: Integer;
SecID,
TempContents,
S: string;
begin
SecID := CurNode;
if (Length (CurSection) > 0) and (((CurFile <> 'cpp') and (CurFile <> 'gnuexts')) or (SecID = 'Extended Asm')) then
SecID := SecID + ',,' + CurSection;
ProcessSecID (SecID);
SecID := GetSecID (SecID);
if Length (CurSubFile) > 0 then
SecID := SecID + '_' + StringReplace (CurSubFile, '/', ' and ', [rfReplaceAll]);
TempContents := Copy (NewContents, SecStart, Length (NewContents));
PostProcessDest (TempContents);
TrimHTMLWhiteSpace (TempContents);
if (Pos ('@code', CurSectionTitle) > 0) and (Pos ('.', CurSectionTitle) > 0) then begin
Delete (CurSectionTitle, 1, Pos ('.', CurSectionTitle) - 1);
for I := 3 to Length (CurSectionTitle) do
if not (CurSectionTitle [I] in ['A'..'Z', 'a'..'z', '_', '.', '0'..'9', '[', ']']) then begin
Delete (CurSectionTitle, I, Length (CurSectionTitle));
Break;
end;
end;
if Length (TempContents) > 0 then begin
if Length (CurSubFile) > 0 then
S := CurSubFile
else
S := CurSectionTitle;
WriteFile (SecID + '.hss', '[Main]'#13#10'Title=' + S + #13#10#13#10'[Top]'#13#10 + TempContents + #13#10);
end;
SecStart := Length (NewContents) + 1;
end;
procedure StartSeeAlso;
var
I: Integer;
begin
I := Length (NewContents);
while (I > 0) and (NewContents [I] in [#13, #10, ' ', #9]) do
Dec (I);
InsertedSeeAlso := True;
if (I <= 0) or (NewContents [I] in ['.', '>']) then
NewContents := NewContents + 'See '
else if (NewContents [I] in [',', ';', ':', '(', '[', '{']) then
NewContents := NewContents + 'see '
else
InsertedSeeAlso := False;
end;
procedure EndSeeAlso;
begin
if InsertedSeeAlso and (P <= Length (FullContents)) and (FullContents [P] = ',') then
Inc (P);
InsertedSeeAlso := False;
end;
procedure ConvertFromP(ListType: TListType = ltNone);
var
I,
J: Integer;
Tag,
Parameters,
Quotes,
S: string;
begin
while P <= Length (FullContents) do begin
if FullContents [P] = '}' then begin
Inc (P);
Break;
end else if FullContents [P] = '{' then begin
Inc (P);
ConvertFromP (ListType);
end else if FullContents [P] = #13 then begin
while (Length (NewContents) > 0) and (NewContents [Length (NewContents)] = ' ') do
Delete (NewContents, Length (NewContents), 1);
if PreFormatted > 0 then begin
NewContents := NewContents + #13#10;
Inc (P);
end else begin
if (Copy (FullContents, P, 2) = #13#13) or (Copy (FullContents, P, 4) = #13#10#13#10) or (((Copy (FullContents, P, 2) = #13'@') or (Copy (FullContents, P, 3) = #13#10'@')) and (Pos ('{', Copy (FullContents, P, 25)) <= 0) and (Pos ('if', Copy (FullContents, P, 25)) <= 0)) then begin
if Copy (NewContents, Length (NewContents) - 9, 10) <> '
'#13#10 then
NewContents := NewContents + #13#10'
'#13#10;
while (P <= Length (FullContents)) and (FullContents [P] in [#13, #10]) do
Inc (P);
end else begin
if Copy (NewContents, Length (NewContents) - 1, 2) <> #13#10 then
NewContents := NewContents + #13#10;
Inc (P);
end;
end;
end else if FullContents [P] = '@' then begin
Inc (P);
if P <= Length (FullContents) then begin
if FullContents [P] in ['A'..'Z', 'a'..'z', '0'..'9'] then begin
Tag := '';
Parameters := '';
Quotes := '';
while (P <= Length (FullContents)) and (not (FullContents [P] in [#13, #10, ' ', '{'])) do begin
Tag := Tag + FullContents [P];
Inc (P);
end;
if (P <= Length (FullContents)) and (FullContents [P] = '{') then begin
Inc (P);
if (Tag = 'w')
or (Tag = 'r')
or (Tag = 'gccoptlist')
or (Tag = 'key')
or (Tag = 'value')
or (Tag = 'copyrightnotice')
or (Tag = 'covertexts')
or (Tag = 'acronym')
then
Tag := ''
else if (Tag = 'sc') then
else if (Tag = 'anchor') then begin
Tag := '';
while (P <= Length (FullContents)) and (not (FullContents [P] in ['@', '{', '}'])) do
Inc (P);
end else if Tag = 'copyright' then begin
Tag := '';
NewContents := NewContents + '(c)';
end else if Tag = 'TeX' then begin
Tag := '';
NewContents := NewContents + 'TeX';
end else if Tag = 'equiv' then begin
Tag := '';
NewContents := NewContents + '<=>';
end else if Tag = 'expansion' then begin
Tag := '';
NewContents := NewContents + 'expands to';
end else if Tag = 'error' then begin
Tag := '';
NewContents := NewContents + 'Error:';
end else if Tag = 'minus' then begin
Tag := '';
NewContents := NewContents + '-';
end else if (Tag = 'dots') then begin
Tag := '';
NewContents := NewContents + '...';
end else if (Tag = 'code') or (Tag = 'samp') or (Tag = 'command') or (Tag = 'file') or (Tag = 'math') or (Tag = 'env') or (Tag = 'kbd') or (Tag = 't') then begin
if (Length (FullContents) >= P + 2) and (FullContents [P] = '-') and ((FullContents [P + 1] in ['A'..'Z', 'a'..'z', '0'..'9']) or ((FullContents [P + 1] = '-') and (FullContents [P + 2] in ['A'..'Z', 'a'..'z', '0'..'9']))) then begin
Tag := 'B';
Quotes := '''';
end else
Tag := 'CODE';
end else if (Tag = 'strong') or (Tag = 'b') then
Tag := 'B'
else if (Tag = 'emph') or (Tag = 'var') or (Tag = 'i') then
Tag := 'I'
else if (Tag = 'dfn') then
Tag := 'U'
else if (Tag = 'option') then begin
Tag := 'B';
Quotes := '''';
end else if (Tag = 'cite') then begin
Tag := '';
Quotes := '"';
end else if (Tag = 'ref') or (Tag = 'xref') or (Tag = 'pxref') then begin
Tag := 'A';
I := Pos ('}', Copy (FullContents, P, 255));
if I > 0 then begin
while CountChars ('{', Copy (FullContents, P, I - 1)) > CountChars ('}', Copy (FullContents, P, I - 1)) do
Inc (I);
Parameters := 'HREF="' + GetLinkTo (Copy (FullContents, P, I - 1)) + '"';
if ((Pos (',,', Copy (FullContents, P, 255)) > 0) or (Pos (','#13',', Copy (FullContents, P, 255)) > 0) or (Pos (','#13#10',', Copy (FullContents, P, 255)) > 0)) and (Pos ('{', Copy (FullContents, P, Pos (',', Copy (FullContents, P, 255)))) <= 0) then begin
Delete (FullContents, P, Pos (',', Copy (FullContents, P, 255)));
Delete (FullContents, P, Pos (',', Copy (FullContents, P, 255)));
while FullContents [P] in [' ', #9, #13, #10] do
Delete (FullContents, P, 1);
end;
StartSeeAlso;
end;
end else if (Tag = 'uref') then begin
Tag := 'A';
I := Pos ('}', Copy (FullContents, P, 255));
if I > 0 then begin
Parameters := 'HREF="' + Copy (FullContents, P, I - 1) + '"';
StartSeeAlso;
end;
end else if (Tag = 'email') then begin
Tag := 'A';
I := Pos ('}', Copy (FullContents, P, 255));
if I > 0 then
Parameters := 'HREF="mailto:' + StringReplace (Copy (FullContents, P, I - 1), '@@', '@', []) + '"';
end else if (Tag = 'footnote') then begin
Tag := '';
Quotes := '(';
NewContents := NewContents + ' ';
end else
raise ESubStrNotFound.CreateFmt ('Unsupported style "%s"', [Tag]);
if (Length (Tag) > 0) and (Tag <> 'sc') then begin
NewContents := NewContents + '<' + Tag;
if Length (Parameters) > 0 then
NewContents := NewContents + ' ' + Parameters;
NewContents := NewContents + '>' + Quotes;
end;
if Tag = 'sc' then
Inc (SCase)
else if Tag = 'CODE' then
Inc (CodeFormat);
ConvertFromP (ListType);
if Tag = 'sc' then
Dec (SCase)
else if Tag = 'CODE' then
Dec (CodeFormat);
if Quotes = '(' then
Quotes := ')';
if (Length (Tag) > 0) and (Tag <> 'sc') then
NewContents := NewContents + Quotes + '' + Tag + '>';
if Tag = 'A' then
EndSeeAlso;
end else begin
while (P <= Length (FullContents)) and (FullContents [P] = ' ') do
Inc (P);
if Tag <> 'center' then begin
while (P <= Length (FullContents)) and (not (FullContents [P] in [#13, #10])) do begin
Parameters := Parameters + FullContents [P];
Inc (P);
end;
while (P <= Length (FullContents)) and (FullContents [P] in [#13, #10]) do
Inc (P);
TrimWhiteSpace (Parameters);
if (Tag = 'end') then begin
Dec (P);
if FullContents [P] = #10 then
Dec (P);
Break
end else if (Tag = 'c')
or (Tag = 'comment')
or (Tag = 'set')
or (Tag = 'setfilename')
or (Tag = 'settitle')
or (Tag = 'title')
or (Tag = 'subtitle')
or (Tag = 'cindex')
or (Tag = 'kindex')
or (Tag = 'opindex')
or (Tag = 'findex')
or (Tag = 'gol')
or (Tag = 'noindent')
or (Tag = 'need')
or (Tag = 'page')
or (Tag = 'setchapternewpage')
or (Tag = 'finalout')
or (Tag = 'printindex')
or (Tag = 'syncodeindex')
or (Tag = 'sp')
or (Tag = 'author')
or (Tag = 'vskip')
or (Tag = 'top')
or (Tag = 'refill')
or (Tag = 'lowersections')
or (Tag = 'raisesections')
or (Tag = 'unnumbered')
or (Tag = 'unnumberedsec')
or (Tag = 'contents')
or (Tag = 'defcodeindex')
or (Tag = 'dircategory')
or (Tag = 'tab')
or (Tag = 'bye')
or (Tag = 'insertcopying')
then
else if (Tag = 'node') then begin
if not ((Parameters = 'Ln') and (CurNode = 'Line')) then begin
FinishSection;
CurNode := Parameters;
CurSection := '';
CurSectionTitle := Parameters;
end;
end else if (Tag = 'section') or (Tag = 'subsection') or (Tag = 'subsubsection') or (Tag = 'subheading') or (Tag = 'chapter') then begin
if not ((CurNode = 'Line') and (Pos ('.ln', Parameters) > 0)) then begin
FinishSection;
CurSection := Parameters;
CurSectionTitle := Parameters;
end;
end else if (Tag = 'ignore')
or (Tag = 'tex')
or (Tag = 'menu')
or (Tag = 'direntry')
or (Tag = 'copying')
or ((Tag = 'ifset') and ((Parameters <> 'M68K') and (Parameters <> 'M680X0') and (Parameters <> 'COFF') and (Parameters <> 'W16') and (Parameters <> 'have-stabs') and (Parameters <> 'cppmanual')))
then begin
I := Length (NewContents) + 1;
ConvertFromP (ListType);
Delete (NewContents, I, Length (NewContents));
end else if (Tag = 'group')
or (Tag = 'ifset')
or (Tag = 'ifclear')
or (Tag = 'ifinfo')
or (Tag = 'iftex')
or (Tag = 'ifnottex')
or (Tag = 'ifhtml')
or (Tag = 'ifnothtml')
or (Tag = 'macro')
or (Tag = 'titlepage')
or (Tag = 'quotation')
or (Tag = 'display')
or (Tag = 'detailmenu')
or (Tag = 'html')
then
ConvertFromP (ListType)
else if (Tag = 'example')
or (Tag = 'smallexample')
or (Tag = 'multitable')
or (Tag = 'format')
then begin
NewContents := NewContents + '';
Inc (PreFormatted);
ConvertFromP (ListType);
Dec (PreFormatted);
NewContents := NewContents + '
';
end else if (Tag = 'table') or (Tag = 'ftable') or (Tag = 'vtable') then begin
if CurFile = 'gnuexts' then begin
S := NewContents;
I := SecStart;
SecStart := Length (NewContents) + 1;
ConvertFromP (ltFiles);
FinishSection;
CurSubFile := '';
SecStart := I;
NewContents := S;
end else begin
if ListType = ltColumns then
NewContents := NewContents + '
';
NewContents := NewContents + ''#13#10;
ConvertFromP (ltColumns);
NewContents := NewContents + '
';
if ListType = ltColumns then
NewContents := NewContents + '
';
end;
end else if (Tag = 'itemize') then begin
NewContents := NewContents + ''#13#10'- '#13#10;
ConvertFromP (ltNormal);
NewContents := NewContents + '
'#13#10'
';
end else if (Tag = 'enumerate') then begin
NewContents := NewContents + ' 0 then begin
if Parameters [1] in ['0'..'9'] then
NewContents := NewContents + ' START="' + Parameters + '"'
else
NewContents := NewContents + ' TYPE="' + Parameters + '"';
end;
NewContents := NewContents + '>'#13#10'- '#13#10;
ConvertFromP (ltNormal);
NewContents := NewContents + '
'#13#10'
';
end else if (Tag = 'item') or (Tag = 'itemx') then begin
case ListType of
ltNormal: begin
NewContents := NewContents + ''#13#10''#13#10;
Insert (Parameters + #13#10, FullContents, P);
end;
ltColumns: begin
Parameters := HTMLize (Parameters);
I := Pos ('@', Parameters);
while I > 0 do begin
Delete (Parameters, I, 1);
if (Length (Parameters) >= I) and (Parameters [I] in ['A'..'Z', 'a'..'z']) then begin
if StartsWith ('var{', Parameters, True, I, True) then begin
J := Pos ('}', Copy (Parameters, I, Length (Parameters)));
if J > 0 then begin
Delete (Parameters, I + J - 1, 1);
Insert ('', Parameters, I + J - 1);
Insert ('', Parameters, I);
end;
end else begin
while (Length (Parameters) >= I) and (Parameters [I] <> '{') do
Delete (Parameters, I, 1);
if Length (Parameters) >= I then
Delete (Parameters, I, 1);
J := Pos ('}', Copy (Parameters, I, Length (Parameters)));
if J > 0 then
Delete (Parameters, I + J - 1, 1);
end;
end;
I := Pos ('@', Parameters);
end;
NewContents := NewContents + '' + Parameters + ''#13#10' ';
end;
ltFiles: begin
if P > SecStart + 5 then begin
if Length (CurSubFile) > 0 then
FinishSection;
CurSubFile := Parameters;
if Pos ('__builtin_', CurSubFile) > 0 then
Delete (CurSubFile, 1, Pos ('__builtin_', CurSubFile) - 1);
if Pos (' ', CurSubFile) > 0 then
Delete (CurSubFile, Pos (' ', CurSubFile), Length (CurSubFile));
end;
end else
Insert (Parameters, FullContents, P);
end;
end else if (Tag = 'exdent') then
Insert (Parameters, FullContents, P)
else if (Tag = 'deftypefn') then begin
S := NewContents;
I := SecStart;
SecStart := Length (NewContents) + 1;
CurSubFile := Parameters;
if Pos ('__builtin_', CurSubFile) > 0 then
Delete (CurSubFile, 1, Pos ('__builtin_', CurSubFile) - 1);
if Pos (' ', CurSubFile) > 0 then
Delete (CurSubFile, Pos (' ', CurSubFile), Length (CurSubFile));
ConvertFromP;
FinishSection;
CurSubFile := '';
SecStart := I;
NewContents := S;
end else if (Tag = 'include') then begin
if FileExists (Parameters) or ((Parameters <> 'asconfig.texi') and (Parameters <> 'md.texi') and (Copy (Parameters, 1, 2) <> 'c-')) then begin
S := LoadFile (Parameters);
PreProcessSource (S);
Insert (S, FullContents, P);
end;
end else
raise ESubStrNotFound.CreateFmt ('Unsupported command "%s"', [Tag]);
end;
end;
end else begin
if FullContents [P] <> ':' then
NewContents := NewContents + HTMLizeChar (FullContents [P]);
Inc (P);
end;
end;
end else begin
if FullContents [P] <> #10 then begin
if FullContents [P] in [' ', #13, #9] then begin
if ((Copy (NewContents, Length (NewContents) - 1, 2) = 'eg') or (Copy (NewContents, Length (NewContents) - 1, 2) = 'ie')) and (Length (NewContents) > 2) and (NewContents [Length (NewContents) - 2] in [' ', #13, #9, '(', '[', '{']) then begin
Insert ('.', NewContents, Length (NewContents));
NewContents := NewContents + '.';
end;
end;
if SCase > 0 then
NewContents := NewContents + HTMLizeChar (UpCase (FullContents [P]))
else if FullContents [P] in ['´', '`'] then
NewContents := NewContents + ''''
else if (FullContents [P] in ['-']) and (Copy (NewContents, Length (NewContents) - 1, 2) = '--') then begin
NewContents := NewContents + ' ';
NewContents [Length (NewContents) - 2] := ' ';
end else if (FullContents [P] = ' ') and (CodeFormat > 0) then
NewContents := NewContents + ' '
else
NewContents := NewContents + HTMLizeChar (FullContents [P]);
end;
Inc (P);
end;
end;
end;
begin
if Pos ('invoke', ParamStr (1)) > 0 then
CurFile := 'comopts'
else if Pos ('as', ParamStr (1)) > 0 then
CurFile := 'gnuasm'
else if Pos ('cpp', ParamStr (1)) > 0 then
CurFile := 'cpp'
else if Pos ('extend', ParamStr (1)) > 0 then
CurFile := 'gnuexts'
else
CurFile := WithoutExt (ParamStr (1));
FullContents := LoadFile (ParamStr (1));
PreProcessSource (FullContents);
NewContents := ''#13#10;
try
CurNode := CurFile;
CurSection := '';
CurSectionTitle := '';
CurSubFile := '';
P := 1;
SecStart := Length (NewContents) + 1;
PreFormatted := 0;
SCase := 0;
CodeFormat := 0;
ConvertFromP;
if P <= Length (FullContents) then
raise ESubStrNotFound.Create ('Unexpected closing bracket');
FinishSection;
finally
NewContents := NewContents + #13#10'';
PostProcessDest (NewContents);
WriteFile (ChangeFileExt (ParamStr (1), '.html'), NewContents);
end;
end.