pidl: add a base class for PIDL parsers
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Sat, 30 Nov 2019 02:22:16 +0000 (15:22 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 4 Dec 2019 05:10:31 +0000 (05:10 +0000)
There are about 5 object-oriented parsers, all with their own
effectively identical but differently spelt versions of pidl(),
pidl_hdr(), indent(), and deindent(). With this commit we add a base
class that they can all use.

The ultimate aim is to be able to add some debugging instrumentation
that benefits all[1] the parsers.

[1] The parsers (e.g. Samba::ServerNDR) which use global scope rather
than objects will not be affected.

The versions of the functions in this file follow the most
sophisticated versions of the soon-to-be subclasses. For example, the
pidl() function avoids spurious whitespace and puts #define at column
0, following the Python parser.

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
pidl/lib/Parse/Pidl/Base.pm [new file with mode: 0644]

diff --git a/pidl/lib/Parse/Pidl/Base.pm b/pidl/lib/Parse/Pidl/Base.pm
new file mode 100644 (file)
index 0000000..e89a48d
--- /dev/null
@@ -0,0 +1,46 @@
+# Superclass for IDL structure generators
+# GPL3
+
+package Parse::Pidl::Base;
+
+use strict;
+use warnings;
+
+use Parse::Pidl qw(fatal warning error);
+
+use vars qw($VERSION);
+$VERSION = '0.01';
+
+sub indent {
+       my $self = shift;
+       $self->{tabs} .= "\t";
+}
+
+sub deindent {
+       my $self = shift;
+       $self->{tabs} = substr($self->{tabs}, 1);
+}
+
+sub pidl {
+       my ($self, $txt) = @_;
+       if ($txt) {
+               if ($txt !~ /^#/) {
+                       $self->{res} .= $self->{tabs};
+               }
+               $self->{res} .= $txt;
+       }
+       $self->{res} .= "\n";
+}
+
+
+sub pidl_hdr {
+       my ($self, $txt) = @_;
+       $self->{res_hdr} .= "$txt\n";
+}
+
+
+sub pidl_both {
+       my ($self, $txt) = @_;
+       $self->{res} .= "$txt\n";
+       $self->{res_hdr} .= "$txt\n";
+}