scroll/src/deno/ffi.ts

54 lines
898 B
JavaScript

// Deno-specific ffi code
import { IFFI } from '../common/runtime.ts';
let suffix = '';
switch (Deno.build.os) {
case 'windows':
suffix = 'dll';
break;
case 'darwin':
suffix = 'dylib';
break;
default:
suffix = 'so.6';
break;
}
const cSharedLib = `libc.${suffix}`;
const cStdLib = Deno.dlopen(
cSharedLib,
{
tcgetattr: {
parameters: ['i32', 'pointer'],
result: 'i32',
},
tcsetattr: {
parameters: ['i32', 'i32', 'pointer'],
result: 'i32',
},
cfmakeraw: {
parameters: ['pointer'],
result: 'void',
},
} as const,
);
const { tcgetattr, tcsetattr, cfmakeraw } = cStdLib.symbols;
let closed = false;
const DenoFFI: IFFI = {
tcgetattr,
tcsetattr,
cfmakeraw,
getPointer: Deno.UnsafePointer.of,
close: () => {
if (!closed) {
cStdLib.close();
closed = true;
}
// Do nothing if FFI library was already closed
},
};
export default DenoFFI;