nufatfs
Version:
A new async-friendly library for accessing FAT16 and FAT32 filesystems
127 lines (126 loc) • 4.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.nameNormalTo83 = exports.namesEqual = exports.name83toNormal = exports.splitExt83 = exports.splitExt = exports.arraysEq = exports.structFormatUnpack = void 0;
const low_level_1 = require("./low-level");
var Endianness;
(function (Endianness) {
Endianness[Endianness["BIG"] = 0] = "BIG";
Endianness[Endianness["LITTLE"] = 1] = "LITTLE";
})(Endianness || (Endianness = {}));
;
const TypeSizeMap = {
b: 1,
c: 1,
h: 2,
i: 4,
l: 4,
q: 8,
};
function structFormatUnpack(format, data, offset = 0) {
let output = [];
let endianness = Endianness.BIG;
let _format = format.split('');
const next = () => _format.splice(0, 1)[0];
const peek = () => _format[0];
if (['<', '>', '@'].includes(peek())) {
let modifier = next();
if (modifier === '<')
endianness = Endianness.LITTLE;
}
let repeat = 0;
let dataIndex = offset;
while (_format.length) {
let char = next();
if ("1234567890".includes(char)) {
// Is a repeat value.
repeat *= 10;
repeat += parseInt(char);
continue;
}
if (char === 'x') {
// Padding
dataIndex += Math.max(1, repeat);
repeat = 0;
continue;
}
else if (char.toLowerCase() in TypeSizeMap) {
// A simple integer
let byteCount = TypeSizeMap[char.toLowerCase()];
for (let i = 0; i < Math.max(1, repeat); i++) {
let resultingInteger = 0;
let bytes = data.slice(dataIndex, dataIndex + byteCount);
dataIndex += byteCount;
// Form an integer
for (let j = 0; j < byteCount; j++) {
let index = endianness === Endianness.LITTLE ? (byteCount - 1 - j) : j;
let byte = bytes[index];
resultingInteger = (resultingInteger << 8) | byte;
}
// Apply two's compliment if needed.
if (char.toLowerCase() !== char) {
// Is upper-case, so unsigned
resultingInteger >>>= 0;
}
output.push(resultingInteger);
}
repeat = 0;
}
else if (char == 's') {
// String.
output.push(data.slice(dataIndex, dataIndex += repeat));
repeat = 0;
}
else {
console.log(`Unknown format char: ${char}`);
}
}
return output;
}
exports.structFormatUnpack = structFormatUnpack;
function arraysEq(a, b) {
if (a.length !== b.length)
return false;
for (let i = 0; i < a.length; i++) {
if (a[i] !== b[i])
return false;
}
return true;
}
exports.arraysEq = arraysEq;
function splitExt(name) {
const index = name.lastIndexOf('.');
return index === -1 ? [name, ''] : [name.slice(0, index), name.slice(index + 1)];
}
exports.splitExt = splitExt;
function splitExt83(name) {
if (name.length !== 8 + 3) {
throw new low_level_1.FatError("Invalid 8.3 file name");
}
return [name.slice(0, 8).trim(), name.slice(8).trim()];
}
exports.splitExt83 = splitExt83;
function name83toNormal(_name) {
const [name, ext] = splitExt83(_name);
return ext === '' ? name : (name + '.' + ext);
}
exports.name83toNormal = name83toNormal;
function namesEqual(normalName, name83) {
const [name1, ext1] = splitExt(normalName);
const [name2, ext2] = splitExt83(name83);
return name1.toLowerCase() === name2.toLowerCase() && ext1.toLowerCase() === ext2.toLowerCase();
}
exports.namesEqual = namesEqual;
function nameNormalTo83(normalName) {
let [name, ext] = splitExt(normalName);
if (name.length > 8)
name = name.substring(0, 8);
if (ext.length > 3)
ext = ext.substring(0, 3);
for (let i = name.length; i < 8; i++)
name += ' ';
for (let i = ext.length; i < 3; i++)
ext += ' ';
name += ext;
return name;
}
exports.nameNormalTo83 = nameNormalTo83;