[kaffe] CVS kaffe (robilad): Fixed #16
Kaffe CVS
cvs-commits at kaffe.org
Sat Feb 11 17:21:05 PST 2006
PatchSet 7125
Date: 2006/02/12 01:10:37
Author: robilad
Branch: HEAD
Tag: (none)
Log:
Fixed #16
2006-02-12 Dalibor Topic <robilad at kaffe.org>
Fix for #16.
* kaffe/kaffevm/string.c: (stringJava2C)
Fixed conversion to C chars for Java unicode
characters >= 127.
* libraries/clib/io/File.c: Switched all functions
to use JNI style declarations. Use GetStringUTFChars
and ReleaseStringUTFChars to convert Java Strings
to C chars. Code taken from GNU Classpath. Added
FSF to copyright header.
* libraries/javalib/external/classpath/gnu/java/net/protocol/file/Connection.java
(unquote) Convert Java characters above 127 to UTF-8 rather than throwing an
exception.
* libraries/javalib/external/classpath/java/net/URLClassLoader.java
(addURLImpl) Check if a file URL points to a directory before
using a JarURLClassLoader.
Members:
ChangeLog:1.4643->1.4644
kaffe/kaffevm/string.c:1.45->1.46
libraries/clib/io/File.c:1.27->1.28
libraries/javalib/external/classpath/gnu/java/net/protocol/file/Connection.java:1.2->1.3
libraries/javalib/external/classpath/java/net/URLClassLoader.java:1.3->1.4
Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4643 kaffe/ChangeLog:1.4644
--- kaffe/ChangeLog:1.4643 Thu Feb 9 22:14:12 2006
+++ kaffe/ChangeLog Sun Feb 12 01:10:37 2006
@@ -1,3 +1,25 @@
+2006-02-12 Dalibor Topic <robilad at kaffe.org>
+
+ Fix for #16.
+
+ * kaffe/kaffevm/string.c: (stringJava2C)
+ Fixed conversion to C chars for Java unicode
+ characters >= 127.
+
+ * libraries/clib/io/File.c: Switched all functions
+ to use JNI style declarations. Use GetStringUTFChars
+ and ReleaseStringUTFChars to convert Java Strings
+ to C chars. Code taken from GNU Classpath. Added
+ FSF to copyright header.
+
+ * libraries/javalib/external/classpath/gnu/java/net/protocol/file/Connection.java
+ (unquote) Convert Java characters above 127 to UTF-8 rather than throwing an
+ exception.
+
+ * libraries/javalib/external/classpath/java/net/URLClassLoader.java
+ (addURLImpl) Check if a file URL points to a directory before
+ using a JarURLClassLoader.
+
2006-02-09 Dalibor Topic <robilad at kaffe.org>
Fix for #12.
Index: kaffe/kaffe/kaffevm/string.c
diff -u kaffe/kaffe/kaffevm/string.c:1.45 kaffe/kaffe/kaffevm/string.c:1.46
--- kaffe/kaffe/kaffevm/string.c:1.45 Wed Aug 31 02:42:28 2005
+++ kaffe/kaffe/kaffevm/string.c Sun Feb 12 01:10:42 2006
@@ -65,10 +65,24 @@
if (len > STRING_SIZE(js)) {
len = STRING_SIZE(js);
}
- cs[len] = 0;
+
while (--len >= 0) {
- *cs++ = (char)*chrs++;
+ if (*chrs >= 0x0001 && *chrs <= 0x007F) {
+ *cs++ = *chrs++ & 0x7F;
+ }
+ else if (*chrs >= 0x0080 && *chrs <= 0x07FF) {
+ *cs++ = 0xC0 | ((*chrs >> 6) & 0x1F);
+ *cs++ = 0x80 | (*chrs++ & 0x3F);
+ }
+ else {
+ *cs++ = 0xE0 | ((*chrs >> 12) & 0x0F);
+ *cs++ = 0x80 | ((*chrs >> 6) & 0x3F);
+ *cs++ = 0x80 | (*chrs++ & 0x3F);
+ }
}
+
+ *cs = 0;
+
return (cs);
}
Index: kaffe/libraries/clib/io/File.c
diff -u kaffe/libraries/clib/io/File.c:1.27 kaffe/libraries/clib/io/File.c:1.28
--- kaffe/libraries/clib/io/File.c:1.27 Wed Aug 10 15:35:37 2005
+++ kaffe/libraries/clib/io/File.c Sun Feb 12 01:10:43 2006
@@ -3,8 +3,10 @@
*
* Copyright (c) 1996, 1997, 1998, 1999
* Transvirtual Technologies, Inc. All rights reserved.
- * Copyright (c) 2003
+ * Copyright (c) 2003, 2006
* Kaffe's team.
+ * Copyright (c) 2006
+ * Free Software Foundation, Inc.
*
* See the file "license.terms" for information on usage and redistribution
* of this file.
@@ -25,6 +27,7 @@
#include "defs.h"
#include "files.h"
#include "../../../include/system.h"
+#include "jni.h"
#include "java_io_VMFile.h"
#include "support.h"
#include "stringSupport.h"
@@ -32,15 +35,24 @@
/*
* Is named item a file?
*/
-jboolean java_io_VMFile_isFile(struct Hjava_lang_String* fileName)
+JNIEXPORT jboolean JNICALL
+Java_java_io_VMFile_isFile (JNIEnv * env,
+ jobject obj __attribute__ ((__unused__)),
+ jstring name)
{
- struct stat buf;
- char str[MAXPATHLEN];
+ const char *filename;
int r;
+ struct stat buf;
- stringJava2CBuf(fileName, str, sizeof(str));
-
- r = KSTAT(str, &buf);
+ filename = (*env)->GetStringUTFChars (env, name, 0);
+ if (filename == NULL)
+ {
+ return (0);
+ }
+
+ r = KSTAT(filename, &buf);
+ (*env)->ReleaseStringUTFChars (env, name, filename);
+
if (r == 0 && S_ISREG(buf.st_mode)) {
return (1);
}
@@ -52,15 +64,24 @@
/*
* Is named item a directory?
*/
-jboolean java_io_VMFile_isDirectory(struct Hjava_lang_String* fileName)
+JNIEXPORT jboolean JNICALL
+Java_java_io_VMFile_isDirectory (JNIEnv * env,
+ jobject obj __attribute__ ((__unused__)),
+ jstring name)
{
- struct stat buf;
- char str[MAXPATHLEN];
+ const char * filename;
int r;
+ struct stat buf;
- stringJava2CBuf(fileName, str, sizeof(str));
+ filename = (*env)->GetStringUTFChars (env, name, 0);
+ if (filename == NULL)
+ {
+ return (0);
+ }
- r = KSTAT(str, &buf);
+ r = KSTAT(filename, &buf);
+ (*env)->ReleaseStringUTFChars (env, name, filename);
+
if (r == 0 && S_ISDIR(buf.st_mode)) {
return (1);
}
@@ -72,29 +93,51 @@
/*
* Does named file exist?
*/
-jboolean java_io_VMFile_exists(struct Hjava_lang_String* fileName)
+JNIEXPORT jboolean JNICALL
+Java_java_io_VMFile_exists (JNIEnv * env,
+ jobject obj __attribute__ ((__unused__)),
+ jstring name)
{
+ const char *filename;
+ int result;
struct stat buf;
- char str[MAXPATHLEN];
- stringJava2CBuf(fileName, str, sizeof(str));
+ filename = (*env)->GetStringUTFChars (env, name, 0);
+ if (filename == NULL)
+ {
+ return (0);
+ }
/* A file exists if I can stat it */
- return (KSTAT(str, &buf) == 0);
+ result = KSTAT(filename, &buf);
+ (*env)->ReleaseStringUTFChars (env, name, filename);
+
+ return result == 0;
}
/*
* Last modified time on file.
*/
-jlong java_io_VMFile_lastModified(struct Hjava_lang_String* fileName)
+JNIEXPORT jlong JNICALL
+Java_java_io_VMFile_lastModified (JNIEnv * env,
+ jobject obj __attribute__ ((__unused__)),
+ jstring name)
{
+ const char *filename;
struct stat buf;
- char str[MAXPATHLEN];
int r;
- stringJava2CBuf(fileName, str, sizeof(str));
+ filename = (*env)->GetStringUTFChars (env, name, 0);
+ if (filename == NULL)
+ {
+ return (0);
+ }
+
- r = KSTAT(str, &buf);
+ r = KSTAT(filename, &buf);
+
+ (*env)->ReleaseStringUTFChars (env, name, filename);
+
if (r != 0) {
return ((jlong)0);
}
@@ -104,44 +147,75 @@
/*
* Can I write to this file?
*/
-jboolean
-java_io_VMFile_canWrite(struct Hjava_lang_String* fileName)
+JNIEXPORT jboolean JNICALL
+Java_java_io_VMFile_canWrite (JNIEnv * env,
+ jobject obj __attribute__ ((__unused__)),
+ jstring name)
{
- char str[MAXPATHLEN];
- int r;
+ const char *filename;
+ int r;
- stringJava2CBuf(fileName, str, sizeof(str));
- /* XXX make part of jsyscall interface !? */
- r = access(str, W_OK);
- return (r < 0 ? 0 : 1);
+ filename = (*env)->GetStringUTFChars (env, name, 0);
+ if (filename == NULL)
+ {
+ return (0);
+ }
+
+ /* XXX make part of jsyscall interface !? */
+ r = access(filename, W_OK);
+
+ (*env)->ReleaseStringUTFChars (env, name, filename);
+
+ return (r < 0 ? 0 : 1);
}
/*
* Can I read from this file.
*/
-jboolean java_io_VMFile_canRead(struct Hjava_lang_String* fileName)
+JNIEXPORT jboolean JNICALL
+Java_java_io_VMFile_canRead (JNIEnv * env,
+ jobject obj __attribute__ ((__unused__)),
+ jstring name)
{
- char str[MAXPATHLEN];
+ const char *filename;
int r;
- stringJava2CBuf(fileName, str, sizeof(str));
+ filename = (*env)->GetStringUTFChars (env, name, 0);
+ if (filename == NULL)
+ {
+ return (0);
+ }
+
/* XXX make part of jsyscall interface !? */
- r = access(str, R_OK);
+ r = access(filename, R_OK);
+
+ (*env)->ReleaseStringUTFChars (env, name, filename);
+
return (r < 0 ? 0 : 1);
}
/*
* Return length of file.
*/
-jlong java_io_VMFile_length(struct Hjava_lang_String* fileName)
+JNIEXPORT jlong JNICALL
+Java_java_io_VMFile_length (JNIEnv * env,
+ jobject obj __attribute__ ((__unused__)),
+ jstring name)
{
+ const char *filename;
struct stat buf;
- char str[MAXPATHLEN];
int r;
- stringJava2CBuf(fileName, str, sizeof(str));
+ filename = (*env)->GetStringUTFChars (env, name, 0);
+ if (filename == NULL)
+ {
+ return (0);
+ }
- r = KSTAT(str, &buf);
+ r = KSTAT(filename, &buf);
+
+ (*env)->ReleaseStringUTFChars (env, name, filename);
+
if (r != 0) {
return ((jlong)0);
}
@@ -151,54 +225,92 @@
/*
* Create a directory.
*/
-jboolean java_io_VMFile_mkdir(struct Hjava_lang_String* fileName)
+JNIEXPORT jboolean JNICALL
+Java_java_io_VMFile_mkdir (JNIEnv * env,
+ jobject obj __attribute__ ((__unused__)),
+ jstring name)
{
- char str[MAXPATHLEN];
+ const char *filename;
int r;
- stringJava2CBuf(fileName, str, sizeof(str));
- r = KMKDIR(str, 0777);
+ filename = (*env)->GetStringUTFChars (env, name, 0);
+ if (filename == NULL)
+ {
+ return (0);
+ }
+
+ r = KMKDIR(filename, 0777);
+
+ (*env)->ReleaseStringUTFChars (env, name, filename);
+
return (r != 0 ? 0 : 1);
}
/*
* Rename a file.
*/
-jboolean java_io_VMFile_renameTo(struct Hjava_lang_String* fromName,
- struct Hjava_lang_String* toName)
+JNIEXPORT jboolean JNICALL
+Java_java_io_VMFile_renameTo (JNIEnv * env,
+ jobject obj __attribute__ ((__unused__)),
+ jstring t, jstring d)
{
- char str[MAXPATHLEN];
- char str2[MAXPATHLEN];
+ const char *old_filename, *new_filename;
int r;
-
- stringJava2CBuf(fromName, str, sizeof(str));
- stringJava2CBuf(toName, str2, sizeof(str2));
-
- r = KRENAME(str, str2);
+
+ old_filename = (*env)->GetStringUTFChars (env, t, 0);
+ if (old_filename == NULL)
+ {
+ return (0);
+ }
+
+ new_filename = (*env)->GetStringUTFChars (env, d, 0);
+ if (new_filename == NULL)
+ {
+ (*env)->ReleaseStringUTFChars (env, t, old_filename);
+ return (0);
+ }
+
+ r = KRENAME(old_filename, new_filename);
+
+ (*env)->ReleaseStringUTFChars (env, t, old_filename);
+ (*env)->ReleaseStringUTFChars (env, t, new_filename);
+
return (r != 0 ? 0 : 1);
}
/*
* Delete a file.
*/
-jboolean java_io_VMFile_delete(struct Hjava_lang_String* fileName)
+JNIEXPORT jboolean JNICALL
+Java_java_io_VMFile_delete (JNIEnv * env,
+ jobject obj __attribute__ ((__unused__)),
+ jstring name)
{
- char str[MAXPATHLEN];
- int r;
+ const char *filename;
+ int r;
- stringJava2CBuf(fileName, str, sizeof(str));
+ filename = (*env)->GetStringUTFChars (env, name, 0);
+ if (filename == NULL)
+ {
+ return (0);
+ }
+
+ r = KREMOVE(filename);
- r = KREMOVE(str);
- return(r != 0 ? 0 : 1);
+ (*env)->ReleaseStringUTFChars (env, name, filename);
+
+ return(r != 0 ? 0 : 1);
}
/*
* Get a directory listing.
*/
-HArrayOfObject* java_io_VMFile_list(struct Hjava_lang_String* dirName)
+JNIEXPORT jobjectArray JNICALL
+Java_java_io_VMFile_list (JNIEnv * env, jobject obj
+ __attribute__ ((__unused__)), jstring name)
{
#if defined(HAVE_DIRENT_H)
- char path[MAXPATHLEN];
+ const char *dirname;
DIR* dir;
struct dirent* entry;
struct dentry {
@@ -212,11 +324,18 @@
int count;
int i;
int oom = 0;
-
- stringJava2CBuf(dirName, path, sizeof(path));
+
+ dirname = (*env)->GetStringUTFChars (env, name, 0);
+ if (dirname == NULL)
+ {
+ return (0);
+ }
/* XXX make part of jsyscall interface !? */
- dir = opendir(path);
+ dir = opendir(dirname);
+
+ (*env)->ReleaseStringUTFChars (env, name, dirname);
+
if (dir == 0) {
return (NULL);
}
@@ -284,15 +403,25 @@
#endif
}
-jboolean java_io_VMFile_create(struct Hjava_lang_String* fileName)
+JNIEXPORT jboolean JNICALL
+Java_java_io_VMFile_create (JNIEnv * env,
+ jclass clazz __attribute__ ((__unused__)),
+ jstring name)
{
- char str[MAXPATHLEN];
+ const char *filename;
int fd;
int rc;
- stringJava2CBuf(fileName, str, sizeof(str));
+ filename = (*env)->GetStringUTFChars (env, name, 0);
+ if (filename == NULL)
+ {
+ return (0);
+ }
+
+ rc = KOPEN(filename, O_EXCL|O_WRONLY|O_BINARY|O_CREAT, 0600, &fd);
+
+ (*env)->ReleaseStringUTFChars (env, name, filename);
- rc = KOPEN(str, O_EXCL|O_WRONLY|O_BINARY|O_CREAT, 0600, &fd);
switch (rc) {
case 0:
break;
@@ -307,39 +436,62 @@
return 1;
}
-jboolean java_io_VMFile_setLastModified(struct Hjava_lang_String* fileName,
- jlong thetime)
+JNIEXPORT jboolean JNICALL
+Java_java_io_VMFile_setLastModified (JNIEnv * env,
+ jobject obj __attribute__ ((__unused__)),
+ jstring name, jlong newtime)
{
#ifdef HAVE_UTIME_H
- char path[MAXPATHLEN];
+ const char *filename;
+ int result;
struct utimbuf ub;
#endif
- if (thetime < 0)
+ if (newtime < 0)
SignalError("java.lang.IllegalArgumentException", "time < 0");
#ifdef HAVE_UTIME_H
- stringJava2CBuf(fileName, path, sizeof(path));
- ub.actime = (time_t)(thetime / 1000);
+
+ ub.actime = (time_t)(newtime / 1000);
ub.modtime = ub.actime;
- return (utime(path, &ub) >= 0);
+
+ filename = (*env)->GetStringUTFChars (env, name, 0);
+ if (filename == NULL)
+ {
+ return (0);
+ }
+
+ result = utime(filename, &ub);
+
+ (*env)->ReleaseStringUTFChars (env, name, filename);
+
+ return result >= 0;
#else
return 0;
#endif
}
-jboolean java_io_VMFile_setReadOnly(struct Hjava_lang_String* fileName)
+JNIEXPORT jboolean JNICALL
+Java_java_io_VMFile_setReadOnly (JNIEnv * env,
+ jobject obj __attribute__ ((__unused__)),
+ jstring name)
{
+ const char *filename;
struct stat buf;
- char str[MAXPATHLEN];
int r;
- stringJava2CBuf(fileName, str, sizeof(str));
-
- r = KSTAT(str, &buf);
- if (r != 0)
- return 0;
+ filename = (*env)->GetStringUTFChars (env, name, 0);
+ if (filename == NULL)
+ {
+ return (0);
+ }
- r = chmod(str, buf.st_mode & ~(S_IWOTH|S_IWGRP|S_IWUSR));
+ r = KSTAT(filename, &buf);
+
+ if (r == 0)
+ r = chmod(filename, buf.st_mode & ~(S_IWOTH|S_IWGRP|S_IWUSR));
+
+ (*env)->ReleaseStringUTFChars (env, name, filename);
+
return (r == 0);
}
Index: kaffe/libraries/javalib/external/classpath/gnu/java/net/protocol/file/Connection.java
diff -u kaffe/libraries/javalib/external/classpath/gnu/java/net/protocol/file/Connection.java:1.2 kaffe/libraries/javalib/external/classpath/gnu/java/net/protocol/file/Connection.java:1.3
--- kaffe/libraries/javalib/external/classpath/gnu/java/net/protocol/file/Connection.java:1.2 Sat Nov 26 20:29:55 2005
+++ kaffe/libraries/javalib/external/classpath/gnu/java/net/protocol/file/Connection.java Sun Feb 12 01:10:43 2006
@@ -143,13 +143,13 @@
{
if (str == null)
return null;
- byte[] buf = new byte[str.length()];
+
+ final int MAX_BYTES_PER_UTF_8_CHAR = 3;
+ byte[] buf = new byte[str.length()*MAX_BYTES_PER_UTF_8_CHAR];
int pos = 0;
for (int i = 0; i < str.length(); i++)
{
char c = str.charAt(i);
- if (c > 127)
- throw new MalformedURLException(str + " : Invalid character");
if (c == '%')
{
if (i + 2 >= str.length())
@@ -160,6 +160,17 @@
throw new MalformedURLException(str + " : Invalid quoted character");
buf[pos++] = (byte) (hi * 16 + lo);
}
+ else if (c > 127) {
+ try {
+ byte [] c_as_bytes = Character.toString(c).getBytes("utf-8");
+ for (int j = 0; j < c_as_bytes.length ; j++) {
+ buf[pos++] = c_as_bytes[j];
+ }
+ }
+ catch (java.io.UnsupportedEncodingException x2) {
+ throw (Error) new InternalError().initCause(x2);
+ }
+ }
else
buf[pos++] = (byte) c;
}
Index: kaffe/libraries/javalib/external/classpath/java/net/URLClassLoader.java
diff -u kaffe/libraries/javalib/external/classpath/java/net/URLClassLoader.java:1.3 kaffe/libraries/javalib/external/classpath/java/net/URLClassLoader.java:1.4
--- kaffe/libraries/javalib/external/classpath/java/net/URLClassLoader.java:1.3 Fri Jan 27 22:08:21 2006
+++ kaffe/libraries/javalib/external/classpath/java/net/URLClassLoader.java Sun Feb 12 01:10:43 2006
@@ -723,13 +723,13 @@
{
String file = newUrl.getFile();
String protocol = newUrl.getProtocol();
+ File dir = new File(file);
// If we have a file: URL, we want to make it absolute
// here, before we decide whether it is really a jar.
URL absoluteURL;
if ("file".equals (protocol))
{
- File dir = new File(file);
URL absUrl;
try
{
@@ -756,10 +756,11 @@
}
// Check that it is not a directory
- if (! (file.endsWith("/") || file.endsWith(File.separator)))
- loader = new JarURLLoader(this, newUrl, absoluteURL);
- else if ("file".equals(protocol))
- loader = new FileURLLoader(this, newUrl, absoluteURL);
+ if ("file".equals(protocol))
+ if (dir.isDirectory())
+ loader = new FileURLLoader(this, newUrl, absoluteURL);
+ else
+ loader = new JarURLLoader(this, newUrl, absoluteURL);
else
loader = new RemoteURLLoader(this, newUrl);
More information about the kaffe
mailing list