source: proto/JSON/byteclass.py @ 682

Last change on this file since 682 was 682, checked in by ksherdy, 8 years ago

Add UTF8 validation. Add UTF8 character set definitions.

File size: 4.3 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# byteclass.py
4#
5# Bitstream character class definitions for JSON character classes.
6#
7
8class u8_streams ():
9        unibyte = 0
10        prefix = 0
11        prefix2 = 0
12        prefix3 = 0
13        prefix4 = 0
14        suffix = 0
15        badprefix = 0
16        xE0 = 0
17        xED = 0
18        xF0 = 0
19        xF4 = 0
20        xA0_xBF = 0
21        x80_x9F = 0
22        x90_xBF = 0
23        x80_x8F = 0
24        xEF = 0
25        xBF = 0
26        xBE = 0
27        scope22 = 0
28        scope32 = 0
29        scope33 = 0
30        scope42 = 0
31        scope43 = 0
32        scope44 = 0
33        error = 0
34
35class lexical_streams ():
36        r"""
37        RFC 4627 - JavaScript Object Notation (JSON) 
38        RFC 5234 - Augmented BNF for Syntax Specifications: ABNF
39        """
40        #Object
41        LCurlyBrace = 0
42        Colon = 0
43        Comma = 0
44        RCurlyBrace = 0
45        #Array
46        LSquareBracket = 0
47        RSquareBracket = 0
48        #Number
49        Minus = 0
50        Zero = 0
51        Digit1_9 = 0
52        Digit0_9 = 0
53        DecimalPoint = 0
54        Ee = 0
55        PlusMinus = 0
56        NumberFollowSet = 0
57        #String
58        DQuotes = 0
59        RSolidus = 0
60        Solidus = 0
61        b = 0
62        f = 0
63        n = 0
64        t = 0
65        u = 0
66        HexDigit = 0
67       
68class control_streams ():
69        r"""
70        RFC 4627 - JavaScript Object Notation (JSON) 
71        """
72        x00_x1F = 0
73        CR = 0
74        LF = 0
75        HT = 0
76        SP = 0 
77
78def classify_bytes(bit) :
79  u8 = u8_streams()
80  lex = lexical_streams()
81  ctrl = control_streams()
82  u8.unibyte = (~bit[0]);
83  u8.prefix = (bit[0] & bit[1]);
84  u8.prefix2 = (u8.prefix &~ bit[2]);
85  temp1 = (bit[2] &~ bit[3]);
86  u8.prefix3 = (u8.prefix & temp1);
87  temp2 = (bit[2] & bit[3]);
88  u8.prefix4 = (u8.prefix & temp2);
89  u8.suffix = (bit[0] &~ bit[1]);
90  temp3 = (bit[2] | bit[3]);
91  temp4 = (u8.prefix &~ temp3);
92  temp5 = (bit[4] | bit[5]);
93  temp6 = (temp5 | bit[6]);
94  temp7 = (temp4 &~ temp6);
95  temp8 = (bit[6] | bit[7]);
96  temp9 = (bit[5] & temp8);
97  temp10 = (bit[4] | temp9);
98  temp11 = (u8.prefix4 & temp10);
99  u8.badprefix = (temp7 | temp11);
100  temp12 = (temp5 | temp8);
101  u8.xE0 = (u8.prefix3 &~ temp12);
102  temp13 = (bit[4] & bit[5]);
103  temp14 = (bit[7] &~ bit[6]);
104  temp15 = (temp13 & temp14);
105  u8.xED = (u8.prefix3 & temp15);
106  u8.xF0 = (u8.prefix4 &~ temp12);
107  temp16 = (bit[5] &~ bit[4]);
108  temp17 = (temp16 &~ temp8);
109  u8.xF4 = (u8.prefix4 & temp17);
110  u8.xA0_xBF = (u8.suffix & bit[2]);
111  u8.x80_x9F = (u8.suffix &~ bit[2]);
112  u8.x90_xBF = (u8.suffix & temp3);
113  u8.x80_x8F = (u8.suffix &~ temp3);
114  temp18 = (bit[0] | bit[1]);
115  temp19 = (temp18 | bit[2]);
116  ctrl.x00_x1F = (~temp19);
117  temp20 = (temp18 | temp3);
118  ctrl.CR = (temp15 &~ temp20);
119  temp21 = (bit[4] &~ bit[5]);
120  temp22 = (bit[6] &~ bit[7]);
121  temp23 = (temp21 & temp22);
122  ctrl.LF = (temp23 &~ temp20);
123  temp24 = (temp21 & temp14);
124  ctrl.HT = (temp24 &~ temp20);
125  temp25 = (temp1 &~ temp18);
126  ctrl.SP = (temp25 &~ temp12);
127  temp26 = (bit[1] &~ bit[0]);
128  temp27 = (temp26 & temp2);
129  temp28 = (bit[6] & bit[7]);
130  temp29 = (temp21 & temp28);
131  lex.LCurlyBrace = (temp27 & temp29);
132  temp30 = (temp2 &~ temp18);
133  lex.Colon = (temp30 & temp23);
134  temp31 = (temp13 &~ temp8);
135  lex.Comma = (temp25 & temp31);
136  lex.RCurlyBrace = (temp27 & temp15);
137  temp32 = (bit[3] &~ bit[2]);
138  temp33 = (temp26 & temp32);
139  lex.LSquareBracket = (temp33 & temp29);
140  lex.RSquareBracket = (temp33 & temp15);
141  lex.Minus = (temp25 & temp15);
142  lex.Zero = (temp30 &~ temp12);
143  temp34 = (bit[5] | bit[6]);
144  temp35 = (~temp34);
145  temp36 = (bit[5] | temp8);
146  temp37 = ((bit[4] & temp35)|(~(bit[4]) & temp36));
147  lex.Digit1_9 = (temp30 & temp37);
148  temp38 = (bit[4] & temp34);
149  lex.Digit0_9 = (temp30 &~ temp38);
150  temp39 = (temp13 & temp22);
151  lex.DecimalPoint = (temp25 & temp39);
152  temp40 = (temp16 & temp14);
153  temp41 = (temp3 &~ temp1);
154  temp42 = (temp26 &~ temp41);
155  lex.Ee = (temp40 & temp42);
156  temp43 = (temp29 | temp15);
157  lex.PlusMinus = (temp25 & temp43);
158  temp44 = (lex.Comma | lex.RCurlyBrace);
159  lex.NumberFollowSet = (temp44 | lex.RSquareBracket);
160  lex.DQuote = (temp33 & temp31);
161  lex.RSolidus = (temp33 & temp31);
162  lex.Solidus = (temp33 & temp31);
163  lex.b = (temp33 & temp31);
164  lex.f = (temp33 & temp31);
165  lex.n = (temp33 & temp31);
166  lex.t = (temp33 & temp31);
167  lex.u = (temp33 & temp31);
168  temp45 = (temp26 & temp1);
169  temp46 = (temp45 &~ bit[4]);
170  temp47 = (~temp28);
171  temp48 = ((bit[5] & temp47)|(~(bit[5]) & temp8));
172  temp49 = (temp46 & temp48);
173  temp50 = (lex.Digit0_9 | temp49);
174  temp51 = (temp26 &~ temp3);
175  temp52 = (temp51 &~ bit[4]);
176  temp53 = (temp52 & temp48);
177  lex.HexDigit = (temp50 | temp53);
178  temp54 = (temp15 | temp23);
179  temp55 = (temp54 | temp24);
180  temp56 = (temp55 &~ temp20);
181  lex.WS = (temp56 | ctrl.SP); 
182  return (u8,lex,ctrl)
183
Note: See TracBrowser for help on using the repository browser.