123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const ALPHABET =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- const CONTINUATION_BIT = 0x20;
- const END_SEGMENT_BIT = 0x40;
- const NEXT_LINE = END_SEGMENT_BIT | 0x01;
- const INVALID = END_SEGMENT_BIT | 0x02;
- const DATA_MASK = 0x1f;
- const ccToValue = new Uint8Array("z".charCodeAt(0) + 1);
- {
- ccToValue.fill(INVALID);
- for (let i = 0; i < ALPHABET.length; i++) {
- ccToValue[ALPHABET.charCodeAt(i)] = i;
- }
- ccToValue[",".charCodeAt(0)] = END_SEGMENT_BIT;
- ccToValue[";".charCodeAt(0)] = NEXT_LINE;
- }
- const ccMax = ccToValue.length - 1;
- /**
- * @param {string} mappings the mappings string
- * @param {function(number, number, number, number, number, number): void} onMapping called for each mapping
- * @returns {void}
- */
- const readMappings = (mappings, onMapping) => {
- // generatedColumn, [sourceIndex, originalLine, orignalColumn, [nameIndex]]
- const currentData = new Uint32Array([0, 0, 1, 0, 0]);
- let currentDataPos = 0;
- // currentValue will include a sign bit at bit 0
- let currentValue = 0;
- let currentValuePos = 0;
- let generatedLine = 1;
- let generatedColumn = -1;
- for (let i = 0; i < mappings.length; i++) {
- const cc = mappings.charCodeAt(i);
- if (cc > ccMax) continue;
- const value = ccToValue[cc];
- if ((value & END_SEGMENT_BIT) !== 0) {
- // End current segment
- if (currentData[0] > generatedColumn) {
- if (currentDataPos === 1) {
- onMapping(generatedLine, currentData[0], -1, -1, -1, -1);
- } else if (currentDataPos === 4) {
- onMapping(
- generatedLine,
- currentData[0],
- currentData[1],
- currentData[2],
- currentData[3],
- -1
- );
- } else if (currentDataPos === 5) {
- onMapping(
- generatedLine,
- currentData[0],
- currentData[1],
- currentData[2],
- currentData[3],
- currentData[4]
- );
- }
- generatedColumn = currentData[0];
- }
- currentDataPos = 0;
- if (value === NEXT_LINE) {
- // Start new line
- generatedLine++;
- currentData[0] = 0;
- generatedColumn = -1;
- }
- } else if ((value & CONTINUATION_BIT) === 0) {
- // last sextet
- currentValue |= value << currentValuePos;
- const finalValue =
- currentValue & 1 ? -(currentValue >> 1) : currentValue >> 1;
- currentData[currentDataPos++] += finalValue;
- currentValuePos = 0;
- currentValue = 0;
- } else {
- currentValue |= (value & DATA_MASK) << currentValuePos;
- currentValuePos += 5;
- }
- }
- // End current segment
- if (currentDataPos === 1) {
- onMapping(generatedLine, currentData[0], -1, -1, -1, -1);
- } else if (currentDataPos === 4) {
- onMapping(
- generatedLine,
- currentData[0],
- currentData[1],
- currentData[2],
- currentData[3],
- -1
- );
- } else if (currentDataPos === 5) {
- onMapping(
- generatedLine,
- currentData[0],
- currentData[1],
- currentData[2],
- currentData[3],
- currentData[4]
- );
- }
- };
- module.exports = readMappings;
|