Milán Major

netscape-revival

1 branch
Code

sun-java/runtime/string.c

/*
 * @(#)string.c	1.24 95/11/29  
 *
 * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for NON-COMMERCIAL purposes and without
 * fee is hereby granted provided that this copyright notice
 * appears in all copies. Please refer to the file "copyright.html"
 * for further important copyright and licensing information.
 *
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 */

#include "oobj.h"
#include "interpreter.h"
#include "javaString.h"
#include "typecodes.h"
#include "path_md.h"
#include "sys_api.h"

JRI_PUBLIC_API(Hjava_lang_String *)
makeJavaString(char *str, int len) {
    HArrayOfChar *val;
    unicode *p;

    if (!str) len = 0;
    val = (HArrayOfChar *) ArrayAlloc(T_CHAR, len);
    if (val == 0) {
	SignalError(0, JAVAPKG "OutOfMemoryError", 0);
	return 0;
    }
    p = unhand(val)->body;
    if (str) str2unicode(str, p, len);
    return (Hjava_lang_String *)
      execute_java_constructor(EE(), 0, classJavaLangString, "([C)", val);
}

void javaStringPrint(Hjava_lang_String *s) {
    if (s) {
	Classjava_lang_String *str = unhand(s);
	HArrayOfChar *hac = (HArrayOfChar *)str->value;
	unicode *body = unhand(hac)->body;
	printus(body + str->offset, str->count);
    }
}

JRI_PUBLIC_API(int32_t)
javaStringLength(Hjava_lang_String *s) {
    Classjava_lang_String *str;
    if (!s) {
	return 0;
    }
    str = unhand(s);
    return str->count;
}

unicode *javaString2unicode(Hjava_lang_String *s, unicode *buf, int len) {
    if (s) {
	Classjava_lang_String *str = unhand(s);
	HArrayOfChar *hac = (HArrayOfChar *)str->value;
	memcpy(buf, unhand(hac)->body+str->offset, len*sizeof(unicode));
    } else {
	memset(buf, 0, len * sizeof(unicode));
    }
    return buf;
}

JRI_PUBLIC_API(char *)
javaString2CString(Hjava_lang_String *s, char *buf, int buflen) {
    Classjava_lang_String *str;
    HArrayOfChar *hac;

    if (s && (str = unhand(s)) && (hac = (HArrayOfChar *)str->value)) {
	unicode *src = unhand(hac)->body;
	int32_t	len = javaStringLength(s);

	if (len >= buflen)
	    len = buflen - 1;
	unicode2str(src + str->offset, buf, len);
    } else if (buflen) {
	buf[0] = '\0';
    }
    return buf;
}

char *makeCString(Hjava_lang_String *s) {
    extern HArrayOfByte *MakeByteString(char *str, long len);
    int32_t len = javaStringLength(s);
    char *buf;

    HArrayOfByte *hab = MakeByteString(NULL, len + 1);
    if (hab == 0) {
	SignalError(0, JAVAPKG "OutOfMemoryError", 0);
	return 0;
    }

    buf = unhand(hab)->body;
    return javaString2CString(s, buf, (size_t)len + 1);
}

char *allocCString(Hjava_lang_String *s) {
    int32_t len = javaStringLength(s);
    char *buf = sysMalloc((size_t)len + 1);
    if (buf == 0) {
	SignalError(0, JAVAPKG "OutOfMemoryError", 0);
	return 0;
    }
    return javaString2CString(s, buf, (size_t)len + 1);
}