/*
 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package build.tools.charsetmapping;

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Formatter;
import java.util.regex.*;
import java.nio.charset.*;
import static build.tools.charsetmapping.Utils.*;

public class EUC_TW {

    static char[] toCharArray(int[] db,
                              int b1Min, int b1Max,
                              int b2Min, int b2Max)
    {
        char[] ca = new char[(b1Max - b1Min + 1) * (b2Max - b2Min + 1)];
        int off = 0;
        for (int b1 = b1Min; b1 <= b1Max; b1++) {
            for (int b2 = b2Min; b2 <= b2Max; b2++) {
                ca[off++] = (char)(db[b1 * 256 + b2] & 0xffff);
            }
        }
        return ca;
    }

    static char[] toCharArray(byte[] ba,
                              int b1Min, int b1Max,
                              int b2Min, int b2Max)
    {
        char[] ca = new char[(b1Max - b1Min + 1) * (b2Max - b2Min + 1)];
        int off = 0;
        for (int b1 = b1Min; b1 <= b1Max; b1++) {
            int b2 = b2Min;
            while (b2 <= b2Max) {
                ca[off++] = (char)(((ba[b1 * 256 + b2++] & 0xff) << 8) |
                                   (ba[b1 * 256 + b2++] & 0xff));
            }
        }
        return ca;
    }

    private static int initC2BIndex(char[] index) {
        int off = 0;
        for (int i = 0; i < index.length; i++) {
            if (index[i] != 0) {
                index[i] = (char)off;
                off += 0x100;
            } else {
                index[i] = UNMAPPABLE_ENCODING;
            }
        }
        return off;
    }

    private static Pattern euctw = Pattern.compile("(?:8ea)?(\\p{XDigit}++)\\s++(\\p{XDigit}++)?\\s*+.*");

    static void genClass(String args[]) throws Exception
    {
        InputStream is = new FileInputStream(new File(args[0], "euc_tw.map"));
        PrintStream ps = new PrintStream(new File(args[1], "EUC_TWMapping.java"),
                                         "ISO-8859-1");
        String copyright = getCopyright(new File(args[3]));


        // ranges of byte1 and byte2, something should come from a "config" file
        int b1Min = 0xa1;
        int b1Max = 0xfe;
        int b2Min = 0xa1;
        int b2Max = 0xfe;

        try {
            int[][] db = new int[8][0x10000];        // doublebyte
            byte[]  suppFlag = new byte[0x10000];    // doublebyte
            char[]  indexC2B = new char[256];
            char[]  indexC2BSupp = new char[256];

            for (int i = 0; i < 8; i++)
                for (int j = 0; j < 0x10000; j++)
                    db[i][j] = UNMAPPABLE_DECODING;

            Parser p = new Parser(is, euctw);
            Entry  e = null;
            while ((e = p.next()) != null) {
                int plane = 0;
                if (e.bs >= 0x10000) {
                    plane = ((e.bs >> 16) & 0xff) - 1;
                    if (plane >= 14)
                        plane = 7;
                    e.bs = e.bs & 0xffff;
                }
                db[plane][e.bs] = e.cp;
                if (e.cp < 0x10000) {
                    indexC2B[e.cp>>8] = 1;
                } else {
                    indexC2BSupp[(e.cp&0xffff)>>8] = 1;
                    suppFlag[e.bs] |= (1 << plane);
                }
            }

            StringBuilder sb = new StringBuilder();
            Output out = new Output(new Formatter(sb));

            out.format(copyright);
            out.format("%n// -- This file was mechanically generated: Do not edit! -- //%n");
            out.format("package sun.nio.cs.ext;%n%n");
            out.format("class EUC_TWMapping {%n%n");

            // boundaries
            out.format("    final static int b1Min = 0x%x;%n", b1Min);
            out.format("    final static int b1Max = 0x%x;%n", b1Max);
            out.format("    final static int b2Min = 0x%x;%n", b2Min);
            out.format("    final static int b2Max = 0x%x;%n", b2Max);

            // b2c tables
            out.format("%n    final static String[] b2c = {%n");
            for (int plane = 0; plane < 8; plane++) {
                out.format("        // Plane %d%n", plane);
                out.format(toCharArray(db[plane], b1Min, b1Max, b2Min, b2Max),
                           ",");
                out.format("%n");
            }
            out.format("    };%n");

            // c2bIndex
            out.format("%n    static final int C2BSIZE = 0x%x;%n",
                       initC2BIndex(indexC2B));
            out.format("%n    static char[] c2bIndex = new char[] {%n");
            out.format(indexC2B);
            out.format("    };%n");

            // c2bIndexSupp
            out.format("%n    static final int C2BSUPPSIZE = 0x%x;%n",
                       initC2BIndex(indexC2BSupp));
            out.format("%n    static char[] c2bSuppIndex = new char[] {%n");
            out.format(indexC2BSupp);
            out.format("    };%n");

            // suppFlags
            out.format("%n    static String b2cIsSuppStr =%n");
            out.format(toCharArray(suppFlag, b1Min, b1Max, b2Min, b2Max),
                       ";");
            out.format("}");
            out.close();

            ps.println(sb.toString());
            ps.close();
        } catch (Exception x) {
            x.printStackTrace();
        }
    }
}
