{ 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, '
  • '#13#10'
  • '#13#10, '', [rfReplaceAll]); 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, '

    '#13#10'
    ', '
    ', [rfReplaceAll]);
    	Dest := StringReplace (Dest, '

    '#13#10'
    ', '
    ', [rfReplaceAll]); Dest := StringReplace (Dest, ''#13#10'

    ', '', [rfReplaceAll]); Dest := StringReplace (Dest, #13#10#13#10'', #13#10'', [rfReplaceAll]); Dest := StringReplace (Dest, '

    '#13#10''#13#10'

    ', '', [rfReplaceAll]); Dest := StringReplace (Dest, '

    '#13#10''#13#10'

    ', '', [rfReplaceAll]); Dest := StringReplace (Dest, '

    '#13#10''#13#10'

    ', '', [rfReplaceAll]); Dest := StringReplace (Dest, '

    '#13#10'', '', [rfReplaceAll]); Dest := StringReplace (Dest, '
    ', '
    ', [rfReplaceAll]); P := Pos ('', Dest); while P > 0 do begin Dest [P + 2] := 'A'; Dest [P + 3] := '>'; Dest [P + 4] := '<'; Dest [P + 5] := '/'; Dest [P + 6] := 'C'; Dest [P + 7] := 'O'; Dest [P + 8] := 'D'; Dest [P + 9] := 'E'; I := P - 1; while (I > 0) and (Copy (Dest, I, Length ('')) <> '') 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 + ''; 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.