############################################################################
#
#	File:     fnctmpl.icn
#
#	Subject:  Program to produce function templates
#
#	Author:   Ralph E. Griswold
#
#	Date:     February 27, 1992
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  This program processes the rt.db database for the Icon compiler produced
#  by rtt and produces procedures for each Icon function to be used by
#  iftrace.icn.
#
#  The data base is expected from standard input.
#
############################################################################

procedure main()
   local line, header, proto, rettype, name, varargs

   while line := read() do
      line ? {
         if pos(0) then {
            header := read() | stop("eof")
            proto := read() | stop("eof")
            header ? {
               if ="$endsect" then exit()
               tab(upto('{'))
               tab(upto(',') + 1)
               if =("*" | "1+") then rettype := "suspend"
               else rettype := "return"
               }
            proto ? {
               ="\"" | next
               name := tab(bal(' ')) | stop("bad proto")
               name := trim(name,',')
               name ?:= {
                  map(move(1),&lcase,&ucase) || tab(0)
                  }
               name ?:= {
                  if find("...") then {
                     varargs := 1
                     tab(upto('(') + 1) || "x[])"
                     }
                  else {
                     varargs := &null
                     tab(0)
                     }
                  }
               }
            write("procedure ",name)
            if /varargs then write("   ",rettype," ",name)
            else {
               name ?:= {
                  tab(upto('('))
                  }
               write("   ",rettype," ",name," ! x")
               }
            write("end\n")
            }
        else if ="$endsect" then exit()
        }
end
