2005-08-02 06:10:31 +00:00
#!/usr/bin/perl
2005-08-02 17:02:25 +00:00
#
# Create ejs interfaces for structures in a C header file
#
2005-08-02 06:10:31 +00:00
2005-08-02 17:02:25 +00:00
use File::Basename ;
my $ file = shift ;
my $ basename = basename ( $ file , ".h" ) ;
2005-08-02 06:10:31 +00:00
require smb_interfaces ;
2005-08-02 17:02:25 +00:00
my $ parser = new smb_interfaces ;
$ header = $ parser - > parse ( $ file ) ;
2005-08-02 06:10:31 +00:00
2005-08-02 18:56:18 +00:00
use Data::Dumper ;
2005-08-02 17:02:25 +00:00
#print Dumper($header);
# Create header
open ( FILE , ">ejs_${basename}.h" ) ;
print FILE "/* header auto-generated by build_smb_interfaces.pl */\n\n" ;
print FILE "#ifndef _ejs_${basename}_h\n" ;
print FILE "#define _ejs_${basename}_h\n\n" ;
2005-08-02 18:56:18 +00:00
sub struct_name ($)
{
my $ obj = shift ;
return defined ( $ obj - > { STRUCT_NAME } ) ? $ obj - > { STRUCT_NAME } : $ obj - > { UNION_NAME } ;
}
sub prototypes_for ($)
{
my $ obj = shift ;
my $ name = struct_name ( $ obj ) ;
print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n" ;
print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n" ;
}
sub pushpull_for ($)
{
my $ obj = shift ;
my $ name = struct_name ( $ obj ) ;
print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n" ;
print FILE "{\n" ;
print FILE "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, name));\n" ;
print FILE "\n\treturn NT_STATUS_OK;\n" ;
print FILE "}\n\n" ;
print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n" ;
print FILE "{\n" ;
print FILE "\treturn NT_STATUS_OK;\n" ;
print FILE "}\n\n" ;
}
2005-08-02 17:02:25 +00:00
foreach my $ x ( @ { $ header } ) {
2005-08-02 18:56:18 +00:00
# Prototypes for top level structures and unions
prototypes_for ( $ x ) ;
# Prototypes for non-anonymous nested structures and unions
foreach my $ e1 ( @ { $ x - > { DATA } } ) {
foreach my $ e2 ( @ { $ e1 - > { DATA } } ) {
if ( defined ( $ e2 - > { STRUCT_NAME } ) or defined ( $ e2 - > { UNION_NAME } ) ) {
prototypes_for ( $ e2 ) ;
}
}
}
2005-08-02 17:02:25 +00:00
}
print FILE "#endif\n" ;
close ( FILE ) ;
# Create file
open ( FILE , ">ejs_${basename}.c" ) ;
print FILE "/* EJS wrapper functions auto-generated by build_smb_interfaces.pl */\n\n" ;
# Top level functions
foreach my $ x ( @ { $ header } ) {
2005-08-02 18:56:18 +00:00
pushpull_for ( $ x ) ;
2005-08-02 17:02:25 +00:00
}
close ( FILE ) ;