#!/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();
}
Copyright © 1995-2004 by Cogent Real-Time Systems, Inc. All rights reserved.