conv.c
来自「This is a resource based on j2me embedde」· C语言 代码 · 共 450 行
C
450 行
/* * * * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program 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. * * This program 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 at /legal/license.txt). * * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */#include <stdlib.h>#include <string.h>#include <kni.h>#include <midpError.h>#include <midpMalloc.h>#include <conv.h>#if ENABLE_I18N_JAPANESEextern LcConvMethodsRec SJISConvRec;extern LcConvMethodsRec EUCJPConvRec;#define NUM_LCCONV 3static LcConvMethods lcConv[NUM_LCCONV] = {/* 0 */ &SJISConvRec,/* 1 */ &EUCJPConvRec,/* 2 */ NULL, /* depositary for a platform general converter */};#else#define NUM_LCCONV 1static LcConvMethods lcConv[NUM_LCCONV] = {/* 0 */ NULL, /* depositary for a platform general converter */};#endif /* ENABLE_I18N_JAPANESE */static intgetLcConvMethodsIDByEncoding(char *encoding) { if (encoding && *encoding) { int i; for (i = 0; i < NUM_LCCONV; i++) { if (lcConv[i] == NULL) { break; } if (strcmp(lcConv[i]->encoding, encoding) == 0) { return i; } } if (i < NUM_LCCONV) { lcConv[i] = getLcGenConvMethods(encoding); if (lcConv[i] != NULL) { return i; } } } return -1;}#define MAX_LEN_ENC_NAME 15static intgetLcConvMethodsID(jchar *uc, int len) { char enc[MAX_LEN_ENC_NAME + 1]; int i; /* Check the length of the encoding name */ if (len > MAX_LEN_ENC_NAME) { len = MAX_LEN_ENC_NAME; } for (i = 0; i < len; i++) { enc[i] = (char) uc[i]; } enc[i] = 0; return getLcConvMethodsIDByEncoding(enc);}/** * Gets a handle to specific character encoding conversion routine. * <p> * Java declaration: * <pre> * getHandler(Ljava/lang/String;)I * </pre> * * @param encoding character encoding * * @return identifier for requested handler, or <tt>-1</tt> if * the encoding was not supported. */KNIEXPORT KNI_RETURNTYPE_INTJava_com_sun_cldc_i18n_j2me_Conv_getHandler() { jint result = 0; KNI_StartHandles(1); KNI_DeclareHandle(str); KNI_GetParameterAsObject(1, str); if (!KNI_IsNullHandle(str)) { int strLen = KNI_GetStringLength(str); jchar* strBuf; /* Instead of always multiplying the length by sizeof(jchar), * we shift left by 1. This can be done because jchar has a * size of 2 bytes. */ strBuf = (jchar*)midpMalloc(strLen<<1); if (strBuf != NULL) { KNI_GetStringRegion(str, 0, strLen, strBuf); result = getLcConvMethodsID(strBuf, strLen); midpFree(strBuf); } else { KNI_ThrowNew(midpOutOfMemoryError, NULL); } } KNI_EndHandles(); KNI_ReturnInt(result);}/** * Gets the maximum length in bytes for a converted string. * <p> * Java declaration: * <pre> * getMaxByteLength(I)I * </pre> * * @param handler handle returned from getHandler * * @return maximum byte length, or zero if the handler is not valid */KNIEXPORT KNI_RETURNTYPE_INTJava_com_sun_cldc_i18n_j2me_Conv_getMaxByteLength() { int id = KNI_GetParameterAsInt(1); KNI_ReturnInt(lcConv[id] ? lcConv[id]->byteMaxLen() : 0);}/** * Gets the length of a specific converted string. * <p> * Java declaration: * <pre> * getByteLength(I[BII)I * </pre> * * @param handler handle returned from getHandler * @param b buffer of bytes to be converted * @param offset offset into the provided buffer * @param len length of data to be processed * * @return length of the converted string, or zero if the * arguments were not valid */KNIEXPORT KNI_RETURNTYPE_INTJava_com_sun_cldc_i18n_j2me_Conv_getByteLength() { int length = KNI_GetParameterAsInt(4); int offset = KNI_GetParameterAsInt(3); int id = KNI_GetParameterAsInt(1); char* buf; jint result = 0; KNI_StartHandles(1); KNI_DeclareHandle(b); KNI_GetParameterAsObject(2, b); buf = (char*)midpMalloc(length); if (buf == NULL) { KNI_ThrowNew(midpOutOfMemoryError, NULL); } else { KNI_GetRawArrayRegion(b, offset, length, (jbyte*)buf); result = lcConv[id] ? lcConv[id]->byteLen((const unsigned char *) buf, length) : 0; midpFree(buf); } KNI_EndHandles(); KNI_ReturnInt(result);}/** * Converts an array of bytes to converted array of characters. * <p> * Java declaration: * <pre> * byteToChar(I[BII[CII)I * </pre> * * @param handler handle returned from getHandler * @param input buffer of bytes to be converted * @param in_offset offset into the provided buffer * @param in_len length of data to be processed * @param output buffer of converted bytes * @param out_offset offset into the provided output buffer * @param out_len length of data processed * * @return length of the converted string, or zero if the * arguments were not valid */KNIEXPORT KNI_RETURNTYPE_INTJava_com_sun_cldc_i18n_j2me_Conv_byteToChar() { int outLength = KNI_GetParameterAsInt(7); int outOffset = KNI_GetParameterAsInt(6); int inLength = KNI_GetParameterAsInt(4); int inOffset = KNI_GetParameterAsInt(3); int id = KNI_GetParameterAsInt(1); char* inBuf; jchar* outBuf; jint result = 0; KNI_StartHandles(2); KNI_DeclareHandle(output); KNI_DeclareHandle(input); KNI_GetParameterAsObject(5, output); KNI_GetParameterAsObject(2, input); inBuf = (char*)midpMalloc(inLength); if (inBuf != NULL) { /* Instead of always multiplying the length by sizeof(jchar), * we shift left by 1. This can be done because jchar has a * size of 2 bytes. */ outBuf = (jchar*)midpMalloc(outLength<<1); if (outBuf != NULL) { KNI_GetRawArrayRegion(input, inOffset, inLength, (jbyte*)inBuf); result = (lcConv[id] ? lcConv[id]->nativeToUnicode((const unsigned char *) inBuf, inLength, outBuf, outLength): 0); KNI_SetRawArrayRegion(output, outOffset<<1, outLength<<1, (jbyte*)outBuf); midpFree(inBuf); midpFree(outBuf); } else { midpFree(inBuf); KNI_ThrowNew(midpOutOfMemoryError, NULL); } } else { KNI_ThrowNew(midpOutOfMemoryError, NULL); } KNI_EndHandles(); KNI_ReturnInt(result);}/** * Converts an array of characters to converted array of bytes. * <p> * Java declaration: * <pre> * charToByte(I[CII[BII)I * </pre> * * @param handler handle returned from getHandler * @param input buffer of bytes to be converted * @param in_offset offset into the provided buffer * @param in_len length of data to be processed * @param output buffer of converted bytes * @param out_offset offset into the provided output buffer * @param out_len length of data processed * * @return length of the converted string, or zero if the * arguments were not valid */KNIEXPORT KNI_RETURNTYPE_INTJava_com_sun_cldc_i18n_j2me_Conv_charToByte() { int outLength = KNI_GetParameterAsInt(7); int outOffset = KNI_GetParameterAsInt(6); int inLength = KNI_GetParameterAsInt(4); int inOffset = KNI_GetParameterAsInt(3); int id = KNI_GetParameterAsInt(1); jchar* inBuf; char* outBuf; jint result = 0; KNI_StartHandles(2); KNI_DeclareHandle(output); KNI_DeclareHandle(input); KNI_GetParameterAsObject(5, output); KNI_GetParameterAsObject(2, input); /* Instead of always multiplying the length by sizeof(jchar), * we shift left by 1. This can be done because jchar has a * size of 2 bytes. */ inBuf = (jchar*)midpMalloc(inLength<<1); if (inBuf != NULL) { outBuf = (char*)midpMalloc(outLength); if (outBuf != NULL) { KNI_GetRawArrayRegion(input, inOffset<<1, inLength<<1, (jbyte*)inBuf); result = (lcConv[id] ? lcConv[id]->unicodeToNative(inBuf, inLength, (unsigned char*) outBuf, outLength):0); KNI_SetRawArrayRegion(output, outOffset, outLength,(jbyte*)outBuf); midpFree(inBuf); midpFree(outBuf); } else { midpFree(inBuf); KNI_ThrowNew(midpOutOfMemoryError, NULL); } } else { KNI_ThrowNew(midpOutOfMemoryError, NULL); } KNI_EndHandles(); KNI_ReturnInt(result);}/** * Gets the length of a specific converted string as an array of * Unicode bytes. * <p> * Java declaration: * <pre> * sizeOfByteInUnicode(I[BII)I * </pre> * * @param handler handle returned from getHandler * @param b buffer of bytes to be converted * @param offset offset into the provided buffer * @param length length of data to be processed * * @return length of the converted string, or zero if the * arguments were not valid */KNIEXPORT KNI_RETURNTYPE_INTJava_com_sun_cldc_i18n_j2me_Conv_sizeOfByteInUnicode() { int length = KNI_GetParameterAsInt(4); int offset = KNI_GetParameterAsInt(3); int id = KNI_GetParameterAsInt(1); char *buf; jint result = 0; KNI_StartHandles(1); KNI_DeclareHandle(b); KNI_GetParameterAsObject(2, b); buf = (char*)midpMalloc(length); if (buf == NULL) { KNI_ThrowNew(midpOutOfMemoryError, NULL); } else { KNI_GetRawArrayRegion(b, offset, length, (jbyte*)buf); result = lcConv[id] ? lcConv[id]->sizeOfByteInUnicode((const unsigned char *)buf, offset, length) : 0; midpFree(buf); } KNI_EndHandles(); KNI_ReturnInt(result);}/** * Gets the length of a specific converted string as an array of * Unicode characters. * <p> * Java declaration: * <pre> * sizeOfUnicodeInByte(I[CII)I * </pre> * * @param handler handle returned from getHandler * @param c buffer of characters to be converted * @param offset offset into the provided buffer * @param length length of data to be processed * * @return length of the converted string, or zero if the * arguments were not valid */KNIEXPORT KNI_RETURNTYPE_INTJava_com_sun_cldc_i18n_j2me_Conv_sizeOfUnicodeInByte() { int length = KNI_GetParameterAsInt(4); int offset = KNI_GetParameterAsInt(3); int id = KNI_GetParameterAsInt(1); jchar *buf; jint result = 0; KNI_StartHandles(1); KNI_DeclareHandle(c); KNI_GetParameterAsObject(2, c); /* Instead of always multiplying the length by sizeof(jchar), * we shift left by 1. This can be done because jchar has a * size of 2 bytes. */ buf = (jchar*)midpMalloc(length<<1); if (buf == NULL) { KNI_ThrowNew(midpOutOfMemoryError, NULL); } else { KNI_GetRawArrayRegion(c, offset<<1, length<<1, (jbyte*)buf); result = lcConv[id] ? lcConv[id]->sizeOfUnicodeInByte((const jchar *)buf, offset, length) : 0; midpFree(buf); } KNI_EndHandles(); KNI_ReturnInt(result);}LcConvMethodsgetLcConvMethods(char *encoding){ int index = getLcConvMethodsIDByEncoding(encoding); if (index != -1) { return lcConv[index]; } return NULL;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?