On 9/18/21 5:40 AM, frame wrote:
On Friday, 17 September 2021 at 14:29:23 UTC, Steven Schveighoffer wrote:

Looking at that signature, it does not appear that it uses zero-termination at all, as it takes a length. So using `dup` and therefore the gc is totally unnecessary.

I'm assuming that string is the barcode argument?

No, the string appears inside the C-function. I'm calling the function with .ptr and the .length property as it expects.

Oh wow, I totally misunderstood what you are doing. I thought you were *calling* that function, but you are *reimplementing* that code in D.

Have you tried:

```d
const(char)* s2 = "...";
```

This will work because string literals are zero terminated and implicitly castable to `immutable(char)*`, which will also implicitly cast to `const(char)*`.

That should allow s2 to be reassigned but not modify the data. IIRC, string literal data even in C is put into a read-only section by many compilers, so the code shouldn't be changing it.

Now that I understand what you are doing, it becomes clear that this isn't a situation of C code being called. Or are you calling other parts of the C library with that translated function?

The first rule of porting -- just translate, don't change anything. I would try to do exactly what C does without using the GC at all. Continue to use malloc/free. If you have issues with type representation, you may need to adjust for that.

-Steve

Reply via email to