home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / misc / inter41 / l2wh / l2whlink.awk < prev    next >
Text File  |  1994-05-16  |  9KB  |  285 lines

  1. # L2WHLINK.AWK interrup.rtf
  2. # v1.0  8-May-94
  3.  
  4. function hex2dec(ahexs,   i, m) {
  5.   adecs=0 ;  m=1
  6.   for (i=length(ahexs); i > 0; i--) {
  7.     adecs = adecs + 0 + (m * \
  8.              (index(hexdigits,toupper(substr(ahexs,i,1)))-1)+0)
  9.     m = 16 * m
  10.   }
  11.   ahexs=""; i=""; m=""
  12.   return adecs""
  13. }
  14.  
  15. function mkxrffilenm(anid) {
  16.   l_xrfn=""intdir""substr(anid,1,2)
  17.   return l_xrfn
  18. }
  19.  
  20. function escre(as) {     # -- kill regexp specials
  21.   sos=as; as=""
  22.   gsub(/[\$\{\}\*\+\(\)\/\\]/,".",sos)
  23.   gsub(/[\,\&\|\"\?\[\]\^]/,".",sos)
  24.   return sos
  25. }
  26.  
  27. function idexists(anid, ahint, idtouse, firstmatchid, xrffile, idhint, usemem, i, s1) {
  28.   # -- lookup anid /w ahint in index-files, return idtouse too
  29.   #    use simple FIFO cache (hope ahint does not contain spaces)
  30.   if (linkcachecnt+0 > 0) {
  31.     idhint=""ahint; gsub(/ /,"-",idhint); idhint=""anid""idhint
  32.     if ((i=index(linkcache,""idhint""))+0 > 0) {
  33.       s1=substr(linkcache,i,30)
  34.       if ((i=index(s1," "))+0 > 0) {
  35.         if (""substr(s1,1,i-1)"" ~ "^"escre(idhint)"$") {
  36.           printf "Cachehit "idhint"       \r" >> console
  37.           idtouse=""anid""; return ""idtouse
  38.         }
  39.       }
  40.     }
  41.   }
  42.   idtouse=""; firstmatchid="" #; ahint=suboem(ahint)
  43.   usemem="F"
  44.   xrffile=mkxrffilenm(anid)
  45.   if (substr(anid,1,2) ~ /21/) {  # -- i\21 split in two parts
  46.     if (hex2dec(substr(anid,3,2))+0 >= dec21split) {
  47.       xrffile=xrffile""split21""
  48.       if (""idxintno"" ~ split21re) { usemem="T" }
  49.     } else {
  50.       if (substr(anid,1,2) ~ "^"idxintno"$") { usemem="T" }
  51.     }
  52.   } else {
  53.     if (substr(anid,1,2) ~ /2F/) {  # -- i\2F split in two parts
  54.       if (hex2dec(substr(anid,3,2))+0 >= dec2Fsplit) {
  55.         xrffile=xrffile""split2F""
  56.         if (""idxintno"" ~ split2Fre) { usemem="T" }
  57.       } else {
  58.         if (substr(anid,1,2) ~ "^"idxintno"$") { usemem="T" }
  59.       }
  60.     } else {
  61.       if (substr(anid,1,2) ~ "^"idxintno"$") usemem="T"
  62.     }
  63.   }
  64.  
  65.   if (usemem ~ /T/) {
  66.     printf "Using mem "idxintno"    \r" >> console
  67.     if (""anid"" in intindex) {
  68.       if (""ahint"" == "") idtouse=""anid""
  69.       else {
  70.         if (""intindex[""anid""]"" ~ toupper(""ahint))
  71.           idtouse=""anid""
  72.       }
  73.     }
  74.   }
  75.   if (idtouse == "") {
  76.     # idexsave0=$0
  77.     printf "Using file "xrffile"    \r" >> console
  78.     while ( getline < xrffile > 0 ) {
  79.       if ( ""$1"" ~ "^"anid )  {
  80.         if (""ahint"" == "") { idtouse=""$1; break }
  81.         else {
  82.           if (firstmatchid == "") firstmatchid=""$1
  83.           if (toupper(""$0"") ~ toupper(""ahint)) { idtouse=""$1""; break }
  84.         }
  85.       } else
  86.         if (firstmatchid != "") break
  87.     }
  88.     close(xrffile) # ; xrffile=""
  89.     # $0=idexsave0; idexsave0=""; 
  90.   }
  91.  
  92.   if (idtouse == "") if (firstmatchid != "") idtouse=firstmatchid
  93.   firstmatchid=""
  94.   if (""idtouse"" != "") {
  95.     idhint=""ahint; gsub(/ /,"-",idhint); idhint=""idtouse""idhint
  96.     if ((index(""idhint"",""linkcache"")+0) > 0) return ""idtouse
  97.     if (linkcachecnt+0 == linkcachesize) {
  98.       i=index(linkcache," ")
  99.       linkcache=""substr(linkcache,i+1)" "idhint""
  100.     } else {
  101.       linkcache=""linkcache" "idhint""
  102.       linkcachecnt++
  103.     }
  104.   }
  105.   return ""idtouse
  106. }
  107.  
  108.  
  109. function mklinkedrtf(lnkid, lnktext, hint, idtouse, i) {
  110.   # --- this is the 2nd pass procedure RTF -> LTF 
  111.   #       updates global resolvedcnt, uses global $0 and textsep
  112.   rc=0
  113.     lnktext=substr(""$0"",(index(""$0"","LNKTEXT=")+10))
  114.     if ((i=match(lnktext,/[^ \t]/)) > 0) lnktext=substr(lnktext,i)
  115.     gsub(/\\\//,"\/",lnktext)
  116.     if (sub(/[ \t]*$/," ",lnktext) > 0)
  117.       lnktext=substr(lnktext,1,length(lnktext)-1)
  118.  # print "Lnktext="lnktext"         " >> console
  119.     hint=substr(""$0"",(index(""$0"","HINT=")+5))
  120.     if (substr(hint,1,1) ~ /\"/) {
  121.       hint=substr(hint,2,index(hint,"\" LNKTEXT")-2)
  122.  #  print "Hint="hint"                       \r" >> console
  123.     } else hint=""
  124.     idtouse=" "
  125.  # printf "LinkId="lnkid"  \r" >> console
  126.     if (""(idtouse=idexists(lnkid,hint,idtouse)) != "") {
  127.       print ""textsep"{\\strike{"lnktext"}}{\\v id_"idtouse"}" >> lnkrtffile 
  128. #  printf "From "lnktext"             \r" >> console
  129.       rc=1
  130.     } else
  131.       print ""textsep""lnktext"" >> lnkrtffile
  132.     if (textsep == "") textsep=", " 
  133.   lnktext=""; hint=""; lnkid="";
  134.   return rc
  135. }
  136.  
  137. function loadindex(anid,  xrffile, as) {
  138.   intindex="" # -- free array
  139.   nintindex=0
  140.   xrffile=mkxrffilenm(anid); idxintno=substr(anid,1,2)
  141.   if (""idxintno"" ~ /21/) {  # -- i\21 split in two parts
  142.     if (hex2dec(substr(anid,3,2))+0 >= dec21split) {
  143.       xrffile=xrffile""split21""; idxintno="21"split21""
  144.     }
  145.   } else {
  146.   if (""idxintno"" ~ /2F/) {  # -- i\2F split in two parts
  147.     if (hex2dec(substr(anid,3,2))+0 >= dec2Fsplit) {
  148.       xrffile=xrffile""split2F""; idxintno="2F"split2F""
  149.     }
  150.   }
  151.   }
  152.   printf "Loading "xrffile"    \r" >> console
  153.   while ( getline < xrffile > 0 ) {
  154.     if (length($0) > 1) {
  155.       intindex[""$1""]=escre(toupper(substr($0,index($0," ")+1)))
  156.       ++nintindex
  157.     }
  158.   }
  159.   close(xrffile)
  160.   if (nintindex+0 <= 0) idxintno="--"
  161. }
  162.  
  163. BEGIN {
  164.  
  165.   # -- resolve the hyperlinks using idx-files
  166.   #       -> (re)create 2nd pass output file .ltf
  167.   if (linkcachesize == "") linkcachesize=100
  168.   console="\\dev\\con"
  169.  
  170.   grpdir="g\\"; intdir="i\\";  lstfile=ARGV[ARGC-1]
  171.   basename=lstfile
  172.   if ((i=index(basename,"\.")) > 0) basename=substr(basename,1,i-1)
  173.   rtfoutput=basename".rtf"; statefile=basename".sta"
  174.   rtffile=basename".rtf"; hpjfile=basename".hpj"
  175.   hlpfile=basename".hlp"; grpidxfile=""grpdir""basename".grp"
  176.   basegrpidxfn=""grpdir"IG.~"; allgroupsfile=basename".idx"
  177.   hexdigits="0123456789ABCDEF"; linkflag="!!L2WHCRTF!!"
  178.   lnkrtffile=basename".ltf"; contentsid="id_Index"
  179.   about="About Interrupt List"
  180.   ftnt="{\\footnote "
  181.   ftn["#"]="#"ftnt; ftn["$"]="$"ftnt
  182.   ftn["K"]="K"ftnt; ftn["!"]="!"ftnt; ftn["+"]="+"ftnt
  183.  
  184.   print "Verifying hyperlinks and creating new RTF "lnkrtffile >> console
  185.   print "" > lnkrtffile
  186.  
  187.   # -- first split xrf INT 21 in two parts to speedup lookup
  188.   split21="65"; split21re="^21"split21"$"
  189.   xrffile=intdir"21.org"; nxrffile=intdir"21"
  190.   dec21split=hex2dec(split21)+0; next21loaded="F"
  191.   print "Splitting "nxrffile" at 21"split21"" >> console
  192.   if (system("ren "nxrffile" 21.org >> \\dev\\nul")+0 != 0) {
  193.     system("copy "xrffile" "nxrffile" >> \\dev\\nul")
  194.   }
  195.   system("del "nxrffile""split21" >> \\dev\\nul")
  196.   system("del "nxrffile" >> \\dev\\nul")
  197.   while ( getline < xrffile > 0 ) {
  198.     if ( ""$1"" ~ split21re)  {
  199.       close(nxrffile); nxrffile=intdir"21"split21"" 
  200.     }
  201.     print ""$0"" >> nxrffile
  202.   }
  203.   close(xrffile); xrffile=""
  204.   close(nxrffile); nxrffile=""
  205.  
  206.   # -- split xrf INT 2F in two parts too
  207.   split2F="86"; split2Fre="^2F"split2F"$"
  208.   dec2Fsplit=hex2dec(split2F)+0; next2Floaded="F"
  209.   xrffile=intdir"2F.org"; nxrffile=intdir"2F"
  210.   print "Splitting "nxrffile" at 2F"split2F"" >> console
  211.   if (system("ren "nxrffile" 2F.org >> \\dev\\nul")+0 != 0) {
  212.     system("copy "xrffile" "nxrffile" >> \\dev\\nul")
  213.   }
  214.   system("del "nxrffile""split2F" >> \\dev\\nul")
  215.   system("del "nxrffile" >> \\dev\\nul")
  216.   while ( getline < xrffile > 0 ) {
  217.     if ( ""$1"" ~ split2Fre)  {
  218.       close(nxrffile); nxrffile=intdir"2F"split2F"" 
  219.     }
  220.     print ""$0"" >> nxrffile
  221.   }
  222.   close(xrffile); xrffile=""
  223.   close(nxrffile); nxrffile=""
  224.  
  225.  
  226.   # -- now rewrite the flagged seealsos
  227.   textsep=""; resolvedcnt=0
  228.   linkcache="00"; linkcachecnt=0
  229.   intno=""; previntno="--"
  230.   intindex=""; nintindex=0; idxintno="--"
  231. }
  232.  
  233. /^\#/ {
  234.   print ""$0"" >> lnkrtffile
  235.   if (""$1"" ~ /^\#\{\\footnote/)  {
  236.     intno=substr($0,match($0,/id_/)+3,2)
  237.     if (""intno"" !~ /^(de)|(__)|(Be)/) {
  238.       if (""intno"" !~ "^"previntno"$") {
  239.         loadindex(intno)
  240.         previntno=intno
  241.       } else {
  242.         if (""intno"" ~ /^21/ && next21loaded ~ /F/) {
  243.           ia=substr($0,match($0,/id_/)+5,2)
  244.           if (""ia"" !~ /^__/) {  # -- i\21 split in two parts
  245.             if (hex2dec(ia)+0 >= dec21split) {
  246.               loadindex("21"split21""); next21loaded="T"
  247.             }  
  248.           }
  249.         }
  250.         if (""intno"" ~ /^2F/ && next2Floaded ~ /F/) {
  251.           ia=substr($0,match($0,/id_/)+5,2)
  252.           if (""ia"" !~ /^__/) {  # -- i\2F split in two parts
  253.             if (hex2dec(ia)+0 >= dec2Fsplit) {
  254.               loadindex("2F"split2F""); next2Floaded="T"
  255.             }  
  256.           }
  257.         }
  258.       }
  259.     }
  260.   } 
  261.   next
  262. }
  263.  
  264. /^\{\\v/ {
  265.   if (""$1"" ~ /L2WHCRTF/) { # -- linkflag
  266.     id=""$2""
  267.     gsub(/\//,"\\\/"); gsub(/\,/,"\\\,")
  268.     if (mklinkedrtf(id) != 0) ++resolvedcnt
  269.     next
  270.   }
  271. }
  272.  
  273.   {
  274.   textsep=""; print ""$0"" >> lnkrtffile
  275.   next
  276. }
  277.  
  278. END {
  279.   for (s in linkcache) delete linkcache[s]
  280.   linkcache=""
  281.   print "# of resolved links = "resolvedcnt"   " >> console
  282.   print "Run Help Compiler now with:",
  283.         " X> HC31 "basename"" >> console
  284. }
  285.