Comment ========================================================== This program turns Ralf Brown's Interrupt List into HTML ========================================================== EndComment var ChapterNumber OutF PreMode WrapTextList SeeAlsoNum SeeAlsoKey SeeAlsoInt Table Table2 Index IndexFile NameMode CatList CatList2 Base Alpha Text Base = 'F:\HTML\INTR\' Setup Main WriteAscTextFile('TABLE.ASC',Table) Writeln 'Reading INDEX.ASC ...' ReadAscTextFile('INDEX.ASC',Index) WriteAscTextFile('INDEX2.ASC',Index) BuildIntIndexes BuildAlphaIndexes BuildCatIndexes ExitMenu ;============================================================= Procedure KbdAbort if KbdReady if ReadKey = Esc then ExitMenu endif EndProc Procedure MakeChapterName (N) var Name Name = Str(N) while length(Name) < 4 Name = '0' + Name endwhile Return 'rb' + Name + '.htm' EndProc Procedure MakeIntName (N) var Name Name = Str(N) while length(Name) < 3 Name = '0' + Name endwhile Return 'int' + Name + '.htm' EndProc Procedure MakeAlphaName (N) var Name Name = Str(N-63) while length(Name) < 2 Name = '0' + Name endwhile Return 'al' + Name + '.htm' EndProc Procedure MakeCatName (N) var Name Name = Str(N) while length(Name) < 2 Name = '0' + Name endwhile Return 'cat' + Name + '.htm' EndProc Procedure MakeContentsName (N) var Name N = N + 1 mod 3 if N = 0 Name = 'int.htm' elseif N = 1 Name = 'cat.htm' else Name = 'alpha.htm' endif Return Name EndProc Procedure MakeName (N) if NameMode = 1 Return MakeChapterName(N) elseif NameMode = 2 Return MakeIntName(N) elseif NameMode = 3 Return MakeAlphaName(N) elseif NameMode = 4 Return MakeCatName(N) elseif NameMode = 5 Return MakeContentsName(N) endif EndProc Procedure UnIndent (St,N) N = 0 while (St > '') and (Left(St,1) = ' ') N = N + 1 delete(St,1,1) endwhile EndProc Procedure CapFirstCharacter (St) Mid(St,1) = UpperCase(Left(St,1)) EndProc Procedure WrapText (St) Return PosInListLeft(St,WrapTextList) > 0 EndProc Procedure ProcessTextBody (IntNum) var Section St St2 St3 St4 St5 IntNum2 IntNum3 P B I SA Section = '' Loop Text St = ColonCommand(LoopVal) UnIndent(Loc LoopVal,Loc P) if St > '' Section = St if St = 'Return:' if LoopIndex > 1 Text[LoopIndex - 1] = Text[LoopIndex - 1] + '
' endif endif ;- Here's where we turn SeeAlso into hot links if St = 'SeeAlso:' St2 = 'SeeAlso: ' St = NextWordDelim(LoopVal,'') while LoopVal > '' B = pos(',',LoopVal) if B = 0 then B = 255 St = Left(LoopVal,B-1) St3 = St delete(LoopVal,1,B) if not (St StartsWith 'INT') St = IntNum + '/' + St endif while pos('"',St) > 0 delete(St,pos('"',St),1) endwhile B = PosInListLeft(St,SeeAlsoKey) if B > 0 ;- Found it! St2 = St2 + '' St2 = St2 + St3 + ' - ' else ;- Not Found B = pos('"',St3) if B > 0 if St3 StartsWith 'INT' IntNum3 = St3 delete(IntNum3,1,4) IntNum2 = Value('$' + Left(IntNum3,2)) else IntNum2 = IntNum P = pos(' ',IntNum2) if P > 0 delete(IntNum2,1,P) endif P = pos('/',IntNum2) if P > 0 IntNum2 = Left(IntNum2,P-1) endif IntNum2 = Value('$' + IntNum2) endif St4 = Left(St3,B-1) delete(St3,1,B-1) St5 = St3 St5 = NextWord(St5) ;- St5 is new key B = PosInListPartial(St5,SeeAlsoInt[IntNum2+1,1]) if B > 0 ;- Found it! B = SeeAlsoInt[IntNum2+1,2,B] St2 = St2 + '' St2 = St2 + St4 + St3 + ' - ' else ;- Still Not Found St2 = St2 + '' St2 = St2 + St4 + '' + St3 + ' - ' endif else St2 = St2 + St3 + ' - ' endif endif endwhile length(St2) = length(St2) - 3 LoopVal = St2 endif endif if (Section <> '') and (Section <> 'Return:') if P = 8 if LoopIndex > 1 Text[LoopIndex - 1] = Text[LoopIndex - 1] + '.' endif CapFirstCharacter(Loc LoopVal) endif endif EndLoop Section = '' Loop Text St = ColonCommand(Loc LoopVal) if St > '' Section = St if WrapText(Section) SetPreMode Off Wr '

