/* REXX: convert files wget.info, wget.info-1, .., wget.info-4 to */ /* wget.htm (because I deleted PMINFO.exe and all other makeinfo */ /* tools on my system intentionally). Ignore a warning about the */ /* unconverted underline in `DIr__Prefix': I haven't implemented */ /* a check for `x _y_ z' or _x `y' z_ (this would be converted to */ /* bold or to bold, most probably wrong). */ /* If you want to try this with other *.info files edit at least */ /* the XHTML section in HEAD() or the FOOT()
for */ /* your system, copy or replace image top.jpg, and edit this: */ /* NAME = 'Wget' (case sensitive, also name of input files) */ /* PART = 4 (for *.info-1 etc. upto PART, could be 0) */ signal on novalue name TRAP ; signal on halt name TRAP signal on failure name TRAP ; signal on syntax name TRAP signal on notready name TRAP ; signal on error name TRAP NAME = 'Wget' ; PART = 4 TOP = NAME || '.info' ; NODE.0 = NAME OUT = NAME || '.htm' ; call XDEL OUT TMP = NAME || '.tmp' ; call XDEL TMP do N = 0 to PART if N = 0 then PART = TOP ; else do PART = TOP || '-' || N ; call lineout TMP, d2c( 31 ) end /* d2c( 31 ) marks info sections */ L = chars( PART ) if L = 0 then exit TRAP( 'fatal - empty' PART ) do while L > 0 if L > 8192 then call charout TMP, charin( PART, , 8192 ) else call charout TMP, charin( PART, , L ) L = chars( PART ) end call charout PART end N call charout TMP /* copied TOP and PARTs to TMP */ call HEAD OUT /* hardwired .. */ TOP = 0 /* 1: last line was d2c( 31 )... */ PART = 0 /* 0: ...but next was no "File:" */ VOID = 0 /* 1: last line empty or "File:" */ SKIP = '' /* skip header (handled in Node) */ NONO.0 = 0 /* n = NONO.0 for highest NODE.n */ NOTE.0 = 0 /* 1: await pending "*note" link */ do N = 1 while lines( TMP ) > 0 LINE = strip( linein( TMP ), 'Trailing' ) select when LINE = d2c( 31 ) then TOP = 1 when TOP & abbrev( LINE, 'File: ' ) then do parse var LINE . 'Node: ' PART ',' . 'Up: ' TOP TOP = 3 - ( TOP = 'Top' ) ; VOID = 1 ; SKIP = PART NODE = NODE( PART, 1 ) LINE = '' LINE = LINE || '' LINE = LINE || 'top   ' LINE = LINE || '' || TEXI( PART ) LINE = LINE || '
'

            if NONO.0 = 1 then do
               LINE = ' 
'
            end

            call lineout OUT, LINE        ;  PART = 1 ;  TOP = 0
         end
         when TOP                                  then  do
                                             PART = 0 ;  TOP = 0
         end
         when PART = 0                             then  nop
         when LINE = '* Menu:'                     then  nop
         when abbrev( LINE, '* ' )                 then  do
            parse var LINE 3 X ':' Y
            if right( Y, 1 ) = '.' then do
               Y = strip( left( Y, length( Y ) - 1 ))
            end
            select
               when Y = ':'            then  Y = X
               when abbrev( Y, ': ' )  then  do
                  Y = strip( substr( Y, 2 ))
               end
               when X = NODE.0         then  iterate N
               when Y <> ''            then  do
                  LINE = Y ;  Y = X ;  X = LINE
               end
               otherwise exit TRAP( 'fatal - line' N || ':' LINE )
            end
            LINE = ''
            LINE = LINE || TEXI( Y ) || ''
            call lineout OUT, LINE
         end
         when VOID = 1 & LINE = ''                 then  nop
         when VOID = 0 | SKIP = ''                 /**/ , /**/
            | length( LINE ) <> length( SKIP )     then  do
            VOID = ( LINE = '' ) ;  SKIP = ''
            call lineout OUT, TEXI( LINE )
         end
         when LINE = SKIP                          then  nop
         when verify( LINE, left( LINE, 1 )) = 0   then  SKIP = ''
         otherwise   exit TRAP( 'fatal - unmatched' SKIP )
      end
   end N
   do TOP = 1 to NONO.0          /* check unresolved links        */
      if NONO.TOP < 0 then exit TRAP( 'fatal - undefined' NODE.TOP )
      if NODE.TOP = NODE.0 then iterate TOP
      if NONO.TOP > 0 then say 'warning - unreferenced' NODE.TOP
   end TOP

   call FOOT OUT     ;  say N 'lines input for' OUT
   call lineout TMP  ;  exit XDEL( TMP )

