6e3519 | 2005-08-20 | Martin Nilsson | |
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();
|
9f73e3 | 2005-12-18 | Marcus Comstedt | | cls->create_init_exit();
|
6e3519 | 2005-08-20 | Martin Nilsson | |
current_data += "#define EXTPRG extern\n"+sfhead;
|
4ca982 | 2006-01-02 | Marcus Comstedt | |
if(cls->mixin_for)
current_data += "#define CLASS_TYPE MIXIN\n";
|
6e3519 | 2005-08-20 | Martin Nilsson | | if( sizeof( cls->pre ) )
current_data += COMPOSE( cls->pre );
void output_thing( object thing )
{
|
08a19f | 2005-10-06 | Henrik Grubbström (Grubba) | | if( mixed err=catch( current_data += thing->c_definition() ) )
|
6e3519 | 2005-08-20 | Martin Nilsson | | 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 ] );
write_file( dir + filename( cls ), current_data );
files += ({ filename( cls ) });
}
string protos = "";
static void build_protos( Class cls, int lvl )
{
if( cls->name != "global" )
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | protos+=(" "*lvl)+"EXTPRG struct program *"+glue_c_name(cls->c_name())+"_program;\n";
|
6e3519 | 2005-08-20 | Martin Nilsson | | 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" )
{
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | exitfun += " free_program( "+glue_c_name(cls->c_name())+"_program );\n";
|
4ca982 | 2006-01-02 | Marcus Comstedt | | if( !cls->mixin_for )
type_switch =
"#ifdef "+cls->c_type_define()+"\n"
" if(PGTK_CHECK_TYPE(widget, "+cls->c_type_define()+"))\n"
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | " return "+glue_c_name(cls->c_name())+"_program;\n"
|
4ca982 | 2006-01-02 | Marcus Comstedt | | "#endif\n"+type_switch;
|
6e3519 | 2005-08-20 | Martin Nilsson | | }
res = "static void _"+init_n+"()\n{\n";
if( cls->name != "_global" )
{
res +=
" start_new_program(); /* "+cls->name+" */\n";
|
4ca982 | 2006-01-02 | Marcus Comstedt | | if( sizeof(cls->inherits) )
foreach( cls->inherits, Class c )
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | res += " low_inherit( "+glue_c_name(c->c_name())+
|
4ca982 | 2006-01-02 | Marcus Comstedt | | "_program,0,0,0,0,0);\n";
|
6e3519 | 2005-08-20 | Martin Nilsson | | else
{
|
4ca982 | 2006-01-02 | Marcus Comstedt | | res += " ADD_STORAGE(struct "+
(cls->mixin_for? "mixin_wrapper":"object_wrapper")+
");\n";
|
6e3519 | 2005-08-20 | Martin Nilsson | | }
}
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" )
{
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | res += (" "+glue_c_name(cls->c_name())+"_program = end_program();\n"
" "+glue_c_name(cls->c_name())+"_program->id = "+cls->class_id()+";\n");
|
6e3519 | 2005-08-20 | Martin Nilsson | | res += (" add_program_constant("+S(cls->pike_name(),1,0,26)+",\n"
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | " "+glue_c_name(cls->c_name())+"_program, 0);\n");
|
6e3519 | 2005-08-20 | Martin Nilsson | |
}
res += "}\n\n";
toplevel += res;
|
9f73e3 | 2005-12-18 | Marcus Comstedt | |
if( cls->name == "_global" )
{
if(sizeof(cls->init))
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | initfun += " pgtk2__init();\n";
|
9f73e3 | 2005-12-18 | Marcus Comstedt | | if(sizeof(cls->exit))
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | exitfun += " pgtk2__exit();\n";
|
9f73e3 | 2005-12-18 | Marcus Comstedt | | }
|
6e3519 | 2005-08-20 | Martin Nilsson | | } )
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,
|
2d4932 | 2006-01-07 | Martin Nilsson | | array(Node) global_code,
|
d1bf15 | 2006-01-14 | Martin Nilsson | | mapping(string:int) strings)
|
6e3519 | 2005-08-20 | Martin Nilsson | | {
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 );
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();
|
2d4932 | 2006-01-07 | Martin Nilsson | |
|
d1bf15 | 2006-01-14 | Martin Nilsson | | if(sizeof(strings))
|
2d4932 | 2006-01-07 | Martin Nilsson | | {
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | pre += "struct pike_string * pgtk2_pstr_vector["+sizeof(strings)+"];\n\n";
|
d1bf15 | 2006-01-14 | Martin Nilsson | | foreach( strings; string str; int idx )
{
initfun += sprintf("\n /* %O */\n", str);
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | initfun += " pgtk2_pstr_vector[" + idx + "] = make_shared_binary_string(" +
|
d1bf15 | 2006-01-14 | Martin Nilsson | | S(str,0,2) + "," + sizeof(str) + ");\n";
}
exitfun += #"
{
int i;
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | for( i=0; i<NELEM(pgtk2_pstr_vector); i++ )
free_string( pgtk2_pstr_vector[i] );
|
d1bf15 | 2006-01-14 | Martin Nilsson | | }
";
|
2d4932 | 2006-01-07 | Martin Nilsson | | }
|
6e3519 | 2005-08-20 | Martin Nilsson | | 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"
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | "struct program *pgtk2_type_to_program(GObject *widget)\n"
|
6e3519 | 2005-08-20 | Martin Nilsson | | "{\n"
|
7d6945 | 2008-01-21 | Henrik Grubbström (Grubba) | | " if (!widget) return NULL;\n"
|
6e3519 | 2005-08-20 | Martin Nilsson | | +type_switch+
|
ba9e80 | 2006-02-27 | Martin Stjernholm | | " return pg2_object_program;\n}\n\n" );
|
6e3519 | 2005-08-20 | Martin Nilsson | |
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;})|
|
350a49 | 2006-01-03 | Marcus Comstedt | | ({ __FILE__, combine_path( __FILE__, "../../build_pgtk.pike" )}),
|
6e3519 | 2005-08-20 | Martin Nilsson | | string f )
{
Stdio.Stat s;
|
985fe2 | 2005-08-24 | Martin Nilsson | | if( !(s = file_stat( f ) ) ) {
|
6e3519 | 2005-08-20 | Martin Nilsson | | werror("Failed to stat "+f+"\n");
|
985fe2 | 2005-08-24 | Martin Nilsson | | return 0;
}
|
6e3519 | 2005-08-20 | Martin Nilsson | | if( s->mtime > last_time )
return 0;
}
return 1;
}
void create( string _s, string _d, object p )
{
sdir = _s;
dir = _d;
parent = p;
}
|