! Program to convert a View source file into a TeX source
! RMM 16/5/82
! Modded by JHB Sep 84
! Transfer from Layout to Tex in progress Jan 1989

!!%include "inc:util.imp"
!--
%external%predicate%spec EXISTS(%string(255)file)
{apm} %system%string(8)%fn%spec DATE
{apm} %system%string(5)%fn%spec TIME
!--
%begin

%const %integer TT = 0;                  ! terminal I/O stream
%const %integer source = 1
%const %integer destination = 1
%const %integer stream error = 9;        ! event signalled on trouble

%string (255) input file,output file,a,b

%integer lines = 0
%owninteger blank=0 ;!Count of how many consecutive blank lines we've had
%owninteger sectionnos=0 ;!Flag to catch text before the first section.
                         ;!We insert  special section "Preamble".
%owninteger ttmode=0

%string (255) current line

! section stack

%const %integer max depth = 10

%integer %array sect no (1 : max depth);         ! section numbers
%integer TOS = 0;                                ! top of section stack

!
! SET DEFAULT
!

%constinteger nonfatal=0, fatal=1

%routine readline(%string (*) %name s)
   %byte c
   s=""
   %cycle; readsymbol(c); %exit %if c<' '; s=s.tostring(c); %repeat
%end

%routine printline(%string (255) s)
   printstring(s); newline
%end

%routine error(%string (255) text, %integer what)
   printline(text)
   %stop %if what = fatal
%end

%routine set default(%string (*) %name file, %string (7) extension)
   %if exists(file.extension) %then file = file.extension
%end


!
! PRINT MODDED
! Quotes special characters and converts runs of spaces to HSPACE.
! Note trailing spaces are discarded as a side-effect
! Spaces at start of line will usually indicate some specific formatting
! so force a line break.
!

