# # 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;