| # | |
| # Copyright 1999, 2000, 2001 Patrik Stridvall | |
| # | |
| # This library is free software; you can redistribute it and/or | |
| # modify it under the terms of the GNU Lesser General Public | |
| # License as published by the Free Software Foundation; either | |
| # version 2.1 of the License, or (at your option) any later version. | |
| # | |
| # This library is distributed in the hope that it will be useful, | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| # Lesser General Public License for more details. | |
| # | |
| # You should have received a copy of the GNU Lesser General Public | |
| # License along with this library; if not, write to the Free Software | |
| # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| # | |
| package winapi_c_parser; | |
| use strict; | |
| use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); | |
| require Exporter; | |
| @ISA = qw(Exporter); | |
| @EXPORT = qw(); | |
| @EXPORT_OK = qw(); | |
| use options qw($options); | |
| use output qw($output); | |
| use c_function; | |
| use c_type; | |
| use function; | |
| use winapi_function; | |
| use winapi_parser; | |
| ######################################################################## | |
| # new | |
| # | |
| sub new($$) { | |
| my $proto = shift; | |
| my $class = ref($proto) || $proto; | |
| my $self = {}; | |
| bless ($self, $class); | |
| my $file = \${$self->{FILE}}; | |
| my $create_function = \${$self->{CREATE_FUNCTION}}; | |
| my $create_type = \${$self->{CREATE_TYPE}}; | |
| my $found_comment = \${$self->{FOUND_COMMENT}}; | |
| my $found_declaration = \${$self->{FOUND_DECLARATION}}; | |
| my $found_function = \${$self->{FOUND_FUNCTION}}; | |
| my $found_function_call = \${$self->{FOUND_FUNCTION_CALL}}; | |
| my $found_line = \${$self->{FOUND_LINE}}; | |
| my $found_preprocessor = \${$self->{FOUND_PREPROCESSOR}}; | |
| my $found_statement = \${$self->{FOUND_STATEMENT}}; | |
| my $found_type = \${$self->{FOUND_TYPE}}; | |
| my $found_variable = \${$self->{FOUND_VARIABLE}}; | |
| $$file = shift; | |
| $$create_function = sub { return new c_function; }; | |
| $$create_type = sub { return new c_type; }; | |
| $$found_comment = sub { return 1; }; | |
| $$found_declaration = sub { return 1; }; | |
| $$found_function = sub { return 1; }; | |
| $$found_function_call = sub { return 1; }; | |
| $$found_line = sub { return 1; }; | |
| $$found_preprocessor = sub { return 1; }; | |
| $$found_statement = sub { return 1; }; | |
| $$found_type = sub { return 1; }; | |
| $$found_variable = sub { return 1; }; | |
| return $self; | |
| } | |
| ######################################################################## | |
| # set_found_comment_callback | |
| # | |
| sub set_found_comment_callback($$) { | |
| my $self = shift; | |
| my $found_comment = \${$self->{FOUND_COMMENT}}; | |
| $$found_comment = shift; | |
| } | |
| ######################################################################## | |
| # set_found_declaration_callback | |
| # | |
| sub set_found_declaration_callback($$) { | |
| my $self = shift; | |
| my $found_declaration = \${$self->{FOUND_DECLARATION}}; | |
| $$found_declaration = shift; | |
| } | |
| ######################################################################## | |
| # set_found_function_callback | |
| # | |
| sub set_found_function_callback($$) { | |
| my $self = shift; | |
| my $found_function = \${$self->{FOUND_FUNCTION}}; | |
| $$found_function = shift; | |
| } | |
| ######################################################################## | |
| # set_found_function_call_callback | |
| # | |
| sub set_found_function_call_callback($$) { | |
| my $self = shift; | |
| my $found_function_call = \${$self->{FOUND_FUNCTION_CALL}}; | |
| $$found_function_call = shift; | |
| } | |
| ######################################################################## | |
| # set_found_line_callback | |
| # | |
| sub set_found_line_callback($$) { | |
| my $self = shift; | |
| my $found_line = \${$self->{FOUND_LINE}}; | |
| $$found_line = shift; | |
| } | |
| ######################################################################## | |
| # set_found_preprocessor_callback | |
| # | |
| sub set_found_preprocessor_callback($$) { | |
| my $self = shift; | |
| my $found_preprocessor = \${$self->{FOUND_PREPROCESSOR}}; | |
| $$found_preprocessor = shift; | |
| } | |
| ######################################################################## | |
| # set_found_statement_callback | |
| # | |
| sub set_found_statement_callback($$) { | |
| my $self = shift; | |
| my $found_statement = \${$self->{FOUND_STATEMENT}}; | |
| $$found_statement = shift; | |
| } | |
| ######################################################################## | |
| # set_found_type_callback | |
| # | |
| sub set_found_type_callback($$) { | |
| my $self = shift; | |
| my $found_type = \${$self->{FOUND_TYPE}}; | |
| $$found_type = shift; | |
| } | |
| ######################################################################## | |
| # set_found_variable_callback | |
| # | |
| sub set_found_variable_callback($$) { | |
| my $self = shift; | |
| my $found_variable = \${$self->{FOUND_VARIABLE}}; | |
| $$found_variable = shift; | |
| } | |
| ######################################################################## | |
| # parse_c_file | |
| sub parse_c_file($$$$) { | |
| my $self = shift; | |
| my $file = \${$self->{FILE}}; | |
| my $found_comment = \${$self->{FOUND_COMMENT}}; | |
| my $found_declaration = \${$self->{FOUND_DECLARATION}}; | |
| my $create_function = \${$self->{CREATE_FUNCTION}}; | |
| my $found_function = \${$self->{FOUND_FUNCTION}}; | |
| my $found_function_call = \${$self->{FOUND_FUNCTION_CALL}}; | |
| my $found_line = \${$self->{FOUND_LINE}}; | |
| my $found_preprocessor = \${$self->{FOUND_PREPROCESSOR}}; | |
| my $found_statement = \${$self->{FOUND_STATEMENT}}; | |
| my $found_variable = \${$self->{FOUND_VARIABLE}}; | |
| my $refcurrent = shift; | |
| my $refline = shift; | |
| my $refcolumn = shift; | |
| my $_create_function = sub { | |
| return 'function'->new; | |
| }; | |
| my $_create_type = sub { | |
| return 'type'->new; | |
| }; | |
| my $_found_function = sub { | |
| my $old_function = shift; | |
| my $function = new c_function; | |
| $function->file($old_function->file); | |
| $function->begin_line($old_function->function_line); | |
| $function->begin_column(0); | |
| $function->end_line($old_function->function_line); | |
| $function->end_column(0); | |
| $function->linkage($old_function->linkage); | |
| $function->return_type($old_function->return_type); | |
| $function->calling_convention($old_function->calling_convention); | |
| $function->name($old_function->internal_name); | |
| if(defined($old_function->argument_types)) { | |
| $function->argument_types([@{$old_function->argument_types}]); | |
| } | |
| if(defined($old_function->argument_names)) { | |
| $function->argument_names([@{$old_function->argument_names}]); | |
| } | |
| $function->statements_line($old_function->statements_line); | |
| $function->statements_column(0); | |
| $function->statements($old_function->statements); | |
| &$$found_function($function); | |
| }; | |
| my $_found_preprocessor = sub { | |
| my $directive = shift; | |
| my $argument = shift; | |
| my $begin_line = 0; | |
| my $begin_column = 0; | |
| my $preprocessor = "#$directive $argument"; | |
| &$$found_preprocessor($begin_line, $begin_column, $preprocessor); | |
| }; | |
| my $_found_type = sub { | |
| my $type = shift; | |
| }; | |
| winapi_parser::parse_c_file($$file, { | |
| # c_comment_found => $found_c_comment, | |
| # cplusplus_comment_found => $found_cplusplus_comment, | |
| function_create => $_create_function, | |
| function_found => $_found_function, | |
| preprocessor_found => $_found_preprocessor, | |
| type_create => $_create_type, | |
| type_found => $_found_type, | |
| }); | |
| } | |
| 1; |