eparser and pidl

Jelmer Vernooij jelmer at samba.org
Wed Feb 16 21:50:19 GMT 2005

Hi Tridge,

On Wed, Feb 16, 2005 at 04:40:15PM +1100, Andrew Tridgell wrote about 'eparser and pidl':
> I like the pidl restructuring you are doing as it makes the code much
> cleaner, but I thought I should mention that your changes have broken
> the pidl ethereal plugin generator. 

> I can see two obvious ways to fix this:

> 1) fix eparser.pm to use the new function names from ndr.pm

I've just fixed it this (1) way. 

> 2) change eparser.pm to not use the "rewrite using regex" technique

> One approach might be to change ndr.pm to generate code that uses
> substitution templates to set things up for the right type of output.

> For example we could have ndr_ethereal.tpl and ndr_samba.tpl as two
> template files, which would contain things like this:

> my $tmpl_hf_declare = "static int hf_%{NAME} = -1;\n"

> Then ndr.pm would load the template, and do this:

>   template_set("PIPE" => "lsa");
>   template_set("NAME" => $thename);
>   pidl $hf_declare_tmpl

> where the pidl function would be changed to always take a template. If
> the template is empty (as it would be in ndr_samba.tpl in the above
> example) then it does nothing. If it is non-empty then it does the
> hash substitution and outputs the result;

> The templating itself is pretty easy - there are plenty of perl
> template systems around, or writing a new one is just a few lines of
> code.

> A slightly less trivial template might be:

> my $tmpl_rqst = "
> int %{PIPE}_%{FUNCTION}_rqst(tvbuff_t *tvb, int offset, 
>                              packet_info *pinfo, proto_tree *tree, guint8 *drep)
> {
>         struct pidl_pull *ndr = pidl_pull_init(tvb, offset, pinfo, drep);
>         struct %{PIPE}_%{FUNCTION} *r = talloc_p(NULL, struct %{PIPE}_%{FUNCTION});
>         pidl_tree ptree;
>         ptree.proto_tree = tree;
>         ptree.subtree_list = NULL;
>         ndr_pull_%{PIPE}_%{FUNCTION}(ndr, NDR_IN, &ptree, r);
>         return ndr->offset;
> }
> ";

> which would generate all the _rqst() functions needed by ethereal.

> Obviously we will need to break many functions up into separate
> parts.
I like the idea of moving the lumps of C code out of the current perl files. I'll keep working on 
ndr.pm's internals and multi level pointers first. 

I have attached a first "draft" of the 
multi-level-pointers patch to this email, for those interested. It's quite simple and
generates exactly the same code for 1-level pointers as pidl did
before. The only issue at the moment is the fact that it crashes on
2-level pointers ;-) 



Jelmer Vernooij <jelmer at samba.org> - http://jelmer.vernstok.nl/ - ctrlsoft at jabber.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://lists.samba.org/archive/samba-technical/attachments/20050216/1348f00f/attachment.bin

More information about the samba-technical mailing list