Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.postscript > #3443
| From | news@zzo38computer.org.invalid |
|---|---|
| Newsgroups | comp.lang.postscript |
| Subject | JSON reader/writer in PostScript (second version) |
| Date | 2019-09-08 21:32 +0000 |
| Organization | Aioe.org NNTP Server |
| Message-ID | <1567977875.bystand@zzo38computer.org> (permalink) |
| References | <1567559086.bystand@zzo38computer.org> |
JSON.utf8 is now implemented (although it doesn't currently convert
surrogate pairs into a single UTF-8 codepoint), and another change as
suggested by some of the other follow-up messages to my first message
have also been implemented. Also, the "dot stuffing" of this message is
(hopefully) correct now; it was a bug in the NNTP software I was using,
but I have now corrected that bug (hopefully).
Also, I would like to know if you have any use for this, and especially if
you have found any bugs in it. (This is not mandatory though; it is public
domain, so you are allowed to do whatever you want with it.)
The below (between "===BEGIN CODE===" and "===END CODE===") is the
PostScript program.
===BEGIN CODE===
% JSON implementation in PostScript
% (public domain)
currentpacking true setpacking
/JSON.utf8 false def
/.JSON.file null def
/.JSON.str 65535 string def
/.JSON.hex (16#????) def
/.JSON.backchar 0 def
/.JSON.char 0 def
/.JSON.namech 256 string def
48 1 57 {.JSON.namech exch 1 put} for %0-9
97 1 122 {.JSON.namech exch 1 put} for %a-z
(+-.E) {.JSON.namech exch 1 put} forall
/.JSON.escape 256 string def
0 1 255 {.JSON.escape exch dup put} for
.JSON.escape 98 8 put
.JSON.escape 102 12 put
.JSON.escape 110 10 put
.JSON.escape 114 13 put
.JSON.escape 116 9 put
.JSON.escape 117 0 put
/.JSON.readnum {
.JSON.str 0 .JSON.char put
1
{.JSON.file read {
.JSON.namech 1 index get 0 eq {
/.JSON.backchar exch store
.JSON.str exch 0 exch getinterval cvr
exit
} {
.JSON.str exch 2 index exch put
1 add
} ifelse
} {JSON.badinput} ifelse} loop
} bind def
/.JSON.readword {
{.JSON.file read {
.JSON.namech 1 index get 0 eq {
/.JSON.backchar exch store
exit
} {pop} ifelse
} {JSON.badinput} ifelse} loop
} bind def
/.JSON.readstring {
0 {
.JSON.file read pop
dup 34 eq {
% End of string
pop dup string dup 2 index
.JSON.str exch 0 exch getinterval
0 exch putinterval exch pop
exit
} {
% Character
.JSON.str 2 index 2 index put
92 eq {
.JSON.str 1 index .JSON.escape .JSON.file read pop get put
.JSON.str 1 index get 0 eq {
.JSON.file .JSON.hex 3 4 getinterval readstring pop pop
/.JSON.char .JSON.hex cvi store
.JSON.char 127 gt JSON.utf8 and {
.JSON.char 16#0800 lt {
% Two byte UTF-8
.JSON.str 1 index .JSON.char -6 bitshift 16#C0 or put
1 add
.JSON.str 1 index .JSON.char 16#3F and 16#80 or put
} {
% Three byte UTF-8
.JSON.str 1 index .JSON.char -12 bitshift 16#E0 or put
1 add
.JSON.str 1 index .JSON.char -6 bitshift 16#3F and 16#80 or put
1 add
.JSON.str 1 index .JSON.char 16#3F and 16#80 or put
} ifelse
} {
.JSON.str 1 index .JSON.char 255 and put
} ifelse
} if
} if
1 add
} ifelse
} loop
} bind def
/.JSON.parsech 256 array def
33 1 255 {.JSON.parsech exch /JSON.badinput cvx put} for
0 1 32 {.JSON.parsech exch null cvx put} for %spaces
.JSON.parsech 34 /.JSON.readstring load put %"
.JSON.parsech 43 /.JSON.readnum load put %+
.JSON.parsech 44 null cvx put %,
.JSON.parsech 45 /.JSON.readnum load put %-
48 1 57 {.JSON.parsech exch /.JSON.readnum load put} for %numbers
.JSON.parsech 58 /cvn load put %:
.JSON.parsech 91 mark put %[
.JSON.parsech 93 (]) cvn load put %]
.JSON.parsech 102 {false .JSON.readword} put %f
.JSON.parsech 110 {null .JSON.readword} put %n
.JSON.parsech 116 {true .JSON.readword} put %t
.JSON.parsech 123 mark put %{
.JSON.parsech 125 (>>) cvn load put %}
/.JSON.parse { % ( -- object )
.JSON.backchar 0 eq {
.JSON.file read
} {
.JSON.backchar /.JSON.backchar 0 store true
} ifelse {
/.JSON.char exch store
.JSON.parsech .JSON.char get exec
.JSON.parse
} if
} bind def
/.JSON.charx [32 {true} repeat 224 {false} repeat] def
.JSON.charx 34 true put
.JSON.charx 92 true put
/.JSON.writechar {
.JSON.charx 1 index get {
.JSON.file (\\u00) writestring
dup 16 lt {.JSON.file 48 write} if
16 .JSON.str cvrs .JSON.file exch writestring
} {
.JSON.file exch write
} ifelse
} def
/.JSON.writedict <<
/arraytype {.JSON.file 91 write false exch {exch {.JSON.file 44 write} if .JSON.write true} forall pop .JSON.file 93 write}
/booleantype {.JSON.str cvs .JSON.file exch writestring}
/dicttype {.JSON.file 123 write false exch {3 -1 roll {.JSON.file 44 write} if exch .JSON.write .JSON.file 58 write .JSON.write true} forall pop .JSON.file 125 write}
/integertype {.JSON.str cvs .JSON.file exch writestring}
/nametype {.JSON.str cvs .JSON.write}
/nulltype {.JSON.file (null) writestring}
/realtype {.JSON.str cvs .JSON.file exch writestring}
/stringtype {.JSON.file 34 write {.JSON.writechar} forall .JSON.file 34 write}
>> def
/JSON.read {/.JSON.file exch store .JSON.parse} bind def
/.JSON.write {dup type .JSON.writedict exch get exec} bind def
/JSON.write {exch /.JSON.file exch store .JSON.write .JSON.file 10 write} bind def
setpacking
===END CODE===
--
Note: I am not always able to read/post messages during Monday-Friday.
Back to comp.lang.postscript | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
JSON reader/writer in PostScript news@zzo38computer.org.invalid - 2019-09-04 01:19 +0000
Re: JSON reader/writer in PostScript luser droog <luser.droog@gmail.com> - 2019-09-05 23:05 -0700
Re: JSON reader/writer in PostScript luser droog <luser.droog@gmail.com> - 2019-09-06 22:06 -0700
JSON reader/writer in PostScript (second version) news@zzo38computer.org.invalid - 2019-09-08 21:32 +0000
Re: JSON reader/writer in PostScript (second version) luser droog <luser.droog@gmail.com> - 2019-09-12 19:11 -0700
Re: JSON reader/writer in PostScript (second version) luser droog <luser.droog@gmail.com> - 2019-09-14 19:50 -0700
Re: JSON reader/writer in PostScript (second version) news@zzo38computer.org.invalid - 2019-09-15 18:34 +0000
Re: JSON reader/writer in PostScript (second version) luser droog <luser.droog@gmail.com> - 2019-09-13 19:53 -0700
csiph-web