2025-10-07 11:02:38 +00:00
#!/usr/bin/env perl
# $Id$
my $ objs = "" ;
2025-10-07 14:20:45 +00:00
my $ decl = "" ;
my @ calls = ( ) ;
2025-10-07 15:10:46 +00:00
my % ints = ( ) ;
my % texts = ( ) ;
my % voids = ( ) ;
2025-10-07 14:20:45 +00:00
open ( IN , "<" , "include/Mw/StringDefs.h" ) ;
while ( my $ hl = <IN> ) {
$ hl =~ s/\r?\n$// ;
if ( $ hl =~ /^#define[ \t]+([^ ]+)[ \t]+"C(.+)"$/ ) {
my $ name = "On" . uc ( substr ( $ 2 , 0 , 1 ) ) . substr ( $ 2 , 1 ) ;
my @ c = ( $ 1 , $ name ) ;
$ decl = $ decl . " virtual void " . $ name . "(void*){};\n" ;
push ( @ calls , [ @ c ] ) ;
}
2025-10-07 15:10:46 +00:00
elsif ( $ hl =~ /^#define[ \t]+([^ ]+)[ \t]+"I(.+)"$/ ) {
$ ints { $ 1 } = uc ( substr ( $ 2 , 0 , 1 ) ) . substr ( $ 2 , 1 ) ;
}
elsif ( $ hl =~ /^#define[ \t]+([^ ]+)[ \t]+"S(.+)"$/ ) {
$ texts { $ 1 } = uc ( substr ( $ 2 , 0 , 1 ) ) . substr ( $ 2 , 1 ) ;
}
elsif ( $ hl =~ /^#define[ \t]+([^ ]+)[ \t]+"V(.+)"$/ ) {
$ voids { $ 1 } = uc ( substr ( $ 2 , 0 , 1 ) ) . substr ( $ 2 , 1 ) ;
}
2025-10-07 14:20:45 +00:00
}
2025-10-07 15:10:46 +00:00
close ( IN ) ;
2025-10-07 14:20:45 +00:00
2025-10-07 11:02:38 +00:00
opendir ( DIR , "include/Mw/Widget" ) ;
my @ files = readdir ( DIR ) ;
foreach my $ f ( @ files ) {
if ( $ f eq '.' || $ f eq '..' ) {
next ;
}
$ f =~ /^(.+)\.h$/ ;
2025-10-07 15:42:47 +00:00
my $ name = $ 1 ;
my @ props = ( ) ;
my @ methods = ( ) ;
my @ omethods = ( ) ;
2025-10-16 16:47:41 +00:00
my @ comments = ( ) ;
2025-10-07 15:42:47 +00:00
my @ names = ( ) ;
my @ args = ( ) ;
2025-10-07 15:10:46 +00:00
open ( IN , "include/Mw/Widget/$f" ) ;
while ( my $ l = <IN> ) {
$ l =~ s/\r?\n$//g ;
if ( $ l =~ /%prop[ \t]+(.+)$/ ) {
@ props = split ( /[ \t]+/ , $ 1 ) ;
}
2025-10-07 15:42:47 +00:00
elsif ( $ l =~
2025-10-16 16:47:41 +00:00
/^MWDECL[ \t]+(.+)[ \t]+Mw${name}([^ \t]+)[ \t]*\([^,\)]+(?:,(.*))?\);(?: \/\*(.+))?$/
2025-10-07 15:42:47 +00:00
)
{
my $ arg = $ 3 ;
my $ ret = $ 1 ;
my $ nam = $ 2 ;
2025-10-16 16:47:41 +00:00
my $ com = $ 4 ;
2025-10-07 15:42:47 +00:00
$ arg =~ s/^[ \t]+// ;
$ arg =~ s/[ \t]+$// ;
if ( ! $ arg ) {
$ arg = "void" ;
}
push ( @ methods , "$ret $nam($arg)" ) ;
push ( @ omethods , "$ret MwOO::${name}::$nam($arg)" ) ;
push ( @ names , $ nam ) ;
2025-10-16 16:47:41 +00:00
push ( @ comments , $ com ) ;
2025-10-07 15:42:47 +00:00
my @ al = split ( /[ \t]*,[ \t]*/ , $ arg ) ;
my $ i = 0 ;
foreach my $ dummy ( @ al ) {
$ al [ $ i ] =~ s/^.+[ \t]+([^ \t]+)$/\1/g ;
$ i + + ;
}
push ( @ args , join ( ", " , @ al ) ) ;
}
2025-10-07 15:10:46 +00:00
}
close ( IN ) ;
2025-10-07 11:02:38 +00:00
2025-10-08 17:34:14 +00:00
push ( @ props , "MwNbackground" ) ;
push ( @ props , "MwNforeground" ) ;
2025-10-07 11:02:38 +00:00
open ( OUT , ">" , "include/MwOO/Widget/$f" ) ;
print ( OUT "/* \$Id\$ */\n" ) ;
print ( OUT "#ifndef __MWOO_WIDGET_" . uc ( $ name ) . "_H__\n" ) ;
print ( OUT "#define __MWOO_WIDGET_" . uc ( $ name ) . "_H__\n" ) ;
print ( OUT "\n" ) ;
print ( OUT "#include <MwOO/Base.h>\n" ) ;
print ( OUT "\n" ) ;
2025-10-07 14:20:45 +00:00
print ( OUT "namespace MwOO {\n" ) ;
print ( OUT " class ${name} : public MwOO::Base {\n" ) ;
print ( OUT " public:\n" ) ;
2025-10-07 11:02:38 +00:00
print ( OUT
2025-10-07 14:20:45 +00:00
" ${name}(const char* widget_name, MwOO::Base* parent, int x, int y, int w, int h);\n"
2025-10-07 11:02:38 +00:00
) ;
2025-10-07 15:10:46 +00:00
2025-10-07 15:42:47 +00:00
foreach my $ m ( @ methods ) {
2025-10-11 14:33:56 +00:00
if ( $ m =~ /^MwWidget[ \t]+/ ) {
my $ l = $ m ;
$ l =~ s/^MwWidget([ \t]+)/MwOO::Base\1/g ;
print ( OUT " $l;\n" ) ;
}
else {
print ( OUT " $m;\n" ) ;
}
2025-10-07 15:42:47 +00:00
}
2025-10-07 15:10:46 +00:00
foreach my $ prop ( @ props ) {
my $ type = "" ;
my % hash = ( ) ;
if ( defined ( $ ints { $ prop } ) ) {
$ type = "int" ;
% hash = % ints ;
}
elsif ( defined ( $ texts { $ prop } ) ) {
$ type = "const char*" ;
% hash = % texts ;
}
elsif ( defined ( $ voids { $ prop } ) ) {
$ type = "void*" ;
% hash = % voids ;
}
if ( length ( $ type ) > 0 ) {
print ( OUT " void Set" . $ hash { $ prop } . "($type value);\n" ) ;
print ( OUT " $type Get" . $ hash { $ prop } . "(void);\n" ) ;
}
}
2025-10-07 14:20:45 +00:00
print ( OUT " };\n" ) ;
print ( OUT "}\n" ) ;
2025-10-07 11:02:38 +00:00
print ( OUT "\n" ) ;
print ( OUT "#endif\n" ) ;
close ( OUT ) ;
open ( OUT , ">" , "oosrc/widget/" . lc ( $ name ) . ".cc" ) ;
print ( OUT "/* \$Id\$ */\n" ) ;
print ( OUT "#include <MwOO/Widget/$name.h>\n" ) ;
print ( OUT "#include <Mw/Widget/$name.h>\n" ) ;
print ( OUT "\n" ) ;
print ( OUT
2025-10-07 14:20:45 +00:00
"MwOO::${name}::${name}(const char* widget_name, MwOO::Base* parent, int x, int y, int w, int h) : MwOO::Base(Mw${name}Class, widget_name, parent, x, y, w, h){\n"
2025-10-07 11:02:38 +00:00
) ;
print ( OUT "}\n" ) ;
2025-10-07 15:10:46 +00:00
print ( OUT "\n" ) ;
2025-10-07 15:42:47 +00:00
my $ i = 0 ;
foreach my $ m ( @ omethods ) {
2025-10-16 16:47:41 +00:00
my $ end = "" ;
my $ suffix = "" ;
2025-10-11 14:33:56 +00:00
if ( $ m =~ /^MwWidget[ \t]+/ ) {
my $ l = $ m ;
$ l =~ s/^MwWidget([ \t]+)/MwOO::Base\1/ ;
print ( OUT "$l\{\n" ) ;
}
else {
print ( OUT "$m\{\n" ) ;
}
2025-10-16 16:47:41 +00:00
if ( $ args [ $ i ] =~ /\.\.\./ ) {
print ( OUT " va_list va;\n" ) ;
}
if ( ! ( $ m =~ /^void[ \t]+/ ) ) {
my $ rettype = $ m ;
$ rettype =~ s/^MwWidget([ \t]+)/MwOO::Base\1/ ;
$ rettype =~ s/ MwOO::.+\)$// ;
print ( OUT " $rettype ret;\n" ) ;
}
if ( $ args [ $ i ] =~ /\.\.\./ ) {
my $ p = $ comments [ $ i ] ;
$ p =~ /VA_HINT:([^ ]+)/ ;
print ( OUT " va_start(va, $1);\n" ) ;
$ suffix = "Va" ;
}
2025-10-07 15:42:47 +00:00
if ( $ m =~ /^void[ \t]+/ ) {
2025-10-16 16:47:41 +00:00
print ( OUT " Mw${name}$suffix" . $ names [ $ i ] ) ;
2025-10-07 15:42:47 +00:00
}
2025-10-11 14:33:56 +00:00
elsif ( $ m =~ /^MwWidget[ \t]+/ ) {
2025-10-16 16:47:41 +00:00
print ( OUT " ret = MwOO::Base(Mw${name}$suffix" . $ names [ $ i ] ) ;
2025-10-11 14:33:56 +00:00
$ end = ")" ;
}
2025-10-07 15:42:47 +00:00
else {
2025-10-16 16:47:41 +00:00
print ( OUT " ret = Mw${name}$suffix" . $ names [ $ i ] ) ;
2025-10-07 15:42:47 +00:00
}
if ( $ args [ $ i ] eq "void" ) {
2025-10-11 14:33:56 +00:00
print ( OUT "(this->widget)$end;\n" ) ;
2025-10-07 15:42:47 +00:00
}
else {
2025-10-16 16:47:41 +00:00
my $ p = $ args [ $ i ] ;
$ p =~ s/\.\.\./va/ ;
print ( OUT "(this->widget, " . $ p . ")$end;\n" ) ;
}
if ( $ args [ $ i ] =~ /\.\.\./ ) {
print ( OUT " va_end(va);\n" ) ;
}
if ( ! ( $ m =~ /^void[ \t]+/ ) ) {
print ( OUT " return ret;\n" ) ;
2025-10-07 15:42:47 +00:00
}
2025-10-16 16:47:41 +00:00
print ( OUT "}\n\n" ) ;
2025-10-07 15:42:47 +00:00
$ i + + ;
}
2025-10-07 15:10:46 +00:00
foreach my $ prop ( @ props ) {
my $ type = "" ;
my $ typename = "" ;
my % hash = ( ) ;
if ( defined ( $ ints { $ prop } ) ) {
$ type = "int" ;
$ typename = "Integer" ;
% hash = % ints ;
}
elsif ( defined ( $ texts { $ prop } ) ) {
$ type = "const char*" ;
$ typename = "Text" ;
% hash = % texts ;
}
elsif ( defined ( $ voids { $ prop } ) ) {
$ type = "void*" ;
$ typename = "Void" ;
% hash = % voids ;
}
if ( length ( $ type ) > 0 ) {
print ( OUT "void MwOO::${name}::Set"
. $ hash { $ prop }
. "($type value){\n" ) ;
print ( OUT " MwSet$typename(this->widget, $prop, value);\n" ) ;
print ( OUT "}\n" ) ;
print ( OUT "\n" ) ;
print ( OUT "$type MwOO::${name}::Get" . $ hash { $ prop } . "(void){\n" ) ;
print ( OUT " return MwGet$typename(this->widget, $prop);\n" ) ;
print ( OUT "}\n" ) ;
print ( OUT "\n" ) ;
}
}
2025-10-07 11:02:38 +00:00
close ( OUT ) ;
if ( ! ( $ name eq 'Vulkan' || $ name eq 'OpenGL' ) ) {
$ objs = $ objs . " oosrc/widget/" . lc ( $ name ) . ".o" ;
}
}
closedir ( DIR ) ;
open ( OUT , ">" , "oosrc/deps.mk" ) ;
print ( OUT "# \$Id\$\n" ) ;
print ( OUT "OOL_OBJS +=$objs\n" ) ;
close ( OUT ) ;
2025-10-07 14:20:45 +00:00
my $ base_h = "" ;
my $ skip = 0 ;
open ( IN , "<" , "include/MwOO/Base.h" ) ;
while ( my $ l = <IN> ) {
$ l =~ s/\r?\n$// ;
if ( $ l =~ /BEGIN AUTOGENERATE/ ) {
$ base_h = $ base_h . "/* BEGIN AUTOGENERATE */\n" ;
$ skip = 1 ;
$ base_h = $ base_h . $ decl . "\n" ;
}
elsif ( $ l =~ /END AUTOGENERATE/ ) {
$ base_h = $ base_h . "/* END AUTOGENERATE */\n" ;
$ skip = 0 ;
}
elsif ( ! $ skip ) {
$ base_h = $ base_h . $ l . "\n" ;
}
}
close ( IN ) ;
open ( OUT , ">" , "include/MwOO/Base.h" ) ;
print ( OUT "$base_h" ) ;
close ( OUT ) ;
my $ base_c = "" ;
my $ skip = 0 ;
open ( IN , "<" , "oosrc/base.cc" ) ;
while ( my $ l = <IN> ) {
$ l =~ s/\r?\n$// ;
if ( $ l =~ /BEGIN AUTOGENERATE/ ) {
$ base_c = $ base_c . "/* BEGIN AUTOGENERATE */\n" ;
$ skip = 1 ;
foreach my $ call ( @ calls ) {
my @ c = @ { $ call } ;
$ base_c =
$ base_c
. "static void __"
. $ c [ 1 ]
. "(MwWidget widget, void* user, void* call){\n" ;
$ base_c = $ base_c . " MwOO::Base* c = (MwOO::Base*)user;\n" ;
2025-10-12 10:43:15 +00:00
$ base_c = $ base_c . " (void)widget;" ;
2025-10-07 14:20:45 +00:00
$ base_c = $ base_c . " c->" . $ c [ 1 ] . "(call);\n" ;
$ base_c = $ base_c . "}\n" ;
}
$ base_c = $ base_c . "\n" ;
$ base_c = $ base_c . "void MwOO::Base::SetHandler(void){\n" ;
foreach my $ call ( @ calls ) {
my @ c = @ { $ call } ;
$ base_c =
$ base_c
. " MwAddUserHandler(this->widget, "
. $ c [ 0 ] . ", __"
. $ c [ 1 ]
. ", this);\n" ;
}
$ base_c = $ base_c . "}\n" ;
}
elsif ( $ l =~ /END AUTOGENERATE/ ) {
$ base_c = $ base_c . "/* END AUTOGENERATE */\n" ;
$ skip = 0 ;
}
elsif ( ! $ skip ) {
$ base_c = $ base_c . $ l . "\n" ;
}
}
close ( IN ) ;
open ( OUT , ">" , "oosrc/base.cc" ) ;
print ( OUT "$base_c" ) ;
close ( OUT ) ;