#! /usr/bin/perl

# This migration script converts source files to use the new
# function name conventions of libavl.

# Usage: convert *.[ch]

use strict;
use warnings FATAL => 'all';
use IO::File;

my %trans = (
	avl_alloc_tree => 'avl_tree_malloc',
	avl_alloc_node => 'avl_node_malloc_FIXME',
	avl_clear_tree => 'avl_tree_clear',
	avl_compare_t => 'avl_cmp_t',
	avl_delete => 'avl_item_delete',
	avl_delete_node => 'avl_delete',
	avl_fixup_node => 'avl_fixup',
	avl_freeitem_t => 'avl_free_t',
	avl_free_nodes => 'avl_tree_purge',
	avl_free_tree => 'avl_free_tree',
	avl_init_node => 'avl_node_init',
	avl_init_tree => 'avl_tree_init',
	avl_insert => 'avl_item_insert',
	avl_insert_node => 'avl_insert',
	avl_insert_somewhere => 'avl_insert_somewhere_FIXME',
	avl_insert_top => 'avl_insert_top_FIXME',
	avl_search_closest => 'avl_search_closest_FIXME',
	avl_unlink_node => 'avl_unlink',
);

my $re = join('|', map { qr/\Q$_\E/ } keys %trans);
$re = qr/\b($re)\b/;

foreach my $file (@ARGV) {
	unlink("$file,new") or $!{ENOENT}
		or die "unlink($file,new): $!\n";

	my $in = new IO::File($file, '<')
		or die "$file: $!\n";
	my $out = new IO::File("$file,new", '>')
		or die "$file,new: $!\n";

	while(defined(my $line = $in->getline)) {
		$line =~ s/$re/$trans{$1}/ge;
		$out->write($line)
			or die "$file,new: $!\n";
	}

	$in->eof
		or die "$file: $!\n";
	$in->close
		or die "$file: $!\n";
	undef $in;

	$out->flush
		or die "$file,new: $!\n";
	$out->sync
		or die "$file,new: $!\n";
	$out->close
		or die "$file,new: $!\n";
	undef $out;

	rename("$file,new", $file)
		or die "rename($file,new -> $file): $!\n";
}
