aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/jogamp/gluegen/CMethodBindingEmitter.java')
-rw-r--r--src/java/com/jogamp/gluegen/CMethodBindingEmitter.java30
1 files changed, 27 insertions, 3 deletions
diff --git a/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java b/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java
index 9c7ed0b..e20a1cb 100644
--- a/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java
+++ b/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java
@@ -1176,12 +1176,36 @@ public class CMethodBindingEmitter extends FunctionEmitter {
unit.emitln(" */");
}
} else if (javaType.isString()) {
+ final boolean pascalString = javaType.isPascalStringVariant();
+ final String lenArgName;
+ if( pascalString ) {
+ final int lenIdx = cfg.pascalStringLengthIndex(getCSymbol(), argIdx);
+ lenArgName = 0 <= lenIdx ? binding.getArgumentName(lenIdx) : null;
+ } else {
+ lenArgName = null;
+ }
if( addLocalVar ) {
- unit.emit(" "+javaType.jniTypeName()+" "+javaArgName+" = ");
+ unit.emitln(" "+javaType.jniTypeName()+" "+javaArgName+";");
+ }
+ if( null != lenArgName ) {
+ unit.emitln(" if (NULL == "+cArgName+" || 0 >= "+lenArgName+" ) {");
} else {
- unit.emit(" "+javaArgName+" = ");
+ unit.emitln(" if (NULL == "+cArgName+") {");
+ }
+ unit.emitln(" "+javaArgName+" = NULL;");
+ unit.emitln(" } else {");
+ if( null != lenArgName ) {
+ unit.emitln(" char* "+cArgName+"_cstr = calloc("+lenArgName+"+1, sizeof(char)); // PascalString -> Add EOS");
+ unit.emitln(" memcpy("+cArgName+"_cstr, "+cArgName+", "+lenArgName+");");
}
- unit.emitln("(NULL == "+cArgName+") ? NULL : (*env)->NewStringUTF(env, (const char *)"+cArgName+");");
+ unit.emit (" "+javaArgName+" = ");
+ if( null != lenArgName ) {
+ unit.emitln("(*env)->NewStringUTF(env, (const char *)"+cArgName+"_cstr);");
+ unit.emitln(" free("+cArgName+"_cstr);");
+ } else {
+ unit.emitln("(*env)->NewStringUTF(env, (const char *)"+cArgName+");");
+ }
+ unit.emitln(" }");
} else if (javaType.isArrayOfCompoundTypeWrappers() ||
( javaType.isArray() && javaType.isNIOByteBufferArray() ) )
{