#-*- perl -*- # # Copyright (C) 2001,2002,2003,2004,2005 Ken'ichi Fukamachi # All rights reserved. This program is free software; you can # redistribute it and/or modify it under the same terms as Perl itself. # # $FML: Convert.pm,v 1.19 2004/07/23 13:16:36 fukachan Exp $ # package FML::Config::Convert; use strict; use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD); use Carp; =head1 NAME FML::Config::Convert -- tiny non object-style variable expansion tool. =head1 SYNOPSIS my $in = new FileHandle $src; my $out = new FileHandle "> $dst.$$"; if (defined $in && defined $out) { &FML::Config::Convert::convert($in, $out, $config); $out->close(); $in->close(); rename("$dst.$$", $dst) || croak("fail to rename $dst"); } else { croak("fail to open $src") unless defined $in; croak("fail to open $dst") unless defined $out; } =head1 DESCRIPTION Installer needs variable expansion. This module provides variable expansion for __variable__ style string. =head1 METHODS =head2 convert($in, $out, $config) conversion filter. The source is given by file handle $in, output is specified as file handle $out. Specify HASH_REF $config as source of { key => value }. =head2 convert_file($src, $dst, $config) convert() wrapper for files. =cut # Descriptions: conversion filter for file handles # with configuration replacement. # Arguments: HANDLE($in) HANDLE($out) HASH_REF($config) # Side Effects: print out to handle $out # Return Value: none sub convert { my ($in, $out, $config) = @_; if (defined $in && defined $out && defined $config) { my $buf; while ($buf = <$in>) { $buf = _replace($buf, $config) if $buf =~ /__/o; print $out $buf; } } else { croak("convert: invalid in/out channel"); } } # Descriptions: conversion filter for files. # Arguments: STR($src) STR($dst) HASH_REF($config) # Side Effects: print out to file $out # Return Value: none sub convert_file { my ($src, $dst, $config) = @_; my $dst_tmp = sprintf("%s.%s", $dst, $$); use FileHandle; my $in = new FileHandle $src; my $out = new FileHandle "> $dst_tmp"; if (defined $in && defined $out) { use File::stat; my $stat = stat($src); my $mode = $stat->mode; eval q{ convert($in, $out, $config);}; croak($@) if $@; $out->close(); $in->close(); chmod $mode, $dst_tmp; rename($dst_tmp, $dst) || croak("fail to rename $dst"); } else { croak("fail to open $src") unless defined $in; croak("fail to open $dst") unless defined $out; } } # Descriptions: replace __variable__ with real value in $config. # Arguments: STR($buf) HASH_REF($config) # Side Effects: buffer replacement # Return Value: STR($buf) HASH_REF($config) sub _replace { my ($buf, $config) = @_; # XXX special condition: replace one line if hints is given if (defined $config->{ __hints_for_fml_process__ }) { if ($buf =~ /__hints_for_fml_process__/) { $buf = $config->{ __hints_for_fml_process__ }; return $buf; } } if (defined $config->{ fml_owner }) { $buf =~ s/__fml_owner__/$config->{ fml_owner }/g; } if (defined $config->{ ml_name }) { $buf =~ s/__ml_name__/$config->{ ml_name }/g; } if (defined $config->{ _ml_name_admin }) { $buf =~ s/__ml_name_admin__/$config->{ _ml_name_admin }/g; } if (defined $config->{ _ml_name_ctl }) { $buf =~ s/__ml_name_ctl__/$config->{ _ml_name_ctl }/g; } if (defined $config->{ _ml_name_error }) { $buf =~ s/__ml_name_error__/$config->{ _ml_name_error }/g; } if (defined $config->{ _ml_name_post }) { $buf =~ s/__ml_name_post__/$config->{ _ml_name_post }/g; } if (defined $config->{ _ml_name_request }) { $buf =~ s/__ml_name_request__/$config->{ _ml_name_request }/g; } if (defined $config->{ ml_domain }) { $buf =~ s/__ml_domain__/$config->{ ml_domain }/g; } if (defined $config->{ libexec_dir }) { $buf =~ s/__libexec_dir__/$config->{ libexec_dir }/g; } if (defined $config->{ ml_home_dir }) { $buf =~ s/__ml_home_dir__/$config->{ ml_home_dir }/g; } if (defined $config->{ ml_home_prefix }) { $buf =~ s/__ml_home_prefix__/$config->{ ml_home_prefix }/g; } if (defined $config->{ executable_prefix }) { $buf =~ s/__executable_prefix__/$config->{ executable_prefix }/g; } return $buf; } =head1 CODING STYLE See C on fml coding style guide. =head1 AUTHOR Ken'ichi Fukamachi =head1 COPYRIGHT Copyright (C) 2001,2002,2003,2004,2005 Ken'ichi Fukamachi All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 HISTORY FML::Config::Convert first appeared in fml8 mailing list driver package. See C for more details. =cut 1;