UNPKG

nufatfs

Version:

A new async-friendly library for accessing FAT16 and FAT32 filesystems

127 lines (126 loc) 4.16 kB
"use strict"; 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;