pike.git
/
src
/
post_modules
/
GTK2
/
output
/
split.pike
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/post_modules/GTK2/output/split.pike:1:
+
// Output one file per class as C, more or less.
+
inherit "util";
+
string head = "", sfhead="", dir, sdir;
+
string debug = "";
+
object parent;
-
+
static string filename( Class c )
+
{
+
if( sizeof( c->c_name() ) )
+
return "p"+c->c_name()+".c";
+
return "pgtk_globals.c";
+
}
+
+
array files = ({});
+
static void output_class( Class cls, int lvl )
+
{
+
string current_data = "";
+
+
if( !cls->functions["_sprintf"] )
+
cls->create_default_sprintf();
+
+
/* Start output */
+
current_data += "#define EXTPRG extern\n"+sfhead;
+
if( sizeof( cls->pre ) )
+
current_data += COMPOSE( cls->pre );
+
void output_thing( object thing )
+
{
+
if( mixed err=catch( current_data += thing->c_defenition() ) )
+
werror(thing->file+":"+thing->line+": Error: "+
+
(stringp(err)?err:describe_backtrace(err))+"\n" );
+
};
+
+
foreach( sort( indices( cls->functions ) ), string fun )
+
output_thing( cls->functions[ fun ] );
+
+
foreach( sort( indices( cls->members ) ), string mem )
+
output_thing( cls->members[ mem ] );
+
+
// Processing done. Actually write the file.
+
write_file( dir + filename( cls ), current_data );
+
files += ({ filename( cls ) });
+
}
+
+
string protos = "";
+
+
static void build_protos( Class cls, int lvl )
+
{
+
if( cls->name != "global" )
+
protos+=(" "*lvl)+"EXTPRG struct program *p"+cls->c_name()+"_program;\n";
+
foreach( sort( indices( cls->functions ) ), string f )
+
protos += (" "*lvl)+ " extern "+cls->functions[ f ]->c_prototype();
+
foreach( sort( indices( cls->members ) ), string f )
+
protos += (" "*lvl)+ " extern "+cls->members[ f ]->c_prototype();
+
}
+
+
int init_n;
+
string initfun = "", exitfun="", type_switch="", toplevel ="";
+
static void build_pike_fadds( Class cls, int lvl )
+
{
+
string res = "";
+
init_n++;
+
+
if( mixed e = catch
+
{
+
void output_thing( mixed thing )
+
{
+
if( mixed err=catch( res += thing->pike_add() ) )
+
werror(thing->file+":"+thing->line+": Error: "+
+
(stringp(err)?err:describe_backtrace(err))+"\n" );
+
};
+
+
if( cls->name != "_global" )
+
{
+
exitfun += " free_program( p"+cls->c_name()+"_program );\n";
+
type_switch =
+
"#ifdef "+cls->c_type_define()+"\n"
+
" if(PGTK_CHECK_TYPE(widget, "+cls->c_type_define()+"))\n"
+
" return p"+cls->c_name()+"_program;\n"
+
"#endif\n"+type_switch;
+
}
+
res = "static void _"+init_n+"()\n{\n";
+
+
if( cls->name != "_global" )
+
{
+
res +=
+
" start_new_program(); /* "+cls->name+" */\n";
+
if( cls->inherits )
+
res += " low_inherit( p"+cls->inherits->c_name()+
+
"_program,0,0,0,0,0);\n";
+
else
+
{
+
res += " ADD_STORAGE(struct object_wrapper);\n";
+
res += " set_init_callback(pgtk_clear_obj_struct);\n";
+
}
+
}
+
+
foreach( sort( indices( cls->functions ) ), string f )
+
output_thing( cls->functions[ f ] );
+
foreach( sort( indices( cls->members ) ), string f )
+
output_thing( cls->members[ f ] );
+
if( cls->name != "_global" )
+
{
+
res += (" p"+cls->c_name()+"_program = end_program();\n"
+
" p"+cls->c_name()+"_program->id = "+cls->class_id()+";\n");
+
res += (" add_program_constant("+S(cls->pike_name(),1,0,26)+",\n"
+
" p"+cls->c_name()+"_program, 0);\n");
+
// predef::write("pike_name==%s\n",cls->pike_name());
+
/*
+
string str=S(cls->pike_name(),1,0,26);
+
predef::write("pike_name==%s\n",str);
+
array aaa=str/"\n";
+
string str1;
+
sscanf(aaa[1],"%*[ \t](%s)",str1);
+
predef::write("PSTR==%s\n",str1);
+
*/
+
}
+
res += "}\n\n";
+
toplevel += res;
+
} )
+
werror(cls->file+":"+cls->line+": Error: "+
+
(stringp(e)?e:describe_backtrace(e))+"\n" );
+
+
}
+
+
string make_initfun()
+
{
+
string res = "";
+
string line = "";
+
for( int i = 1; i<=init_n; i++ )
+
{
+
line += "_"+i+"(); ";
+
if( sizeof( line ) > 70 )
+
{
+
res += " "+line+"\n";
+
line = "";
+
}
+
}
+
if( sizeof(line) )
+
res += " "+line+"\n";
+
return res;
+
}
+
void post_class_build()
+
{
+
}
+
+
array(string) output( mapping(string:Class) classes,
+
mapping(string:Constant) constants,
+
array(Node) global_code )
+
{
+
head = Stdio.read_bytes( combine_path( sdir, "../pgtk.c.head" ) );
+
if(!head) error("Failed to load ../pgtk.c.head\n");
+
sfhead = replace( head, "PROTOTYPES", "#include \"prototypes.h\"" );
+
traverse_class_tree( classes, output_class );
+
post_class_build();
+
traverse_class_tree( classes, build_protos );
+
write_file( dir + "prototypes.h", protos );
+
write_file( dir + "time_stamp", (string)time() );
+
+
string pre = "#define EXTPRG\n"+sfhead+"\n", res = "";
+
+
pre += Parser.Pike.simple_reconstitute( global_code );
+
+
// This code is here to optimize the global string data.
+
// Basically, make sure that the constants/classes/functions etc.
+
// is added in reverse length order.
+
foreach( sort(indices(constants)), string c )
+
if( mixed e = catch( initfun += constants[c]->pike_add()) )
+
werror(constants[c]->file+":"+constants[c]->line+": Error: "+
+
(stringp(e)?e:describe_backtrace(e))+"\n" );
+
+
array q = ({});
+
foreach( classes;; object c )
+
q |= indices(c->functions) | indices(c->members);
+
q = Array.uniq2( sort(q) ); sort(map(q,sizeof),q);
+
foreach( reverse(q), string w ) S(w);
+
+
traverse_class_tree( classes, build_pike_fadds );
+
+
+
mapping done = ([]);
+
foreach( classes;; object c )
+
foreach( c->signals; string n; object s )
+
if( !done[n] )
+
done[n] = s;
+
+
q = sort(indices( done )); sort(map(q,sizeof),q);
+
foreach( reverse(q), string w ) S("s_"+w,1);
+
+
foreach( sort(indices( done )), string w )
+
initfun += done[w]->pike_add();
+
pre += get_string_data()+"\n\n";
+
files = ({ "pgtk.c" }) + files;
+
+
+
write_file( dir+"pgtk.c",
+
pre + toplevel +
+
"PIKE_MODULE_INIT {\n"+make_initfun()+initfun+"}\n\n"
+
"PIKE_MODULE_EXIT {\n"+exitfun+"}\n\n"
+
"struct program *pgtk_type_to_program(GObject *widget)\n"
+
"{\n"
+
+type_switch+
+
" return pg_object_program;\n}\n\n" );
+
+
return files;
+
}
+
+
int up_to_date( )
+
{
+
int last_time = (int)Stdio.read_bytes( dir+"time_stamp" );
+
if(!last_time )
+
return 0;
+
foreach( map(get_dir( sdir ), lambda(string s){return sdir+s;})|
+
({ __FILE__, combine_path( __FILE__, "../../new_build_pgtk.pike" )}),
+
string f )
+
{
+
Stdio.Stat s;
+
if( !(s = file_stat( f ) ) )
+
werror("Failed to stat "+f+"\n");
+
if( s->mtime > last_time )
+
return 0;
+
}
+
return 1;
+
}
+
+
+
void create( string _s, string _d, object p )
+
{
+
sdir = _s;
+
dir = _d;
+
parent = p;
+
}
+
Newline at end of file added.