From d63df04854045c2b53ee903c57452398f92a6b15 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 27 Apr 2021 13:12:55 +0200 Subject: [PATCH] Move the `AsciiHexStream` from `src/core/stream.js` and into its own file --- src/core/ascii_hex_stream.js | 86 ++++++++++++++++++++++++++++++++++++ src/core/parser.js | 2 +- src/core/stream.js | 68 ---------------------------- 3 files changed, 87 insertions(+), 69 deletions(-) create mode 100644 src/core/ascii_hex_stream.js diff --git a/src/core/ascii_hex_stream.js b/src/core/ascii_hex_stream.js new file mode 100644 index 000000000..7446672f3 --- /dev/null +++ b/src/core/ascii_hex_stream.js @@ -0,0 +1,86 @@ +/* Copyright 2012 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* eslint-disable no-var */ + +import { DecodeStream } from "./stream.js"; + +var AsciiHexStream = (function AsciiHexStreamClosure() { + // eslint-disable-next-line no-shadow + function AsciiHexStream(str, maybeLength) { + this.str = str; + this.dict = str.dict; + + this.firstDigit = -1; + + // Most streams increase in size when decoded, but AsciiHex streams shrink + // by 50%. + if (maybeLength) { + maybeLength = 0.5 * maybeLength; + } + DecodeStream.call(this, maybeLength); + } + + AsciiHexStream.prototype = Object.create(DecodeStream.prototype); + + AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() { + var UPSTREAM_BLOCK_SIZE = 8000; + var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); + if (!bytes.length) { + this.eof = true; + return; + } + + var maxDecodeLength = (bytes.length + 1) >> 1; + var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); + var bufferLength = this.bufferLength; + + var firstDigit = this.firstDigit; + for (var i = 0, ii = bytes.length; i < ii; i++) { + var ch = bytes[i], + digit; + if (ch >= /* '0' = */ 0x30 && ch <= /* '9' = */ 0x39) { + digit = ch & 0x0f; + } else if ( + (ch >= /* 'A' = */ 0x41 && ch <= /* 'Z' = */ 0x46) || + (ch >= /* 'a' = */ 0x61 && ch <= /* 'z' = */ 0x66) + ) { + digit = (ch & 0x0f) + 9; + } else if (ch === /* '>' = */ 0x3e) { + this.eof = true; + break; + } else { + // Probably whitespace, ignoring. + continue; + } + if (firstDigit < 0) { + firstDigit = digit; + } else { + buffer[bufferLength++] = (firstDigit << 4) | digit; + firstDigit = -1; + } + } + if (firstDigit >= 0 && this.eof) { + // incomplete byte + buffer[bufferLength++] = firstDigit << 4; + firstDigit = -1; + } + this.firstDigit = firstDigit; + this.bufferLength = bufferLength; + }; + + return AsciiHexStream; +})(); + +export { AsciiHexStream }; diff --git a/src/core/parser.js b/src/core/parser.js index a925aa947..048deae7f 100644 --- a/src/core/parser.js +++ b/src/core/parser.js @@ -15,7 +15,6 @@ import { Ascii85Stream, - AsciiHexStream, FlateStream, NullStream, PredictorStream, @@ -41,6 +40,7 @@ import { Ref, } from "./primitives.js"; import { isWhiteSpace, MissingDataException } from "./core_utils.js"; +import { AsciiHexStream } from "./ascii_hex_stream.js"; import { CCITTFaxStream } from "./ccitt_stream.js"; import { Jbig2Stream } from "./jbig2_stream.js"; import { JpegStream } from "./jpeg_stream.js"; diff --git a/src/core/stream.js b/src/core/stream.js index 54321d23a..1c09cb8aa 100644 --- a/src/core/stream.js +++ b/src/core/stream.js @@ -1081,73 +1081,6 @@ var Ascii85Stream = (function Ascii85StreamClosure() { return Ascii85Stream; })(); -var AsciiHexStream = (function AsciiHexStreamClosure() { - // eslint-disable-next-line no-shadow - function AsciiHexStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - this.firstDigit = -1; - - // Most streams increase in size when decoded, but AsciiHex streams shrink - // by 50%. - if (maybeLength) { - maybeLength = 0.5 * maybeLength; - } - DecodeStream.call(this, maybeLength); - } - - AsciiHexStream.prototype = Object.create(DecodeStream.prototype); - - AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() { - var UPSTREAM_BLOCK_SIZE = 8000; - var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); - if (!bytes.length) { - this.eof = true; - return; - } - - var maxDecodeLength = (bytes.length + 1) >> 1; - var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); - var bufferLength = this.bufferLength; - - var firstDigit = this.firstDigit; - for (var i = 0, ii = bytes.length; i < ii; i++) { - var ch = bytes[i], - digit; - if (ch >= /* '0' = */ 0x30 && ch <= /* '9' = */ 0x39) { - digit = ch & 0x0f; - } else if ( - (ch >= /* 'A' = */ 0x41 && ch <= /* 'Z' = */ 0x46) || - (ch >= /* 'a' = */ 0x61 && ch <= /* 'z' = */ 0x66) - ) { - digit = (ch & 0x0f) + 9; - } else if (ch === /* '>' = */ 0x3e) { - this.eof = true; - break; - } else { - // Probably whitespace, ignoring. - continue; - } - if (firstDigit < 0) { - firstDigit = digit; - } else { - buffer[bufferLength++] = (firstDigit << 4) | digit; - firstDigit = -1; - } - } - if (firstDigit >= 0 && this.eof) { - // incomplete byte - buffer[bufferLength++] = firstDigit << 4; - firstDigit = -1; - } - this.firstDigit = firstDigit; - this.bufferLength = bufferLength; - }; - - return AsciiHexStream; -})(); - var NullStream = (function NullStreamClosure() { // eslint-disable-next-line no-shadow function NullStream() { @@ -1161,7 +1094,6 @@ var NullStream = (function NullStreamClosure() { export { Ascii85Stream, - AsciiHexStream, DecodeStream, DecryptStream, FlateStream,