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: | 475 / 686 |
| Version history: | 15 change(s) |
| Referenced in: | [show references] |