elflib
Version:
ELF file reader and writer
71 lines (70 loc) • 2.47 kB
JavaScript
import * as fs from 'fs';
function bufferRead(state, length, position) {
let updatepos = false;
const { array } = state;
if (!array)
return Promise.reject('state.array must be defined');
if (!length)
return Promise.reject('Length must be specified');
if (!position) {
position = state.position;
updatepos = true;
}
if (position <= state.size) {
if (position + length > state.size)
length = state.size - position;
if (length < 0)
length = 0;
if (updatepos)
state.position += length;
// return Promise.resolve(new Uint8Array(array, state.offset + position, length));
return Promise.resolve(array instanceof ArrayBuffer ? new Uint8Array(array) : array);
}
else {
return Promise.reject('read past end of file');
}
}
function createView(from) {
return new DataView(from.buffer, from.byteOffset, from.byteLength);
}
export function buffer(buffer) {
const state = {
array: buffer,
offset: buffer instanceof Uint8Array ? buffer.byteOffset : 0,
position: 0,
size: buffer.byteLength
};
return {
open: () => Promise.resolve(),
size: () => state.size,
close: () => Promise.resolve(),
read: (length, position) => bufferRead(state, length, position),
view: (length, position) => bufferRead(state, length, position).then(createView),
};
}
export function array(array) {
return buffer(Uint8Array.from(array));
}
export async function fileHandle(fh) {
await fh.stat();
return buffer(Uint8Array.from(await fh.readFile()));
}
export function fileDescriptor(handle) {
fs.fstatSync(handle);
return buffer(Uint8Array.from(fs.readFileSync(handle)));
}
export function filePath(path) {
fs.accessSync(path, fs.constants.R_OK);
return buffer(Uint8Array.from(fs.readFileSync(path)));
}
export function HelperDataView(view, bigEndian) {
view.readUInt8 = view.getUint8.bind(view);
view.readUInt16 = (ix) => view.getUint16(ix, !bigEndian);
view.readUInt32 = (ix) => view.getUint32(ix, !bigEndian);
view.readUInt64 = (ix) => view.getBigUint64(ix, !bigEndian);
view.readSInt8 = (ix) => view.getInt8(ix);
view.readSInt16 = (ix) => view.getInt16(ix, !bigEndian);
view.readSInt32 = (ix) => view.getInt32(ix, !bigEndian);
view.readSInt64 = (ix) => view.getBigInt64(ix, !bigEndian);
return view;
}