diff --git a/.eslintrc b/.eslintrc index 8dc3744..3ae0c77 100644 --- a/.eslintrc +++ b/.eslintrc @@ -5,14 +5,14 @@ "ecmaVersion": 3, }, "plugins": [ "html", "json" ], - "extends": "eslint:recommended", + "!extends": "eslint:recommended", "rules": { - "comma-style": [ 2, "last" ], - "comma-dangle": [ 2, "never" ], - "curly": 0, - "no-bitwise": 0, "no-console": 0, + "no-bitwise": 0, + "curly": 0, + "comma-style": [ 2, "last" ], "no-trailing-spaces": 2, - "semi": [ 2, "always" ] + "semi": [ 2, "always" ], + "comma-dangle": [ 2, "never" ] } } diff --git a/.gitignore b/.gitignore index 159e4fc..bc55255 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,3 @@ node_modules misc/coverage.html ctest/sauce* *.sheetjs -*.tgz diff --git a/.spelling b/.spelling deleted file mode 100644 index ce339f3..0000000 --- a/.spelling +++ /dev/null @@ -1,40 +0,0 @@ -# printj (C) 2016-present SheetJS -- http://sheetjs.com -SheetJS -printj -printf - -# printf-related terms -16-bit -32-bit -52-bit -64-bit -base-10 -fmt - -# Third-party -AltiVec -FreeBSD -glibc -libc -nodejs -npm -unicode - -# Other terms -CommonJS -NaN -UTF-16 -accessor -bitwise -codepages -conformant -errno -falsy -runtime -trigraphs -truthy -typeof -valueOf -variadic -whitespace - diff --git a/.travis.yml b/.travis.yml index fc97c87..c529897 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: node_js node_js: - - "9" - "8" - "7" - "6" diff --git a/LICENSE b/LICENSE index 4a5a262..de06dc2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,192 +1,4 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright (C) 2016-present SheetJS LLC +Copyright (C) 2016-present SheetJS Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -199,3 +11,4 @@ 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. + diff --git a/Makefile b/Makefile index d3e7d23..eef66b3 100644 --- a/Makefile +++ b/Makefile @@ -9,16 +9,8 @@ ULIB=$(shell echo $(LIB) | tr a-z A-Z) DEPS=$(sort $(wildcard bits/*.js)) TARGET=$(LIB).js FLOWTARGET=$(LIB).flow.js -MJSTARGET=$(LIB).mjs FLOWTGTS=$(TARGET) $(AUXTARGETS) CLOSURE=/usr/local/lib/node_modules/google-closure-compiler/compiler.jar -UGLIFY="./node_modules/@sheetjs/uglify-js/bin/uglifyjs" -JSCS=./node_modules/.bin/jscs -JSHINT=./node_modules/.bin/jshint -MOCHA=./node_modules/.bin/mocha -ESLINT=./node_modules/.bin/eslint -ALEX=./node_modules/.bin/alex -MDSPELL=./node_modules/.bin/mdspell ## Main Targets @@ -34,7 +26,6 @@ $(FLOWTGTS): %.js : %.flow.js $(FLOWTARGET): $(DEPS) lib cp lib/$(REQS).js $(FLOWTARGET) - cp lib/$(REQS).mjs $(MJSTARGET) bits/01_version.js: package.json echo "$(ULIB).version = '"`grep version package.json | awk '{gsub(/[^0-9a-z\.-]/,"",$$2); print $$2}'`"';" > $@ @@ -44,22 +35,18 @@ clean: clean-stress ## Remove targets and build artifacts @OUTDIR=$(PWD)/lib make -C bits clean rm -f $(TARGET) $(FLOWTARGET) -.PHONY: init -init: ## Initial setup for development - npm i - .PHONY: dist dist: $(TARGET) ## Prepare JS files for distribution cp $(TARGET) dist/ cp LICENSE dist/ - $(UGLIFY) $(TARGET) -o dist/$(LIB).min.js --source-map dist/$(LIB).min.map --preamble "$$(head -n 1 bits/00_header.js)" + uglifyjs $(TARGET) -o dist/$(LIB).min.js --source-map dist/$(LIB).min.map --preamble "$$(head -n 1 bits/00_header.js)" misc/strip_sourcemap.sh dist/$(LIB).min.js ## Testing .PHONY: test mocha test mocha: test.js $(TARGET) ## Run test suite - $(MOCHA) -R spec -t 20000 + mocha -R spec -t 20000 .PHONY: ctest ctest: ## Build browser test (into ctest/ subdirectory) @@ -83,21 +70,18 @@ clean-stress: ## Remove stress tests ## Code Checking -.PHONY: fullint -fullint: lint old-lint tslint mdlint ## Run all checks - .PHONY: lint lint: $(TARGET) ## Run eslint checks - @$(ESLINT) --ext .js,.njs,.json,.html,.htm $(TARGET) $(AUXTARGETS) $(CMDS) $(HTMLLINT) package.json + @eslint --ext .js,.njs,.json,.html,.htm $(TARGET) $(AUXTARGETS) $(CMDS) $(HTMLLINT) package.json bower.json if [ -e $(CLOSURE) ]; then java -jar $(CLOSURE) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi .PHONY: old-lint old-lint: $(TARGET) ## Run jshint and jscs checks - @$(JSHINT) --show-non-errors $(TARGET) $(AUXTARGETS) - @$(JSHINT) --show-non-errors $(CMDS) - @$(JSHINT) --show-non-errors package.json - @$(JSHINT) --show-non-errors --extract=always $(HTMLLINT) - @$(JSCS) lib/*.js + @jshint --show-non-errors $(TARGET) $(AUXTARGETS) + @jshint --show-non-errors $(CMDS) + @jshint --show-non-errors package.json + @jshint --show-non-errors --extract=always $(HTMLLINT) + @jscs lib/*.js if [ -e $(CLOSURE) ]; then java -jar $(CLOSURE) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi .PHONY: tslint @@ -113,17 +97,11 @@ flow: lint ## Run flow checker cov: misc/coverage.html ## Run coverage test misc/coverage.html: $(TARGET) test.js - $(MOCHA) --require blanket -R html-cov -t 20000 > $@ + mocha --require blanket -R html-cov -t 20000 > $@ .PHONY: coveralls coveralls: ## Coverage Test + Send to coveralls.io - $(MOCHA) --require blanket --reporter mocha-lcov-reporter -t 20000 | node ./node_modules/coveralls/bin/coveralls.js - -MDLINT=README.md -.PHONY: mdlint -mdlint: $(MDLINT) ## Check markdown documents - $(ALEX) $^ - $(MDSPELL) -a -n -x -r --en-us $^ + mocha --require blanket --reporter mocha-lcov-reporter -t 20000 | node ./node_modules/coveralls/bin/coveralls.js .PHONY: help help: diff --git a/README.md b/README.md index 41286bb..d28af52 100644 --- a/README.md +++ b/README.md @@ -7,73 +7,10 @@ compliance, performance and IE6+ support. PRINTJ.sprintf("Hello %s!", "World"); ``` -A self-contained specification of the printf format string is included below in -[this README](#printf-format-string-specification), as well as a summary of the +A self-contained specification of the printf format string is included below in [this README](#printf-format-string-specification), as well as a summary of the [support against various printf implementations](#support-summary) -## Table of Contents - -
- Table of Contents (click to show) - - - - * [Installation](#installation) - + [ES Module Support](#es-module-support) - * [Usage](#usage) - * [Testing](#testing) - * [License](#license) - * [Badges](#badges) -- [printf format string specification](#printf-format-string-specification) - + [Original C Interface](#original-c-interface) - + [JS and C strings](#js-and-c-strings) - + [JS Interface](#js-interface) - * [Specifier heritage and regular expression](#specifier-heritage-and-regular-expression) - * [Conversion Specifier Quick Reference Table](#conversion-specifier-quick-reference-table) - * [Parameter Selection](#parameter-selection) - * [Dynamic Specifiers](#dynamic-specifiers) -- [C Data Model](#c-data-model) - + [Integer Types](#integer-types) - + [Character and String Types](#character-and-string-types) - + [Floating Point Number Types](#floating-point-number-types) - * [Implementation](#implementation) -- [Integer Conversions](#integer-conversions) - * [Restricting Integer Values](#restricting-integer-values) - * [Length Specifiers for Integer Conversions](#length-specifiers-for-integer-conversions) - * [Rendering Unsigned Integers in Base 10 ("u" and "U" conversions)](#rendering-unsigned-integers-in-base-10-u-and-u-conversions) - * [Rendering Unsigned Integers in Base 8 ("o" and "O" conversions)](#rendering-unsigned-integers-in-base-8-o-and-o-conversions) - * [Rendering Unsigned Integers in Base 16 ("x" and "X" conversions)](#rendering-unsigned-integers-in-base-16-x-and-x-conversions) - * [Rendering Signed Integers in Base 10 ("d" "i" and "D" conversions)](#rendering-signed-integers-in-base-10-d-i-and-d-conversions) -- [Floating Point Conversions](#floating-point-conversions) - * [Infinity, NaN, and Negative Zero](#infinity-nan-and-negative-zero) - * [Exponential Form ("e" and "E" conversions)](#exponential-form-e-and-e-conversions) - * [Standard Form ("f" and "F" conversions)](#standard-form-f-and-f-conversions) - * [Value-dependent Form ("g" and "G" conversions)](#value-dependent-form-g-and-g-conversions) - * [Hex-Mantissa Decimal-Binary-Exponent Form ("a" and "A" conversions)](#hex-mantissa-decimal-binary-exponent-form-a-and-a-conversions) -- [Character Conversions](#character-conversions) - * [Rendering Strings ("s" and "S" conversions)](#rendering-strings-s-and-s-conversions) - * [Rendering Characters ("c" and "C" conversions)](#rendering-characters-c-and-c-conversions) -- [Non-Numeric Conversions](#non-numeric-conversions) - * [The literal "%" symbol ("%" conversion)](#the-literal-%25-symbol-%25-conversion) - * [Interpreting and Rendering Pointers ("p" conversion)](#interpreting-and-rendering-pointers-p-conversion) - * [Extracting length of a partial conversion ("n" conversion)](#extracting-length-of-a-partial-conversion-n-conversion) - * [Error messages ("m" conversion)](#error-messages-m-conversion) -- [Extensions](#extensions) - * [Rendering Boolean Values ("y" and "Y" conversions)](#rendering-boolean-values-y-and-y-conversions) - * [Rendering JSON ("J" conversion)](#rendering-json-j-conversion) - * [JS typeof and valueOf ("T" and "V" conversion)](#js-typeof-and-valueof-t-and-v-conversion) - * [Rendering Unsigned Integers in Base 2 ("b" and "B" conversions)](#rendering-unsigned-integers-in-base-2-b-and-b-conversions) -- [Miscellaneous Notes](#miscellaneous-notes) - * [Format Characters](#format-characters) - * [JS and C strings](#js-and-c-strings-1) - * [Browser Deviations](#browser-deviations) - * [Support Summary](#support-summary) - - - -
- ## Installation With [npm](https://www.npmjs.org/package/printj): @@ -93,40 +30,9 @@ The browser exposes a variable `PRINTJ` When installed globally, npm installs a script `printj` that renders the format string with the given arguments. Running the script with `-h` displays help. -The script will manipulate `module.exports` if available. This is not always -desirable. To prevent the behavior, define `DO_NOT_EXPORT_PRINTJ` - -### ES Module Support - -The bundle ships with a `printj.mjs` script that acts as an ES Module. - -**NodeJS** - -NodeJS 12+ support ES modules. The default import uses the CommonJS script: - -```js -import PRINTJ from "printj"; -``` - -It is possible to use the ESM powered script referencing `printj.mjs` directly: - -```js -import * as PRINTJ from "printj/printj.mjs"; // pull all exports -import { sprintf } from "printj/printj.mjs"; // pull `sprintf` -``` - -**Browser Module Support** - -Chrome 61+ and Safari 11+ support module imports in the web browser. The `.mjs` -script can be imported from a `script type=module` block: - -```html - -``` - +The script will manipulate `module.exports` if available (e.g. in a CommonJS +`require` context). This is not always desirable. To prevent the behavior, +define `DO_NOT_EXPORT_PRINTJ` ## Usage @@ -185,9 +91,13 @@ requires access to a C compiler. Please consult the attached LICENSE file for details. All rights not explicitly granted by the Apache 2.0 license are reserved by the Original Author. + +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FSheetJS%2Fprintj.svg?type=large)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FSheetJS%2Fprintj?ref=badge_large) + ## Badges [![Build Status](https://saucelabs.com/browser-matrix/printj.svg)](https://saucelabs.com/u/printj) +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FSheetJS%2Fprintj.svg?type=shield)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FSheetJS%2Fprintj?ref=badge_shield) [![Build Status](https://travis-ci.org/SheetJS/printj.svg?branch=master)](https://travis-ci.org/SheetJS/printj) @@ -197,6 +107,8 @@ granted by the Apache 2.0 license are reserved by the Original Author. [![Dependencies Status](https://david-dm.org/sheetjs/printj/status.svg)](https://david-dm.org/sheetjs/printj) +[![ghit.me](https://ghit.me/badge.svg?repo=sheetjs/printj)](https://ghit.me/repo/sheetjs/printj) + [![Analytics](https://ga-beacon.appspot.com/UA-36810333-1/SheetJS/printj?pixel)](https://github.com/SheetJS/printj) # printf format string specification @@ -217,8 +129,8 @@ but have different interfaces reflecting different input and output behaviors. Some functions have wide variants that use wide `wchar_t *` strings rather than normal C `char *`. The following variants are required by the POSIX spec: -| function | max length | output destination | vintage | wide form | -|:-----------|:-----------|:----------------------|:--------|:-----------| +| function | max length | output destination | vintage | wide ver | +|------------|------------|-----------------------|---------|------------| | `printf` | unbounded | standard output | K&R | `wprintf` | | `fprintf` | unbounded | stream (`FILE *`) | K&R | `fwprintf` | | `sprintf` | unbounded | string (`char *`) | K&R | `swprintf` | @@ -277,7 +189,7 @@ various string functions are included at the end of the document. ## Specifier heritage and regular expression -Note: The regular expressions follow Perl `/x` style. Whitespace characters +Note: The regular expressions follow perl `/x` style. Whitespace characters outside of character classes are ignored. `#` is a comment character and every character until the end of the line is ignored. To convert to a standard regex: @@ -356,10 +268,10 @@ Combining the various extensions yields the following regular expression: ```perl /%(?: %| # literal %% (flags etc prohibited) - ([1-9]\d*\$)? # positional parameter + (\d+\$)? # positional parameter ([-+ 0\x23\x27]*)? # flags - ([1-9]\d*|\*(?:[1-9]\d*\$)?)? # width - (?:\.(\d+|\*(?:[1-9]\d*\$)?))? # precision + (\d*|\*(?:\d+\$)?) # width + (?:\.(\d+|\*(?:\d+\$)?))? # precision (hh?|ll?|[LzjtqZIw])? # length ([diouxXfFeEgGaAcCsSpnDUOmbByYJVT]) # conversion specifier )/x @@ -390,7 +302,7 @@ This implementation explicitly does not support certain non-standard extensions: | `i` | integral | cast to C `int`, standard form decimal (alias of `d`) | | `J` | extended | prints objects using JSON or `util.inspect` | | `m` | misc | prints info about Error objects (JS equivalent of `errno`) | -| `n` | misc | do not print! store number of chars written to `.len` field | +| `n` | misc | do not print! stores number of chars written to arg `.len` | | `o` | integral | cast to C `unsigned int`, standard form octal | | `O` | integral | cast to C `unsigned long`, standard form octal | | `p` | misc | print `"l"` field of object (fake pointer) | @@ -415,8 +327,8 @@ printf("Count to 3: %d %d %d", 1, 2, 3); // Count to 3: 1 2 3 ``` POSIX `printf` permits explicit argument selection, bypassing the standard -behavior of consuming arguments in order. To specify the argument at position -`n`, use `n$` immediately after the `%` token: +behavior of using the arguments in order. To select the `n`-th argument, use +`n$` immediately after the `%` token to select an argument for the conversion: ```C printf("%d %d %d", 1, 2, 3); // 1 2 3 (implicit order 1, 2, 3 ) @@ -555,11 +467,11 @@ Numerous "C data models", specifying the bit/byte sizes of the various types, have been and continue to be used. For example, OSX and other modern 64-bit UNIX flavors use the "LP64" C data model. 64-bit Windows currently uses the "LLP64" model. 32-bit systems generally use the "ILP32" model. The 8-bit byte -sizes for the data types under the various models are defined in `ctypes.json` +sizes for the various types under the various models are defined in ctypes.json in the `Models` object as per the following table: -| type | JSON key | LP64 | ILP32 | LLP64 | -|:------------|:------------|-----:|------:|------:| +| type | ctypes.json | LP64 | ILP32 | LLP64 | +|-------------|-------------|-----:|------:|------:| | `char` | `char` | 1 | 1 | 1 | | `short` | `short` | 2 | 2 | 2 | | `int` | `int` | 4 | 4 | 4 | @@ -627,7 +539,7 @@ lengths exceeding 32 bits, `Math.round` is appropriate. |------|---------------------------|-------------------------------------------| | 8 | `V & 0xFF` | `V &= 0xFF; if(V > 0x7F) V-= 0x100` | | 16 | `V & 0xFFFF` | `V &= 0xFFFF; if(V > 0x7FFF) V-= 0x10000` | -| 32 | `V >>> 0` | `V \| 0` | +| 32 | `V >>> 0` | `V | 0` | | 64 | `Math.abs(Math.round(V))` | `Math.round(V)` | ## Length Specifiers for Integer Conversions @@ -647,16 +559,16 @@ is signed or unsigned according to the conversion specifier. If a length is specified, it overrides the implied length of the conversion. The following table describes the behavior of this implementation: -| implied C type | JSON key | length | conversion default | -|:-----------------------------|:------------|:--------:|:-------------------| -| `[unsigned] int` | `int` | (none) | `d i o u x X` | -| `[unsigned] char` | `char` | `hh` | -| `[unsigned] short` | `short` | `h` | -| `[unsigned] long` | `long` | `l` | `D U O` | -| `[unsigned] long long` | `longlong` | `L ll q` | -| `intmax_t` or `uintmax_t` | `intmax_t` | `j` | -| `size_t` or `ssize_t` | `size_t` | `z Z` | -| `ptrdiff_t` or unsigned form | `ptrdiff_t` | `t` | +| implied C type | ctypes.json | length | conv default | +|:------------------------------------|:------------|:------:|:-------------| +| `int` or `unsigned int` | `int` | (none) | d i o u x X | +| `char` or `unsigned char` | `char` | hh | +| `short` or `unsigned short` | `short` | h | +| `long` or `unsigned long` | `long` | l | D U O | +| `long long` or `unsigned long long` | `longlong` | L ll q | +| `intmax_t` or `uintmax_t` | `intmax_t` | j | +| `size_t` or `ssize_t` | `size_t` | z Z | +| `ptrdiff_t` or unsigned variant | `ptrdiff_t` | t | ## Rendering Unsigned Integers in Base 10 ("u" and "U" conversions) @@ -707,7 +619,7 @@ JS recognizes a few special IEEE754 values, as described in the following table: |------------:|:--------------|:-----------------------------------------------| | `Infinity` | `1./0.` | Positive limiting value `lim{x->0+} 1/x` | | `-Infinity` | `-1./0.` | Negative limiting value `lim{x->0+} -1/x` | -| `NaN` | `0./0.` | Placeholder for "not-a-number" such as `0./0.` | +| `NaN` | `0./0.` | Placeholder for "not-a-number" e.g. `0./0.` | | `-0.` | `-1/Infinity` | Negative limiting value `lim{x->0-} x` | JS `Number` methods render different strings from the POSIX spec: @@ -717,7 +629,7 @@ JS `Number` methods render different strings from the POSIX spec: | `Infinity` | `"inf" "INF"` or `"infinity" "INFINITY"` | `"Infinity"` | | `-Infinity` | `"-inf" "-INF"` or `"-infinity" "-INFINITY"` | `"-Infinity"` | | `NaN` | `"[-]nan" "[-]NAN"` w/opt parenthesized chars | `"NaN"` | -| `-0.` | uses negative sign (`"-0"` under `"%f"`) | same as `+0.` | +| `-0.` | uses negative sign (e.g. `"-0"` under `"%f"`) | same as `+0.` | This implementation performs the required adjustments. @@ -726,10 +638,10 @@ This implementation performs the required adjustments. Aside from the special cases discussed above, JS `num.toExponential(prec)` differs from POSIX `printf("%1$.*2$e", num, prec)` in the exponent field: JS writes exponents with the fewest digits (POSIX requires 2+ digits). This is -addressed by inspecting the output string and inserting a "0" when needed. +easily fixed by inspecting the output string and inserting a "0" when needed. The optional `#` flag forces the decimal point to appear when precision is 0. -This is also fixed by adding a decimal point just before the "e". +This is also easily corrected by adding a decimal point just before the "e". ## Standard Form ("f" and "F" conversions) @@ -748,12 +660,12 @@ The final form (exponential or standard) is determined based on the value. The threshold is different from the JS `toString` / `toPrecision` thresholds and depends on the specified precision as well as the base-10 exponent: -| Value | `"%.3g"` | `toPrecision(3)` | -|------------:|:-----------|:-----------------| -| `1.2345e-4` | `0.000123` | `0.000123` | -| `1.2345e-5` | `1.23e-05` | `0.0000123` | -| `1.2345e-6` | `1.23e-06` | `0.00000123` | -| `1.2345e-7` | `1.23e-07` | `1.23e-7` | +| Value | `"%.3g"` | `toPrecision(3)` | +|----------:|:-----------|:-----------------| +| 1.2345e-4 | `0.000123` | `0.000123` | +| 1.2345e-5 | `1.23e-05` | `0.0000123` | +| 1.2345e-6 | `1.23e-06` | `0.00000123` | +| 1.2345e-7 | `1.23e-07` | `1.23e-7` | According to JS spec, `toPrecision` uses standard form when `precision > E` and `E >= -6`. For printf standard form is used when `precision > E` and `E >= -4`. @@ -765,24 +677,24 @@ the exponent expression, and radix of the exponent expression. The standard exponential form uses decimal for all three parts. For base 16, there are quite a few reasonable combinations. Consider the value `1.234567e-80`: -| Mantissa | Exp Base | Radix 10 (sigil `";"`) | Radix 16 (sigil `";"`) | -|:--------:|:--------:|:-----------------------|:-----------------------| -| 10 | 10 | `1.234567;-80` | `1.234567;-50` | -| 16 | 10 | `1.3c0c9539b8887;-80` | `1.3c0c9539b8887;-50` | -| 16 | 16 | `5.daf8c8f5f4104;-67` | `5.daf8c8f5f4104;-43` | -| 16 | 4 | `1.76be323d7d041;-133` | `1.76be323d7d041;-85` | -| 16 | 2 | `1.76be323d7d041;-266` | `1.76be323d7d041;-10a` | +| Mant | Exp Base | Radix-10 (sigil `";"`) | Radix-16 (sigil `";"`) | +|:----:|:--------:|:-----------------------|:-----------------------| +| 10 | 10 | `1.234567;-80` | `1.234567;-50` | +| 16 | 10 | `1.3c0c9539b8887;-80` | `1.3c0c9539b8887;-50` | +| 16 | 16 | `5.daf8c8f5f4104;-67` | `5.daf8c8f5f4104;-43` | +| 16 | 4 | `1.76be323d7d041;-133` | `1.76be323d7d041;-85` | +| 16 | 2 | `1.76be323d7d041;-266` | `1.76be323d7d041;-10a` | POSIX `"%a"` uses a hex mantissa (16), decimal exponent radix (10), and binary exponent base (2). The general normalized form requires that the integral part of the mantissa to exceed 0 and not to exceed `exponent base - 1` except in the special case of `0`. The sigil is `p` and exponent sign is always used. -JS `num.toString(radix)` is implementation-dependent for radices other than 10 +JS `num.toString(radix)` is implementation-dependent for valid non-10 radices (`2-9, 11-36`). IE uses hex-mantissa decimal-hex-exponent form when the absolute value of the base-2 exponent exceeds 60. Otherwise, IE uses an exact standard hexadecimal form. Chrome, Safari and other browsers always use the -exact standard hexadecimal form. Both forms are converted to `"%a"` by +exact standard hexadecimal form. Both forms are easily converted to `"%a"` by calculating and dividing by the appropriate power of 2. For each non-zero normal floating point value, there are 4 acceptable strings @@ -932,7 +844,7 @@ In all forms other than `"%m"`, an argument will be processed as follows: - If the `errno` field is set, emit "Error number " followed by the errno - Otherwise emit "Error " followed by the error interpreted as a String -```js +``` var x = new Error("sheetjs"); x.errno = 69; x.toString = function() { return "SHEETJS"; }; printf("|%#m|", x); // |sheetjs| @@ -994,7 +906,7 @@ Width, precision and other flags are ignored. Under the "T" conversion, the result of `typeof arg` is rendered. If the `#` flag is specified, the type is derived from `Object.prototype.toString`: -```js +``` printf("%1$T %1$#T", 1); // 'number Number' printf("%1$T %1$#T", 'foo'); // 'string String' printf("%1$T %1$#T", [1,2,3]); // 'object Array' @@ -1004,7 +916,7 @@ printf("%1$T %1$#T", undefined); // 'undefined Undefined' Under the "V" conversion, the result of `arg.valueOf()` is rendered: -```js +``` var _f = function() { return "f"; }; var _3 = function() { return 3; }; printf("%1$d %1$s %1$V", {toString:_f}); // '0 f f' @@ -1091,5 +1003,4 @@ no attempt is made to correct for them. The test suite ignores those cases: - Parser accepts but does not emulate CRT wide and unicode character conversions - glibc `Z` length conversion and extended `m` error support - Parser fails on CRT `I32`/`I64` fixed lengths -- Default `LP64` data model but can be configured to support `ILP32` or `LLP64` - +- Default `LP64` data model but can be configured to support `ILP32` or `LLP64` \ No newline at end of file diff --git a/bin/printj.njs b/bin/printj.njs index 5e1ae8d..74920f6 100755 --- a/bin/printj.njs +++ b/bin/printj.njs @@ -1,9 +1,7 @@ #!/usr/bin/env node -/* printj.js (C) 2016-present SheetJS -- https://sheetjs.com */ -/* eslint-env node */ +/* printj.js (C) 2016-present SheetJS -- http://sheetjs.com */ /* vim: set ts=2 ft=javascript: */ /*jshint node:true, evil:true */ -require("../shim"); var X = require("../"), argv = process.argv; function help() { @@ -28,7 +26,8 @@ function help() { " $ printj '|%s is %s|' s:1+2 e:1+2 # |1+2 is 3|", " $ printj '|%c %c|' s:69 n:69 # |6 E|", "", -"Web Demo: https://oss.sheetjs.com/printj/" +"Support email: dev@sheetjs.com", +"Web Demo: http://oss.sheetjs.com/printj/" ].forEach(function(l) { console.log(l); }); return 0; } @@ -43,7 +42,6 @@ function parse_arg(arg/*:string*/)/*:any*/ { case /*e*/ 101: return eval(m); case /*s*/ 115: return m; } - void p; return arg; } diff --git a/bits/00_header.js b/bits/00_header.js index 2cd78d2..32a09a3 100644 --- a/bits/00_header.js +++ b/bits/00_header.js @@ -4,15 +4,9 @@ /*exported PRINTJ */ /*:: declare var DO_NOT_EXPORT_PRINTJ:?boolean; */ /*:: declare function define(cb:()=>any):void; */ -#ifdef USE_ESM -var PRINTJ/*:PRINTJModule*/ = /*::(*/{}/*:: :any)*/; -#include "01_version.js" -export const version = PRINTJ.version; -#else var PRINTJ/*:PRINTJModule*/; (function (factory/*:(a:any)=>void*/)/*:void*/ { /*jshint ignore:start */ - /*eslint-disable */ if(typeof DO_NOT_EXPORT_PRINTJ === 'undefined') { if('object' === typeof exports) { factory(exports); @@ -28,8 +22,6 @@ var PRINTJ/*:PRINTJModule*/; } else { factory(PRINTJ = /*::(*/{}/*:: :any)*/); } - /*eslint-enable */ /*jshint ignore:end */ }(function(PRINTJ/*:PRINTJModule*/) { #include "01_version.js" -#endif diff --git a/bits/01_version.js b/bits/01_version.js index c39cf20..3633660 100644 --- a/bits/01_version.js +++ b/bits/01_version.js @@ -1 +1 @@ -PRINTJ.version = '1.3.1'; +PRINTJ.version = '1.1.0'; diff --git a/bits/02_regexp.js b/bits/02_regexp.js index 31a7535..f00e292 100644 --- a/bits/02_regexp.js +++ b/bits/02_regexp.js @@ -1,3 +1,3 @@ -var REGEX/*:RegExp*/ = /%(?:%|([1-9]\d*\$)?([-+ 0#']*)?([1-9]\d*|\*(?:[1-9]\d*\$)?)?(?:\.(\d+|\*(?:[1-9]\d*\$)?))?(hh?|ll?|[LzjtqZIw])?([diouxXfFeEgGaAcCsSpnDUOmbByYJVT]))/g; -/* |A-----------AB----------BC---------------------------CD----------------------------DE-------------------EF---------------------------------F| */ +var REGEX/*:RegExp*/ = /%(?:%|(\d+\$)?([-+ 0#']*)?(\d*|\*(?:\d+\$)?)(?:\.(\d+|\*(?:\d+\$)?))?(hh?|ll?|[LzjtqZIw])?([diouxXfFeEgGaAcCsSpnDUOmbByYJVT]))/g; +/* |A------AB----------BC----------------CD-----------------------DE-------------------EF---------------------------------F| */ diff --git a/bits/10_tokenize.js b/bits/10_tokenize.js index 2a4ca74..0a5277b 100644 --- a/bits/10_tokenize.js +++ b/bits/10_tokenize.js @@ -4,11 +4,8 @@ #define GETCHAR c = fmt.charCodeAt(i); #endif -var tcache = {}; - #define DRAIN(idx) if(start < idx) out.push(["L", fmt.substring(start, idx)]); function tokenize(fmt/*:string*/)/*:ParsedFmt*/ { - if(tcache[fmt]) return tcache[fmt]; var out/*:ParsedFmt*/ = []; var start/*:number*/ = 0; @@ -19,7 +16,7 @@ function tokenize(fmt/*:string*/)/*:ParsedFmt*/ { DRAIN(m.index) start = m.index + m[0].length; if(m[0] === "%%") out.push(["%","%"]); - else out.push([m[6], m[0]||"", m[1]||"", m[2]||"", m[3]||"", m[4]||"", m[5]||""]); + else out.push([m[6], m[0], m[1], m[2], m[3], m[4], m[5]]); } #else /* NOT USE_REGEX */ @@ -77,5 +74,5 @@ function tokenize(fmt/*:string*/)/*:ParsedFmt*/ { #endif /* USE_REGEX */ if(start < fmt.length) out.push(["L", fmt.substring(start)]); - return (tcache[fmt] = out); + return out; } diff --git a/bits/40_macros.js b/bits/40_macros.js index 46811bd..47b4e92 100644 --- a/bits/40_macros.js +++ b/bits/40_macros.js @@ -1,5 +1,12 @@ #define isnan isNaN -#define PAD_(x,c) (x >= 0 ? c.repeat(x) : "") +//#define PAD_(x,c) (x >= 0 ? new Array(((x)|0) + 1).join((c)) : "") +var padstr/*:{[s:string]:string}*/ = { + " ": " ", + "0": "000000000000000000000000000000000", + "7": "777777777777777777777777777777777", + "f": "fffffffffffffffffffffffffffffffff" +}; +#define PAD_(x,c) (x >= 0 ? padstr[c].substr(0,x) : "") #ifdef DO_NOT_INLINE function pads(x/*:number*/, c/*:string*/)/*:string*/ { return PAD_(x,c); } #define PADS(x,c) pads(x,c) diff --git a/bits/50_doit.js b/bits/50_doit.js index 229355b..a359aea 100644 --- a/bits/50_doit.js +++ b/bits/50_doit.js @@ -1,17 +1,13 @@ #include "30_ctypes.js" #include "40_macros.js" -#ifdef USE_ESM -var u_inspect/*:(o:any)=>string*/ = JSON.stringify; -#else /*:: var util = require('util'); */ /*global process:true, util:true, require:true */ if(typeof process !== 'undefined' && !!process.versions && !!process.versions.node) util=require("util"); var u_inspect/*:(o:any)=>string*/ = (typeof util != 'undefined') ? util.inspect : JSON.stringify; -#endif + function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { - //var o/*:Array*/ = []; - var o = ""; + var o/*:Array*/ = []; var argidx/*:number*/ = 0, idx/*:number*/ = 0; var Vnum/*:number*/ = 0; var pad/*:string*/ = ""; @@ -19,24 +15,24 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { var m/*:ParsedEntry*/ = t[i], c/*:number*/ = (m[0]/*:string*/).charCodeAt(0); /* m order: conv full param flags width prec length */ - if(c === /*L*/ 76) { o += /*o.push*/(m[1]); continue; } - if(c === /*%*/ 37) { o += /*o.push*/("%"); continue; } + if(c === /*L*/ 76) { o.push(m[1]); continue; } + if(c === /*%*/ 37) { o.push("%"); continue; } var O/*:string*/ = ""; var isnum/*:number*/ = 0, radix/*:number*/ = 10, bytes/*:number*/ = SIZEOF_INT, sign/*:boolean*/ = false; /* flags */ - var flags/*:string*/ = m[IDX_FLAGS]/*||""*/; + var flags/*:string*/ = m[IDX_FLAGS]||""; var alt/*:boolean*/ = flags.indexOf("#") > -1; /* position */ - if(m[IDX_POS]) argidx = parseInt(m[IDX_POS], 10)-1; + if(m[IDX_POS]) argidx = parseInt(m[IDX_POS])-1; /* %m special case */ - else if(c === /*m*/ 109 && !alt) { o += /*.push*/("Success"); continue; } + else if(c === /*m*/ 109 && !alt) { o.push("Success"); continue; } #define GRAB_INT(NAME, IDX, DFL) \ var NAME/*:number*/ = DFL; \ - if(/*m[IDX] != null &&*/ m[IDX].length > 0) { \ + if(m[IDX] != null && m[IDX].length > 0) { \ if(m[IDX].charAt(0) !== '*') NAME = parseInt(m[IDX], 10); \ else if(m[IDX].length === 1) NAME = args[idx++]; \ else NAME = args[parseInt(m[IDX].substr(1), 10)-1]; \ @@ -55,7 +51,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { var arg/*:any*/ = args[argidx]; /* grab length */ - var len/*:string*/ = m[IDX_LEN]/* || ""*/; + var len/*:string*/ = m[IDX_LEN] || ""; #define INT isnum = -1 #define SGN(s) sign = s @@ -82,7 +78,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { #include "70_float.js" } - o += /*.push*/(O); + o.push(O); } - return o/*.join("")*/; + return o.join(""); } diff --git a/bits/52_convint.js b/bits/52_convint.js index 76797c8..328a8ba 100644 --- a/bits/52_convint.js +++ b/bits/52_convint.js @@ -7,7 +7,7 @@ /* unsigned integer */ case /*U*/ 85: LONG; /* falls through */ - case /*u*/ 117: INT; break; + case /*u*/ 117: INT; break; /* unsigned octal */ case /*O*/ 79: LONG; diff --git a/bits/54_convmisc.js b/bits/54_convmisc.js index b77498d..fa479e9 100644 --- a/bits/54_convmisc.js +++ b/bits/54_convmisc.js @@ -11,8 +11,7 @@ /* store length in the `len` key */ case /*n*/ 110: - if(arg) { arg.len = o.length; } - //if(arg) { arg.len=0; for(var oo/*:number*/ = 0; oo < o.length; ++oo) arg.len += o[oo].length; } + if(arg) { arg.len=0; for(var oo/*:number*/ = 0; oo < o.length; ++oo) arg.len += o[oo].length; } continue; /* process error */ @@ -36,7 +35,7 @@ /* boolean (extension) */ case /*Y*/ 89: case /*y*/ 121: - O = (arg) ? (alt ? "yes" : "true") : (alt ? "no" : "false"); + O = Boolean(arg) ? (alt ? "yes" : "true") : (alt ? "no" : "false"); if(c == /*Y*/ 89) O = O.toUpperCase(); PREC_STR(O, prec) WIDTH(O, width, flags) diff --git a/bits/99_esmfoot.js b/bits/99_esmfoot.js deleted file mode 100644 index 54a466f..0000000 --- a/bits/99_esmfoot.js +++ /dev/null @@ -1 +0,0 @@ -export { sprintf, vsprintf }; diff --git a/bits/Makefile b/bits/Makefile index b73e4a2..f6986ac 100644 --- a/bits/Makefile +++ b/bits/Makefile @@ -2,8 +2,8 @@ ifndef OUTDIR OUTDIR=$(PWD)/lib endif -JSFILES=$(wildcard *.js) $(wildcard *.mjs) -LIBS=$(filter-out $(wildcard [0-9]*_*.js),$(JSFILES)) +JSFILES=$(wildcard *.js) +LIBS=$(filter-out $(wildcard [0-9]*_*.js),$(wildcard *.js)) OUTLIBS=$(patsubst %,$(OUTDIR)/%,$(LIBS)) diff --git a/bits/flow.js b/bits/flow.js index 722cb39..485fad7 100644 --- a/bits/flow.js +++ b/bits/flow.js @@ -10,6 +10,6 @@ declare class PRINTJModule { _doit:(t:ParsedFmt, args:Args)=>string; _tokenize:(fmt:string)=>ParsedFmt; }; -declare module "./" { declare module.exports:PRINTJModule }; -declare module "../" { declare module.exports:PRINTJModule }; +declare module "./" { declare var exports:PRINTJModule }; +declare module "../" { declare var exports:PRINTJModule }; */ diff --git a/bits/loop_code.mjs b/bits/loop_code.mjs deleted file mode 100644 index fb8179e..0000000 --- a/bits/loop_code.mjs +++ /dev/null @@ -1,8 +0,0 @@ -#define USE_ESM -#include "00_header.js" -#define USE_LOOP -#define USE_CODE -#include "10_tokenize.js" -#include "50_doit.js" -#include "80_wrapper.js" -#include "99_esmfoot.js" diff --git a/ctest/printj.js b/ctest/printj.js index 09bd070..626c1c7 100644 --- a/ctest/printj.js +++ b/ctest/printj.js @@ -5,7 +5,6 @@ var PRINTJ; (function (factory) { /*jshint ignore:start */ - /*eslint-disable */ if(typeof DO_NOT_EXPORT_PRINTJ === 'undefined') { if('object' === typeof exports) { factory(exports); @@ -21,16 +20,12 @@ var PRINTJ; } else { factory(PRINTJ = {}); } - /*eslint-enable */ /*jshint ignore:end */ }(function(PRINTJ) { -PRINTJ.version = '1.3.0'; - -var tcache = {}; +PRINTJ.version = '1.1.0'; function tokenize(fmt) { - if(tcache[fmt]) return tcache[fmt]; var out = []; var start = 0; @@ -149,16 +144,23 @@ function tokenize(fmt) { } if(start < fmt.length) out.push(["L", fmt.substring(start)]); - return (tcache[fmt] = out); + return out; } +//#define PAD_(x,c) (x >= 0 ? new Array(((x)|0) + 1).join((c)) : "") +var padstr = { + " ": " ", + "0": "000000000000000000000000000000000", + "7": "777777777777777777777777777777777", + "f": "fffffffffffffffffffffffffffffffff" +}; + /*global process:true, util:true, require:true */ if(typeof process !== 'undefined' && !!process.versions && !!process.versions.node) util=require("util"); var u_inspect = (typeof util != 'undefined') ? util.inspect : JSON.stringify; function doit(t, args) { - //var o = []; - var o = ""; + var o = []; var argidx = 0, idx = 0; var Vnum = 0; var pad = ""; @@ -166,26 +168,26 @@ function doit(t, args) { var m = t[i], c = (m[0]).charCodeAt(0); /* m order: conv full param flags width prec length */ - if(c === /*L*/ 76) { o += /*o.push*/(m[1]); continue; } - if(c === /*%*/ 37) { o += /*o.push*/("%"); continue; } + if(c === /*L*/ 76) { o.push(m[1]); continue; } + if(c === /*%*/ 37) { o.push("%"); continue; } var O = ""; var isnum = 0, radix = 10, bytes = 4, sign = false; /* flags */ - var flags = m[3]/*||""*/; + var flags = m[3]||""; var alt = flags.indexOf("#") > -1; /* position */ - if(m[2]) argidx = parseInt(m[2], 10)-1; + if(m[2]) argidx = parseInt(m[2])-1; /* %m special case */ - else if(c === /*m*/ 109 && !alt) { o += /*.push*/("Success"); continue; } + else if(c === /*m*/ 109 && !alt) { o.push("Success"); continue; } /* grab width */ - var width = 0; if( m[ 4].length > 0) { if(m[ 4].charAt(0) !== '*') width = parseInt(m[ 4], 10); else if(m[ 4].length === 1) width = args[idx++]; else width = args[parseInt(m[ 4].substr(1), 10)-1]; } + var width = 0; if(m[ 4] != null && m[ 4].length > 0) { if(m[ 4].charAt(0) !== '*') width = parseInt(m[ 4], 10); else if(m[ 4].length === 1) width = args[idx++]; else width = args[parseInt(m[ 4].substr(1), 10)-1]; } /* grab precision */ - var prec = -1; if( m[ 5].length > 0) { if(m[ 5].charAt(0) !== '*') prec = parseInt(m[ 5], 10); else if(m[ 5].length === 1) prec = args[idx++]; else prec = args[parseInt(m[ 5].substr(1), 10)-1]; } + var prec = -1; if(m[ 5] != null && m[ 5].length > 0) { if(m[ 5].charAt(0) !== '*') prec = parseInt(m[ 5], 10); else if(m[ 5].length === 1) prec = args[idx++]; else prec = args[parseInt(m[ 5].substr(1), 10)-1]; } /* position not specified */ if(!m[2]) argidx = idx++; @@ -194,7 +196,7 @@ function doit(t, args) { var arg = args[argidx]; /* grab length */ - var len = m[6]/* || ""*/; + var len = m[6] || ""; switch(c) { /* str cCsS */ @@ -204,7 +206,7 @@ function doit(t, args) { /* only valid flag is "-" for left justification */ O = String(arg); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* first char of string or convert */ @@ -219,7 +221,7 @@ function doit(t, args) { case "string": O = arg.charAt(0); break; default: O = String(arg).charAt(0); } - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* int diDuUoOxXbB */ @@ -233,7 +235,7 @@ function doit(t, args) { /* unsigned integer */ case /*U*/ 85: bytes = 8; /* falls through */ - case /*u*/ 117: isnum = -1; break; + case /*u*/ 117: isnum = -1; break; /* unsigned octal */ case /*O*/ 79: bytes = 8; @@ -280,8 +282,7 @@ function doit(t, args) { /* store length in the `len` key */ case /*n*/ 110: - if(arg) { arg.len = o.length; } - //if(arg) { arg.len=0; for(var oo = 0; oo < o.length; ++oo) arg.len += o[oo].length; } + if(arg) { arg.len=0; for(var oo = 0; oo < o.length; ++oo) arg.len += o[oo].length; } continue; /* process error */ @@ -305,10 +306,10 @@ function doit(t, args) { /* boolean (extension) */ case /*Y*/ 89: case /*y*/ 121: - O = (arg) ? (alt ? "yes" : "true") : (alt ? "no" : "false"); + O = Boolean(arg) ? (alt ? "yes" : "true") : (alt ? "no" : "false"); if(c == /*Y*/ 89) O = O.toUpperCase(); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; } @@ -370,16 +371,16 @@ function doit(t, args) { if(radix == 16 || radix == -16) { O = (Vnum>>>0).toString(16); Vnum = Math.floor((Vnum - (Vnum >>> 0)) / Math.pow(2,32)); - O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? "0".repeat(8 - O.length) : "") + O; - O = (16 - O.length >= 0 ? "f".repeat(16 - O.length) : "") + O; + O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? padstr[ "0"].substr(0,8 - O.length) : "") + O; + O = (16 - O.length >= 0 ? padstr[ "f"].substr(0,16 - O.length) : "") + O; if(radix == 16) O = O.toUpperCase(); } else if(radix == 8) { O = (Vnum>>>0).toString(8); - O = (10 - O.length >= 0 ? "0".repeat(10 - O.length) : "") + O; + O = (10 - O.length >= 0 ? padstr[ "0"].substr(0,10 - O.length) : "") + O; Vnum = Math.floor((Vnum - ((Vnum >>> 0)&0x3FFFFFFF)) / Math.pow(2,30)); O = (Vnum>>>0).toString(8) + O.substr(O.length - 10); O = O.substr(O.length - 20); - O = "1" + (21 - O.length >= 0 ? "7".repeat(21 - O.length) : "") + O; + O = "1" + (21 - O.length >= 0 ? padstr[ "7"].substr(0,21 - O.length) : "") + O; } else { Vnum = (-Vnum) % 1e16; var d1 = [1,8,4,4,6,7,4,4,0,7,3,7,0,9,5,5,1,6,1,6]; @@ -400,8 +401,8 @@ function doit(t, args) { if(prec ===0 && O == "0" && !(radix == 8 && alt)) O = ""; /* bail out */ else { if(O.length < prec + (O.substr(0,1) == "-" ? 1 : 0)) { - if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? "0".repeat(prec - O.length) : "") + O; - else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? "0".repeat(prec + 1 - O.length) : "") + O.substr(1); + if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? padstr[ "0"].substr(0,prec - O.length) : "") + O; + else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? padstr[ "0"].substr(0,prec + 1 - O.length) : "") + O.substr(1); } /* add prefix for # form */ @@ -422,10 +423,10 @@ function doit(t, args) { if(width > 0) { if(O.length < width) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && prec < 0 && O.length > 0) { - if(prec > O.length) O = ((prec - O.length) >= 0 ? "0".repeat((prec - O.length)) : "") + O; - pad = ((width - O.length) >= 0 ? (prec > 0 ? " " : "0").repeat((width - O.length)) : ""); + if(prec > O.length) O = ((prec - O.length) >= 0 ? padstr[ "0"].substr(0,(prec - O.length)) : "") + O; + pad = ((width - O.length) >= 0 ? padstr[ (prec > 0 ? " " : "0")].substr(0,(width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -433,7 +434,7 @@ function doit(t, args) { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; } } } @@ -480,8 +481,8 @@ function doit(t, args) { O = Vnum.toExponential(20); E = +O.substr(O.indexOf("e")+1); O = O.charAt(0) + O.substr(2,O.indexOf("e")-2); - O = O + (E - O.length + 1 >= 0 ? "0".repeat(E - O.length + 1) : ""); - if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); + O = O + (E - O.length + 1 >= 0 ? padstr[ "0"].substr(0,E - O.length + 1) : ""); + if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? padstr[ "0"].substr(0,prec) : ""); break; /* e/E exponential */ @@ -495,7 +496,7 @@ function doit(t, args) { /* a/A hex */ case 4: - if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? "0".repeat(prec) : ""):"")+"p+0"; break;} + if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? padstr["0"].substr(0,prec) : ""):"")+"p+0"; break;} O = Vnum.toString(16); /* First char 0-9 */ var ac = O.charCodeAt(0); @@ -542,11 +543,11 @@ function doit(t, args) { if(prec > 0) { O = O.substr(0, prec + 2); if(O.length < prec + 2) { - if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : "") + O.substr(1); - else O += ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : ""); + if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : "") + O.substr(1); + else O += ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : ""); } } else if(prec === 0) O = O.charAt(0) + (alt ? "." : ""); - } else if(prec > 0) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); + } else if(prec > 0) O = O + "." + (prec >= 0 ? padstr["0"].substr(0,prec) : ""); else if(alt) O = O + "."; O = "0x" + O + "p" + (E>=0 ? "+" + E : E); break; @@ -563,9 +564,9 @@ function doit(t, args) { /* width */ if(width > O.length) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && O.length > 0 && isf) { - pad = ((width - O.length) >= 0 ? "0".repeat((width - O.length)) : ""); + pad = ((width - O.length) >= 0 ? padstr[ "0"].substr(0,(width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -573,16 +574,16 @@ function doit(t, args) { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; } } if(c < 96) O = O.toUpperCase(); } - o += /*.push*/(O); + o.push(O); } - return o/*.join("")*/; + return o.join(""); } function vsprintf(fmt, args) { return doit(tokenize(fmt), args); } diff --git a/ctest/shim.js b/ctest/shim.js index 4493b85..e3d7840 100644 --- a/ctest/shim.js +++ b/ctest/shim.js @@ -235,42 +235,3 @@ if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) { return target; }; } - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat -if (!String.prototype.repeat) { - String.prototype.repeat = function(count) { - 'use strict'; - if (this == null) { - throw new TypeError('can\'t convert ' + this + ' to object'); - } - var str = '' + this; - count = +count; - if (count != count) { - count = 0; - } - if (count < 0) { - throw new RangeError('repeat count must be non-negative'); - } - if (count == Infinity) { - throw new RangeError('repeat count must be less than infinity'); - } - count = Math.floor(count); - if (str.length == 0 || count == 0) { - return ''; - } - // Ensuring count is a 31-bit integer allows us to heavily optimize the - // main part. But anyway, most current (August 2014) browsers can't handle - // strings 1 << 28 chars or longer, so: - if (str.length * count >= 1 << 28) { - throw new RangeError('repeat count must not overflow maximum string size'); - } - var maxCount = str.length * count; - count = Math.floor(Math.log(count) / Math.log(2)); - while (count) { - str += str; - count--; - } - str += str.substring(0, maxCount - str.length); - return str; - }; -} diff --git a/ctest/test.js b/ctest/test.js index c807d0e..9b1c71c 100644 --- a/ctest/test.js +++ b/ctest/test.js @@ -3,7 +3,6 @@ var X; var IMPLS = {}, IMPLA = [], IMPL = []; if(typeof require !== 'undefined') { assert = require('assert'); - require('./shim'); X=require('./'); IMPL = require("./lib/impl.json"); IMPL.forEach(function(impl, i) { IMPLS[impl] = IMPLA[i] = require("./lib/" + impl); }); @@ -55,7 +54,7 @@ describe('correctness', function() { IMPL.forEach(function(n,i) { var impl = IMPLA[i]; it(n, function() { - for(var i = 0; i < 5; ++i) PRINTF.forEach(function(v) { + PRINTF.forEach(function(v) { if(impl.sprintf.apply(impl, v[0]) != v[1]) { if(isopera() && v[0][0].match(/^%.*[Aa]$/)) return; console.log(v); @@ -191,7 +190,4 @@ describe('special cases', function() { assert.equal(sprintf("|%*.*s|", 4, 0, "sheetjs"), "| |"); assert.equal(sprintf("|%*.*s|", 4, -1, "sheetjs"), "|sheetjs|"); }); - it('handles long strings', function() { - for(var i = 10; i <= 1000; i+= 10) assert.equal(sprintf("%" + i + "s", "abc").length, i); - }); }); diff --git a/dist/LICENSE b/dist/LICENSE index 4a5a262..de06dc2 100644 --- a/dist/LICENSE +++ b/dist/LICENSE @@ -1,192 +1,4 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright (C) 2016-present SheetJS LLC +Copyright (C) 2016-present SheetJS Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -199,3 +11,4 @@ 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. + diff --git a/dist/printj.js b/dist/printj.js index a102fa2..7a65d48 100644 --- a/dist/printj.js +++ b/dist/printj.js @@ -5,7 +5,6 @@ var PRINTJ; (function (factory) { /*jshint ignore:start */ - /*eslint-disable */ if(typeof DO_NOT_EXPORT_PRINTJ === 'undefined') { if('object' === typeof exports) { factory(exports); @@ -21,16 +20,12 @@ var PRINTJ; } else { factory(PRINTJ = {}); } - /*eslint-enable */ /*jshint ignore:end */ }(function(PRINTJ) { -PRINTJ.version = '1.3.1'; - -var tcache = {}; +PRINTJ.version = '1.0.1'; function tokenize(fmt) { - if(tcache[fmt]) return tcache[fmt]; var out = []; var start = 0; @@ -149,16 +144,23 @@ function tokenize(fmt) { } if(start < fmt.length) out.push(["L", fmt.substring(start)]); - return (tcache[fmt] = out); + return out; } +//#define PAD_(x,c) (x >= 0 ? new Array(((x)|0) + 1).join((c)) : "") +var padstr = { + " ": " ", + "0": "000000000000000000000000000000000", + "7": "777777777777777777777777777777777", + "f": "fffffffffffffffffffffffffffffffff" +}; + /*global process:true, util:true, require:true */ if(typeof process !== 'undefined' && !!process.versions && !!process.versions.node) util=require("util"); var u_inspect = (typeof util != 'undefined') ? util.inspect : JSON.stringify; function doit(t, args) { - //var o = []; - var o = ""; + var o = []; var argidx = 0, idx = 0; var Vnum = 0; var pad = ""; @@ -166,26 +168,26 @@ function doit(t, args) { var m = t[i], c = (m[0]).charCodeAt(0); /* m order: conv full param flags width prec length */ - if(c === /*L*/ 76) { o += /*o.push*/(m[1]); continue; } - if(c === /*%*/ 37) { o += /*o.push*/("%"); continue; } + if(c === /*L*/ 76) { o.push(m[1]); continue; } + if(c === /*%*/ 37) { o.push("%"); continue; } var O = ""; var isnum = 0, radix = 10, bytes = 4, sign = false; /* flags */ - var flags = m[3]/*||""*/; + var flags = m[3]||""; var alt = flags.indexOf("#") > -1; /* position */ - if(m[2]) argidx = parseInt(m[2], 10)-1; + if(m[2]) argidx = parseInt(m[2])-1; /* %m special case */ - else if(c === /*m*/ 109 && !alt) { o += /*.push*/("Success"); continue; } + else if(c === /*m*/ 109 && !alt) { o.push("Success"); continue; } /* grab width */ - var width = 0; if( m[ 4].length > 0) { if(m[ 4].charAt(0) !== '*') width = parseInt(m[ 4], 10); else if(m[ 4].length === 1) width = args[idx++]; else width = args[parseInt(m[ 4].substr(1), 10)-1]; } + var width = 0; if(m[ 4] != null && m[ 4].length > 0) { if(m[ 4].charAt(0) !== '*') width = parseInt(m[ 4], 10); else if(m[ 4].length === 1) width = args[idx++]; else width = args[parseInt(m[ 4].substr(1), 10)-1]; } /* grab precision */ - var prec = -1; if( m[ 5].length > 0) { if(m[ 5].charAt(0) !== '*') prec = parseInt(m[ 5], 10); else if(m[ 5].length === 1) prec = args[idx++]; else prec = args[parseInt(m[ 5].substr(1), 10)-1]; } + var prec = -1; if(m[ 5] != null && m[ 5].length > 0) { if(m[ 5].charAt(0) !== '*') prec = parseInt(m[ 5], 10); else if(m[ 5].length === 1) prec = args[idx++]; else prec = args[parseInt(m[ 5].substr(1), 10)-1]; } /* position not specified */ if(!m[2]) argidx = idx++; @@ -194,7 +196,7 @@ function doit(t, args) { var arg = args[argidx]; /* grab length */ - var len = m[6]/* || ""*/; + var len = m[6] || ""; switch(c) { /* str cCsS */ @@ -204,7 +206,7 @@ function doit(t, args) { /* only valid flag is "-" for left justification */ O = String(arg); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* first char of string or convert */ @@ -219,7 +221,7 @@ function doit(t, args) { case "string": O = arg.charAt(0); break; default: O = String(arg).charAt(0); } - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* int diDuUoOxXbB */ @@ -233,7 +235,7 @@ function doit(t, args) { /* unsigned integer */ case /*U*/ 85: bytes = 8; /* falls through */ - case /*u*/ 117: isnum = -1; break; + case /*u*/ 117: isnum = -1; break; /* unsigned octal */ case /*O*/ 79: bytes = 8; @@ -280,8 +282,7 @@ function doit(t, args) { /* store length in the `len` key */ case /*n*/ 110: - if(arg) { arg.len = o.length; } - //if(arg) { arg.len=0; for(var oo = 0; oo < o.length; ++oo) arg.len += o[oo].length; } + if(arg) { arg.len=0; for(var oo = 0; oo < o.length; ++oo) arg.len += o[oo].length; } continue; /* process error */ @@ -305,16 +306,14 @@ function doit(t, args) { /* boolean (extension) */ case /*Y*/ 89: case /*y*/ 121: - O = (arg) ? (alt ? "yes" : "true") : (alt ? "no" : "false"); + O = Boolean(arg) ? (alt ? "yes" : "true") : (alt ? "no" : "false"); if(c == /*Y*/ 89) O = O.toUpperCase(); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; } - if(width < 0) { width = -width; flags += "-"; } - if(isnum == -1) { Vnum = Number(arg); @@ -370,16 +369,16 @@ function doit(t, args) { if(radix == 16 || radix == -16) { O = (Vnum>>>0).toString(16); Vnum = Math.floor((Vnum - (Vnum >>> 0)) / Math.pow(2,32)); - O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? "0".repeat(8 - O.length) : "") + O; - O = (16 - O.length >= 0 ? "f".repeat(16 - O.length) : "") + O; + O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? padstr[ "0"].substr(0,8 - O.length) : "") + O; + O = (16 - O.length >= 0 ? padstr[ "f"].substr(0,16 - O.length) : "") + O; if(radix == 16) O = O.toUpperCase(); } else if(radix == 8) { O = (Vnum>>>0).toString(8); - O = (10 - O.length >= 0 ? "0".repeat(10 - O.length) : "") + O; + O = (10 - O.length >= 0 ? padstr[ "0"].substr(0,10 - O.length) : "") + O; Vnum = Math.floor((Vnum - ((Vnum >>> 0)&0x3FFFFFFF)) / Math.pow(2,30)); O = (Vnum>>>0).toString(8) + O.substr(O.length - 10); O = O.substr(O.length - 20); - O = "1" + (21 - O.length >= 0 ? "7".repeat(21 - O.length) : "") + O; + O = "1" + (21 - O.length >= 0 ? padstr[ "7"].substr(0,21 - O.length) : "") + O; } else { Vnum = (-Vnum) % 1e16; var d1 = [1,8,4,4,6,7,4,4,0,7,3,7,0,9,5,5,1,6,1,6]; @@ -400,8 +399,8 @@ function doit(t, args) { if(prec ===0 && O == "0" && !(radix == 8 && alt)) O = ""; /* bail out */ else { if(O.length < prec + (O.substr(0,1) == "-" ? 1 : 0)) { - if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? "0".repeat(prec - O.length) : "") + O; - else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? "0".repeat(prec + 1 - O.length) : "") + O.substr(1); + if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? padstr[ "0"].substr(0,prec - O.length) : "") + O; + else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? padstr[ "0"].substr(0,prec + 1 - O.length) : "") + O.substr(1); } /* add prefix for # form */ @@ -422,10 +421,10 @@ function doit(t, args) { if(width > 0) { if(O.length < width) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && prec < 0 && O.length > 0) { - if(prec > O.length) O = ((prec - O.length) >= 0 ? "0".repeat((prec - O.length)) : "") + O; - pad = ((width - O.length) >= 0 ? (prec > 0 ? " " : "0").repeat((width - O.length)) : ""); + if(prec > O.length) O = ((prec - O.length) >= 0 ? padstr[ "0"].substr(0,(prec - O.length)) : "") + O; + pad = ((width - O.length) >= 0 ? padstr[ (prec > 0 ? " " : "0")].substr(0,(width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -433,7 +432,7 @@ function doit(t, args) { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; } } } @@ -480,8 +479,8 @@ function doit(t, args) { O = Vnum.toExponential(20); E = +O.substr(O.indexOf("e")+1); O = O.charAt(0) + O.substr(2,O.indexOf("e")-2); - O = O + (E - O.length + 1 >= 0 ? "0".repeat(E - O.length + 1) : ""); - if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); + O = O + (E - O.length + 1 >= 0 ? padstr[ "0"].substr(0,E - O.length + 1) : ""); + if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? padstr[ "0"].substr(0,prec) : ""); break; /* e/E exponential */ @@ -495,7 +494,7 @@ function doit(t, args) { /* a/A hex */ case 4: - if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? "0".repeat(prec) : ""):"")+"p+0"; break;} + if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? padstr["0"].substr(0,prec) : ""):"")+"p+0"; break;} O = Vnum.toString(16); /* First char 0-9 */ var ac = O.charCodeAt(0); @@ -542,11 +541,11 @@ function doit(t, args) { if(prec > 0) { O = O.substr(0, prec + 2); if(O.length < prec + 2) { - if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : "") + O.substr(1); - else O += ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : ""); + if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : "") + O.substr(1); + else O += ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : ""); } } else if(prec === 0) O = O.charAt(0) + (alt ? "." : ""); - } else if(prec > 0) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); + } else if(prec > 0) O = O + "." + (prec >= 0 ? padstr["0"].substr(0,prec) : ""); else if(alt) O = O + "."; O = "0x" + O + "p" + (E>=0 ? "+" + E : E); break; @@ -563,9 +562,9 @@ function doit(t, args) { /* width */ if(width > O.length) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && O.length > 0 && isf) { - pad = ((width - O.length) >= 0 ? "0".repeat((width - O.length)) : ""); + pad = ((width - O.length) >= 0 ? padstr[ "0"].substr(0,(width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -573,16 +572,16 @@ function doit(t, args) { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; } } if(c < 96) O = O.toUpperCase(); } - o += /*.push*/(O); + o.push(O); } - return o/*.join("")*/; + return o.join(""); } function vsprintf(fmt, args) { return doit(tokenize(fmt), args); } diff --git a/dist/printj.min.js b/dist/printj.min.js index b43f1b7..a24da26 100644 --- a/dist/printj.min.js +++ b/dist/printj.min.js @@ -1,2 +1,2 @@ /* printj.js (C) 2016-present SheetJS -- http://sheetjs.com */ -var PRINTJ;(function(factory){if(typeof DO_NOT_EXPORT_PRINTJ==="undefined"){if("object"===typeof exports){factory(exports)}else if("function"===typeof define&&define.amd){define(function(){var module={};factory(module);return module})}else{factory(PRINTJ={})}}else{factory(PRINTJ={})}})(function(PRINTJ){PRINTJ.version="1.3.1";var tcache={};function tokenize(fmt){if(tcache[fmt])return tcache[fmt];var out=[];var start=0;var i=0;var infmt=false;var fmtparam="",fmtflags="",fmtwidth="",fmtprec="",fmtlen="";var c=0;var L=fmt.length;for(;i=48&&c<58){if(fmtprec.length)fmtprec+=String.fromCharCode(c);else if(c==48&&!fmtwidth.length)fmtflags+=String.fromCharCode(c);else fmtwidth+=String.fromCharCode(c)}else switch(c){case 36:if(fmtprec.length)fmtprec+="$";else if(fmtwidth.charAt(0)=="*")fmtwidth+="$";else{fmtparam=fmtwidth+"$";fmtwidth=""}break;case 39:fmtflags+="'";break;case 45:fmtflags+="-";break;case 43:fmtflags+="+";break;case 32:fmtflags+=" ";break;case 35:fmtflags+="#";break;case 46:fmtprec=".";break;case 42:if(fmtprec.charAt(0)==".")fmtprec+="*";else fmtwidth+="*";break;case 104:;case 108:if(fmtlen.length>1)throw"bad length "+fmtlen+String(c);fmtlen+=String.fromCharCode(c);break;case 76:;case 106:;case 122:;case 116:;case 113:;case 90:;case 119:if(fmtlen!=="")throw"bad length "+fmtlen+String.fromCharCode(c);fmtlen=String.fromCharCode(c);break;case 73:if(fmtlen!=="")throw"bad length "+fmtlen+"I";fmtlen="I";break;case 100:;case 105:;case 111:;case 117:;case 120:;case 88:;case 102:;case 70:;case 101:;case 69:;case 103:;case 71:;case 97:;case 65:;case 99:;case 67:;case 115:;case 83:;case 112:;case 110:;case 68:;case 85:;case 79:;case 109:;case 98:;case 66:;case 121:;case 89:;case 74:;case 86:;case 84:;case 37:infmt=false;if(fmtprec.length>1)fmtprec=fmtprec.substr(1);out.push([String.fromCharCode(c),fmt.substring(start,i+1),fmtparam,fmtflags,fmtwidth,fmtprec,fmtlen]);start=i+1;fmtlen=fmtprec=fmtwidth=fmtflags=fmtparam="";break;default:throw new Error("Invalid format string starting with |"+fmt.substring(start,i+1)+"|");}}if(start-1;if(m[2])argidx=parseInt(m[2],10)-1;else if(c===109&&!alt){o+="Success";continue}var width=0;if(m[4].length>0){if(m[4].charAt(0)!=="*")width=parseInt(m[4],10);else if(m[4].length===1)width=args[idx++];else width=args[parseInt(m[4].substr(1),10)-1]}var prec=-1;if(m[5].length>0){if(m[5].charAt(0)!=="*")prec=parseInt(m[5],10);else if(m[5].length===1)prec=args[idx++];else prec=args[parseInt(m[5].substr(1),10)-1]}if(!m[2])argidx=idx++;var arg=args[argidx];var len=m[6];switch(c){case 83:;case 115:O=String(arg);if(prec>=0)O=O.substr(0,prec);if(width>O.length||-width>O.length){if((flags.indexOf("-")==-1||width<0)&&flags.indexOf("0")!=-1){pad=width-O.length>=0?"0".repeat(width-O.length):"";O=pad+O}else{pad=width-O.length>=0?" ".repeat(width-O.length):"";O=flags.indexOf("-")>-1?O+pad:pad+O}}break;case 67:;case 99:switch(typeof arg){case"number":var cc=arg;if(c==67||len.charCodeAt(0)===108){cc&=4294967295;O=String.fromCharCode(cc)}else{cc&=255;O=String.fromCharCode(cc)}break;case"string":O=arg.charAt(0);break;default:O=String(arg).charAt(0);}if(width>O.length||-width>O.length){if((flags.indexOf("-")==-1||width<0)&&flags.indexOf("0")!=-1){pad=width-O.length>=0?"0".repeat(width-O.length):"";O=pad+O}else{pad=width-O.length>=0?" ".repeat(width-O.length):"";O=flags.indexOf("-")>-1?O+pad:pad+O}}break;case 68:bytes=8;case 100:;case 105:isnum=-1;sign=true;break;case 85:bytes=8;case 117:isnum=-1;break;case 79:bytes=8;case 111:isnum=-1;radix=8;break;case 120:isnum=-1;radix=-16;break;case 88:isnum=-1;radix=16;break;case 66:bytes=8;case 98:isnum=-1;radix=2;break;case 70:;case 102:isnum=1;break;case 69:;case 101:isnum=2;break;case 71:;case 103:isnum=3;break;case 65:;case 97:isnum=4;break;case 112:Vnum=typeof arg=="number"?arg:arg?Number(arg.l):-1;if(isNaN(Vnum))Vnum=-1;if(alt)O=Vnum.toString(10);else{Vnum=Math.abs(Vnum);O="0x"+Vnum.toString(16).toLowerCase()}break;case 110:if(arg){arg.len=o.length}continue;case 109:if(!(arg instanceof Error))O="Success";else if(arg.message)O=arg.message;else if(arg.errno)O="Error number "+arg.errno;else O="Error "+String(arg);break;case 74:O=(alt?u_inspect:JSON.stringify)(arg);break;case 86:O=arg==null?"null":String(arg.valueOf());break;case 84:if(alt){O=Object.prototype.toString.call(arg).substr(8);O=O.substr(0,O.length-1)}else O=typeof arg;break;case 89:;case 121:O=arg?alt?"yes":"true":alt?"no":"false";if(c==89)O=O.toUpperCase();if(prec>=0)O=O.substr(0,prec);if(width>O.length||-width>O.length){if((flags.indexOf("-")==-1||width<0)&&flags.indexOf("0")!=-1){pad=width-O.length>=0?"0".repeat(width-O.length):"";O=pad+O}else{pad=width-O.length>=0?" ".repeat(width-O.length):"";O=flags.indexOf("-")>-1?O+pad:pad+O}}break;}if(width<0){width=-width;flags+="-"}if(isnum==-1){Vnum=Number(arg);switch(len){case"hh":{bytes=1}break;case"h":{bytes=2}break;case"l":{if(bytes==4)bytes=8}break;case"L":;case"q":;case"ll":{if(bytes==4)bytes=8}break;case"j":{if(bytes==4)bytes=8}break;case"t":{if(bytes==4)bytes=8}break;case"z":;case"Z":{if(bytes==4)bytes=8}break;case"I":{if(bytes==4)bytes=8}break;case"w":break;}switch(bytes){case 1:Vnum=Vnum&255;if(sign&&Vnum>127)Vnum-=255+1;break;case 2:Vnum=Vnum&65535;if(sign&&Vnum>32767)Vnum-=65535+1;break;case 4:Vnum=sign?Vnum|0:Vnum>>>0;break;default:Vnum=isNaN(Vnum)?0:Math.round(Vnum);break;}if(bytes>4&&Vnum<0&&!sign){if(radix==16||radix==-16){O=(Vnum>>>0).toString(16);Vnum=Math.floor((Vnum-(Vnum>>>0))/Math.pow(2,32));O=(Vnum>>>0).toString(16)+(8-O.length>=0?"0".repeat(8-O.length):"")+O;O=(16-O.length>=0?"f".repeat(16-O.length):"")+O;if(radix==16)O=O.toUpperCase()}else if(radix==8){O=(Vnum>>>0).toString(8);O=(10-O.length>=0?"0".repeat(10-O.length):"")+O;Vnum=Math.floor((Vnum-(Vnum>>>0&1073741823))/Math.pow(2,30));O=(Vnum>>>0).toString(8)+O.substr(O.length-10);O=O.substr(O.length-20);O="1"+(21-O.length>=0?"7".repeat(21-O.length):"")+O}else{Vnum=-Vnum%1e16;var d1=[1,8,4,4,6,7,4,4,0,7,3,7,0,9,5,5,1,6,1,6];var di=d1.length-1;while(Vnum>0){if((d1[di]-=Vnum%10)<0){d1[di]+=10;d1[di-1]--}--di;Vnum=Math.floor(Vnum/10)}O=d1.join("")}}else{if(radix===-16)O=Vnum.toString(16).toLowerCase();else if(radix===16)O=Vnum.toString(16).toUpperCase();else O=Vnum.toString(radix)}if(prec===0&&O=="0"&&!(radix==8&&alt))O="";else{if(O.length=0?"0".repeat(prec-O.length):"")+O;else O=O.substr(0,1)+(prec+1-O.length>=0?"0".repeat(prec+1-O.length):"")+O.substr(1)}if(!sign&&alt&&Vnum!==0)switch(radix){case-16:O="0x"+O;break;case 16:O="0X"+O;break;case 8:if(O.charAt(0)!="0")O="0"+O;break;case 2:O="0b"+O;break;}}if(sign&&O.charAt(0)!="-"){if(flags.indexOf("+")>-1)O="+"+O;else if(flags.indexOf(" ")>-1)O=" "+O}if(width>0){if(O.length-1){O=O+(width-O.length>=0?" ".repeat(width-O.length):"")}else if(flags.indexOf("0")>-1&&prec<0&&O.length>0){if(prec>O.length)O=(prec-O.length>=0?"0".repeat(prec-O.length):"")+O;pad=width-O.length>=0?(prec>0?" ":"0").repeat(width-O.length):"";if(O.charCodeAt(0)<48){if(O.charAt(2).toLowerCase()=="x")O=O.substr(0,3)+pad+O.substring(3);else O=O.substr(0,1)+pad+O.substring(1)}else if(O.charAt(1).toLowerCase()=="x")O=O.substr(0,2)+pad+O.substring(2);else O=pad+O}else{O=(width-O.length>=0?" ".repeat(width-O.length):"")+O}}}}else if(isnum>0){Vnum=Number(arg);if(arg===null)Vnum=0/0;if(len=="L")bytes=12;var isf=isFinite(Vnum);if(!isf){if(Vnum<0)O="-";else if(flags.indexOf("+")>-1)O="+";else if(flags.indexOf(" ")>-1)O=" ";O+=isNaN(Vnum)?"nan":"inf"}else{var E=0;if(prec==-1&&isnum!=4)prec=6;if(isnum==3){O=Vnum.toExponential(1);E=+O.substr(O.indexOf("e")+1);if(prec===0)prec=1;if(prec>E&&E>=-4){isnum=11;prec=prec-(E+1)}else{isnum=12;prec=prec-1}}var sg=Vnum<0||1/Vnum==-Infinity?"-":"";if(Vnum<0)Vnum=-Vnum;switch(isnum){case 1:;case 11:if(Vnum<1e21){O=Vnum.toFixed(prec);if(isnum==1){if(prec===0&&alt&&O.indexOf(".")==-1)O+="."}else if(!alt)O=O.replace(/(\.\d*[1-9])0*$/,"$1").replace(/\.0*$/,"");else if(O.indexOf(".")==-1)O+=".";break}O=Vnum.toExponential(20);E=+O.substr(O.indexOf("e")+1);O=O.charAt(0)+O.substr(2,O.indexOf("e")-2);O=O+(E-O.length+1>=0?"0".repeat(E-O.length+1):"");if(alt||prec>0&&isnum!==11)O=O+"."+(prec>=0?"0".repeat(prec):"");break;case 2:;case 12:O=Vnum.toExponential(prec);E=O.indexOf("e");if(O.length-E===3)O=O.substr(0,E+2)+"0"+O.substr(E+2);if(alt&&O.indexOf(".")==-1)O=O.substr(0,E)+"."+O.substr(E);else if(!alt&&isnum==12)O=O.replace(/\.0*e/,"e").replace(/\.(\d*[1-9])0*e/,".$1e");break;case 4:if(Vnum===0){O="0x0"+(alt||prec>0?"."+(prec>=0?"0".repeat(prec):""):"")+"p+0";break}O=Vnum.toString(16);var ac=O.charCodeAt(0);if(ac==48){ac=2;E=-4;Vnum*=16;while(O.charCodeAt(ac++)==48){E-=4;Vnum*=16}O=Vnum.toString(16);ac=O.charCodeAt(0)}var ai=O.indexOf(".");if(O.indexOf("(")>-1){var am=O.match(/\(e(.*)\)/);var ae=am?+am[1]:0;E+=4*ae;Vnum/=Math.pow(16,ae)}else if(ai>1){E+=4*(ai-1);Vnum/=Math.pow(16,ai-1)}else if(ai==-1){E+=4*(O.length-1);Vnum/=Math.pow(16,O.length-1)}if(bytes>8){if(ac<50){E-=3;Vnum*=8}else if(ac<52){E-=2;Vnum*=4}else if(ac<56){E-=1;Vnum*=2}}else{if(ac>=56){E+=3;Vnum/=8}else if(ac>=52){E+=2;Vnum/=4}else if(ac>=50){E+=1;Vnum/=2}}O=Vnum.toString(16);if(O.length>1){if(O.length>prec+2&&O.charCodeAt(prec+2)>=56){var _f=O.charCodeAt(0)==102;O=(Vnum+8*Math.pow(16,-prec-1)).toString(16);if(_f&&O.charCodeAt(0)==49)E+=4}if(prec>0){O=O.substr(0,prec+2);if(O.length=0?"0".repeat(prec+2-O.length):"")+O.substr(1);else O+=prec+2-O.length>=0?"0".repeat(prec+2-O.length):""}}else if(prec===0)O=O.charAt(0)+(alt?".":"")}else if(prec>0)O=O+"."+(prec>=0?"0".repeat(prec):"");else if(alt)O=O+".";O="0x"+O+"p"+(E>=0?"+"+E:E);break;}if(sg===""){if(flags.indexOf("+")>-1)sg="+";else if(flags.indexOf(" ")>-1)sg=" "}O=sg+O}if(width>O.length){if(flags.indexOf("-")>-1){O=O+(width-O.length>=0?" ".repeat(width-O.length):"")}else if(flags.indexOf("0")>-1&&O.length>0&&isf){pad=width-O.length>=0?"0".repeat(width-O.length):"";if(O.charCodeAt(0)<48){if(O.charAt(2).toLowerCase()=="x")O=O.substr(0,3)+pad+O.substring(3);else O=O.substr(0,1)+pad+O.substring(1)}else if(O.charAt(1).toLowerCase()=="x")O=O.substr(0,2)+pad+O.substring(2);else O=pad+O}else{O=(width-O.length>=0?" ".repeat(width-O.length):"")+O}}if(c<96)O=O.toUpperCase()}o+=O}return o}function vsprintf(fmt,args){return doit(tokenize(fmt),args)}function sprintf(){var args=new Array(arguments.length-1);for(var i=0;i=48&&c<58){if(fmtprec.length)fmtprec+=String.fromCharCode(c);else if(c==48&&!fmtwidth.length)fmtflags+=String.fromCharCode(c);else fmtwidth+=String.fromCharCode(c)}else switch(c){case 36:if(fmtprec.length)fmtprec+="$";else if(fmtwidth.charAt(0)=="*")fmtwidth+="$";else{fmtparam=fmtwidth+"$";fmtwidth=""}break;case 39:fmtflags+="'";break;case 45:fmtflags+="-";break;case 43:fmtflags+="+";break;case 32:fmtflags+=" ";break;case 35:fmtflags+="#";break;case 46:fmtprec=".";break;case 42:if(fmtprec.charAt(0)==".")fmtprec+="*";else fmtwidth+="*";break;case 104:;case 108:if(fmtlen.length>1)throw"bad length "+fmtlen+String(c);fmtlen+=String.fromCharCode(c);break;case 76:;case 106:;case 122:;case 116:;case 113:;case 90:;case 119:if(fmtlen!=="")throw"bad length "+fmtlen+String.fromCharCode(c);fmtlen=String.fromCharCode(c);break;case 73:if(fmtlen!=="")throw"bad length "+fmtlen+"I";fmtlen="I";break;case 100:;case 105:;case 111:;case 117:;case 120:;case 88:;case 102:;case 70:;case 101:;case 69:;case 103:;case 71:;case 97:;case 65:;case 99:;case 67:;case 115:;case 83:;case 112:;case 110:;case 68:;case 85:;case 79:;case 109:;case 98:;case 66:;case 121:;case 89:;case 74:;case 86:;case 84:;case 37:infmt=false;if(fmtprec.length>1)fmtprec=fmtprec.substr(1);out.push([String.fromCharCode(c),fmt.substring(start,i+1),fmtparam,fmtflags,fmtwidth,fmtprec,fmtlen]);start=i+1;fmtlen=fmtprec=fmtwidth=fmtflags=fmtparam="";break;default:throw new Error("Invalid format string starting with |"+fmt.substring(start,i+1)+"|");}}if(start-1;if(m[2])argidx=parseInt(m[2])-1;else if(c===109&&!alt){o.push("Success");continue}var width=0;if(m[4]!=null&&m[4].length>0){if(m[4].charAt(0)!=="*")width=parseInt(m[4],10);else if(m[4].length===1)width=args[idx++];else width=args[parseInt(m[4].substr(1),10)-1]}var prec=-1;if(m[5]!=null&&m[5].length>0){if(m[5].charAt(0)!=="*")prec=parseInt(m[5],10);else if(m[5].length===1)prec=args[idx++];else prec=args[parseInt(m[5].substr(1),10)-1]}if(!m[2])argidx=idx++;var arg=args[argidx];var len=m[6]||"";switch(c){case 83:;case 115:O=String(arg);if(prec>=0)O=O.substr(0,prec);if(width>O.length||-width>O.length){if((flags.indexOf("-")==-1||width<0)&&flags.indexOf("0")!=-1){pad=width-O.length>=0?padstr["0"].substr(0,width-O.length):"";O=pad+O}else{pad=width-O.length>=0?padstr[" "].substr(0,width-O.length):"";O=flags.indexOf("-")>-1?O+pad:pad+O}}break;case 67:;case 99:switch(typeof arg){case"number":var cc=arg;if(c==67||len.charCodeAt(0)===108){cc&=4294967295;O=String.fromCharCode(cc)}else{cc&=255;O=String.fromCharCode(cc)}break;case"string":O=arg.charAt(0);break;default:O=String(arg).charAt(0);}if(width>O.length||-width>O.length){if((flags.indexOf("-")==-1||width<0)&&flags.indexOf("0")!=-1){pad=width-O.length>=0?padstr["0"].substr(0,width-O.length):"";O=pad+O}else{pad=width-O.length>=0?padstr[" "].substr(0,width-O.length):"";O=flags.indexOf("-")>-1?O+pad:pad+O}}break;case 68:bytes=8;case 100:;case 105:isnum=-1;sign=true;break;case 85:bytes=8;case 117:isnum=-1;break;case 79:bytes=8;case 111:isnum=-1;radix=8;break;case 120:isnum=-1;radix=-16;break;case 88:isnum=-1;radix=16;break;case 66:bytes=8;case 98:isnum=-1;radix=2;break;case 70:;case 102:isnum=1;break;case 69:;case 101:isnum=2;break;case 71:;case 103:isnum=3;break;case 65:;case 97:isnum=4;break;case 112:Vnum=typeof arg=="number"?arg:arg?Number(arg.l):-1;if(isNaN(Vnum))Vnum=-1;if(alt)O=Vnum.toString(10);else{Vnum=Math.abs(Vnum);O="0x"+Vnum.toString(16).toLowerCase()}break;case 110:if(arg){arg.len=0;for(var oo=0;oo=0)O=O.substr(0,prec);if(width>O.length||-width>O.length){if((flags.indexOf("-")==-1||width<0)&&flags.indexOf("0")!=-1){pad=width-O.length>=0?padstr["0"].substr(0,width-O.length):"";O=pad+O}else{pad=width-O.length>=0?padstr[" "].substr(0,width-O.length):"";O=flags.indexOf("-")>-1?O+pad:pad+O}}break;}if(isnum==-1){Vnum=Number(arg);switch(len){case"hh":{bytes=1}break;case"h":{bytes=2}break;case"l":{if(bytes==4)bytes=8}break;case"L":;case"q":;case"ll":{if(bytes==4)bytes=8}break;case"j":{if(bytes==4)bytes=8}break;case"t":{if(bytes==4)bytes=8}break;case"z":;case"Z":{if(bytes==4)bytes=8}break;case"I":{if(bytes==4)bytes=8}break;case"w":break;}switch(bytes){case 1:Vnum=Vnum&255;if(sign&&Vnum>127)Vnum-=255+1;break;case 2:Vnum=Vnum&65535;if(sign&&Vnum>32767)Vnum-=65535+1;break;case 4:Vnum=sign?Vnum|0:Vnum>>>0;break;default:Vnum=isNaN(Vnum)?0:Math.round(Vnum);break;}if(bytes>4&&Vnum<0&&!sign){if(radix==16||radix==-16){O=(Vnum>>>0).toString(16);Vnum=Math.floor((Vnum-(Vnum>>>0))/Math.pow(2,32));O=(Vnum>>>0).toString(16)+(8-O.length>=0?padstr["0"].substr(0,8-O.length):"")+O;O=(16-O.length>=0?padstr["f"].substr(0,16-O.length):"")+O;if(radix==16)O=O.toUpperCase()}else if(radix==8){O=(Vnum>>>0).toString(8);O=(10-O.length>=0?padstr["0"].substr(0,10-O.length):"")+O;Vnum=Math.floor((Vnum-(Vnum>>>0&1073741823))/Math.pow(2,30));O=(Vnum>>>0).toString(8)+O.substr(O.length-10);O=O.substr(O.length-20);O="1"+(21-O.length>=0?padstr["7"].substr(0,21-O.length):"")+O}else{Vnum=-Vnum%1e16;var d1=[1,8,4,4,6,7,4,4,0,7,3,7,0,9,5,5,1,6,1,6];var di=d1.length-1;while(Vnum>0){if((d1[di]-=Vnum%10)<0){d1[di]+=10;d1[di-1]--}--di;Vnum=Math.floor(Vnum/10)}O=d1.join("")}}else{if(radix===-16)O=Vnum.toString(16).toLowerCase();else if(radix===16)O=Vnum.toString(16).toUpperCase();else O=Vnum.toString(radix)}if(prec===0&&O=="0"&&!(radix==8&&alt))O="";else{if(O.length=0?padstr["0"].substr(0,prec-O.length):"")+O;else O=O.substr(0,1)+(prec+1-O.length>=0?padstr["0"].substr(0,prec+1-O.length):"")+O.substr(1)}if(!sign&&alt&&Vnum!==0)switch(radix){case-16:O="0x"+O;break;case 16:O="0X"+O;break;case 8:if(O.charAt(0)!="0")O="0"+O;break;case 2:O="0b"+O;break;}}if(sign&&O.charAt(0)!="-"){if(flags.indexOf("+")>-1)O="+"+O;else if(flags.indexOf(" ")>-1)O=" "+O}if(width>0){if(O.length-1){O=O+(width-O.length>=0?padstr[" "].substr(0,width-O.length):"")}else if(flags.indexOf("0")>-1&&prec<0&&O.length>0){if(prec>O.length)O=(prec-O.length>=0?padstr["0"].substr(0,prec-O.length):"")+O;pad=width-O.length>=0?padstr[prec>0?" ":"0"].substr(0,width-O.length):"";if(O.charCodeAt(0)<48){if(O.charAt(2).toLowerCase()=="x")O=O.substr(0,3)+pad+O.substring(3);else O=O.substr(0,1)+pad+O.substring(1)}else if(O.charAt(1).toLowerCase()=="x")O=O.substr(0,2)+pad+O.substring(2);else O=pad+O}else{O=(width-O.length>=0?padstr[" "].substr(0,width-O.length):"")+O}}}}else if(isnum>0){Vnum=Number(arg);if(arg===null)Vnum=0/0;if(len=="L")bytes=12;var isf=isFinite(Vnum);if(!isf){if(Vnum<0)O="-";else if(flags.indexOf("+")>-1)O="+";else if(flags.indexOf(" ")>-1)O=" ";O+=isNaN(Vnum)?"nan":"inf"}else{var E=0;if(prec==-1&&isnum!=4)prec=6;if(isnum==3){O=Vnum.toExponential(1);E=+O.substr(O.indexOf("e")+1);if(prec===0)prec=1;if(prec>E&&E>=-4){isnum=11;prec=prec-(E+1)}else{isnum=12;prec=prec-1}}var sg=Vnum<0||1/Vnum==-Infinity?"-":"";if(Vnum<0)Vnum=-Vnum;switch(isnum){case 1:;case 11:if(Vnum<1e21){O=Vnum.toFixed(prec);if(isnum==1){if(prec===0&&alt&&O.indexOf(".")==-1)O+="."}else if(!alt)O=O.replace(/(\.\d*[1-9])0*$/,"$1").replace(/\.0*$/,"");else if(O.indexOf(".")==-1)O+=".";break}O=Vnum.toExponential(20);E=+O.substr(O.indexOf("e")+1);O=O.charAt(0)+O.substr(2,O.indexOf("e")-2);O=O+(E-O.length+1>=0?padstr["0"].substr(0,E-O.length+1):"");if(alt||prec>0&&isnum!==11)O=O+"."+(prec>=0?padstr["0"].substr(0,prec):"");break;case 2:;case 12:O=Vnum.toExponential(prec);E=O.indexOf("e");if(O.length-E===3)O=O.substr(0,E+2)+"0"+O.substr(E+2);if(alt&&O.indexOf(".")==-1)O=O.substr(0,E)+"."+O.substr(E);else if(!alt&&isnum==12)O=O.replace(/\.0*e/,"e").replace(/\.(\d*[1-9])0*e/,".$1e");break;case 4:if(Vnum===0){O="0x0"+(alt||prec>0?"."+(prec>=0?padstr["0"].substr(0,prec):""):"")+"p+0";break}O=Vnum.toString(16);var ac=O.charCodeAt(0);if(ac==48){ac=2;E=-4;Vnum*=16;while(O.charCodeAt(ac++)==48){E-=4;Vnum*=16}O=Vnum.toString(16);ac=O.charCodeAt(0)}var ai=O.indexOf(".");if(O.indexOf("(")>-1){var am=O.match(/\(e(.*)\)/);var ae=am?+am[1]:0;E+=4*ae;Vnum/=Math.pow(16,ae)}else if(ai>1){E+=4*(ai-1);Vnum/=Math.pow(16,ai-1)}else if(ai==-1){E+=4*(O.length-1);Vnum/=Math.pow(16,O.length-1)}if(bytes>8){if(ac<50){E-=3;Vnum*=8}else if(ac<52){E-=2;Vnum*=4}else if(ac<56){E-=1;Vnum*=2}}else{if(ac>=56){E+=3;Vnum/=8}else if(ac>=52){E+=2;Vnum/=4}else if(ac>=50){E+=1;Vnum/=2}}O=Vnum.toString(16);if(O.length>1){if(O.length>prec+2&&O.charCodeAt(prec+2)>=56){var _f=O.charCodeAt(0)==102;O=(Vnum+8*Math.pow(16,-prec-1)).toString(16);if(_f&&O.charCodeAt(0)==49)E+=4}if(prec>0){O=O.substr(0,prec+2);if(O.length=0?padstr["0"].substr(0,prec+2-O.length):"")+O.substr(1);else O+=prec+2-O.length>=0?padstr["0"].substr(0,prec+2-O.length):""}}else if(prec===0)O=O.charAt(0)+(alt?".":"")}else if(prec>0)O=O+"."+(prec>=0?padstr["0"].substr(0,prec):"");else if(alt)O=O+".";O="0x"+O+"p"+(E>=0?"+"+E:E);break;}if(sg===""){if(flags.indexOf("+")>-1)sg="+";else if(flags.indexOf(" ")>-1)sg=" "}O=sg+O}if(width>O.length){if(flags.indexOf("-")>-1){O=O+(width-O.length>=0?padstr[" "].substr(0,width-O.length):"")}else if(flags.indexOf("0")>-1&&O.length>0&&isf){pad=width-O.length>=0?padstr["0"].substr(0,width-O.length):"";if(O.charCodeAt(0)<48){if(O.charAt(2).toLowerCase()=="x")O=O.substr(0,3)+pad+O.substring(3);else O=O.substr(0,1)+pad+O.substring(1)}else if(O.charAt(1).toLowerCase()=="x")O=O.substr(0,2)+pad+O.substring(2);else O=pad+O}else{O=(width-O.length>=0?padstr[" "].substr(0,width-O.length):"")+O}}if(c<96)O=O.toUpperCase()}o.push(O)}return o.join("")}function vsprintf(fmt,args){return doit(tokenize(fmt),args)}function sprintf(){var args=new Array(arguments.length-1);for(var i=0;i PRINTJ Live Demo
-Source Code Repo
-Issues? Something look weird? Click here and report an issue
+Source Code Repo
+Issues? Something look weird? Click here and report an issue

 usage: var printf = PRINTJ.sprintf;
@@ -31,7 +31,6 @@ This implementation supports the full POSIX set of conversions.  Consult the enc
 
 
 
+
-
-
-
diff --git a/tests/node.mjs b/tests/node.mjs
deleted file mode 100755
index 8f0b475..0000000
--- a/tests/node.mjs
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env node --experimental-modules
-
-import { version, sprintf } from '../printj.mjs'
-
-console.log(sprintf("PRINTJ version %s, 123 = 0x%02hhx", version, 123));
diff --git a/tests/printj.mjs b/tests/printj.mjs
deleted file mode 120000
index 6a4bf14..0000000
--- a/tests/printj.mjs
+++ /dev/null
@@ -1 +0,0 @@
-../printj.mjs
\ No newline at end of file
diff --git a/types/bin_printj.ts b/types/bin_printj.ts
index 1ef2731..f5de475 100644
--- a/types/bin_printj.ts
+++ b/types/bin_printj.ts
@@ -1,8 +1,8 @@
 /* printj.ts (C) 2016-present SheetJS -- http://sheetjs.com */
 /* vim: set ts=2 ft=typescript: */
-/// 
+/*jshint node:true, evil:true */
 import X = require("printj");
-const argv = ["n:1","a","e:null","f:3.4", "b:true", "e:1+1"];
+let argv = ["n:1","a","e:null","f:3.4", "b:true", "e:1+1"];
 
 function help() {
 [
@@ -10,7 +10,6 @@ function help() {
 "",
 "Options:",
 "    -h, --help      output usage information",
-"    -d, --dump      print debug information about format string",
 "",
 "Arguments are treated as strings unless prefaced by a type indicator:",
 "    n:     call parseInt (ex. n:3 -> 3)",
@@ -33,32 +32,22 @@ return 0;
 }
 
 function parse_arg(arg: string): any {
-	const m: string = arg.substr(2);
-	let p = 0;
+	let m: string = arg.substr(2), p: number = 0;
 	if(arg.charCodeAt(1) === 58) switch((p = arg.charCodeAt(0))) {
 		case /*n*/ 110: return parseInt(m, 10);
 		case /*f*/ 102: return parseFloat(m);
 		case /*b*/  98: return !(m.toUpperCase() === "FALSE" || m === "0");
 		case /*j*/ 106: return JSON.parse(m);
-		case /*e*/ 101: return /*eval*/(m);
 		case /*s*/ 115: return m;
 	}
 	return arg;
 }
 
-const args: any[] = [];
+let args: any[] = [];
 let fmt = "", n = 0;
 for(let i = 2; i < argv.length; ++i) switch(argv[i]) {
-	case "--help": case "-h": process.exit(help()); break;
-	case "--dump": case "-d": if(fmt.length===0) fmt = argv[++i]; process.exit(dump(fmt)); break;
+	case "--help": case "-h": break;
 	default: if(n++ === 0) fmt = argv[i]; else args.push(parse_arg(argv[i]));
 }
 
 console.log(X.vsprintf(fmt, args));
-process.exit(0);
-
-function dump(fmt: string): number {
-	if(!fmt) { console.error("printj: missing format argument"); return 1; }
-	// X._tokenize(fmt).forEach(function(x){console.log(x);});
-	return 0;
-}
diff --git a/types/index.d.ts b/types/index.d.ts
index 5b6e280..4434ac7 100644
--- a/types/index.d.ts
+++ b/types/index.d.ts
@@ -1,4 +1,5 @@
 /* index.d.ts (C) 2015-present SheetJS */
+// TypeScript Version: 2.2
 
 /** Version string */
 export const version: string;
diff --git a/types/tsconfig.json b/types/tsconfig.json
index adf801d..7a65429 100644
--- a/types/tsconfig.json
+++ b/types/tsconfig.json
@@ -4,12 +4,11 @@
         "lib": [ "es5", "dom" ],
         "noImplicitAny": true,
         "noImplicitThis": true,
-        "strictNullChecks": true,
+        "strictNullChecks": false,
         "baseUrl": ".",
         "paths": { "printj": ["."] },
         "types": [],
         "noEmit": true,
-        "strictFunctionTypes": true,
         "forceConsistentCasingInFileNames": true
     }
 }
diff --git a/types/tslint.json b/types/tslint.json
index a4589d3..d9401a9 100644
--- a/types/tslint.json
+++ b/types/tslint.json
@@ -1,13 +1,11 @@
 {
 	"extends": "dtslint/dtslint.json",
 	"rules": {
-		"no-implicit-dependencies": false,
 		"whitespace": false,
 		"no-sparse-arrays": false,
 		"only-arrow-functions": false,
 		"no-consecutive-blank-lines": false,
 		"prefer-conditional-expression": false,
-		"prefer-const": true,
 		"one-variable-per-declaration": false
 	}
 }