/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.bsf.util.event.generator;

/**
 * Byte handling utilities
 *
 * 5 April 1999 - functions to append standard types to byte arrays
 *                functions to produce standard types from byte arrays
 *
 * @author Richard F. Boehme
 *
 */
public class ByteUtility
{
  public static byte[] addBytes(byte[] array,byte[] value)
  {
    if( null != array )
    {
      byte newarray[] = new byte[array.length + value.length];
      System.arraycopy(array,0,newarray,0,array.length);
      System.arraycopy(value,0,newarray,array.length,value.length);
      array = newarray;
    }
    else
    {
      array = value;
    }
    return array;
  }
  public static byte[] addBytes(byte[] array, byte value)
  {
    if( null != array )
    {
      byte newarray[] = new byte[array.length + 1];
      System.arraycopy(array,0,newarray,0,array.length);
      newarray[newarray.length-1] = value;
      array = newarray;
    }
    else
    {
      array = new byte[1];
      array[0] = value;
    }
    return array;
  }
  public static byte[] addBytes(byte[] array, int value)
  {
    if( null != array )
    {
      byte newarray[] = new byte[array.length + 3];
      System.arraycopy(array,0,newarray,0,array.length);
      newarray[newarray.length-3] = (byte) (( value >> 16 ) & 0xFF);
      newarray[newarray.length-2] = (byte) (( value >>  8 ) & 0xFF);
      newarray[newarray.length-1] = (byte) (  value         & 0xFF);
      array = newarray;
    }
    else
    {
      array = new byte[3];
      array[0] = (byte) (( value >> 16 ) & 0xFF);
      array[1] = (byte) (( value >>  8 ) & 0xFF);
      array[2] = (byte) (  value         & 0xFF);
    }
    return array;
  }
  public static byte[] addBytes(byte[] array, long value)
  {
    if( null != array )
    {
      byte newarray[] = new byte[array.length + 4];
      System.arraycopy(array,0,newarray,0,array.length);
      newarray[newarray.length-4] = (byte) (( value >> 24 ) & 0xFF);
      newarray[newarray.length-3] = (byte) (( value >> 16 ) & 0xFF);
      newarray[newarray.length-2] = (byte) (( value >>  8 ) & 0xFF);
      newarray[newarray.length-1] = (byte) (  value         & 0xFF);
      array = newarray;
    }
    else
    {
      array = new byte[4];
      array[0] = (byte) (( value >> 24 ) & 0xFF);
      array[1] = (byte) (( value >> 16 ) & 0xFF);
      array[2] = (byte) (( value >>  8 ) & 0xFF);
      array[3] = (byte) (value & 0xFF);
    }
    return array;
  }
  public static byte[] addBytes(byte[] array,String value)
  {
    if( null != value )
    {
      if( null != array)
      {
        byte newarray[] = new byte[array.length + value.length()];
        System.arraycopy(array,0,newarray,0,array.length);
        System.arraycopy(value.getBytes(),0,newarray,array.length,value.length());
        array = newarray;
      }
      else
      {
        array = value.getBytes();
      }
    }
    return array;
  }
  public static byte[] addBytes(byte[] array, short value)
  {
    if( null != array)
    {
      byte newarray[] = new byte[array.length + 2];
      System.arraycopy(array,0,newarray,0,array.length);
      newarray[newarray.length-2] = (byte) (( value >> 8 ) & 0xFF);
      newarray[newarray.length-1] = (byte) (  value        & 0xFF);
      array = newarray;
    }
    else
    {
      array = new byte[2];
      array[0] = (byte) (( value >> 8 ) & 0xFF);
      array[1] = (byte) (  value        & 0xFF);
    }
    return array;
  }
  public static double byteArrayToDouble(byte high[], byte low[])
  {
    double temp = 0;
    // high bytes
    temp += (((long)high[0]) & 0xFF) << 56;
    temp += (((long)high[1]) & 0xFF) << 48;
    temp += (((long)high[2]) & 0xFF) << 40;
    temp += (((long)high[3]) & 0xFF) << 32;
    // low bytes
    temp += (((long)low[0]) & 0xFF) << 24;
    temp += (((long)low[1]) & 0xFF) << 16;
    temp += (((long)low[2]) & 0xFF) << 8;
    temp += (((long)low[3]) & 0xFF);
    return temp;
  }
  public static double byteArrayToDouble(byte value[])
  {
    byte high[] = new byte[4];
    byte low[] = new byte[4];
    high[0] = value[0];
    high[1] = value[1];
    high[2] = value[2];
    high[3] = value[3];
    low[0] = value[4];
    low[1] = value[5];
    low[2] = value[6];
    low[3] = value[7];
    return byteArrayToDouble(high,low);
  }
  public static float byteArrayToFloat(byte value[])
  {
    float temp = 0;
    temp += (value[0] & 0xFF) << 24;
    temp += (value[1] & 0xFF) << 16;
    temp += (value[2] & 0xFF) << 8;
    temp += (value[3] & 0xFF);
    return temp;
  }
  public static int byteArrayToInt(byte value[])
  {
    int temp = 0;
    temp += (value[0] & 0xFF) << 24;
    temp += (value[1] & 0xFF) << 16;
    temp += (value[2] & 0xFF) << 8;
    temp += (value[3] & 0xFF);
    return temp;
  }
  public static long byteArrayToLong(byte value[])
  {
    byte high[] = new byte[4];
    byte low[] = new byte[4];
    high[0] = value[0];
    high[1] = value[1];
    high[2] = value[2];
    high[3] = value[3];
    low[0] = value[4];
    low[1] = value[5];
    low[2] = value[6];
    low[3] = value[7];
    return byteArrayToLong(high,low);
  }
  public static long byteArrayToLong(byte high[], byte low[])
  {
    long temp = 0;
    // high bytes
    temp += (((long)high[0]) & 0xFF) << 56;
    temp += (((long)high[1]) & 0xFF) << 48;
    temp += (((long)high[2]) & 0xFF) << 40;
    temp += (((long)high[3]) & 0xFF) << 32;
    // low bytes
    temp += (((long)low[0]) & 0xFF) << 24;
    temp += (((long)low[1]) & 0xFF) << 16;
    temp += (((long)low[2]) & 0xFF) << 8;
    temp += (((long)low[3]) & 0xFF);
    return temp;
  }
  // make the following loops with check on array length *****************
  public static short byteArrayToShort(byte value[])
  {
    short temp = 0;
    temp += (value[0] & 0xFF) << 8;
    temp += (value[1] & 0xFF);
    return temp;
  }
  public static String byteToHexString(byte value)
  {
    String temp = null;

    switch( (value & 0xF0) >> 4 )
    {
      case 0:
        temp = "0";
        break;
      case 1:
        temp = "1";
        break;
      case 2:
        temp = "2";
        break;
      case 3:
        temp = "3";
        break;
      case 4:
        temp = "4";
        break;
      case 5:
        temp = "5";
        break;
      case 6:
        temp = "6";
        break;
      case 7:
        temp = "7";
        break;
      case 8:
        temp = "8";
        break;
      case 9:
        temp = "9";
        break;
      case 10:
        temp = "A";
        break;
      case 11:
        temp = "B";
        break;
      case 12:
        temp = "C";
        break;
      case 13:
        temp = "D";
        break;
      case 14:
        temp = "E";
        break;
      case 15:
        temp = "F";
        break;
    }
    switch( (value & 0x0F) )
    {
      case 0:
        temp += "0";
        break;
      case 1:
        temp += "1";
        break;
      case 2:
        temp += "2";
        break;
      case 3:
        temp += "3";
        break;
      case 4:
        temp += "4";
        break;
      case 5:
        temp += "5";
        break;
      case 6:
        temp += "6";
        break;
      case 7:
        temp += "7";
        break;
      case 8:
        temp += "8";
        break;
      case 9:
        temp += "9";
        break;
      case 10:
        temp += "A";
        break;
      case 11:
        temp += "B";
        break;
      case 12:
        temp += "C";
        break;
      case 13:
        temp += "D";
        break;
      case 14:
        temp += "E";
        break;
      case 15:
        temp += "F";
        break;
    }
    return temp;
  }
}
