#!/usr/bin/perl -w
use strict;
use ExtUtils::MakeMaker qw(prompt);
use File::Find;

my $just_check = @ARGV ? $ARGV[0] eq '-c' : 0;
shift if $just_check;
my $dir = shift || '.';
my %names;

my $prefix = 'apr_';

while (<DATA>) {
    chomp;
    my($old, $new) = grep { s/^$prefix//o } split;
    next unless $old and $new;
    $names{$old} = $new;
}

my $pattern = join '|', keys %names;
#print "replacement pattern=$pattern\n";

find sub {
    chomp;
    return unless /\.[ch]$/;
    my $file = "$File::Find::dir/$_";
    print "looking in $file\n";

    replace($_, !$just_check);

}, $dir;

sub replace {
    my($file, $replace) = @_;
    local *IN, *OUT;
    my @lines;
    my $found = 0;

    open IN, $file or die "open $file: $!";

    while (<IN>) {
        for (m/[^_\"]*$prefix($pattern)\b/og) {
            $found++;
            print "   $file:$. apr_$_ -> apr_$names{$_}\n";
        }
        push @lines, $_ if $replace;
    }

    close IN;

    return unless $found and $replace;

#    my $ans = prompt("replace?", 'y');
#    return unless $ans =~ /^y/i;

    open OUT, ">$file" or die "open $file: $!";

    for (@lines) {
        unless (/^\#include/) {
            s/([^_\"]*$prefix)($pattern)\b/$1$names{$2}/og;
        }
        print OUT $_;
    }

    close OUT;
}

__DATA__
apr_time_t:
apr_implode_gmt              apr_time_exp_gmt_get

apr_socket_t:
apr_close_socket             apr_socket_close
apr_create_socket            apr_socket_create
apr_get_sockaddr             apr_socket_addr_get
apr_get_socketdata           apr_socket_data_get
apr_set_socketdata           apr_socket_data_set
apr_shutdown                 apr_socket_shutdown
apr_bind                     apr_socket_bind
apr_listen                   apr_socket_listen
apr_accept                   apr_socket_accept
apr_connect                  apr_socket_connect
apr_send                     apr_socket_send
apr_sendv                    apr_socket_sendv
apr_sendto                   apr_socket_sendto
apr_recvfrom                 apr_socket_recvfrom
apr_sendfile                 apr_socket_sendfile
apr_recv                     apr_socket_recv

apr_filepath_*:
apr_filename_of_pathname     apr_filepath_name_get

apr_gid_t:
apr_get_groupid              apr_gid_get
apr_get_groupname            apr_gid_name_get
apr_group_name_get           apr_gid_name_get
apr_compare_groups           apr_gid_compare

apr_uid_t:
apr_get_home_directory       apr_uid_homepath_get
apr_get_userid               apr_uid_get
apr_current_userid           apr_uid_current
apr_compare_users            apr_uid_compare
apr_get_username             apr_uid_name_get
apr_compare_users            apr_uid_compare

