import java.lang.foreign.Arena;
import java.lang.foreign.FunctionDescriptor;
import java.lang.foreign.Linker;
import java.lang.foreign.MemorySegment;
import java.lang.foreign.ValueLayout;
import java.lang.invoke.MethodHandle;

public class BandingkanKata {
    public static void main(String[] args) throws Throwable {
        // int strcmp(const char *a, const char *b) dari libc.
        Linker linker = Linker.nativeLinker();
        MethodHandle strcmp = linker.downcallHandle(
                linker.defaultLookup().find("strcmp").get(),
                FunctionDescriptor.of(ValueLayout.JAVA_INT,
                        ValueLayout.ADDRESS, ValueLayout.ADDRESS));

        try (Arena arena = Arena.ofConfined()) {
            MemorySegment apel = arena.allocateFrom("apel");
            MemorySegment jeruk = arena.allocateFrom("jeruk");

            int a = (int) strcmp.invoke(apel, jeruk);
            int b = (int) strcmp.invoke(jeruk, apel);
            int c = (int) strcmp.invoke(apel, apel);

            System.out.println("strcmp(\"apel\", \"jeruk\") = " + a);
            System.out.println("strcmp(\"jeruk\", \"apel\") = " + b);
            System.out.println("strcmp(\"apel\", \"apel\")  = " + c);
            System.out.println("tanda hasil: " + Integer.signum(a) + ", "
                    + Integer.signum(b) + ", " + Integer.signum(c));
        }
    }
}