TEXI: procedure expose NODE. NONO. NOTE.
   TEXI = GSUB( arg( 1 ), '&', '&' )
   TEXI = GSUB( TEXI, '<', '<' )
   TEXI = GSUB( TEXI, '>', '>' )
   TEXI = GSUB( TEXI, '"', '"'  )
   TEXI = PAIR( TEXI, '_', '_', 'em' )
   TEXI = PAIR( TEXI, "`", "'", 'b'  )

   if NOTE.0 & sign( pos( '::', TEXI )) then do
      parse var TEXI LEFT '::' TEXI
      NOTE.0 = strip( LEFT, 'Leading' )
      INDENT = left( '', length( LEFT ) - length( NOTE.0 ))
      NOTE.1 = NODE( space( NOTE.1 NOTE.0 ), -1 )
      NOTE.1 = '' || NOTE.0 || ''
      TEXI   = INDENT || NOTE.1 || TEXI
      NOTE.0 = 0  ;  drop NOTE.1 /* forced NOVALUE if NOTE.1 used */
   end
   if NOTE.0 then exit TRAP( 'fatal - unmatched *note before' TEXI )

   TEXI = NOTE( TEXI, '*note', 'see also' )
   TEXI = NOTE( TEXI, '*Note', 'See also' )

   if sign( verify( TEXI, xrange( ' ', '~' )))
      then exit TRAP( 'fatal - non-ASCII in' arg( 1 ))

   return TEXI

NOTE: procedure expose NODE. NONO. NOTE.
   parse arg TEXT, NOTE, SEE        ;  POS = pos( NOTE, TEXT )

   if POS = 0  then  return TEXT /* expect only one NOTE per line */
   if NOTE.0 | POS < lastpos( NOTE, TEXT )
      then exit TRAP( 'fatal - double *note near' TEXT )

   parse var TEXT TOP (NOTE) TEXT   ;  POS = pos( '::', TEXT )
   if POS = 0 then do            /* broken link, delay resolution */
      NOTE.0 = 1  ;  NOTE.1 = TEXT  ;  return TOP || SEE || TEXT
   end

   parse var TEXT NOTE '::' TEXT    ;  POS = NODE( NOTE, -1 )
   NOTE = '' || strip( NOTE ) || ''
   return TOP || SEE NOTE || TEXT

NODE: procedure expose NODE. NONO.
   parse arg ID, USE          ;  if ID = 'Top' then ID = NODE.0
   do N = 1 to NONO.0            /* '=' unlike '==' strips blanks */
      if NODE.N = ID then do
         select                  /* -1: used, +1: defined, 0: ok. */
            when NONO.N + USE = 0   then  NONO.N = 0
            when USE < 0            then  nop
            otherwise   exit TRAP( 'fatal - ambiguous:' ID )
         end
         return N                /* found definition or reference */
      end
   end N                         /* note definition or reference: */
   NONO.0 = N  ;  NODE.N = ID ;  NONO.N = USE   ;  return N

PAIR: procedure                  /* style tags for _x_ or `x'     */
   parse arg SRC, L, R, TAG   ;  DST = '' ;  TAG = TAG || '>'
   NEW = '<' || TAG  ;  TAG = ' */
   parse arg SRC, OLD, NEW ;  DST = '' ;  POS = pos( OLD, SRC )
   do while POS > 0
      DST = DST || left( SRC, POS -1 ) || NEW
      SRC =      substr( SRC, POS +1 ) ;  POS = pos( OLD, SRC )
   end
   return DST || SRC

HEAD: procedure expose NODE.
   parse arg OUT  ;  PURL = 'http://purl.net/xyzzy/src/info2htm.cmd'

   call charout OUT, ''
   call lineout OUT, ''
   call charout OUT, '    '
   call charout OUT, '    '
   call charout OUT, '    '
   call charout OUT, '    '
   call charout OUT, '    ' || NODE.0 || ''
   call charout OUT, ''
   call lineout OUT, '

' || NODE.0 || '

