Carrot

 view release on metacpan or  search on metacpan

lib/Carrot/Personality/Valued/File/Name/Type/Regular/Content/UTF8_wBOM.pm  view on Meta::CPAN

package Carrot::Personality::Valued::File::Name::Type::Regular::Content::UTF8_wBOM
# /type class
# /capability "Manage content for Unicode text files with BOM as magic."
{
	use strict;
	use warnings 'FATAL' => 'all';
	use open qw(:encoding(utf8));

	BEGIN {
		require('Carrot/Personality/Valued/File/Name/Type/Regular/Content/UTF8_wBOM./manual_modularity.pl');
	} #BEGIN

	Carrot::Meta::Greenhouse::Package_Loader::provide(
		my $cursor_class = '::Personality::Reflective::Iterate::Array::Cursor');

	Carrot::Meta::Greenhouse::Package_Loader::provide_instance(
		my $fatal_syscalls = '::Meta::Greenhouse::Fatal_Syscalls',
		my $translated_errors = '::Meta::Greenhouse::Translated_Errors');

	my $utf8_bom = "\x{feff}"; # used as UTF-8 file magic

# =--------------------------------------------------------------------------= #

sub read_into
# /type method
# /effect ""
# //parameters
#	buffer
# //returns
{
	my ($this) = @ARGUMENTS;

	print STDERR "READ_INTO $$this\n" if (TRACE_FLAG);
	eval {
		$fatal_syscalls->open(my $file, PKY_OPEN_MODE_READ, $$this);

		binmode($file, ':utf8');
		$fatal_syscalls->read($file, my $first_character, 1);
		unless ($first_character eq $utf8_bom)
		{
			seek($file, 0, 0);
		}

		$_[SPX_BUFFER] //= '';
		$fatal_syscalls->read(
			$file,
			$_[SPX_BUFFER],
			(stat($file))[RDX_STAT_SIZE]);

		$fatal_syscalls->close($file);
		return(IS_TRUE);

	} or $translated_errors->escalate(
		'named_file_operation',
		[$$this],
		$EVAL_ERROR);

	return;
}

sub overwrite_from
# /type method
# /effect ""
# //parameters
#	buffer
# //returns
{
	my ($this) = @ARGUMENTS;

	print STDERR "OVERWRITE_FROM $$this\n" if (TRACE_FLAG);
	eval {
		$fatal_syscalls->open(my $file, PKY_OPEN_MODE_WRITE, $$this);

		binmode($file, ':utf8');
		$fatal_syscalls->truncate($file, 0);
		$fatal_syscalls->print2($file, $utf8_bom, $_[SPX_BUFFER]);
		$fatal_syscalls->close($file);
		return(IS_TRUE);

	} or $translated_errors->escalate(
		'named_file_operation',
		[$$this],
		$EVAL_ERROR);

	return;
}

sub read_lines
# /type method
# /effect ""
# //parameters
# //returns
#	?
{
	$_[THIS]->read_into(my $buffer);
	return([split(qr{(?:\012|\015\012?)}, $buffer, PKY_SPLIT_RETURN_FULL_TRAIL)]);
}

sub line_cursor
# /type method
# /effect ""
# //parameters
#	line
# //returns
#	::Personality::Abstract::Instance
{
	return($cursor_class->indirect_constructor(
		       $_[THIS]->read_lines,
		       $_[SPX_LINE]));
}

# =--------------------------------------------------------------------------= #

	return(PERL_FILE_LOADED);
}
# //revision_control
#	version 1.1.137
#	branch main
#	maturity alpha
# /license MPL-2.0 (Mozilla Public License v2.0)
# /copyright "(C) 2009-2014 Winfried Trümper <win@carrot-programming.org>"



( run in 1.222 second using v1.01-cache-2.11-cpan-d8267643d1d )