# -*- mode: Perl -*-
# /=====================================================================\ #
# |  inputenc                                                           | #
# | Implementation for LaTeXML                                          | #
# |=====================================================================| #
# | Part of LaTeXML:                                                    | #
# |  Public domain software, produced as part of work done by the       | #
# |  United States Government & not subject to copyright in the US.     | #
# |---------------------------------------------------------------------| #
# | Bruce Miller <bruce.miller@nist.gov>                        #_#     | #
# | http://dlmf.nist.gov/LaTeXML/                              (o o)    | #
# \=========================================================ooo==U==ooo=/ #
package LaTeXML::Package::Pool;
use strict;
use warnings;
use LaTeXML::Package;
use Encode;

#**********************************************************************
DefPrimitive('\DeclareInputMath {Number} {}', sub {
    my ($stomach, $code, $expansion) = @_;
    my $char = pack('C', $code->valueOf);
    AssignCatcode($char, CC_ACTIVE);
    DefMacroI(T_ACTIVE($char), undef, $expansion); });

DefPrimitive('\DeclareInputText {Number} {}', sub {
    my ($stomach, $code, $expansion) = @_;
    my $char = pack('C', $code->valueOf);
    AssignCatcode($char, CC_ACTIVE);
    DefMacroI(T_ACTIVE($char), undef, $expansion); });

DefMacro('\IeC{}', '#1');

DefMacroI('\@inpenc@undefined', undef, sub {
    Error('unexpected', '<char>', $_[0],
      "Keyboard character used is undefined in inputencoding " . LookupValue('INPUT_ENCODING')); });

DefPrimitive('\inputencoding{}', sub { SetInputEncoding(ToString(Expand($_[1]))); });

DeclareOption(undef, sub { SetInputEncoding(ToString(Expand(T_CS('\CurrentOption')))); });

ProcessOptions();

#**********************************************************************
sub SetInputEncoding {
  my ($encoding) = @_;
  # Initially disable all odd & upper half-plane chars
  foreach my $code ((0 .. 8), 0xB, (0xE .. 0x1E), (128 .. 255)) {
    my $char = pack('C', $code);
    AssignCatcode($char, CC_ACTIVE);
    Let(T_ACTIVE($char), '\@inpenc@undefined'); }
  AssignValue(PERL_INPUT_ENCODING => undef);    # Disable the perl-level decoding, if any.

  # Then load TeX's input encoding definitions.
  InputDefinitions($encoding, type => 'def', reloadable => 1);
  # NOTE: INPUT_ENCODING is never actually used anywhere!
  # So, presumably either Perl is magically converting to utf8
  # or more likely, treating the bytes as (misinterpreted?) utf8?
  # In latter case, perhaps it doesn't matter as long as we end up with the same bytes in/out???
  AssignValue(INPUT_ENCODING => $encoding);
  DefMacro('\inputencodingname', TokenizeInternal($encoding));
  return; }

#**********************************************************************
1;