/** * This file is part of miniCDx benchmark of oSCJ. * * miniCDx is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * miniCDx 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with miniCDx. If not, see <http://www.gnu.org/licenses/>. * * * Copyright 2009, 2010 * @authors Daniel Tang, Ales Plsek * * See: http://sss.cs.purdue.edu/projects/oscj/ */ package scjlibs.examples.hijac.cdx; /* The purpose of this class is to permit printing of debug messages with * callsigns (byte arrays) and floating point data from a no-heap thread. * With standard Java ways of doing this, we get MemoryAccessError due to * the internal use of ThreadLocal by Sun RTS for character encoders/decoders * (and possibly other things). With encoders/decoders, lazy initialisation * leads to uncontrolled allocation w.r.t. to scope. Most likely the problem * is that the thread locals get allocated on the heap. */ /* Note that these converters are intentionally incorrect. We have no control * over the use of thread locals in VM libraries, so these may not work / not * be needed on other VMs. */ public class ASCIIConverter { public static String bytesToString(byte[] bytes) { char[] chars = new char[bytes.length]; for (int i = 0; i < bytes.length; i++) { chars[i] = (char) bytes[i]; } return new String(chars); } public static String floatToString(float f) { Float flt = new Float(f); long intPart = (long) Math.ceil(f); long fewDigits = (long) ((f - intPart) * 1000); return "" + intPart + "." + fewDigits; } }