' call charout OUT, 'This document was created by  info2htm.cmd ' call charout OUT, 'based on a makeinfo version of ' call lineout OUT, 'the ' NODE.0 || ' manual:' return lineout( OUT, '' ) FOOT: procedure DATE = date() time() ; OUT = lastpos( ':', DATE ) DATE = left( DATE, OUT - 1 ) ; parse arg OUT call lineout OUT, '
' call lineout OUT, '' call lineout OUT, '
' call charout OUT, ' XHTML validator<' call lineout OUT, '/a>' call charout OUT, ' Last update:' DATE 'by F.Ellermann' call lineout OUT, '
' ; return /* see , (c) F. Ellermann */ XDEL: procedure /* semi-portable SysFileDelete() */ parse source KEY . . /* assuming ooREXX for WindowsNT */ if KEY = 'OS/2' | KEY = 'WindowsNT' then do call UTIL 'SysFileDelete' return SysFileDelete( arg( 1 )) <> 0 /* 0: okay, 1: error */ end parse version KEY . . if KEY = 'REXXSAA' then return RxDelete( arg( 1 )) <> 0 /* 0: okay, 1: error */ else return DosDel( arg( 1 )) == 0 /* 0: okay, 1: error */ UTIL: procedure /* load necessary RexxUtil entry */ if RxFuncQuery( arg( 1 )) then if RxFuncAdd( arg( 1 ), 'RexxUtil', arg( 1 )) then exit TRAP( "can't add RexxUtil" arg( 1 )) return 0 TRAP: /* select REXX exception handler */ call trace 'O' ; trace N /* don't trace interactive */ parse source TRAP /* source on separate line */ TRAP = x2c( 0D ) || right( '+++', 10 ) TRAP || x2c( 0D0A ) TRAP = TRAP || right( '+++', 10 ) /* = standard trace prefix */ TRAP = TRAP strip( condition( 'c' ) 'trap:' condition( 'd' )) select when wordpos( condition( 'c' ), 'ERROR FAILURE' ) > 0 then do if condition( 'd' ) > '' /* need an additional line */ then TRAP = TRAP || x2c( 0D0A ) || right( '+++', 10 ) TRAP = TRAP '(RC' rc || ')' /* any system error codes */ if condition( 'c' ) = 'FAILURE' then rc = -3 end when wordpos( condition( 'c' ), 'HALT SYNTAX' ) > 0 then do if condition( 'c' ) = 'HALT' then rc = 4 if condition( 'd' ) > '' & condition( 'd' ) <> rc then do if condition( 'd' ) <> errortext( rc ) then do TRAP = TRAP || x2c( 0D0A ) || right( '+++', 10 ) TRAP = TRAP errortext( rc ) end /* future condition( 'd' ) */ end /* may use errortext( rc ) */ else TRAP = TRAP errortext( rc ) rc = -rc /* rc < 0: REXX error code */ end when condition( 'c' ) = 'NOVALUE' then rc = -2 /* dubious */ when condition( 'c' ) = 'NOTREADY' then rc = -1 /* dubious */ otherwise /* force non-zero whole rc */ if datatype( value( 'RC' ), 'W' ) = 0 then rc = 1 if rc = 0 then rc = 1 if condition() = '' then TRAP = TRAP arg( 1 ) end /* direct: TRAP( message ) */ TRAP = TRAP || x2c( 0D0A ) || format( sigl, 6 ) signal on syntax name TRAP.SIGL /* throw syntax error 3... */ if 0 < sigl & sigl <= sourceline() /* if no handle for source */ then TRAP = TRAP '*-*' strip( sourceline( sigl )) else TRAP = TRAP '+++ (source line unavailable)' TRAP.SIGL: /* ...catch syntax error 3 */ if abbrev( right( TRAP, 2 + 6 ), x2c( 0D0A )) then do TRAP = TRAP '+++ (source line unreadable)' ; rc = -rc end select when 0 then do /* in pipes STDERR: output */ parse version TRAP.REXX /* REXX/Personal: \dev\con */ if abbrev( TRAP.REXX, 'REXXSAA ' ) | /**/ , 6 <= word( TRAP.REXX, 2 ) then TRAP.REXX = 'STDERR' else TRAP.REXX = '\dev\con' signal on syntax name TRAP.FAIL call lineout TRAP.REXX , TRAP /* fails if no more handle */ end when 0 then do /* OS/2 PM or ooREXX on NT */ signal on syntax name TRAP.FAIL call RxMessageBox translate( TRAP, ' ', x2c( 0D )), /**/ , 'Trap' time(),, 'ERROR' end otherwise say TRAP ; trace ?L /* interactive Label trace */ end if condition() = 'SIGNAL' then signal TRAP.EXIT TRAP.CALL: return rc /* continue after CALL ON */ TRAP.FAIL: say TRAP ; rc = 0 - rc /* force TRAP error output */ TRAP.EXIT: exit rc /* exit for any SIGNAL ON */