%routine print modded (%string (255) line)
   %integer n,c,lastc, spcs
   %predicate all white(%string (*) %name s)
      %integer i
      %true %if s=""
      %for i=1,1,length(s) %cycle
         %false %if charno(s, i) # ' '
      %repeat
      %true
   %end

   printstring(line) %and %return %if ttmode#0
   %if all white(line) %then blank=blank+1 %and %return
   printline("\section{Preamble}") %and sectionnos=1 %and %c
   blank=1 %if sectionnos=0
   spcs=0
   %for n = 1, 1, length (line) %cycle
      c = charno(line, n)

      %if c # ' ' %and spcs#0 %start
        %if spcs <= 2 %start
           space
        %else
           %if spcs=n-1 %start ;!Line is blank from start
              printstring("\\ ") %if blank=0
              printstring("{\hspace*{")
           %else
              printstring(" {\hspace{")
           %finish
           print(spcs/15,0,1); printstring(" in}} ")
        %finish
        spcs = 0
      %finish

      %if c = '$' %or  c = '&' %or c = '%' %or  c = '#' %or %c
      c = '_' %or  c = '{' %or c = '}' %start
         printsymbol('\')
         print symbol (c)
      %elseif c = '^'
         printstring("$\hat{ }${}")
      %elseif c = '<'
         printstring("$<$")
      %elseif c = '\'
         printstring("$\backslash$")
      %elseif c = '>'
         printstring("$>$")
      %elseif c = ' ' %and ttmode=0
         spcs=spcs+1
      %else
         printsymbol(c)
      %finish
   %repeat
   blank=0
%end; ! of print modded

! +----------+
! |          |
! | GET LINE |
! |          |
! +----------+

%routine get line
   lines = lines + 1
   read line (current line)
%end; ! of get line

! +------------+
! |            |
! | INITIALISE |
! |            |
! +------------+

%routine initialise

   %string (255) param,left,right,title,author,title line
   %integer xx,yy

   %on stream error %start
      select output (TT)
      error("Fails: ".event_message, fatal)
   %finish

   input file = cli param
   output file = input file %unless input file -> input file.("/").output file
   %if output file -> output file.(".").b %start; %finish
   output file = output file.".tex"
   

   output file = input file %if output file = ""
   input file = "view:".input file %unless exists(input file)
   open input (source, input file)
   select input (source)

   set default (output file, ".tex")
   printline("Converting ".input file." to ".output file)
   open output (destination, output file)  
   select output (destination)

   ! some preliminary TeX options
   get line %until current line # ""; !title line
   !This should be a comment !{mmmmmmm} but it might be
   !                         !mmmmmmmm
   xx = 1
   xx=xx+1 %if charno(current line,1) = '!'
   xx=xx+1 %if charno(current line,2) = '{'
   yy = length(current line)
   yy=yy-1 %if charno(current line, length(current line)) = '}'
   title line = substring(current line,xx, yy)
   title=title line %and author = "APM Manual pages" %unless %c
   title line -> title.("/").author

   printline("\documentstyle[a4,12pt]{article}")
   printline("\begin{document}")
   printline("\author{".author."}")
   printline("\title{".title."}")
   printline("\maketitle")
   printline("\parskip .1 in")
   printline("\setcounter{secnumdepth}{10}")
   printline("\parindent 0in")

   ! initialise stack
   sect no (1) = 0
%end; ! of intialise

! +--------------+
! |              |
! | PROCESS LINE |
! |              |
! +--------------+

%routine process line

   %byte %name ch
   %string (255) s

   !
   ! CHECKS
   !

   %predicate checks (%string (15) c)
      %true %if sub string (current line, 1, length (c) + 1) = "!" . c
      %false
   %end; ! of checks

   !
   ! MAIN CODE OF PROCESS LINE
   !

   %if current line="" %start
      newline; blank=1
      %return
   %finish
   ch == char no (current line, 1)
   %if ch = '!' %start
      ! may be a command line
      ch == char no (current line, 2)
      %begin

         %integer n
         %switch ctype (0 : '~')

         -> ctype (ch)

      ctype ('<'): ! start of section
         ch == char no (current line, 3)
         %if ch = '>' %then %c
            error("Fails: Subsiduary files not implemented", fatal)
         TOS = TOS + 1;                         ! a new section
         %if TOS = max depth %then %c
            error("Fails: Nesting too deep", fatal)
         sect no (TOS) = sect no (TOS) + 1
         sect no (TOS + 1) = 0
         sectionnos=1
         %if TOS = 1 %start
            print string ("\section{")
         %elseif TOS = 2
            printstring("\subsection{")
         %else
            printstring("\subsubsection{")
         %finish
         print modded (sub string (current line, 3, length (current line)))
         printstring("}"); newline
         blank=1
         %return

      ctype ('>'): ! end of section
         %if TOS = 0 %then %c
            error("Fails: Unbalanced brackets", fatal)
         TOS = TOS - 1;                         ! pop section stack
         newline
         %return

      ctype ('T'): ! TITLE
         -> fall out %unless checks ("TITLE")
         %if lines > 1 %then %c
            error("Fails: TITLE out of context", fatal)
         print string ("\section{")
         sectionnos=1
         print modded (sub string (current line, 8, length (current line)))
         printstring("}"); newline
         blank=1
         %return

      ctype ('{'): ! Comment
         s = sub string(current line, 3, length(current line)-1)
         %if charno(s,1) = '\' %start ;!Embedded TeX Command
            %if s = "\tt" %then printstring("\small")
            %if s = "\rm" %then printstring("\end{verbatim}")
            print string(s); space
            %if s = "\tt" %then printstring("\begin{verbatim}")
            %if s = "\tt" %then ttmode=1
            %if s = "\rm" %then ttmode=0
            %if s = "\rm" %then printstring(" \normalsize ")
         %finish
         %return

      ctype ('P'): ! PAGE
         -> fall out %unless checks ("PAGE")
!         newline;                             ! maybe
         %return

      ctype ('S'): ! STOP
         %if checks ("STOP") %start
            printstring("\vspace(.75in} ".input file." printed on ".date." at ".time)
            printline("\newpage")
            printline("\tableofcontents")
            newline; print string ("\end{document}")
            newline
            %stop
         %else %if checks ("SKIP")
            error("Fails: SKIP not implemented", fatal)
         %finish
!         -> fall out
      
      fall out:
      ctype (*):   ! anything else
         print modded (sub string (current line, 2, length (current line)))
         newline
      %end
   %else
      print modded (current line)
      newline
   %finish
%end; ! of process line

! +------------+
! |            |
! | EVENT TRAP |
! |            |
! +------------+

%on stream error %start
   %if event_sub = 3 %start
      select output (TT)
      print string ("Fails: ")
      print string (event_message)
      newline
   %else
      printstring("\vspace{.75in} ".input file." printed on ".date." at ".time); newline
      newline
      printline("\newpage")
      printline("\tableofcontents")
      print string ("\end{document}"); newline
   %finish
   %stop
%finish

! +-----------+
! |           |
! | MAIN CODE |
! |           |
! +-----------+

initialise
%cycle
   get line
   process line
%repeat   

%end
%end %of %file
