Libraryless. Click here for Pure Java version (4074L/23K).
| 1 | // supports 8 different character classes | 
| 2 | sclass JSONSpecialIntegral {
 | 
| 3 | int minLevel = 1, maxLevel = 8; | 
| 4 | |
| 5 | byte[] input; | 
| 6 | |
| 7 | int[] bracketLevel; // diff +1 for opening bracket, diff -1 for closing bracket | 
| 8 | int[] bracketCount; // diff +1 for any bracket | 
| 9 | byte[] quotesBitSet; // is character within string? (byte[] = faster replacement for BitSet) | 
| 10 | |
| 11 |   *() {}
 | 
| 12 |   *(byte[] *input) {}
 | 
| 13 | |
| 14 |   void analyze(S input) {
 | 
| 15 | this.input = toUtf8(input); // XXX probably wrong | 
| 16 | analyze(); | 
| 17 | } | 
| 18 | |
| 19 |   void analyze(byte[] input) {
 | 
| 20 | this.input = input; | 
| 21 | analyze(); | 
| 22 | } | 
| 23 | |
| 24 |   void analyze {
 | 
| 25 | byte[] input = this.input; | 
| 26 | int n = input.length; | 
| 27 | bracketLevel = new int[n]; | 
| 28 | bracketCount = new int[n]; | 
| 29 | quotesBitSet = byteArrayBitSet_new(n); | 
| 30 | |
| 31 | int bracketLvl = 0, bracketCnt = 0; | 
| 32 | bool inQuotes; | 
| 33 | |
| 34 |     for i to n: {
 | 
| 35 | byte b = input[i]; | 
| 36 |       if (isOpener(b)) {
 | 
| 37 |         if (!inQuotes) { ++bracketLvl; ++bracketCnt; }
 | 
| 38 |       } else if (isCloser(b)) {
 | 
| 39 |         if (!inQuotes) { --bracketLvl; ++bracketCnt; }
 | 
| 40 |       } else if (inQuotes && b == '\'') {
 | 
| 41 | bracketLevel[i] = bracketLvl; | 
| 42 | bracketCount[i] = bracketCnt; | 
| 43 | setBit(quotesBitSet, i, inQuotes); | 
| 44 | i++; | 
| 45 |       } else if (b == '"') {
 | 
| 46 | inQuotes = !inQuotes; | 
| 47 | } | 
| 48 | ifdef JSONSpecialIntegral_debug | 
| 49 | printVars(+i, +b, c := (char) b, +bracketLvl, +bracketCnt, +inQuotes); | 
| 50 | endifdef | 
| 51 | bracketLevel[i] = bracketLvl; | 
| 52 | bracketCount[i] = bracketCnt; | 
| 53 | setBit(quotesBitSet, i, inQuotes); | 
| 54 | } | 
| 55 | } | 
| 56 | |
| 57 |   int bracketLevel(int idx) {
 | 
| 58 | if (idx < 0) ret 0; | 
| 59 | ret bracketLevel[min(bracketLevel.length-1, idx)]; | 
| 60 | } | 
| 61 | |
| 62 |   int bracketCount(int idx) {
 | 
| 63 | if (idx < 0) ret 0; | 
| 64 | ret bracketCount[min(bracketLevel.length-1, idx)]; | 
| 65 | } | 
| 66 | |
| 67 |   bool inQuoteBit(int idx) {
 | 
| 68 | ret getBit(quotesBitSet, idx); | 
| 69 | } | 
| 70 | |
| 71 |   bool isOpener(byte b) {
 | 
| 72 |     ret b == (byte) '{' || b == (byte) '[';
 | 
| 73 | } | 
| 74 | |
| 75 |   bool isCloser(byte b) {
 | 
| 76 | ret b == (byte) '}' || b == (byte) ']'; | 
| 77 | } | 
| 78 | |
| 79 |   S stats() {
 | 
| 80 | ret renderVars( | 
| 81 | inputLength := l(input), | 
| 82 | sizeFactor := formatDouble((elementSize(bracketLevel)+elementSize(bracketCount)+1/8.0), 2); | 
| 83 | } | 
| 84 | |
| 85 |   int n() { ret input.length; }
 | 
| 86 | } | 
Began life as a copy of #1032583
download show line numbers debug dex old transpilations
Travelled to 3 computer(s): bhatertpkbcr, mowyntqkapby, mqqgnosmbjvj
No comments. add comment
| Snippet ID: | #1032592 | 
| Snippet name: | JSONSpecialIntegral - find special characters quickly in long string (e.g. brackets, quotes, backslash) | 
| Eternal ID of this version: | #1032592/16 | 
| Text MD5: | d70c608ede79a4fa9815f51d034cf3a5 | 
| Transpilation MD5: | 2b4c09dafc0fbe95a23bf89db1f186db | 
| Author: | stefan | 
| Category: | javax | 
| Type: | JavaX fragment (include) | 
| Public (visible to everyone): | Yes | 
| Archived (hidden from active list): | No | 
| Created/modified: | 2021-09-23 09:42:15 | 
| Source code size: | 2259 bytes / 86 lines | 
| Pitched / IR pitched: | No / No | 
| Views / Downloads: | 419 / 637 | 
| Version history: | 15 change(s) | 
| Referenced in: | [show references] |