/*
 *******************************************************************************
 * Copyright (C) 1996-2000, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/tool/normalizer/Attic/CPPWriter.java,v $ 
 * $Date: 2002/02/25 22:43:59 $ 
 * $Revision: 1.8 $
 *
 *****************************************************************************************
 */
package com.ibm.icu.dev.tool.normalizer;

import com.ibm.icu.lang.*;
import com.ibm.icu.text.*;
import com.ibm.icu.util.*;
import com.ibm.icu.util.CompactByteArray;
import com.ibm.icu.util.CompactCharArray;
import com.ibm.icu.impl.Utility;
import java.io.*;

/**
 * CPPWriter knows how to write data structures out to C++ source and header files
 */
class CPPWriter extends SourceWriter {
    PrintWriter source;
    PrintWriter header;

    String className;

    public CPPWriter(String fileName, String cName) throws FileNotFoundException {
        className = cName;
        int i = fileName.lastIndexOf('/');
        String name = (i >= 0) ? fileName.substring(i+1) : fileName;

        // Find the class name
        header = new PrintWriter(new FileOutputStream(fileName + ".h"));
        writeHeader(header);
        header.println("#include \"unicode/utypes.h\"");
        header.println("#include \"ucmp8.h\"");
        header.println("#include \"ucmp16.h\"");
        header.println("");
        header.println("struct " + className + " {");   // "struct" makes everything public

        source = new PrintWriter(new FileOutputStream(fileName + ".cpp"));
        writeHeader(source);
        source.println("#include \"" + name + ".h\" ");
        source.println("");
    }

    public void close() {
        header.println("};");
        header.close();
        source.close();
        header = null;
        source = null;
    }

    public void write(String name, short value) {
        header.println("    enum { " + name + " = " + value + " };");
    }

    public void write(String name, int value) {
        header.println("    enum { " + name + " = " + value + " };");
    }

    public void writeHex(String name, char value) {
        header.println("    enum { " + name + " = 0x" + Utility.hex(value) + " };");
    }

    public void writeHex(String name, int value) {
        header.println("    enum { " + name + " = 0x" + Integer.toString(value,16) + " };");
    }

    public void write(String name, CompactCharArray array) {
        array.compact(false);

        String indexName = name + "_index";
        String valueName = name + "_values";

        write(indexName, array.getIndexArray());
        write(valueName, array.getValueArray());

        header.println("");
        header.println("    static CompactShortArray _" + name + ";");
        header.println("");
        header.println("    static const CompactShortArray* " + name + ";");

        source.println("");
        source.println("CompactShortArray " +
                       className + "::_" + name + ";");
        source.println("");
        source.println("const CompactShortArray* " +
                       className + "::" + name + " = ");
        source.println("    ucmp16_initAliasWithBlockShift(&" + className + "::_" + name + ",");
        source.println("                                   (uint16_t*)" + indexName + ",");
        source.println("                                   (int16_t*)" + valueName + ",");
        source.println("                                   " +
                       array.getValueArray().length + ", " +
                       "0x0000, " + // default value
                       CompactCharArray.BLOCKSHIFT + ");");
    }

    public void write(String name, CompactByteArray array) {
        array.compact(false);

        String indexName = name + "_index";
        String valueName = name + "_values";

        write(indexName, array.getIndexArray());
        write(valueName, array.getValueArray());

        header.println("");
        header.println("    static CompactByteArray _" + name + ";");
        header.println("");
        header.println("    static const CompactByteArray* " + name + ";");

        source.println("");
        source.println("CompactByteArray " +
                       className + "::_" + name + ";");
        source.println("");
        source.println("const CompactByteArray* " +
                       className + "::" + name + " = ");
        source.println("    ucmp8_initAlias(&" + className + "::_" + name + ",");
        source.println("                    (uint16_t*)" + indexName + ",");
        source.println("                    (int8_t*)" + valueName + ",");
        source.println("                    " + array.getValueArray().length + ");");
    }

    public void write(String name, StringBuffer str) {
        write(name, str.toString().toCharArray());
    }

    public void write(String name, char[] array) {
        header.println("");
        header.println("    static const uint16_t " + name + "[];");

        source.println("");
        source.println("const uint16_t " + className + "::" + name + "[] = {");

        source.print("    ");
        for (int i = 0; i < array.length; i++) {
            if (i > 0 && i % 8 == 0) {
                source.print(Utility.LINE_SEPARATOR + "    ");
            }
            source.print("0x" + Utility.hex(array[i]) + ", ");
        }
        source.println("};");
    }

    public void write(String name, short[] array) {
        header.println("");
        header.println("    static const uint16_t " + name + "[];");

        source.println("");
        source.println("const uint16_t " + className + "::" + name + "[] = {");

        source.print("    ");
        for (int i = 0; i < array.length; i++) {
            if (i > 0 && i % 8 == 0) {
                source.print(Utility.LINE_SEPARATOR + "    ");
            }
            source.print("0x" + Utility.hex((char)array[i]) + ", ");
        }
        source.println("};");
    }

    public void write(String name, int[] array) {
        header.println("");
        header.println("    static const int32_t " + name + "[];");

        source.println("");
        source.println("const int32_t " + className + "::" + name + "[] = {");

        source.print("    ");
        for (int i = 0; i < array.length; i++) {
            if (i > 0 && i % 8 == 0) {
                source.print(Utility.LINE_SEPARATOR + "    ");
            }
            source.print("0x" + Integer.toString(array[i],16) + ", ");
        }
        source.println("};");
    }

    public void write(String name, byte[] array) {
        header.println("");
        header.println("    static const uint8_t " + name + "[];");

        source.println("");
        source.println("const uint8_t " + className + "::" + name + "[] = {");

        source.print("    ");
        for (int i = 0; i < array.length; i++) {
            if (i > 0 && i % 8 == 0) {
                source.print(Utility.LINE_SEPARATOR + "    ");
            }
            source.print("0x" + hex2(array[i]) + ", ");
        }
        source.println("};");
    }

    private static StringBuffer __buf = new StringBuffer();

    // This method not multithread safe!
    private static final String hex2(int x) {
        __buf.setLength(0);
        __buf.append(hex1(x>>4)).append(hex1(x));
        return __buf.toString();
    }

    private static final char hex1(int x) {
        return "0123456789ABCDEF".charAt(x & 0xF);
    }
}
