aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/com/jogamp/gluegen/CMethodBindingEmitter.java
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2023-07-05 10:21:48 +0200
committerSven Gothel <[email protected]>2023-07-05 10:21:48 +0200
commit5ceca8550b82591a6a2661a26d3e0d5e6e3e15ff (patch)
tree95768138afdb5ee4c6d3b705e803ad497241f756 /src/java/com/jogamp/gluegen/CMethodBindingEmitter.java
parentae4c2c3e59ed92caa6f0e18360b7236e50899bf6 (diff)
GlueGen: Add 'PascalString' string semantics (length + value-ptr), added prelim code for JavaCallback use-case emitBodyMapCToJNIType()
It is common in toolkit APIs that a string might not be passed as a 'nul' terminated (EOS) C string, but as a Pascal string with a given length argument. A C string is specied as ArgumentIsString alEventCallbackInject 3 while allowing multiple indices .. A Pascal string can be specified as ArgumentIsPascalString ALEVENTPROCSOFT 3 4 while allowing multiple indice-tuples for length and value .. The tuple consist of the length agrument-index first (usually an int) followed by the value argument-index (usually a 'char*'). +++ CMethodBindingEmitter.emitBodyMapCToJNIType(), where PascalString is implemented, is currently being used for - JNI return statement (no PascalString impact possible) - JavaCallback C type -> JNI type, PascalString impacting
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() ) )
{