F.4. doc/i/gtkgamma/autodocs/gtkwidgets2docs.g

#!/usr/cogent/bin/gamma -C -F

/* This program reads the gammagtk.so file, extracts the
 * Gamma/GTK widget classes, and prints out an SGML-tagged
 * reference page for each one. It also creates entity definitions
 * for each page, as well as entity definitions and blank files
 * for a hand-edited purpose, description, and example for each widget.
 */


require("gg_utils.g");

/* Debugging function.
 */

function sigsegv_callback()
{
  local done, __input;
  while (!done)
    {
      princ ("Debug> ");
      flush (stdout);
      try
	{
	  __input = read (macstdin);
	  if (__input == _eof_)
	    done = t;
	  else
	    {
	      pretty_print (eval(__input));
	      terpri();
	    }
	}
      catch princ (_last_error_, "\n");
    }
  princ ("Continuing...\n");
}

signal (SIGSEGV, #sigsegv_callback());

DllLoad("gammagtk.so");

spaces = "                                                                 ";

function methods (c)
{
  local		x = parse_string (string(c));
  local		i, vars;
  
  x = car (cdddr (x));
  with i in x vars=tcollect
    {
      if (list_p(cdr(i)) && cadr(i) == #defun)
	cons (car(i), cdar (cdddr(i)));
      else
	nil;
    }
}

function parents (w)
{
  local		c = eval (w);
  
  plist = list(); 
  pwidget = parent_class(c);
  
  while (pwidget)
    {
      plist = cons(class_name(pwidget), plist);
      pwidget = parent_class(pwidget);
    }
  plist;
}


function get_functions(group)
{
  local funclist = list(), stringlist, fd, line = nil, fname, fgroup, flinkto;

  fd = open("processed_functions.txt", "r");
  while (line != _eof_)
    {
      line = read_line(fd);
      stringlist = string_split(line, " ", 3);
      fname = car(stringlist);
      fgroup = cadr(stringlist);
      flinkto = caddr(stringlist);
      fdescription = car(cdddr(stringlist));
      if ((substr(fgroup, 0, 1) == "g") &&
	  (strchr(fname, ".") == -1) &&
	  (strstr(fgroup, group) >= 0))
	{
	  funclistmember = list(fname, fgroup, flinkto, fdescription);
	  funclist = cons(funclistmember, funclist);
	}
      if ((substr(fgroup, 0, 1) == "G") &&
	  (strchr(fname, ".") == -1) &&
	  (fgroup == group))
	{
	  funclistmember = list(fname, fgroup, flinkto, fdescription);
	  funclist = cons(funclistmember, funclist);
	}
    }
  close(fd);
  funclist = reverse(funclist);
  funclist;
}


function method_html_address (widget_name, method_name)
{
  local i, input, buf, output;
  input = string(widget_name);
  output = char(input[0]);
  for (i=1; wrt = input[i]; i++)
    {
      if (shell_match(char(wrt),"[A-Z]"))
	wrt = string("-", char(wrt));
      else
	wrt = toupper(char(wrt));
      output = string(output, wrt);
    }

  output = string(output, "-");
  
  input = string(method_name);
  for (i=0; wrt = input[i]; i++)
    {
      if (shell_match(char(wrt),"_"))
	wrt = "-";
      else
	wrt = toupper(char(wrt));
      output = string(output, wrt);
    }
  output;
}


function function_html_address (functname)
{
  local i, input, buf, output;
  input = string(functname);
  output = "";
  for (i=0; wrt = input[i]; i++)
    {
      if (shell_match(char(wrt),"_"))
	wrt = "-";
      else
	wrt = toupper(char(wrt));
      output = string(output, wrt);
    }
  if (strstr(functname, "GTK") == 0)
    {
      output = string(output, "-CAPS");
    }
  output;
}

IvarLinks = nil;

function get_link_name (ivar)
{
  local s, input, output, compare, fd, item, varlist, return;
  
  input = string(ivar);
  input = toupper(input);
  input = string_split(input,"_",0);
  output = car(input);
  
  with s in cdr(input) do
    {
      if(cdr(input))
	{
	  output = string(output, "-", s);
	}
      else
	output;
    }
  
  if (!IvarLinks)
    {
      fd =open("processed_ivars.txt", "r");
      
      item = nil;
      varlist = list();
      while(item != _eof_)
	{
	  item = read_line(fd);
	  varlist = cons(item, varlist);
	}
      close (fd);
      IvarLinks = varlist;
    }
  
  search = find_equal(output,IvarLinks);
  if (search == nil)
    nil;
  else
    output;
}


function write_line (file, printstring)
{
  local fd;
  if (fd = open (file, "a"))
    {
      writec (fd, printstring);
      flush(fd);
      close(fd);
    }
  else
    error (string("Failed to open file: ", file));
}


function write_method_vars (fname, meth)
{
  local v, variables = cdr(meth);
  if (variables)
    {
      with v in variables do
	{
	  if (v == car(variables))
	    write_line (fname, string("\<parameter\>", v, "\<\/parameter\>"));
	  else      
	    write_line (fname, string(", \<parameter\>", v, "\<\/parameter\>"));
	}
    }
}


function write_function_args (filename, functname)
{
  local a, arguments;

  if (string_p(functname))
    func = eval(parse_string(functname));
  else
    func = eval(functname);
  arguments = function_args(func);
  if (arguments)
    {
      with a in arguments do
	{
	  if (a == car(arguments))
	    write_line (filename, string("\<parameter\>", car(a), "\<\/parameter\>"));
	  else      
	    write_line (filename, string(", \<parameter\>", car(a), "\<\/parameter\>"));
	  
	}
    }
}


function write_cogent_function(f_list, name_string)
{
  local location, c_function_name;
  location = strstr(car(f_list), name_string);
  c_function_name = string("GTK_TYPE_", toupper(substr(car(f_list), 4, (location-4))));
  write_line (filename, string(
"    \<member\>\<link linkend=\"gg-gtk-type-structurename\"\>\<function\>", car(i), "\<\/function\>\<\/link\> \(\) -- replaces ",  c_function_name,"\<\/member\>\n"));
  write_line (filename, string(
"     \<indexterm id\=\"ix-", substr(string(function_html_address(c_function_name)),0,40), "\"\>\<primary\>", c_function_name, "\<\/primary\>\<\/indexterm\>\n"));
}


function print_widget (w)
{
  local i, l, fd, p, filename, widget = eval (w), childlist, funclist;

	
  /* Set up variables */
	
  p = parent_class (widget);
  filename = string("../re_", w,".sgml");
  unlink (filename);

	
  /* Widget name */
	
  write_line(filename, string (
"\<refentry id=\"re-", w, "\"\>
   \<refmeta\>
      \<refentrytitle\>
         \<classname>", w, "\<\/classname\>
      \<\/refentrytitle\>
   \<\/refmeta\>
   \<refnamediv\>
     \<refname\>\<classname\>", w, "\<\/classname\>\<\/refname\>
       \<refpurpose\>\&", w, "purpose\;\<\/refpurpose\>
       \<indexterm id\=\"ix-", w, "\"\>\<primary\>", w, "\<\/primary\>\<\/indexterm\>
   \<\/refnamediv\>\n"));

	
  /* Instances*/
	
  if (class_p(parent_class(widget)))
    pw = class_name(parent_class(widget));
  else
    pw = "";
  write_line (filename, string(
"\<refsynopsisdiv\>
   \<title\>Synopsis\<\/title\>
      \<synopsis\>
class \<classname\>", w, "\<\/classname\> \<classname\>", pw, "\<\/classname\>
\{\n"));

  l = GGUT_IvarStringList(widget);
  
  // determine maximum length of ivar and type names
  local   ivarlen = 0;
  local   typelen = 0;
  with i in l do
    {
      local   name = car(i), type;
      if (cadr(i) != nil) type = cadr(i);

      if (strlen(name) > ivarlen) ivarlen = strlen(name);
      if (strlen(type) > typelen) typelen = strlen(type);
    }
  with i in l do
    {
      local   name = car(i);
      local   type = cadr(i);
      local   flags = caddr(i);
      
      local nspace = format(string("%", ivarlen - strlen(name)+8,"s")," ");
      local tspace = format(string("%", typelen - strlen(type)+1,"s")," ");
      
      if (type != "")
	type_string = string(nspace, "\/\/ ", type, tspace, ": ", flags);
      else
	type_string = string("");
      
      if (get_link_name(string(toupper(string(w)), "--", name)) != nil)
	write_line (filename, string ("    <ulink url=\"gtk/", tolower(string(w)), ".html#", get_link_name(string(toupper(string(w)), "--", name)), "\"\>\<varname\>", name, "\;\<\/varname\>\<\/ulink\>", type_string));
      else
	write_line (filename, string ("    \<varname\>", name, "\;\<\/varname\>", type_string));
      write_line (filename, string(
" \<indexterm id\=\"ix-ivar-", substr(string(method_html_address(w, name)),0,35), "\"\>\<primary\>", name, "\<\/primary\>\<secondary\>", w, "\<\/secondary\>\<\/indexterm\>\n"));
    }
  write_line (filename, string("\}
     \<\/synopsis\>
\<\/refsynopsisdiv\>\n"));

	  
  /* Parents */

  if ((parents(w)) != nil)
    {
      write_line(filename, string (
"\<refsect1\>
  \<title\>Parent Classes\<\/title\>
    \<para\>\n"));
      
      with pc in parents(w) do
	write_line(filename, string (
"    \<link linkend=\"re-", pc, "\"\>\<classname\>", pc, "\<\/classname\>\<\/link\>\<--"));
      write_line(filename, string (w, "\n"));
      write_line(filename, string (
"    \<\/para\>
\<\/refsect1\>\n"));
      
    }
  
  else
    {
      write_line(filename, string (
"\<refsect1\>
  \<title\>\<\/title\>
    \<para\>\<\/para\>
\<\/refsect1\>\n"));
    }

	  
  /* Children */
	
  if (childlist = getprop (w, #children))
    {
      write_line(filename, string(
"\<refsect1\>
  \<title\>Child Classes\<\/title\>
    \<para\>\n"));

      childlist = sort(childlist, symbol_cmp);
      with i in childlist do
	{
	  write_line(filename, string (
"    \<link linkend=\"re-", i, "\"\>\<classname\>", i, "\<\/classname\>\<\/link\>\n"));
	}	    
      write_line(filename, string(
"    \<\/para\>
\<\/refsect1\>\n"));
    }

	
  /* Description*/
	
  write_line(filename, string(
"\&", w,"description\;\n"));	


  /* Methods */
	
  if (methods(widget))
    {
      write_line(filename, string(
"\<refsect1\>
  \<title\>Methods\<\/title\>
  \<simplelist\>\n"));
					
      with i in methods (widget) do
	{
	  write_line (filename, string(
"    \<member\>\<ulink url=\"gtk/", tolower(string(w)), ".html#", method_html_address(w, car(i)), "\"\>\<function\>", car(i), "\<\/function\>\<\/ulink\> \("));
	  write_method_vars (filename,i);
	  write_line (filename, "\)\<\/member\>\n");
	  write_line (filename, string(
"     \<indexterm id\=\"ix-", substr(string(method_html_address(w, car(i))),0,40), "\"\>\<primary\>", car(i), "\<\/primary\>\<secondary\>", w, "\<\/secondary\>\<\/indexterm\>\n"));
	}
      write_line (filename, string(
"  \<\/simplelist\>					 
\<\/refsect1\>\n"));					 
    }

	
  /* Related Functions */
  
  if (funclist = get_functions(string(class_name(widget))))
    {
      write_line(filename, string(
"\<refsect1\>
  \<title\>Related Functions\<\/title\>
  \<simplelist\>\n"));
      
      with i in funclist do
	{
	  if (caddr(i) == "GTK")
	    {
	      if(car(cdddr(i)) && (strstr(car(cdddr(i)), "Category:") == 0))
//		princ("Found this: ", car(i), "\n");
	      {
		write_line (filename, string(
"    \<member\>\<ulink url=\"gtk/", substr(car(cdddr(i)), 10, -1), ".html#", function_html_address(car(i)), "\"\>\<function\>", car(i), "\<\/function\>\<\/ulink\> \("));
	      }
	      else
		{
		  write_line (filename, string(
"    \<member\>\<ulink url=\"gtk/", tolower(string(w)), ".html#", function_html_address(car(i)), "\"\>\<function\>", car(i), "\<\/function\>\<\/ulink\> \("));
		}
	      write_function_args (filename, car(i));
	      write_line (filename, "\)\<\/member\>\n");
	    }
	  else if (caddr(i) == "Cogent")
	    {
	      if (strstr(car(i), "_get_type") >= 0)
		{
		  write_cogent_function(i, "_get_type");
		}
	      else
		{
		  write_line (filename, string(
"    \<member\>\<function\>", car(i), "\<\/function\> \("));
		  write_function_args (filename, car(i));
		  write_line (filename, "\)\<\/member\>\n");
		}
	    }
	  write_line (filename, string(
"     \<indexterm id\=\"ix-", substr(string(function_html_address(car(i))),0,40), "\"\>\<primary\>", car(i), "\<\/primary\>\<\/indexterm\>\n"));
	}
      write_line (filename, string(
"  \<\/simplelist\>					 
\<\/refsect1\>\n"));					 
    }

	
  /* Examples */
  
  write_line(filename, string(
"\&", w, "example\;
\<\/refentry\>\n"));
}
  

function print_functions()
{
  local		i, fn, fd, filename, funclist;
  filename = string("../functionlist.sgml");
  unlink (filename);

  if (funclist = get_functions("g"))
    {
      write_line(filename, string(
"\<appendix id=\"gg-listoffunctions\"\>
  \<title\>List of Functions (Non Widget-Specific)\<\/title\>
  \<simplelist\>\n"));
					
      with i in funclist do
	{
	  if ((cadr(i) == "gtk-none"))
	    write_line (filename, string(
"    \<member\>\<function\>", car(i), "\<\/function\> \("));
	  else if (caddr(i) == "GTK")
	    write_line (filename, string(
"    \<member\>\<ulink url=\"gtk/", cadr(i), ".html#", function_html_address(car(i)), "\"\>\<function\>", car(i), "\<\/function\>\<\/ulink\> \("));
	  else if (caddr(i) == "Cogent")
	    write_line (filename, string(
"    \<member\>\<function\>", car(i), "\<\/function\> \("));
	  else if (caddr(i) == "GDK")
	    write_line (filename, string(
"    \<member\>\<ulink url=\"gdk/", cadr(i), ".html#", function_html_address(car(i)), "\"\>\<function\>", car(i), "\<\/function\>\<\/ulink\> \("));
	  write_function_args (filename, car(i));
	  write_line (filename, "\)");
	  if (car(cdddr(i)))
	      {
		write_line (filename, string("  ", car(cdddr(i))));
	      }
	  write_line (filename, "\<\/member\>");
	  write_line (filename, string(
"\n     \<indexterm id\=\"ix-", substr(string(function_html_address(car(i))),0,40), "\"\>\<primary\>", car(i), "\<\/primary\>\<\/indexterm\>\n"));
	}
      write_line (filename, string(
"  \<\/simplelist\>					 
\<\/appendix\>\n"));					 
    }
}
	

function write_entities (widgetlist)
{
  unlink ("../gtkwidgetref.sgml");
  unlink ("../gtkclassref.sgml");
  unlink ("../gdkclassref.sgml");
  unlink ("../entities.sgml");
  write_line("../entities.sgml", string(
"\<\!-- Main entities --\>
\<\!entity frontgtkgam SYSTEM \"frontgtkgam.sgml\"\>
\<\!entity gtkwidgetref SYSTEM \"gtkwidgetref.sgml\"\>
\<\!entity gtkclassref SYSTEM \"gtkclassref.sgml\"\>
\<\!entity gdkclassref SYSTEM \"gdkclassref.sgml\"\>
\<\!entity app1gtk SYSTEM \"examplecode.sgml\"\>
\<\!entity app2gtk SYSTEM \"functionlist.sgml\"\>
\<\!entity app3gtk SYSTEM \"widgettree.sgml\"\>


\<\!-- Reference entries\: Widgets and related content --\>\n"));

  with i in widgetlist do
    {
      write_line("../entities.sgml", string(
"\<\!entity re", i, " SYSTEM \"re_", i, ".sgml\"\>\n"));
      write_line("../entities.sgml", string(
"\<\!entity ", i, "purpose SYSTEM \"purposes/", i, "purpose.sgml\"\>\n"));
      write_line("../entities.sgml", string(
"\<\!entity ", i, "description SYSTEM \"descriptions/", i, "description.sgml\"\>\n"));
      write_line("../entities.sgml", string(
"\<\!entity ", i, "example SYSTEM \"examples/", i, "example.sgml\"\>\n"));

      if (class_p(eval(i)))
	{
	  if (strstr(string (i), "Gtk") == 0)
	    {
	      if (is_class_member(eval(i), GtkWidget))
		write_line("../gtkwidgetref.sgml", string("&re", i, ";\n"));
	      else
		write_line("../gtkclassref.sgml", string("&re", i, ";\n"));
	    }
	  else if (strstr(string (i), "Gdk") == 0)
	    write_line("../gdkclassref.sgml", string("&re", i, ";\n"));
	  else
	    error (string("Can't make a reference entry for: ", i));
	}
      else princ(i, "\n");
      write_line(string("../purposes/", i, "purpose.sgml"),"");
      write_line(string("../descriptions/", i, "description.sgml"),"");
      write_line(string("../examples/", i, "example.sgml"),"");
    }
}
  

function write_widget_page()
{
  local filename = string("../widgettree.sgml");
  unlink (filename);
  write_line(filename, string(
"\<appendix id=\"gg-widgethierarchy\"\>
  \<title\>The Gtk Widget Hierarchy\<\/title\>
  \<literallayout\>
\<link linkend=\"re-GtkWidget\"\>\<classname\>GtkWidget\<\/classname\>\<\/link\>\n"));

  write_widget_tree(GtkWidget, filename, "");
  write_line(filename, string(
"  \</literallayout\>
\</appendix>\n"));

}


function write_widget_tree(widget, file, ind)
{
  local childrenlist, indent, lfile = file, wname = class_name(eval(widget));
  if (childrenlist = getprop (wname, #children))
    {
      childrenlist = sort(childrenlist, symbol_cmp);
      indent = string(ind, "|         ");
      lfile = file;
      with i in childrenlist do
	{
	  write_line(lfile, indent);
	  write_line(lfile, string (
"\<link linkend=\"re-", i, "\"\>\<classname\>", i, "\<\/classname\>\<\/link\>\n"));
	  write_widget_tree(eval(i), lfile, indent);
	}	    
    }
}


function symbol_cmp(s1, s2)
{
  local string1, string2;
  string1 = string(s1);
  string2 = string(s2);
  strcmp(string1, string2);
}


function main ()
{
	local		x, i, indent = 0, c, p;
	
	x = apropos ("G*k*", class_p);
	with i in x do
	{
		c = eval(i);
		p = parent_class (c);
		if (p)
		{
		  setprop (class_name(p), #children,
			   cons (i, getprop(class_name(p), #children)));
		  setprop (i, #child, t);
		}
	}

	with i in x do
	{
		print_widget (i);
	}

	write_entities(x);

      	print_functions();

	write_widget_page();

}