|
@@ -1,514 +1,254 @@
|
|
MODULE JSonFormatter;
|
|
MODULE JSonFormatter;
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
(**
|
|
(**
|
|
-
|
|
|
|
project = "JSon"
|
|
project = "JSon"
|
|
-
|
|
|
|
organization = ""
|
|
organization = ""
|
|
-
|
|
|
|
contributors = ""
|
|
contributors = ""
|
|
-
|
|
|
|
version = "System/Rsrc/About"
|
|
version = "System/Rsrc/About"
|
|
-
|
|
|
|
copyright = "Kushnir Piotr Michailovich"
|
|
copyright = "Kushnir Piotr Michailovich"
|
|
-
|
|
|
|
license = "Docu/BB-License"
|
|
license = "Docu/BB-License"
|
|
-
|
|
|
|
purpose = "генерация json вручную, этот способ полезен тем, кто не использует YSonModels, по каким-то причинам"
|
|
purpose = "генерация json вручную, этот способ полезен тем, кто не использует YSonModels, по каким-то причинам"
|
|
-
|
|
|
|
changes = "
|
|
changes = "
|
|
-
|
|
|
|
- 20130112, pk, автогенерация заголовка
|
|
- 20130112, pk, автогенерация заголовка
|
|
-
|
|
|
|
- 20150204, pk, порт для fw
|
|
- 20150204, pk, порт для fw
|
|
-
|
|
|
|
"
|
|
"
|
|
-
|
|
|
|
issues = ""
|
|
issues = ""
|
|
-
|
|
|
|
**)
|
|
**)
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
IMPORT
|
|
IMPORT
|
|
-
|
|
|
|
JSonGenerator,
|
|
JSonGenerator,
|
|
-
|
|
|
|
Str, Out;
|
|
Str, Out;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
CONST
|
|
CONST
|
|
-
|
|
|
|
objBegin* = 1;
|
|
objBegin* = 1;
|
|
-
|
|
|
|
objEnd* = 2;
|
|
objEnd* = 2;
|
|
-
|
|
|
|
arrBegin* = 3;
|
|
arrBegin* = 3;
|
|
-
|
|
|
|
arrEnd* = 4;
|
|
arrEnd* = 4;
|
|
-
|
|
|
|
name = 5;
|
|
name = 5;
|
|
-
|
|
|
|
value = 6;
|
|
value = 6;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
stringVal* = 1;
|
|
stringVal* = 1;
|
|
-
|
|
|
|
unicodeStringVal* = 10;
|
|
unicodeStringVal* = 10;
|
|
-
|
|
|
|
intVal* = 2;
|
|
intVal* = 2;
|
|
-
|
|
|
|
realVal* =3;
|
|
realVal* =3;
|
|
-
|
|
|
|
atomVal*= 4;
|
|
atomVal*= 4;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
errWrongSym* = -1;
|
|
errWrongSym* = -1;
|
|
-
|
|
|
|
errUnexpected* = -2;
|
|
errUnexpected* = -2;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
TYPE
|
|
TYPE
|
|
-
|
|
|
|
Formatter* = POINTER TO ABSTRACT RECORD END;
|
|
Formatter* = POINTER TO ABSTRACT RECORD END;
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
Directory* = POINTER TO ABSTRACT RECORD END;
|
|
Directory* = POINTER TO ABSTRACT RECORD END;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
StdDir = POINTER TO RECORD (Directory) END;
|
|
StdDir = POINTER TO RECORD (Directory) END;
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
StdF = POINTER TO RECORD (Formatter)
|
|
StdF = POINTER TO RECORD (Formatter)
|
|
-
|
|
|
|
wr: JSonGenerator.Writer;
|
|
wr: JSonGenerator.Writer;
|
|
-
|
|
|
|
this: StackItem;
|
|
this: StackItem;
|
|
-
|
|
|
|
END;
|
|
END;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
StackItem = POINTER TO RECORD
|
|
StackItem = POINTER TO RECORD
|
|
-
|
|
|
|
depth: INTEGER;
|
|
depth: INTEGER;
|
|
-
|
|
|
|
expect: SET;
|
|
expect: SET;
|
|
-
|
|
|
|
values: LONGINT;
|
|
values: LONGINT;
|
|
-
|
|
|
|
next: StackItem;
|
|
next: StackItem;
|
|
-
|
|
|
|
END;
|
|
END;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
VAR
|
|
VAR
|
|
-
|
|
|
|
dir-, prev-, stdDir-: Directory;
|
|
dir-, prev-, stdDir-: Directory;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
PROCEDURE (d: Directory) New* (wr: JSonGenerator.Writer): Formatter, NEW, ABSTRACT;
|
|
PROCEDURE (d: Directory) New* (wr: JSonGenerator.Writer): Formatter, NEW, ABSTRACT;
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
PROCEDURE (f: Formatter) ConnectTo- (wr: JSonGenerator.Writer), NEW, ABSTRACT;
|
|
PROCEDURE (f: Formatter) ConnectTo- (wr: JSonGenerator.Writer), NEW, ABSTRACT;
|
|
-
|
|
|
|
PROCEDURE (f: Formatter) WriteSym* (sym: INTEGER; OUT res: INTEGER), NEW, ABSTRACT;
|
|
PROCEDURE (f: Formatter) WriteSym* (sym: INTEGER; OUT res: INTEGER), NEW, ABSTRACT;
|
|
-
|
|
|
|
PROCEDURE (f: Formatter) WriteName* (IN s: ARRAY OF CHAR; OUT res: INTEGER), NEW, ABSTRACT;
|
|
PROCEDURE (f: Formatter) WriteName* (IN s: ARRAY OF CHAR; OUT res: INTEGER), NEW, ABSTRACT;
|
|
-
|
|
|
|
PROCEDURE (f: Formatter) WriteValue* (type: INTEGER; IN val: ARRAY OF CHAR; OUT res: INTEGER), NEW, ABSTRACT;
|
|
PROCEDURE (f: Formatter) WriteValue* (type: INTEGER; IN val: ARRAY OF CHAR; OUT res: INTEGER), NEW, ABSTRACT;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
PROCEDURE NewStackItem(): StackItem;
|
|
PROCEDURE NewStackItem(): StackItem;
|
|
-
|
|
|
|
VAR s: StackItem;
|
|
VAR s: StackItem;
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
NEW(s);
|
|
NEW(s);
|
|
-
|
|
|
|
s.depth:=1;
|
|
s.depth:=1;
|
|
-
|
|
|
|
s.expect:={};
|
|
s.expect:={};
|
|
-
|
|
|
|
s.values:=0;
|
|
s.values:=0;
|
|
-
|
|
|
|
RETURN s;
|
|
RETURN s;
|
|
-
|
|
|
|
END NewStackItem;
|
|
END NewStackItem;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
PROCEDURE Push(VAR root: StackItem);
|
|
PROCEDURE Push(VAR root: StackItem);
|
|
-
|
|
|
|
VAR new: StackItem;
|
|
VAR new: StackItem;
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
new:=NewStackItem();
|
|
new:=NewStackItem();
|
|
-
|
|
|
|
new.next:=root;
|
|
new.next:=root;
|
|
-
|
|
|
|
root:=new;
|
|
root:=new;
|
|
-
|
|
|
|
IF root.next#NIL THEN root.depth:=root.next.depth+1 END
|
|
IF root.next#NIL THEN root.depth:=root.next.depth+1 END
|
|
-
|
|
|
|
END Push;
|
|
END Push;
|
|
-
|
|
|
|
|
|
|
|
-
|
|
|
|
PROCEDURE Pop(VAR root: StackItem);
|
|
PROCEDURE Pop(VAR root: StackItem);
|
|
-
|
|
|
|
VAR old: StackItem;
|
|
VAR old: StackItem;
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
IF root#NIL THEN
|
|
IF root#NIL THEN
|
|
-
|
|
|
|
old:=root;
|
|
old:=root;
|
|
-
|
|
|
|
root:=old.next;
|
|
root:=old.next;
|
|
-
|
|
|
|
old:=NIL;
|
|
old:=NIL;
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
END Pop;
|
|
END Pop;
|
|
-
|
|
|
|
|
|
|
|
-
|
|
|
|
PROCEDURE (f: StdF) ConnectTo (wr: JSonGenerator.Writer);
|
|
PROCEDURE (f: StdF) ConnectTo (wr: JSonGenerator.Writer);
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
ASSERT(wr#NIL, 20); ASSERT(wr.Base()#NIL, 21);
|
|
ASSERT(wr#NIL, 20); ASSERT(wr.Base()#NIL, 21);
|
|
-
|
|
|
|
f.wr:=wr;
|
|
f.wr:=wr;
|
|
-
|
|
|
|
f.this:=NIL;
|
|
f.this:=NIL;
|
|
-
|
|
|
|
END ConnectTo;
|
|
END ConnectTo;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
PROCEDURE String (wr: JSonGenerator.Writer; IN s: ARRAY OF CHAR);
|
|
PROCEDURE String (wr: JSonGenerator.Writer; IN s: ARRAY OF CHAR);
|
|
-
|
|
|
|
VAR i: INTEGER;
|
|
VAR i: INTEGER;
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
i:=0;
|
|
i:=0;
|
|
-
|
|
|
|
WHILE i<LEN(s$) DO
|
|
WHILE i<LEN(s$) DO
|
|
-
|
|
|
|
CASE s[i] OF
|
|
CASE s[i] OF
|
|
-
|
|
|
|
'"': wr.Char('\'); wr.Char('"');
|
|
'"': wr.Char('\'); wr.Char('"');
|
|
-
|
|
|
|
|'\': wr.Char('\'); wr.Char('\');
|
|
|'\': wr.Char('\'); wr.Char('\');
|
|
-
|
|
|
|
|09X: wr.Char('\'); wr.Char('t');
|
|
|09X: wr.Char('\'); wr.Char('t');
|
|
-
|
|
|
|
|0DX: wr.Char('\'); wr.Char('r');
|
|
|0DX: wr.Char('\'); wr.Char('r');
|
|
-
|
|
|
|
|0AX: wr.Char('\'); wr.Char('n');
|
|
|0AX: wr.Char('\'); wr.Char('n');
|
|
-
|
|
|
|
|0CX: wr.Char('\'); wr.Char('f');
|
|
|0CX: wr.Char('\'); wr.Char('f');
|
|
-
|
|
|
|
|08X: wr.Char('\'); wr.Char('b');
|
|
|08X: wr.Char('\'); wr.Char('b');
|
|
-
|
|
|
|
ELSE wr.Char(s[i]) END;
|
|
ELSE wr.Char(s[i]) END;
|
|
-
|
|
|
|
INC(i)
|
|
INC(i)
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
END String;
|
|
END String;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
PROCEDURE UniString (wr: JSonGenerator.Writer; IN s: ARRAY OF CHAR);
|
|
PROCEDURE UniString (wr: JSonGenerator.Writer; IN s: ARRAY OF CHAR);
|
|
-
|
|
|
|
VAR i: INTEGER;
|
|
VAR i: INTEGER;
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
i:=0;
|
|
i:=0;
|
|
-
|
|
|
|
WHILE i<LEN(s$) DO
|
|
WHILE i<LEN(s$) DO
|
|
-
|
|
|
|
CASE s[i] OF
|
|
CASE s[i] OF
|
|
-
|
|
|
|
'"': wr.Char('\'); wr.Char('"');
|
|
'"': wr.Char('\'); wr.Char('"');
|
|
-
|
|
|
|
|'\': wr.Char('\'); wr.Char('\');
|
|
|'\': wr.Char('\'); wr.Char('\');
|
|
-
|
|
|
|
|09X: wr.Char('\'); wr.Char('t');
|
|
|09X: wr.Char('\'); wr.Char('t');
|
|
-
|
|
|
|
|0DX: wr.Char('\'); wr.Char('r');
|
|
|0DX: wr.Char('\'); wr.Char('r');
|
|
-
|
|
|
|
|0AX: wr.Char('\'); wr.Char('n');
|
|
|0AX: wr.Char('\'); wr.Char('n');
|
|
-
|
|
|
|
|0CX: wr.Char('\'); wr.Char('f');
|
|
|0CX: wr.Char('\'); wr.Char('f');
|
|
-
|
|
|
|
|08X: wr.Char('\'); wr.Char('b');
|
|
|08X: wr.Char('\'); wr.Char('b');
|
|
-
|
|
|
|
ELSE wr.UnicodeChar(s[i]) END;
|
|
ELSE wr.UnicodeChar(s[i]) END;
|
|
-
|
|
|
|
INC(i)
|
|
INC(i)
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
END UniString;
|
|
END UniString;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
PROCEDURE (f: StdF) WriteName (IN s: ARRAY OF CHAR; OUT res: INTEGER);
|
|
PROCEDURE (f: StdF) WriteName (IN s: ARRAY OF CHAR; OUT res: INTEGER);
|
|
-
|
|
|
|
VAR i: INTEGER;
|
|
VAR i: INTEGER;
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
ASSERT(s$#'', 20);
|
|
ASSERT(s$#'', 20);
|
|
-
|
|
|
|
res:=0;
|
|
res:=0;
|
|
-
|
|
|
|
IF (f.this#NIL) & (name IN f.this.expect) THEN
|
|
IF (f.this#NIL) & (name IN f.this.expect) THEN
|
|
-
|
|
|
|
IF (objEnd IN f.this.expect) THEN
|
|
IF (objEnd IN f.this.expect) THEN
|
|
-
|
|
|
|
IF f.this.values > 0 THEN
|
|
IF f.this.values > 0 THEN
|
|
-
|
|
|
|
f.wr.Char(',');
|
|
f.wr.Char(',');
|
|
-
|
|
|
|
f.wr.Whitespace(0DX);
|
|
f.wr.Whitespace(0DX);
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
FOR i:=1 TO f.this.depth DO f.wr.Whitespace(09X) END;
|
|
FOR i:=1 TO f.this.depth DO f.wr.Whitespace(09X) END;
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
f.wr.Char('"'); String(f.wr, s); f.wr.Char('"'); f.wr.Char(':'); f.wr.Whitespace(' '); f.this.expect:={value, arrBegin, objBegin};
|
|
f.wr.Char('"'); String(f.wr, s); f.wr.Char('"'); f.wr.Char(':'); f.wr.Whitespace(' '); f.this.expect:={value, arrBegin, objBegin};
|
|
-
|
|
|
|
INC(f.this.values);
|
|
INC(f.this.values);
|
|
-
|
|
|
|
ELSE
|
|
ELSE
|
|
-
|
|
|
|
res:=errUnexpected
|
|
res:=errUnexpected
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
END WriteName;
|
|
END WriteName;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
PROCEDURE (f: StdF) WriteValue (type: INTEGER; IN v: ARRAY OF CHAR; OUT res: INTEGER);
|
|
PROCEDURE (f: StdF) WriteValue (type: INTEGER; IN v: ARRAY OF CHAR; OUT res: INTEGER);
|
|
-
|
|
|
|
VAR i: INTEGER; vs: ARRAY 20 OF CHAR;
|
|
VAR i: INTEGER; vs: ARRAY 20 OF CHAR;
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
ASSERT(type IN {stringVal, atomVal, intVal, realVal, unicodeStringVal}, 20);
|
|
ASSERT(type IN {stringVal, atomVal, intVal, realVal, unicodeStringVal}, 20);
|
|
-
|
|
|
|
ASSERT((type IN {stringVal, unicodeStringVal}) OR (v$#''), 21);
|
|
ASSERT((type IN {stringVal, unicodeStringVal}) OR (v$#''), 21);
|
|
-
|
|
|
|
res:=0;
|
|
res:=0;
|
|
-
|
|
|
|
IF (f.this#NIL) & (value IN f.this.expect) THEN
|
|
IF (f.this#NIL) & (value IN f.this.expect) THEN
|
|
-
|
|
|
|
IF (arrEnd IN f.this.expect) THEN
|
|
IF (arrEnd IN f.this.expect) THEN
|
|
-
|
|
|
|
IF f.this.values > 0 THEN
|
|
IF f.this.values > 0 THEN
|
|
-
|
|
|
|
f.wr.Char(',');
|
|
f.wr.Char(',');
|
|
-
|
|
|
|
f.wr.Whitespace(0DX);
|
|
f.wr.Whitespace(0DX);
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
FOR i:=1 TO f.this.depth DO f.wr.Whitespace(09X) END;
|
|
FOR i:=1 TO f.this.depth DO f.wr.Whitespace(09X) END;
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
CASE type OF
|
|
CASE type OF
|
|
-
|
|
|
|
stringVal: f.wr.Char('"'); String(f.wr, v); f.wr.Char('"');
|
|
stringVal: f.wr.Char('"'); String(f.wr, v); f.wr.Char('"');
|
|
-
|
|
|
|
|unicodeStringVal: f.wr.Char('"'); UniString(f.wr, v); f.wr.Char('"');
|
|
|unicodeStringVal: f.wr.Char('"'); UniString(f.wr, v); f.wr.Char('"');
|
|
-
|
|
|
|
|intVal, realVal: String(f.wr, v);
|
|
|intVal, realVal: String(f.wr, v);
|
|
-
|
|
|
|
|atomVal: Str.ToLower(v, vs); String(f.wr, vs); (* null, true, false точно поместятся в 20 символов *)
|
|
|atomVal: Str.ToLower(v, vs); String(f.wr, vs); (* null, true, false точно поместятся в 20 символов *)
|
|
-
|
|
|
|
ELSE HALT(100) END;
|
|
ELSE HALT(100) END;
|
|
-
|
|
|
|
INC(f.this.values);
|
|
INC(f.this.values);
|
|
-
|
|
|
|
IF ~(arrEnd IN f.this.expect) THEN f.this.expect:={objEnd, name} END;
|
|
IF ~(arrEnd IN f.this.expect) THEN f.this.expect:={objEnd, name} END;
|
|
-
|
|
|
|
ELSE
|
|
ELSE
|
|
-
|
|
|
|
res:=errUnexpected
|
|
res:=errUnexpected
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
END WriteValue;
|
|
END WriteValue;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
PROCEDURE (f: StdF) WriteSym (sym: INTEGER; OUT res: INTEGER);
|
|
PROCEDURE (f: StdF) WriteSym (sym: INTEGER; OUT res: INTEGER);
|
|
-
|
|
|
|
VAR expect: SET; i: INTEGER;
|
|
VAR expect: SET; i: INTEGER;
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
res:=0;
|
|
res:=0;
|
|
-
|
|
|
|
IF f.this#NIL THEN expect:=f.this.expect ELSE expect:={objBegin, arrBegin} END;
|
|
IF f.this#NIL THEN expect:=f.this.expect ELSE expect:={objBegin, arrBegin} END;
|
|
IF (sym IN expect) THEN
|
|
IF (sym IN expect) THEN
|
|
-
|
|
|
|
CASE sym OF
|
|
CASE sym OF
|
|
-
|
|
|
|
objBegin:
|
|
objBegin:
|
|
-
|
|
|
|
IF (f.this#NIL) THEN
|
|
IF (f.this#NIL) THEN
|
|
-
|
|
|
|
IF ~(arrEnd IN f.this.expect) THEN
|
|
IF ~(arrEnd IN f.this.expect) THEN
|
|
-
|
|
|
|
- f.this.expect:={objEnd, name}
|
|
|
|
-
|
|
|
|
|
|
+ f.this.expect:={objEnd, name}
|
|
ELSE
|
|
ELSE
|
|
-
|
|
|
|
IF f.this.values > 0 THEN
|
|
IF f.this.values > 0 THEN
|
|
-
|
|
|
|
f.wr.Char(',');
|
|
f.wr.Char(',');
|
|
-
|
|
|
|
f.wr.Whitespace(0DX);
|
|
f.wr.Whitespace(0DX);
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
FOR i:=1 TO f.this.depth DO f.wr.Whitespace(09X) END;
|
|
FOR i:=1 TO f.this.depth DO f.wr.Whitespace(09X) END;
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
Push(f.this); f.wr.Char('{'); f.wr.Whitespace(0DX); f.this.expect:={objEnd, name}
|
|
Push(f.this); f.wr.Char('{'); f.wr.Whitespace(0DX); f.this.expect:={objEnd, name}
|
|
-
|
|
|
|
|arrBegin:
|
|
|arrBegin:
|
|
-
|
|
|
|
IF (f.this#NIL) THEN
|
|
IF (f.this#NIL) THEN
|
|
-
|
|
|
|
IF ~(arrEnd IN f.this.expect) THEN f.this.expect:={objEnd, name}
|
|
IF ~(arrEnd IN f.this.expect) THEN f.this.expect:={objEnd, name}
|
|
-
|
|
|
|
ELSE
|
|
ELSE
|
|
-
|
|
|
|
IF f.this.values > 0 THEN
|
|
IF f.this.values > 0 THEN
|
|
-
|
|
|
|
f.wr.Char(',');
|
|
f.wr.Char(',');
|
|
-
|
|
|
|
f.wr.Whitespace(0DX);
|
|
f.wr.Whitespace(0DX);
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
FOR i:=1 TO f.this.depth DO f.wr.Whitespace(09X) END;
|
|
FOR i:=1 TO f.this.depth DO f.wr.Whitespace(09X) END;
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
Push(f.this); f.wr.Char('['); f.wr.Whitespace(0DX); f.this.expect:={arrEnd, objBegin, arrBegin, value}
|
|
Push(f.this); f.wr.Char('['); f.wr.Whitespace(0DX); f.this.expect:={arrEnd, objBegin, arrBegin, value}
|
|
-
|
|
|
|
|objEnd:
|
|
|objEnd:
|
|
-
|
|
|
|
f.wr.Whitespace(0DX); FOR i:=1 TO f.this.depth-1 DO f.wr.Whitespace(09X) END;
|
|
f.wr.Whitespace(0DX); FOR i:=1 TO f.this.depth-1 DO f.wr.Whitespace(09X) END;
|
|
-
|
|
|
|
f.wr.Char('}'); Pop(f.this);
|
|
f.wr.Char('}'); Pop(f.this);
|
|
-
|
|
|
|
|arrEnd:
|
|
|arrEnd:
|
|
-
|
|
|
|
f.wr.Whitespace(0DX); FOR i:=1 TO f.this.depth-1 DO f.wr.Whitespace(09X) END;
|
|
f.wr.Whitespace(0DX); FOR i:=1 TO f.this.depth-1 DO f.wr.Whitespace(09X) END;
|
|
-
|
|
|
|
f.wr.Char(']'); Pop(f.this)
|
|
f.wr.Char(']'); Pop(f.this)
|
|
-
|
|
|
|
ELSE HALT(101) END;
|
|
ELSE HALT(101) END;
|
|
-
|
|
|
|
ELSE
|
|
ELSE
|
|
-
|
|
|
|
res:=errWrongSym;
|
|
res:=errWrongSym;
|
|
-
|
|
|
|
HALT(100);
|
|
HALT(100);
|
|
-
|
|
|
|
END;
|
|
END;
|
|
-
|
|
|
|
END WriteSym;
|
|
END WriteSym;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
PROCEDURE (d: StdDir) New (wr: JSonGenerator.Writer): Formatter;
|
|
PROCEDURE (d: StdDir) New (wr: JSonGenerator.Writer): Formatter;
|
|
-
|
|
|
|
VAR f: StdF;
|
|
VAR f: StdF;
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
ASSERT(wr#NIL, 20); ASSERT(wr.Base()#NIL, 21);
|
|
ASSERT(wr#NIL, 20); ASSERT(wr.Base()#NIL, 21);
|
|
-
|
|
|
|
NEW(f);
|
|
NEW(f);
|
|
-
|
|
|
|
f.ConnectTo(wr);
|
|
f.ConnectTo(wr);
|
|
-
|
|
|
|
RETURN f
|
|
RETURN f
|
|
-
|
|
|
|
END New;
|
|
END New;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
PROCEDURE Install* (d: Directory);
|
|
PROCEDURE Install* (d: Directory);
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
ASSERT(d#NIL, 20);
|
|
ASSERT(d#NIL, 20);
|
|
-
|
|
|
|
prev:=dir;
|
|
prev:=dir;
|
|
-
|
|
|
|
dir:=d;
|
|
dir:=d;
|
|
-
|
|
|
|
END Install;
|
|
END Install;
|
|
-
|
|
|
|
|
|
|
|
-
|
|
|
|
PROCEDURE Init;
|
|
PROCEDURE Init;
|
|
-
|
|
|
|
VAR d: StdDir;
|
|
VAR d: StdDir;
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
NEW(d);
|
|
NEW(d);
|
|
-
|
|
|
|
Install(d);
|
|
Install(d);
|
|
-
|
|
|
|
stdDir:=d;
|
|
stdDir:=d;
|
|
-
|
|
|
|
END Init;
|
|
END Init;
|
|
-
|
|
|
|
|
|
|
|
-
|
|
|
|
BEGIN
|
|
BEGIN
|
|
-
|
|
|
|
Init
|
|
Init
|
|
-
|
|
|
|
END JSonFormatter.
|
|
END JSonFormatter.
|