' Section '' CapFirstCharacter(Loc LoopVal) Wr LoopVal else SetPreMode On CapFirstCharacter(Loc LoopVal) Wr '

' Section '
' LoopVal endif else if LoopVal = '' SetPreMode On LoopVal = '

' else P = pos('(TABLE',LoopVal) if P > 0 St = mid(LoopVal,P + 7,255) I[1] = Value(NextWord(St)) I[2] = ChapterNumber AppendArray(Table,I) endif P = pos('(SEE',LoopVal) if P > 0 St = LoopVal St2 = mid(St,P,11) B = Value(mid(St,P + 6,4)) delete(St,P,11) St3 = '' St3 = St3 + St2 + '' insert(St3,St,P) LoopVal = St endif endif Wr LoopVal endif EndLoop EndProc Procedure ProcessAFile (Name) var T F Line Category Index St OutName P I var Title Title2 IntNum FirstChar FileAssign(F,Name) FileOpen(F) while not EndOfFile(F) Line = FileReadln(F) if Line StartsWith '--------' ;- Process the file if Category <> 'Information' if ChapterNumber > 0 OutName = MakeChapterName(ChapterNumber) Writeln 'Creating File: ' OutName FileAssign(OutF,Base + OutName) FileCreate(OutF) Title = '' ;- Build the Title Loop Index Title = Title + LoopVal + '/' EndLoop Length(Title) = Length(Title) - 1 Wr '' Wr '' Wr '' Title Wr '' Wr '' Wr Body Wr '

' Wr '

' Title Wr '

' Wr '

' Indexes(ChapterNumber) Wr AddLine ;- Process Line 1 Title2 = Text[1] delete(Text,1,1) while pos('"',Title2) > 0 delete(Title2,pos('"',Title2),1) endwhile P = Pos('-',Title2) if P > 0 delete(Title2,1,P) Trim(Title2) CapFirstCharacter(loc Title2) endif if pos('NETWARE',Title2) > 0 Category = 'Netware' endif if pos('VIRUS',Title2) > 0 Category = 'Viruses' endif IntNum = Index[1] P = pos(' ',IntNum) if P > 0 delete(IntNum,1,P) endif IntNum = Value('$' + IntNum) Wr '' Title2 '' if pos(': ',Text[1]) = 0 SetPreMode On endif ProcessTextBody (Index[1]) SetPreMode Off Wr '

P = PosInList(Category,CatList2) Wr 'Category: ' Wr Category '' Wr '- ' Wr 'Int ' HexString(IntNum,2) 'h' FirstChar = left(Title2,1) if FirstChar < '@' then FirstChar = '@' if FirstChar > 'Z' then FirstChar = 'Z' Wr '- ' Wr FirstChar '' Wr '

' AddLine Indexes(ChapterNumber) Wr '' Wr '' ;- Index Entry dispose(I) AppendArray(I,ChapterNumber) AppendArray(I,IntNum) AppendArray(I,Title) AppendArray(I,Category) AppendArray(I,Title2) WritelnAsc(IndexFile,I) FileClose(OutF) KbdAbort endif dispose Index dispose Text ChapterNumber = ChapterNumber + 1 endif ;- Process the new Header Line delete(Line,1,8) Category = CatList[ord(Left(Line,1))] delete(Line,1,2) St = Left(Line,2) delete(Line,1,2) if St = '--' St = NextWordDelim(Line,'-') Index[1] = St else Index[1] = 'Int ' + St St = Left(Line,4) delete(Line,1,4) if not (St StartsWith '-') if St EndsWith '-' AppendArray(Index,'AH=' + Left(St,2)) + 'h' else AppendArray(Index,'AX=' + St) + 'h' endif endif St = Left(Line,6) delete(Line,1,6) if not (St StartsWith '-') if St EndsWith '-' St = Left(St,4) endif insert('=',St,3) St = St + 'h' AppendArray(Index,St) endif endif else ;- Process Body Text AppendArray(Text,Line) endif endwhile EndProc Procedure Indexes (N) var St Wr '' Wr '' Wr '' Wr '' Wr '
' Wr '' Wr 'Prev' Wr '' Wr 'Next' Wr '' Wr 'Home' Wr '' Wr 'Ralf' Wr 'InterrupsCategoriesContents

' EndProc Procedure ColonCommand (St) var St2 P B P = pos(': ',St) if P = 0 then Return '' St2 = St delete(St,1,P) Trim(St) Return Left(St2,P) EndProc Procedure SetPreMode (F) if F = PreMode then Return if F Wr '

'
     PreMode
   else
     Wr '
' PreMode Off endif EndProc Procedure Wr ($St) FileWriteln(OutF,St) EndProc Procedure AddLine Return '----------------------

' EndProc Procedure Body Return '' EndProc Procedure PreColor Return '' EndProc Procedure NameColor Return '' EndProc Procedure HomePage Return 'Home Page' EndProc Procedure LeftOfDash (St) var P P = pos(' - ',St) if P > 0 St = Left(St,P-1) endif Return St EndProc Procedure MakeIntHeader (N) var OutName Title OutName = MakeIntName(N) Writeln 'Creating File: ' OutName FileAssign(OutF,Base + OutName) FileCreate(OutF) Title = 'INT ' + HexString(N,2) Wr '' Wr '' Wr '' Title Wr '' Wr '' Wr Body Wr '

' Wr '

' Title Wr '

' Wr '

' Indexes(N) Wr AddLine EndProc Procedure MakeIntFooter (N) Wr '

' Wr AddLine Indexes(N) Wr '' Wr '' FileClose(OutF) EndProc Procedure BuildIntIndexes var Key IntNum St IntNum = -1 NameMode = 2 Loop Index if LoopVal[2] <> IntNum if IntNum <> -1 MakeIntFooter(IntNum) endif MakeIntHeader(LoopVal[2]) IntNum = LoopVal[2] endif Wr '' LoopVal[3] '' Wr ' - ' LoopVal[5] '
' EndLoop MakeIntFooter(IntNum) BuildIntMasterIndex EndProc Procedure BuildIntMasterIndex var St Hex Title Writeln 'Creating File: INT.HTM' FileAssign(OutF,Base + 'INT.HTM') FileCreate(OutF) Title = 'Interrupt Jump Table' Wr '' Wr '' Wr '' Title Wr '' Wr '' Wr Body Wr '

' Wr '

' Title Wr '

' Wr '

' NameMode = 5 Indexes(2) Wr '
' AddLine Wr ' Wr '' Loop 256 if (LoopIndex > 1) and (LoopIndex - 1 mod 16 = 0) Wr '' endif Hex = HexString(LoopIndex-1,2) Wr '' EndLoop Wr '' Wr '
' Wr Hex '
' Wr '

' Wr AddLine Wr '' Wr '' FileClose(OutF) EndProc Procedure MakeAlphaHeader (Ch) var OutName Title N N = Ord(Ch) OutName = MakeAlphaName(N) Writeln 'Creating File: ' OutName FileAssign(OutF,Base + OutName) FileCreate(OutF) Title = '- ' + Ch + ' -' Wr '' Wr '' Wr '' Title Wr '' Wr '' Wr Body Wr '

' Wr '

' Title Wr '

' Wr '

' Indexes(N) Wr AddLine Wr '

    ' EndProc Procedure MakeAlphaFooter (N) Wr '
' Wr '

' Wr AddLine Indexes(N) Wr '' Wr '' FileClose(OutF) EndProc Procedure BuildAlphaIndexes var Key LastCh N Ch St StL StR NextStL P SubList Writeln 'Sorting ...' MatrixInvert(Index) Key = Index[5] MatrixInvert(Index) SortArrayLinked(Index,Key) LastCh = '' NameMode = 3 Loop Index Ch = UpperCase(Left(LoopVal[5],1)) if Ch < '@' then Ch = '@' if Ch > 'Z' then Ch = 'Z' if Ch <> LastCh if LastCh <> '' MakeAlphaFooter(Ord(LastCh)) endif MakeAlphaHeader(Ch) LastCh = Ch endif St = LoopVal[5] P = pos(' - ',St) if P > 0 StL = Left(St,P-1) StR = Mid(St,P+3,255) endif NextStL = LeftOfDash(Index[LoopIndex+1,5]) if StL <> NextStL Wr '

  • ' Wr St '' if SubList Wr '

    ' SubList Off endif else if SubList Wr '

  • ' Wr StR '' else AppendArray(Alpha,StL) Wr '' Wr '

  • ' StL '' Wr '
      ' Wr '
    • ' Wr StR '' SubList On endif endif EndLoop MakeAlphaFooter(Ord(LastCh)) BuildAlphaMasterIndex EndProc Procedure BuildCatMasterIndex var St Hex Title Writeln 'Creating File: CAT.HTM' FileAssign(OutF,Base + 'CAT.HTM') FileCreate(OutF) Title = 'Category Index' Wr '' Wr '' Wr '' Title Wr '' Wr '' Wr Body Wr '
      ' Wr '

      ' Title Wr '

      ' Wr '

      ' NameMode = 5 Indexes(3) Wr AddLine Wr '

      ' Wr AddLine Wr '' Wr '' FileClose(OutF) EndProc Procedure BuildAlphaMasterIndex var St Hex Title FirstLet OldFirst Writeln 'Creating File: ALPHA.HTM' FileAssign(OutF,Base + 'ALPHA.HTM') FileCreate(OutF) Title = 'Table of Contents' Wr '' Wr '' Wr '' Title Wr '' Wr '' Wr Body Wr '

      ' Wr '

      ' Title Wr '

      ' Wr '

      ' NameMode = 5 Indexes(4) Wr AddLine Wr 'Index of Commands Starting with these Letters:
      Loop 27 Wr '' Wr Char(LoopIndex + 63) '' EndLoop Wr '

      ' Wr 'Index into this File Starting with these Letters:
      Loop 27 Wr '' Wr Char(LoopIndex + 63) '' EndLoop Wr '

      ' Wr '

        ' Loop Alpha FirstLet = Left(LoopVal,1) if FirstLet < 'A' then FirstLet = '@' if FirstLet > 'Z' then FirstLet = 'Z' if FirstLet > OldFirst if FirstLet > '@' Wr '

      ' endif Wr '' Wr '

      - ' FirstLet ' -

      ' Wr '

      ' Wr AddLine Wr '' Wr '' FileClose(OutF) EndProc Procedure MakeCatHeader (N,St) var OutName Title OutName = MakeCatName(N) Writeln 'Creating File: ' OutName FileAssign(OutF,Base + OutName) FileCreate(OutF) Title = St Wr '' Wr '' Wr '' Title Wr '' Wr '' Wr Body Wr '

      ' Wr '

      ' Title Wr '

      ' Wr '

      ' Indexes(N) Wr AddLine Wr '

        ' EndProc Procedure BuildCatFooter(N) Wr '
      ' Wr '

      ' Wr AddLine Indexes(N) Wr '' Wr '' FileClose(OutF) EndProc Procedure BuildCatIndexes var Key Old Cat N St StL StR NextStL P SubList Writeln 'Sorting ...' Loop Index Key[LoopIndex] = LoopVal[4] + ' ' + LoopVal[5] EndLoop SortArrayLinked(Index,Key) Old = 'ZZZ' N = 0 NameMode = 4 Loop Index if LoopVal[4] <> Old if N > 0 BuildCatFooter(N) endif N = N + 1 MakeCatHeader(N,LoopVal[4]) Old = LoopVal[4] endif St = LoopVal[5] P = pos(' - ',St) if P > 0 StL = Left(St,P-1) StR = Mid(St,P+3,255) endif NextStL = LeftOfDash(Index[LoopIndex+1,5]) if StL <> NextStL Wr '

    • ' Wr St '' if SubList Wr '

    ' SubList Off endif else if SubList Wr '

  • ' Wr StR '' else Wr '

  • ' StL '' Wr '
      ' Wr '
    • ' Wr StR '' SubList On endif endif EndLoop BuildCatFooter(N) BuildCatMasterIndex EndProc Procedure Setup var Categories Registers StandardIO ReadAscTextFile('CAT.LST',Categories) Loop Categories CatList[ord(LoopVal[1])] = LoopVal[2] if LoopVal[2] <> 'Information' AppendArray(CatList2,LoopVal[2]) endif EndLoop AppendArray(CatList2,'Netware') AppendArray(CatList2,'Viruses') SortArray(CatList2) ChapterNumber = 0 WrapTextList = Set['Note:','Notes:','Bugs:','Bug:','Desc:','Program:','SeeAlso:'] UpperCaseCompare On Writeln 'Reading Indexes ...' ReadAscTextFile('INDEX2.ASC',Index) ReadAscTextFile('TABLE.ASC',Table2) Loop Index SeeAlsoNum[LoopIndex] = LoopVal[1] SeeAlsoKey[LoopIndex] = LoopVal[3] + LoopVal[5] ;- 3 dimensional array AppendArray(SeeAlsoInt[LoopVal[2]+1,1],LoopVal[5]) AppendArray(SeeAlsoInt[LoopVal[2]+1,2],LoopVal[1]) EndLoop FileAssign(IndexFile,'INDEX.ASC') FileCreate(IndexFile) NameMode = 1 EndProc Procedure Main ProcessAFile 'INTERRUP.LST' FileClose(IndexFile) EndProc