mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
parent
82037a75ea
commit
7acc0e77a6
@ -21,6 +21,7 @@ idl:
|
|||||||
| idl import { push(@{$_[1]}, $_[2]); $_[1] }
|
| idl import { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
| idl include { push(@{$_[1]}, $_[2]); $_[1] }
|
| idl include { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
| idl importlib { push(@{$_[1]}, $_[2]); $_[1] }
|
| idl importlib { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
|
| idl cpp_quote { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
;
|
;
|
||||||
|
|
||||||
import: 'import' commalist ';' {{
|
import: 'import' commalist ';' {{
|
||||||
@ -77,6 +78,15 @@ interface: property_list 'interface' identifier '{' definitions '}' optional_sem
|
|||||||
}}
|
}}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
cpp_quote: 'cpp_quote' '(' text ')'
|
||||||
|
{{
|
||||||
|
"TYPE" => "CPP_QUOTE",
|
||||||
|
"FILE" => $_[0]->YYData->{FILE},
|
||||||
|
"LINE" => $_[0]->YYData->{LINE},
|
||||||
|
"DATA" => $_[3]
|
||||||
|
}}
|
||||||
|
;
|
||||||
|
|
||||||
definitions:
|
definitions:
|
||||||
definition { [ $_[1] ] }
|
definition { [ $_[1] ] }
|
||||||
| definitions definition { push(@{$_[1]}, $_[2]); $_[1] }
|
| definitions definition { push(@{$_[1]}, $_[2]); $_[1] }
|
||||||
@ -466,7 +476,7 @@ again:
|
|||||||
if (s/^([\w_]+)//) {
|
if (s/^([\w_]+)//) {
|
||||||
$parser->YYData->{LAST_TOKEN} = $1;
|
$parser->YYData->{LAST_TOKEN} = $1;
|
||||||
if ($1 =~
|
if ($1 =~
|
||||||
/^(coclass|interface|const|typedef|declare|union
|
/^(coclass|interface|const|typedef|declare|union|cpp_quote
|
||||||
|struct|enum|bitmap|void|unsigned|signed|import|include
|
|struct|enum|bitmap|void|unsigned|signed|import|include
|
||||||
|importlib)$/x) {
|
|importlib)$/x) {
|
||||||
return $1;
|
return $1;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -715,6 +715,7 @@ sub Parse($)
|
|||||||
my @ndr = ();
|
my @ndr = ();
|
||||||
|
|
||||||
foreach (@{$idl}) {
|
foreach (@{$idl}) {
|
||||||
|
($_->{TYPE} eq "CPP_QUOTE") && push(@ndr, $_);
|
||||||
($_->{TYPE} eq "INTERFACE") && push(@ndr, ParseInterface($_));
|
($_->{TYPE} eq "INTERFACE") && push(@ndr, ParseInterface($_));
|
||||||
($_->{TYPE} eq "IMPORT") && push(@ndr, $_);
|
($_->{TYPE} eq "IMPORT") && push(@ndr, $_);
|
||||||
}
|
}
|
||||||
|
@ -371,6 +371,13 @@ sub HeaderInterface($)
|
|||||||
pidl "#endif /* _HEADER_$interface->{NAME} */\n";
|
pidl "#endif /* _HEADER_$interface->{NAME} */\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub HeaderQuote($)
|
||||||
|
{
|
||||||
|
my($quote) = shift;
|
||||||
|
|
||||||
|
pidl $quote->{DATA};
|
||||||
|
}
|
||||||
|
|
||||||
#####################################################################
|
#####################################################################
|
||||||
# parse a parsed IDL into a C header
|
# parse a parsed IDL into a C header
|
||||||
sub Parse($)
|
sub Parse($)
|
||||||
@ -388,6 +395,7 @@ sub Parse($)
|
|||||||
pidl "\n";
|
pidl "\n";
|
||||||
|
|
||||||
foreach (@{$ndr}) {
|
foreach (@{$ndr}) {
|
||||||
|
($_->{TYPE} eq "CPP_QUOTE") && HeaderQuote($_);
|
||||||
($_->{TYPE} eq "INTERFACE") && HeaderInterface($_);
|
($_->{TYPE} eq "INTERFACE") && HeaderInterface($_);
|
||||||
($_->{TYPE} eq "IMPORT") && HeaderImport(@{$_->{PATHS}});
|
($_->{TYPE} eq "IMPORT") && HeaderImport(@{$_->{PATHS}});
|
||||||
($_->{TYPE} eq "INCLUDE") && HeaderInclude(@{$_->{PATHS}});
|
($_->{TYPE} eq "INCLUDE") && HeaderInclude(@{$_->{PATHS}});
|
||||||
|
@ -273,7 +273,7 @@ Datagram support (ncadg_*)
|
|||||||
in, out, ref, length_is, switch_is, size_is, uuid, case, default, string,
|
in, out, ref, length_is, switch_is, size_is, uuid, case, default, string,
|
||||||
unique, ptr, pointer_default, v1_enum, object, helpstring, range, local,
|
unique, ptr, pointer_default, v1_enum, object, helpstring, range, local,
|
||||||
call_as, endpoint, switch_type, progid, coclass, iid_is, represent_as,
|
call_as, endpoint, switch_type, progid, coclass, iid_is, represent_as,
|
||||||
transmit_as, import, include.
|
transmit_as, import, include, cpp_quote.
|
||||||
|
|
||||||
=head2 PIDL Specific properties
|
=head2 PIDL Specific properties
|
||||||
|
|
||||||
@ -347,7 +347,7 @@ to the host format. Commonly used values are UCS2, DOS and UTF8.
|
|||||||
|
|
||||||
=head2 Unsupported MIDL properties or statements
|
=head2 Unsupported MIDL properties or statements
|
||||||
|
|
||||||
aggregatable, appobject, async_uuid, bindable, control, cpp_quote,
|
aggregatable, appobject, async_uuid, bindable, control,
|
||||||
defaultbind, defaultcollelem, defaultvalue, defaultvtable, dispinterface,
|
defaultbind, defaultcollelem, defaultvalue, defaultvtable, dispinterface,
|
||||||
displaybind, dual, entry, first_is, helpcontext, helpfile, helpstringcontext,
|
displaybind, dual, entry, first_is, helpcontext, helpfile, helpstringcontext,
|
||||||
helpstringdll, hidden, idl_module, idl_quote, id, immediatebind, importlib,
|
helpstringdll, hidden, idl_module, idl_quote, id, immediatebind, importlib,
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
use Test::More tests => 15;
|
use Test::More tests => 16;
|
||||||
use FindBin qw($RealBin);
|
use FindBin qw($RealBin);
|
||||||
use lib "$RealBin";
|
use lib "$RealBin";
|
||||||
use Util;
|
use Util;
|
||||||
@ -53,3 +53,6 @@ like(parse_idl("interface p { struct x; };"),
|
|||||||
|
|
||||||
like(parse_idl("interface p { typedef struct x { int p; } x; };"),
|
like(parse_idl("interface p { typedef struct x { int p; } x; };"),
|
||||||
qr/struct x.*{.*int32_t p;.*};/sm, "double struct declaration");
|
qr/struct x.*{.*int32_t p;.*};/sm, "double struct declaration");
|
||||||
|
|
||||||
|
like(parse_idl("cpp_quote(\"some-foo\")"),
|
||||||
|
qr/some-foo/sm, "cpp quote");
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
# Published under the GNU General Public License
|
# Published under the GNU General Public License
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Test::More tests => 64 * 2 + 2;
|
use Test::More tests => 65 * 2 + 3;
|
||||||
use FindBin qw($RealBin);
|
use FindBin qw($RealBin);
|
||||||
use lib "$RealBin";
|
use lib "$RealBin";
|
||||||
use Util qw(test_errors);
|
use Util qw(test_errors);
|
||||||
@ -109,6 +109,7 @@ testok "import-multiple", "import \"foo.idl\", \"bar.idl\";";
|
|||||||
testok "include-multiple", "include \"foo.idl\", \"bar.idl\";";
|
testok "include-multiple", "include \"foo.idl\", \"bar.idl\";";
|
||||||
testok "empty-struct", "interface test { struct foo { }; }";
|
testok "empty-struct", "interface test { struct foo { }; }";
|
||||||
testok "typedef-double", "interface test { typedef struct foo { } foo; }";
|
testok "typedef-double", "interface test { typedef struct foo { } foo; }";
|
||||||
|
testok "cpp-quote", "cpp_quote(\"bla\")";
|
||||||
|
|
||||||
my $x = Parse::Pidl::IDL::parse_string("interface foo { struct x {}; }", "<foo>");
|
my $x = Parse::Pidl::IDL::parse_string("interface foo { struct x {}; }", "<foo>");
|
||||||
|
|
||||||
@ -122,3 +123,10 @@ is_deeply($x,
|
|||||||
[ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [
|
[ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [
|
||||||
{ 'NAME' => 'x', 'TYPE' => 'STRUCT' } ],
|
{ 'NAME' => 'x', 'TYPE' => 'STRUCT' } ],
|
||||||
'TYPE' => 'INTERFACE', 'LINE' => 0 } ]);
|
'TYPE' => 'INTERFACE', 'LINE' => 0 } ]);
|
||||||
|
|
||||||
|
$x = Parse::Pidl::IDL::parse_string("cpp_quote(\"foobar\")", "<quote>");
|
||||||
|
is_deeply($x,
|
||||||
|
[ { 'FILE' => '<quote>', 'DATA' => '"foobar"',
|
||||||
|
'TYPE' => 'CPP_QUOTE', 'LINE' => 0 } ]);
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user