*=*=*=*= ToMap.html =*=*=*=*
Integer Function ToMap(hfile)
parameter (mxhash=500)
implicit integer(a-z)
include 'whstruct.fi'
common /HASH/ nhash,hashv,hasho
record /TOMAPHEADER/ th
record /FILEHEADER/ fh
character*1 hfile(*)
character*4 clong
integer long
integer hashv(mxhash),hasho(mxhash)
equivalence (clong,long)
c
ToMap = 0
ipos = 1
call overlay(fh.read,hfile(ipos),len(fh.read))
ipos = ipos + len(fh.read)
call overlay(th.read,hfile(ipos),len(th.read))
ipos = ipos + len(th.read)
topic = 0
do i=ipos,fh.fileplusheader,4
topic = topic+1
call overlay(clong,hfile(i),4)
hasho(topic) = long
hashv(topic) = topic
write(6,'(a,i3,a,z8)') ' Topic ',topic,' offset ',long
enddo
nhash = topic
end
*=*=*=*= Context.html =*=*=*=*
Integer Function Context
Integer Function Context
Integer Function Context(hfile)
implicit integer(a-z)
parameter (mxhash=500)
include 'whstruct.fi'
common /HASH/ nhash,hashv,hasho
record /FILEHEADER/ fh
record /BTREEHEADER/ bh
record /BTREENODEHEADER/ bnh
record /BTREEINDEXHEADER/ bih
character*(1) hfile(*)
character*4 clong
character*2 cint
integer hashv(mxhash),hasho(mxhash)
integer*4 long
integer*2 int
equivalence (int,cint),(clong,long)
c
Context = 0
ipos = 1
call overlay(fh.read,hfile(ipos),len(fh.read))
ipos = ipos + len(fh.read)
call overlay(bh.read,hfile(ipos),len(bh.read))
ipos = ipos + len(bh.read)
FirstPageLoc = ipos
write(6,*) ' BTREE root page ',bh.rootpage
write(6,*) ' Values in hash table ',bh.totalbtreeentries
ipos = ipos + bh.rootpage*BTreePageSize
write(6,*) ' Nlevels ',bh.nlevels
Level = 1
nextpage = 0
1 if(level.lt.bh.nlevels) then
call overlay(bih.read,hfile(ipos),len(bih.read))
ipos = ipos+4
call overlay(cint,hfile(ipos),2)
nextpage = int
level = level + 1
goto 1
endif
c
c found nextpage
c
nhash = 0
2 ipos = FirstPageLoc + nextpage*BTreePageSize
call overlay(bnh.read,hfile(ipos),len(bnh.read))
ipos = ipos + 8
do i=1,bnh.nentries
if(nhash.ge.mxhash) goto 900
nhash = nhash + 1
call overlay(clong,hfile(ipos),4)
hashv(nhash) = long
ipos = ipos + 4
call overlay(clong,hfile(ipos),4)
hasho(nhash) = long
ipos = ipos + 4
end do
nextpage = bnh.nextpage
if(nextpage.ne.-1) goto 2
do i=1,nhash
write(6,'(a,i3,a,z8,a,z8)') ' Hash ',i,' val ',
& hashv(i),' offset ',hasho(i)
end do
goto 1000
900 write(6,*) ' Max hash values exceeded in CONTEXT'
Context = -5090
1000 continue
end
*=*=*=*= Descriptors.html =*=*=*=*
Integer Function Descriptors
Integer Function Descriptors
Integer Function Descriptors(ldata,cdata)
implicit integer(a-z)
parameter (mxtag=200)
common /TAGS/ ntags,ltag,ctag
character*50 ctag(mxtag)
character*(*) cdata
character*4 clong
character*2 cint1,cint2
character*1 c,c1,c2,c3
integer ltag(mxtag)
integer long,bi,bi1,bi2,bi3
integer*2 int1,int2
byte b,b1,b2,b3
equivalence (b,c),(b1,c1),(b2,c2),(b3,c3)
equivalence (clong,long),(cint1,int1),(cint2,int2)
c
blocko(ii) = iand(ii,#3FFF)
c
Descriptors = 0
ntags = 0
if(ldata.le.0) return
write(6,*) ' descriptors ...'
write(6,'(20(1x,z2))') (cdata(i:i),i=1,ldata)
i = 0
1 i = i+1
if(i.lt.ldata) then
write(6,*) ' -----------------------------'
c = cdata(i:i)
b1 = 0
b2 = 0
b3 = 0
if(i+2.le.ldata) c1 = cdata(i+2:i+2)
if(i+4.le.ldata) c2 = cdata(i+4:i+4)
if(i+5.le.ldata) c3 = cdata(i+5:i+5)
bi = iand(b,#FF)
bi1 = iand(b1,#FF)
bi2 = iand(b2,#FF)
bi3 = iand(b3,#FF)
c
c Type 89x (link data) takes priority in search
c
if (bi3.eq.#89) then
if (bi.eq.#E3) then
write(6,*) ' Topic link '
else if(bi.eq.#E2) then
write(6,*) ' Pop up Topic link'
else
write(6,'(a,z2)') ' Link type ',bi
endif
clong = cdata(i+1:i+4)
write(6,'(a,z4,1x,z4)') ' value ',long,blocko(long)
i = i+5
Descriptors = Descriptors+2
ntags = ntags + 1
ctag(ntags) = ''
ltag(ntags) = 16
ntags = ntags + 1
ctag(ntags) = ''
ltag(ntags) = 4
else if(bi.eq.#80) then
write(6,*) ' byte #80 '
Descriptors = Descriptors+1
ntags = ntags + 1
ltag(ntags) = 0
else if(bi.eq.#82) then
write(6,*) '\par'
Descriptors = Descriptors+1
ntags = ntags + 1
ctag(ntags) = ''
ltag(ntags) = 3
else if(bi.eq.#81) then
write(6,*) '\line'
Descriptors = Descriptors+1
ntags = ntags + 1
ltag(ntags) = 0
else if(bi.eq.#83) then
write(6,*) '\tab'
Descriptors = Descriptors+1
ntags = ntags + 1
ctag = char(9)
ltag = 1
else if(bi1.eq.#80) then
cint1 = cdata(i:i+1)
ntags = ntags + 1
if(int1.eq.5) then
write(6,*) ' bold begin'
ctag(ntags) = ''
ltag(ntags) = 3
else if(int1.eq.4) then
if(ltag(ntags-1).eq.0) then
ctag(ntags-1) = ''
ltag(ntags-1) = 3
endif
ctag(ntags) = ''
ltag(ntags) = 4
write(6,*) ' bold end'
else if(int1.eq.8) then
write(6,*) ' underline end'
if(ltag(ntags-1).eq.0) then
ctag(ntags-1) = ''
ltag(ntags-1) = 4
endif
ctag(ntags) = ''
ltag(ntags) = 5
else
write(6,'(a,z4)') ' format , value ',int1
ltag(ntags) = 0
endif
i = i+2
Descriptors = Descriptors+1
else if(bi1.eq.#81) then
cint1 = cdata(i:i+1)
write(6,'(a,z4)') ' \line , value ',int1
i = i+2
Descriptors = Descriptors+1
ntags = ntags + 1
ltag(ntags) = 0
else if(bi1.eq.#82) then
cint1 = cdata(i:i+1)
write(6,'(a,z4)') ' \par , value ',int1
i = i+2
Descriptors = Descriptors+1
ntags = ntags + 1
ctag(ntags) = '
'
ltag(ntags) = 3
else if(bi1.eq.#86) then
cint1 = cdata(i:i+1)
write(6,*) ' Unknown #86 value ',int1
i = i+2
Descriptors = Descriptors+1
ntags = ntags + 1
ltag(ntags) = 0
else if(bi2.eq.#80) then
cint1 = cdata(i:i+1)
cint2 = cdata(i+2:i+3)
write(6,'(a,2z5)') ' Formatting values ',int1,int2
i = i+4
Descriptors = Descriptors+1
ntags = ntags + 1
ltag(ntags) = 0
else if (bi3.eq.#82) then
write(6,'(a,z2)') ' Bitmap? data type ',bi
cint1 = cdata(i+1:i+2)
cint2 = cdata(i+3:i+4)
write(6,'(a,2z5)') ' values ',int1,int2
i = i+5
Descriptors = Descriptors+2
ntags = ntags + 1
ctag(ntags) = ''
ltag(ntags) = 14
ntags = ntags + 1
ctag(ntags) = ''
ltag(ntags) = 4
else if(bi.ge.#80.and.bi.le.#90) then
write(6,'(a,z2)') ' Unknown descriptor ',bi
Descriptors = Descriptors+1
ntags = ntags + 1
ltag(ntags) = 0
else
write(6,'(a,z2)') ' Unassigned byte ',bi
endif
goto 1
endif
end
*=*=*=*= TagTopic.html =*=*=*=*
Integer Function TagTopic
Integer Function TagTopic
Integer Function TagTopic(length,TopicNum,cdata,itit)
implicit integer (a-z)
parameter (mxtag=200,lsp=80)
common /TAGS/ ntags,ltag,ctag
character*50 ctag(mxtag)
character*(*) cdata
character*1024 cbuff
integer ltag(mxtag)
TagTopic = 0
if(itit.eq.1) then
cbuff = cdata(:length)
write(2,*) ' '
write(2,*) 'cbuff(:length)//'">'//
& cbuff(:length)//''
write(2,*) ' '
else
itag = 0
ipos = 0
iout = 0
1 ipos = ipos + 1
if(ipos.gt.length) goto 2
if(cdata(ipos:ipos).eq.char(0)) then
itag = itag + 1
if(itag.gt.ntags) goto 1
if(ltag(itag).eq.0) then
write(2,*) cbuff(:iout)
iout = 0
goto 1
endif
if(iout.gt.lsp.and.cbuff(iout:iout).eq.' ') then
write(2,*) cbuff(:iout)
iout = 0
else if(ctag(itag).eq.'
') then
write(2,*) cbuff(:iout)
iout = 0
endif
cbuff(iout+1:iout+ltag(itag)) = ctag(itag)
iout = iout + ltag(itag)
else
cbuff(iout+1:iout+1) = cdata(ipos:ipos)
iout = iout + 1
if(iout.gt.lsp.and.cdata(ipos:ipos).eq.' ') then
write(2,*) cbuff(:iout)
iout = 0
endif
endif
goto 1
endif
2 write(2,*) cbuff(:iout)
end
*=*=*=*= GetInt.html =*=*=*=*
Integer Function GetInt
Integer Function GetInt
Integer Function GetInt(nchar,cin)
character*(*) cin
character*1 c1,c2,c3
character*2 cint
character*4 clong
integer*2 int
integer*4 long
c
byte b1,b2,b3
equivalence (b1,c1),(b2,c2),(b3,c3),(long,clong),(int,cint)
GetInt = 0
if(nchar.gt.4.or.nchar.le.0) return
if(nchar.eq.1) then
c1 = cin(1:1)
GetInt = iand(b1,#FF)
else if(nchar.eq.2) then
cint = cin(:2)
GetInt = int
else if(nchar.eq.3) then
c1 = cin(1:1)
c2 = cin(2:2)
c3 = cin(3:3)
GetInt = iand(b1,#FF) + 256*iand(b2,#FF) +
& 65536*iand(b3,#FF)
else if(nchar.eq.4) then
clong = cin(:4)
GetInt = long
endif
end
*=*=*=*= Expand.html =*=*=*=*
Integer Function Expand
Integer Function Expand
Integer Function Expand(needed,iposi,iposo,mx,nzero,cin,cout)
implicit integer(a-z)
include 'whstruct.fi'
parameter (mxphrase=1000)
common /PHRASES/ nphrase,is_p,if_p,cphrase
character*15000 cphrase
character*(*) cin,cout
character*1 c1,c2
integer is_p(mxphrase),if_p(mxphrase)
byte b1,b2
equivalence (b1,c1), (b2,c2)
c
istarti = iposi
istarto = iposo
expand = 0
1 if(expand.ge.needed) return
c1 = cin(iposi:iposi)
if(b1.le.9.and.b1.ge.1) then
c2 = cin(iposi+1:iposi+1)
phrase_n = 256*(iand(b1,#FF)-1) + iand(b2,#FF)
phrasen = phrase_n/2 + 1
if(phrasen.eq.0.or.phrasen.gt.nphrase) goto 900
lp = if_p(phrasen)-is_p(phrasen)+1
cout(iposo+1:iposo+lp) =
& cphrase(is_p(phrasen):if_p(phrasen))
iposo = iposo + lp
if(mod(phrase_n,2).eq.1) then
cout(iposo+1:iposo+1)=' '
iposo = iposo + 1
endif
iposi = iposi + 2
else if(b1.ne.0) then
cout(iposo+1:iposo+1) = c1
iposo = iposo + 1
iposi = iposi + 1
else
nzero = nzero + 1
cout(iposo+1:iposo+1) = c1
iposo = iposo + 1
iposi = iposi + 1
endif
expand = iposo-istarto
used = iposi-istarti
if(expand.lt.needed.and.used.lt.mx) goto 1
goto 1000
c
c error exits
c
900 write(6,*) ' Phrase replacement error'
expand = -5060
goto 1000
1000 end
*=*=*=*= WriteTopics.html =*=*=*=*
Integer Function WriteTopics
Integer Function WriteTopics
Integer Function WriteTopics(compression,hfile)
implicit integer(a-z)
include 'whstruct.fi'
parameter (fourb=4*TopicBlockSize)
record /FILEHEADER/ fh
record /TOPICBLOCKHEADER/ tbh
record /TOPICLINK/ tl
record /TOPICHEADER/ th
integer*2 int
integer*4 long
character*(1) hfile(*)
character*2 cint
character*4 clong
character*(fourb) cdec,cdeco
character*(1) c1,c2,c3
byte b1,b2,b3
logical compression,pending
equivalence (long,clong)
equivalence (int,cint)
equivalence (b1,c1)
equivalence (b2,c2)
equivalence (b3,c3)
external expand,TagTopic
c
c statement function Block Offset
c
blocko(ii) = iand(ii,#3FFF)
c
WriteTopics = 0
nlinks = 0
iposh = 1
nblocks = 0
pending = .false.
c
call overlay(fh.read,hfile(iposh),len(fh.read))
iposh = iposh + len(fh.read)
write(6,*) ' fileplushead ',fh.fileplusheader
write(6,*) ' filesize ',fh.filesize
TopicStart = iposh
c
500 call overlay(tbh.read,hfile(iposh),len(tbh.read))
iposh = iposh + len(tbh.read)
c
c tl_off is length of the topiclink header without the 2 offset bytes
c
tl_off = len(tl.read)-2
tbh_off = len(tbh.read)-4
c
ToGet = min(TopicBlockSize-tbh_off,fh.filesize-iposh+1)
if(compression) then
ldec = Decompress(ToGet,hfile(iposh),cdec)
else
call overlay(cdec,hfile(iposh),ToGet)
ldec = ToGet
endif
ipos = 1
if(pending) then
big =10000
nout = expand(big,ipos,iout,needed,nhot,cdec,cdeco)
write(6,*) nhot,' locators found'
write(6,*) ' Text: ',cdeco(:iout)
status = TagTopic(iout,TopicNum,cdeco,type)
pending = .false.
endif
c
1 continue
tl.read = cdec(ipos:)
dlen1 = tl.datalen1 - tl_off
dlen2 = tl.blocksize - tl.datalen1
ipos = ipos + tl_off
if(tl.recordtype.eq.tl_topichdr) then
write(6,*) ' '
write(6,*) ' TOPIC Header '
write(6,'(a,z6)') ' offset ',ipos-tl_off
th.read = cdec(ipos:)
write(6,'(a,z6)') ' last one ',tl.prevblock
TopicNum = th.topicnum
write(6,*) ' this topic num ',topicnum
ipos = ipos + dlen1
iout = 0
nhot = 0
c
mx = ldec-ipos+1
nout = expand(tl.datalen2,ipos,iout,mx,nhot,cdec,cdeco)
if(nout.ne.tl.datalen2) then
pending = .true.
type = 1
needed = blocko(tl.nextblock)-len(tbh.read)
else
pending = .false.
write(6,*) ' TopicLink Title: ',cdeco(:iout)
status = TagTopic(iout,TopicNum,cdeco,1)
endif
c
else if(tl.recordtype.eq.tl_display.or.
& tl.recordtype.eq.tl_text) then
istart = ipos
write(6,*) ' All descriptors ....'
write(6,'(20(1x,z2))') (cdec(i:i),i=ipos,ipos+dlen1-2)
c Get linkdata1 length
lrec = index(cdec(ipos:),char(#80)) - 1
len_linkdata1 = GetInt(lrec,cdec(ipos:ipos+lrec-1))
len_linkdata1 = len_linkdata1/2 - (lrec+1)
ipos = ipos + lrec + 1
c Get linkdata2 length
lrec = index(cdec(ipos:),char(#80)) - 1
len_linkdata2 = GetInt(lrec,cdec(ipos:ipos+lrec-1))
len_linkdata2 = len_linkdata2/2
len_linkdata1 = len_linkdata1 - (lrec+1)
write(6,*) ' dlen1,len_linkdata1 ',dlen1,len_linkdata1
ipos = ipos + lrec + 1
iend = istart + dlen1
write(6,*) ' ipos,iend ',ipos,iend
c
c Decode the descriptors
c
nihot = Descriptors(iend-ipos,cdec(ipos:iend-1))
write(6,*) nihot,' descriptors found'
ipos = iend
c
c Start of text (linkdata2)
c
nhot = 0
iout = 0
mx = ldec-ipos+1
nout = expand(tl.datalen2,ipos,iout,mx,nhot,cdec,cdeco)
if(nout.ne.tl.datalen2) then
pending = .true.
type = 2
needed = blocko(tl.nextblock)-len(tbh.read)
else
pending = .false.
write(6,*) nhot,' locators found'
write(6,*) ' Text: ',cdeco(:iout)
status = TagTopic(iout,TopicNum,cdeco,2)
endif
else if(tl.recordtype.eq.tl_table) then
write(6,*) ' Table data '
write(6,'(20(1x,z2))') (cdec(i:i),i=ipos,ipos+39)
ipos = ipos + tl.datalen2 + dlen1
else
write(6,*) ' *** Unknown data type *** '
write(6,'(20(1x,z2))') (cdec(i:i),i=ipos,ipos+39)
ipos = ipos + tl.datalen2 + dlen1
endif
c
c Return to 1 for next TOPICLINK
c
if(ipos.lt.ldec) goto 1
c
c Get next topic block
c
nblocks = nblocks + 1
iposh = TopicStart + nblocks*(TopicBlockSize+len(tbh.read))
if(iposh.lt.fh.fileplusheader) goto 500
c
end
*=*=*=*= PosFile.html =*=*=*=*
Integer Function PosFile
Integer Function PosFile
Integer Function PosFile(ipos,iposnow)
implicit integer(a-z)
parameter (buffsize=1024)
character*(buffsize) cbuff
character*1 c
c
PosFile = ipos
if(iposnow.eq.ipos) then
return
else if(iposnow.lt.ipos) then
diff = ipos - iposnow
else
diff = ipos
rewind(1)
endif
write(6,*) ' ipos,iposnow,n,m ',ipos,iposnow,n,m
n = diff/buffsize
m = diff - (n*buffsize)
if(n.ne.0) read(1,err=900,end=900) (cbuff,i=1,n)
if(m.ne.0) read(1,end=900,err=900) (c,i=1,m)
return
900 PosFile = -1
end
*=*=*=*= HLP2HTML
.html =*=*=*=*
Program HLP2HTML
Program HLP2HTML
Program HLP2HTML
implicit integer(a-z)
parameter (mxfiles=30,mxbuff=1000)
include 'whstruct.fi'
c
record /HELPHEADER/ hh
record /WHIFSBTREEHEADER/ wh
record /FILEHEADER/ fh
c
character*127 helpfile
character*(mxbuff) cbuff
character*1 c
character*2 cint
character*4 clong
character hfile [allocatable, huge] (:)
c
integer offset_file(mxfiles)
integer*2 int
integer*4 long
c
byte b
c
logical compression
c
equivalence(c,b)
equivalence(cint,int)
equivalence(clong,long)
c
call getarg(1,helpfile,status)
if(status.le.0) stop
c
open(2,file='user',title='HTML Output',recl=200)
open(1,file=helpfile(:status),status='old',form='binary',
& access='direct',recl=1,err=900)
c
nfiles = 0
c
read(1,end=902,err=902) hh.read
if(hh.MagicNumber.ne.hhMagic) goto 901
ipos = len(hh.read)
write(6,*) ' WHIFS = ',hh.WHIFS
write(6,*) ' Filesize = ',hh.filesize
c
c Goto the WHIFS header and read the file positions
c
ipos = PosFile(hh.WHIFS-1,ipos)
if(ipos.lt.0) goto 904
read(1,end=904,err=904) wh.read
write(6,*) ' read WHIFSBtree '
write(6,*) ' Nsplits = ',wh.nsplits
write(6,*) ' Totalpages = ',wh.totalpages
write(6,*) ' Nlevels = ',wh.nlevels
write(6,*) ' -1 = ',wh.mustbenegone
write(6,*) ' rootpage = ',wh.rootpage
write(6,*) ' TotalEntries = ',wh.totalwhifsentries
ipos = ipos + len(wh.read)
FirstPageLoc = hh.WHIFS + len(wh.read)
write(6,*) ' Firstpageloc = ',firstpageloc
c
c 8 is a fudge I do not understand ...
c
firstpageloc=firstpageloc+8
c
nfiles = min(wh.totalWHIFSentries,mxfiles)
PhraseIndex = 0
TopicIndex = 0
TopicTitle = 0
FontIndex = 0
ToMapIndex = 0
ContextIndex = 0
compression = .false.
ipos = PosFile(FirstPageLoc,ipos)
do entry=1,nfiles
write(6,*) ' Looking for WHIFS Entry ',entry
lbuff = 0
1 read(1,end=904,err=904) c
ipos = ipos + 1
if(b.ne.0) then
lbuff = lbuff + 1
cbuff(lbuff:lbuff) = c
goto 1
endif
read(1,end=904,err=904) clong
ipos = ipos + 4
write(6,*) ' WHIFS entry name ',cbuff(:lbuff)
offset_file(entry) = long + 1
write(6,'(a,i8,1x,z7)') ' at offset ',offset_file(entry),
& offset_file(entry)
c
if(cbuff(:lbuff).eq.'|SYSTEM') then
SystemIndex = entry
else if(cbuff(:lbuff).eq.'|Phrases') then
PhraseIndex = entry
else if(cbuff(:lbuff).eq.'|TOPIC') then
TopicIndex = entry
else if(cbuff(:lbuff).eq.'|TTLBTREE') then
TopicTitle = entry
else if(cbuff(:lbuff).eq.'|FONT') then
FontIndex = entry
else if(cbuff(:lbuff).eq.'|CONTEXT') then
ContextIndex = entry
else if(cbuff(:lbuff).eq.'|TOMAP') then
ToMapIndex = entry
else if(cbuff(:3).eq.'|bm') then
c status = DecodeBMP(cbuff,lbuff,hfile(offset_file(entry)))
c if(status.ne.0) goto 910
endif
end do
c
c Decode the SYSTEM file
c
if(SystemIndex.ne.0) then
ipos = PosFile(offset_file(SystemIndex)-1,ipos)
if(ipos.lt.0) goto 904
read(1,end=904,err=904) fh.read
allocate(hfile(fh.fileplusheader),stat=status)
if(status.ne.0) goto 905
do i=1,len(fh.read)
hfile(i) = fh.read(i:i)
end do
ipo = len(fh.read)+1
read(1,end=904,err=904) (hfile(i),i=ipo,fh.fileplusheader)
status = ReadSystem(compression,hfile(1))
deallocate(hfile)
ipos = ipos + fh.fileplusheader
if(status.ne.0) goto 912
endif
c
c Decode the Phrases file, if present
c
if(PhraseIndex.ne.0) then
ipos = PosFile(offset_file(PhraseIndex)-1,ipos)
if(ipos.lt.0) goto 904
read(1,end=904,err=904) fh.read
allocate(hfile(fh.fileplusheader),stat=status)
if(status.ne.0) goto 905
do i=1,len(fh.read)
hfile(i) = fh.read(i:i)
end do
ipo = len(fh.read)+1
read(1,end=904,err=904) (hfile(i),i=ipo,fh.fileplusheader)
status = DecodePhrases(compression,hfile(1))
deallocate(hfile)
ipos = ipos + fh.fileplusheader
if (status.ne.0) goto 907
endif
c
c Decode the Context file
c
if(ContextIndex.ne.0) then
ipos = PosFile(offset_file(ContextIndex)-1,ipos)
if(ipos.lt.0) goto 904
read(1,end=904,err=904) fh.read
allocate(hfile(fh.fileplusheader),stat=status)
if(status.ne.0) goto 905
do i=1,len(fh.read)
hfile(i) = fh.read(i:i)
end do
ipo = len(fh.read)+1
read(1,end=904,err=904) (hfile(i),i=ipo,fh.fileplusheader)
status = Context(hfile(1))
deallocate(hfile)
ipos = ipos + fh.fileplusheader
if(status.ne.0) goto 915
endif
c
c Decode the TOMAP file
c
if(ToMapIndex.ne.0) then
ipos = PosFile(offset_file(ToMapIndex)-1,ipos)
if(ipos.lt.0) goto 904
read(1,end=904,err=904) fh.read
allocate(hfile(fh.fileplusheader),stat=status)
if(status.ne.0) goto 905
do i=1,len(fh.read)
hfile(i) = fh.read(i:i)
end do
ipo = len(fh.read)+1
read(1,end=904,err=904) (hfile(i),i=ipo,fh.fileplusheader)
status = ToMap(hfile(1))
deallocate(hfile)
ipos = ipos + fh.fileplusheader
if(status.ne.0) goto 916
endif
c
c And the Topics Titles ..
c
if(TopicTitle.ne.0) then
ipos = PosFile(offset_file(TopicTitle)-1,ipos)
if(ipos.lt.0) goto 904
read(1,end=904,err=904) fh.read
allocate(hfile(fh.fileplusheader),stat=status)
if(status.ne.0) goto 905
do i=1,len(fh.read)
hfile(i) = fh.read(i:i)
end do
ipo = len(fh.read)+1
read(1,end=904,err=904) (hfile(i),i=ipo,fh.fileplusheader)
status = WriteTitles(hfile(1))
deallocate(hfile)
ipos = ipos + fh.fileplusheader
if (status.ne.0) goto 909
endif
c
c And the TOPICS files
c
if(TopicIndex.ne.0) then
ipos = PosFile(offset_file(TopicIndex)-1,ipos)
if(ipos.lt.0) goto 904
read(1,end=904,err=904) fh.read
allocate(hfile(fh.fileplusheader),stat=status)
if(status.ne.0) goto 905
do i=1,len(fh.read)
hfile(i) = fh.read(i:i)
end do
ipo = len(fh.read)+1
read(1,end=904,err=904) (hfile(i),i=ipo,fh.fileplusheader)
status = WriteTopics(compression,hfile(1))
deallocate(hfile)
ipos = ipos + fh.fileplusheader
if(status.ne.0) goto 908
endif
c
2 iret = 0
goto 1000
c
c
c
900 write(6,*) ' Cannot open file'
iret = -5000
goto 1000
901 write(6,*) ' Not a Windows help file'
iret = -5001
goto 1000
902 write(6,*) ' Cannot read Help file header'
iret = -5002
goto 1000
903 write(6,*) ' Error positioning internal file'
iret = -5003
goto 1000
904 write(6,*) ' Error positioning Help file'
iret = -5004
goto 1000
905 write(6,*) ' Cannot allocate enough memory'
iret = -5005
goto 1000
906 write(6,*) ' Error writing output HTML file '
iret = -5006
goto 1000
907 write(6,*) ' Error decoding Phrases file '
iret = status
goto 1000
908 write(6,*) ' Error decoding Topics file'
iret = status
goto 1000
909 write(6,*) ' Error fetching Topic titles '
iret = status
goto 1000
910 write(6,*) ' Error in Bitmap decode'
iret = status
goto 1000
912 write(6,*) ' Error decoding System file'
iret = status
goto 1000
915 write(6,*) ' Error decoding CONTEXT file'
iret = status
goto 1000
916 write(6,*) ' Error decoding TOMAP file'
iret = status
goto 1000
c
c all routes end here
1000 continue
read(5,*)
close(1)
close(2)
end
*=*=*=*= DecodeBMP.html =*=*=*=*
Integer Function DecodeBMP
Integer Function DecodeBMP
Integer Function DecodeBMP(name,lname,hfile)
implicit integer(a-z)
include 'whstruct.fi'
record /FILEHEADER/ fh
character*(*) name
character*(1) hfile(*)
character*13 filename
c
DecodeBMP = 0
ipos = 1
filename = name(2:lname)//'.BMP '
lf = index(filename,' ')-1
call overlay(fh.read,hfile(ipos),len(fh.read))
write(6,*) ' Bitmap ',name(:lname)
write(6,*) ' fileplushead ',fh.fileplusheader
write(6,*) ' filesize ',fh.filesize
ipos = ipos + len(fh.read)
open(80,file=filename(:lf),form='unformatted',
& status='new',err=900)
write(80,err=901) (hfile(i),i=ipos,fh.fileplusheader)
close(80)
return
c
900 write(6,*) ' Error opening bitmap file '//filename(:lf)
DecodeBMP = -5060
goto 1000
901 write(6,*) ' Error writing bitmap file '//filename(:lf)
DecodeBMP = -5061
goto 1000
1000 continue
end
*=*=*=*= ReadSystem.html =*=*=*=*
Integer Function ReadSystem
Integer Function ReadSystem
Integer Function ReadSystem(compression,hfile)
implicit integer (a-z)
include 'whstruct.fi'
record /FILEHEADER/ fh
record /SYSTEMHEADER/ sh
record /SYSTEMRECORD/ sr
logical compression
character*1 hfile(*)
character*127 title
c
ReadSystem = 0
ipos = 1
call overlay(fh.read,hfile(ipos),len(fh.read))
ipos = ipos + len(fh.read)
call overlay(sh.read,hfile(ipos),len(sh.read))
ipos = ipos + len(sh.read)
if(sh.revision.eq.21) then
compression = iand(sh.flags,comp_310) .ne. 0 .or.
& iand(sh.flags,comp_unk) .ne. 0
else
compression = .false.
endif
write(6,*) ' compression ',compression
if(sh.revision.eq.#0F) then
call overlay(title,hfile(ipos),len(title))
lt = index(title,char(0))-1
else
nmacro = 0
30 if(ipos.lt.fh.fileplusheader) then
call overlay(sr.read,hfile(ipos),len(sr.read))
write(6,*) ' datasize = ',sr.datasize
if (sr.recordtype.eq.1) then
write(6,*) ' -Help file title'
call overlay(title,hfile(ipos+4),len(title))
lt = sr.datasize
if(title(lt:lt).eq.char(0)) lt = lt-1
else if(sr.recordtype.eq.2) then
write(6,*) ' -Copyright notice'
else if(sr.recordtype.eq.3) then
write(6,*) ' -Contents ID'
else if(sr.recordtype.eq.4) then
write(6,*) ' -Macro Data'
else if(sr.recordtype.eq.5) then
write(6,*) ' -Icon'
else if(sr.recordtype.eq.6) then
write(6,*) ' -Secondary Window'
else if(sr.recordtype.eq.8) then
write(6,*) ' -Citation'
else
write(6,*) ' -Unknown ',sr.recordtype
endif
ipos = ipos + sr.datasize + len(sr.read)
goto 30
endif
endif
write(2,'(a)') ' '//title(:lt)//' '
write(2,'(a)') ' '//title(:lt)//'
'
end
*=*=*=*= WriteTitles.html =*=*=*=*
Integer Function WriteTitles
Integer Function WriteTitles
Integer Function WriteTitles(hfile)
implicit integer(a-z)
include 'whstruct.fi'
parameter (mxtitles=200)
common /TOPICS/ ntitles,ttitle
record /FILEHEADER/ fh
record /BTREEHEADER/ bh
record /BTREENODEHEADER/ bnh
record /BTREEINDEXHEADER/ bih
integer*4 long
character*(1) hfile(*)
character*4 clong
character*128 title,ttitle(mxtitles)
equivalence (long,clong)
c
WriteTitles = 0
ipos = 1
call overlay(fh.read,hfile(ipos),len(fh.read))
ipos = ipos + len(fh.read)
call overlay(bh.read,hfile(ipos),len(bh.read))
ipos = ipos + len(bh.read)
FirstPageLoc = ipos
Ntitles = bh.totalbtreeentries
ipos = FirstPageLoc + bh.rootpage*btreepagesize
level = 1
ititle = 0
1 if(level.lt.bh.nlevels) then
call overlay(bih.read,hfile(ipos),len(bih.read))
ipos = ipos+len(bih.read)
call overlay(clong,hfile(ipos),4)
nextpage = long
ipos = FirstPageLoc + nextpage*btreepagesize
level = level + 1
goto 1
endif
2 continue
call overlay(bnh.read,hfile(ipos),len(bnh.read))
ipos = ipos+len(bnh.read)
write(6,*) ' nentries = ',bnh.nentries
do i=1,bnh.nentries
call overlay(clong,hfile(ipos),4)
ipos = ipos + 4
TopicOffset = long
call overlay(title,hfile(ipos),len(title))
ltit = index(title,char(0))-1
write(6,*) ' Summary Topic '//title(:ltit)
write(6,'(a,z4)') ' at offset ',long
ititle = ititle + 1
ttitle(ititle) = title(:ltit)
ipos = ipos + ltit + 1
end do
if (bnh.nextpage.ne.-1) then
write(6,*) ' Going to page ',bnh.nextpage
ipos = FirstPageLoc + bnh.nextpage*btreepagesize
goto 2
endif
end
*=*=*=*= DecodePhrases.html =*=*=*=*
Integer Function DecodePhrases
Integer Function DecodePhrases
Integer Function DecodePhrases(compression,hfile)
implicit integer(a-z)
include 'whstruct.fi'
parameter (mxphrase=1000)
common /PHRASES/ nphrase,is_p,if_p,cphrase
record /PHRASEHEADER/ ph
record /FILEHEADER/ fh
character*1 hfile(*)
character*2 cint
character*15000 cphrase
integer int
integer is_p(mxphrase),if_p(mxphrase)
logical compression
equivalence(int,cint)
c
DecodePhrases = 0
ipos = 1
write(6,'(20(1x,z2))') (hfile(i),i=1,20)
write(6,*) ' Decoding Phrases ...'
call overlay(fh.read,hfile(ipos),len(fh.read))
ipos = ipos + len(fh.read)
call overlay(ph.read,hfile(ipos),len(ph.read))
ipos = ipos + len(ph.read)
write(6,*) ' Phrases file size = ',fh.filesize
write(6,*) ' numphrases = ',ph.numphrases
nphrase = ph.numphrases
if(compression) then
write(6,*) ' phrasessize = ',ph.phrasessize
call overlay(cint,hfile(ipos),2)
istart = ipos+int
before = fh.filesize - (len(ph.read)+2*(ph.numphrases+1))
ldec = Decompress(before,hfile(istart),cphrase)
if(ldec.le.0) goto 900
write(6,*) ' Before/after decode ',before,ldec
else
write(6,*) ' 100x ',ph.onehundred
ipos = ipos - 4
call overlay(cint,hfile(ipos),2)
istart = ipos + int
psize = fh.fileplusheader - istart + 1
call overlay(cphrase,hfile(istart),psize)
endif
call overlay(cint,hfile(ipos),2)
ioff = int
is_p(1) = 1
ipos = ipos + 2
do i = 2,nphrase
call overlay(cint,hfile(ipos),2)
is_p(i) = int - ioff + 1
if_p(i-1) = int - ioff
ipos = ipos + 2
enddo
call overlay(cint,hfile(ipos),2)
if_p(nphrase) = int - ioff
c do i=1,nphrase
c write(6,*) ' phrase ',i,' ',cphrase(is_p(i):if_p(i))
c end do
DecodePhrases = 0
return
900 write(6,*) ' Decompressed Phrases error'
DecodePhrases = -5050
end
*=*=*=*= overlay.html =*=*=*=*
subroutine overlay
subroutine overlay
subroutine overlay(char1,char2,N)
integer N
character*(*) char1
character*(1) char2(*)
do i=1,N
char1(i:i) = char2(i)
enddo
end
*=*=*=*= Decompress.html =*=*=*=*
Integer Function Decompress
Integer Function Decompress
Integer Function Decompress(lin,cin,cout)
implicit integer (a-z)
character*1 cin(*)
character*(*) cout
character*(1) c,c1
byte control,b,b1
equivalence (b,c)
equivalence (b1,c1)
equivalence (ib,b)
c
Decompress = 0
lout = 0
ipos = 1
1 continue
if(ipos.gt.lin) goto 2
c = cin(ipos)
control = b
ip2 = 1
do count=0,7
if(btest(control,count)) then
c = cin(ipos+ip2)
c1 = cin(ipos+ip2+1)
len = ishft(iand(b1,#F0),-4) + 3
dis = 256*iand(b1,#0F) + iand(b,#FF) + 1
if(dis.le.lout) then
do i=1,len
ib = lout-dis+i
c = cout(ib:ib)
cout(lout+i:lout+i) = c
enddo
else
cout(lout+1:lout+len) = '?'
endif
lout = lout + len
ip2 = ip2 + 2
else
lout = lout+1
cout(lout:lout) = cin(ipos+ip2)
ip2 = ip2+1
endif
end do
ipos = ipos+ip2
goto 1
2 Decompress = lout
end