14
14
along with WJElement. If not, see <http://www.gnu.org/licenses/>.
15
15
*/
16
16
17
-
18
17
#include "element.h"
19
18
#include <time.h>
20
19
@@ -63,13 +62,12 @@ _WJElement * _WJENew(_WJElement *parent, char *name, size_t len, const char *fil
63
62
if (!parent -> pub .child ) {
64
63
parent -> pub .child = (WJElement ) result ;
65
64
} else {
66
- /* Find the last child so it can be added at the end */
67
- for (prev = parent -> pub .child ; prev && prev -> next ; prev = prev -> next );
68
-
65
+ prev = parent -> pub .last ;
69
66
prev -> next = (WJElement ) result ;
70
67
result -> pub .prev = prev ;
71
68
}
72
69
70
+ parent -> pub .last = (WJElement ) result ;
73
71
parent -> pub .count ++ ;
74
72
}
75
73
@@ -115,6 +113,9 @@ EXPORT XplBool _WJEDetach(WJElement document, const char *file, const int line)
115
113
if (document -> parent -> child == document ) {
116
114
document -> parent -> child = document -> next ;
117
115
}
116
+ if (document -> parent -> last == document ) {
117
+ document -> parent -> last = document -> prev ;
118
+ }
118
119
document -> parent -> count -- ;
119
120
document -> parent = NULL ;
120
121
}
@@ -141,6 +142,10 @@ EXPORT XplBool WJEAttach(WJElement container, WJElement document)
141
142
return (FALSE);
142
143
}
143
144
145
+ if (document -> parent == container ) {
146
+ return (TRUE);
147
+ }
148
+
144
149
if (document -> name ) {
145
150
while ((prev = WJEChild (container , document -> name , WJE_GET ))) {
146
151
WJEDetach (prev );
@@ -155,12 +160,11 @@ EXPORT XplBool WJEAttach(WJElement container, WJElement document)
155
160
if (!container -> child ) {
156
161
container -> child = document ;
157
162
} else {
158
- /* Find the last child so it can be added at the end */
159
- for (prev = container -> child ; prev && prev -> next ; prev = prev -> next );
160
-
163
+ prev = container -> last ;
161
164
prev -> next = document ;
162
165
document -> prev = prev ;
163
166
}
167
+ container -> last = document ;
164
168
container -> count ++ ;
165
169
WJEChanged (container );
166
170
@@ -307,6 +311,17 @@ static WJElement _WJELoad(_WJElement *parent, WJReader reader, char *where, WJEL
307
311
return ((WJElement ) l );
308
312
}
309
313
314
+ EXPORT WJElement _WJEOpenDocument (WJReader reader , char * where , WJELoadCB loadcb , void * data , const char * file , const int line )
315
+ {
316
+ WJElement element ;
317
+
318
+ if ((element = _WJELoad (NULL , reader , where , loadcb , data , file , line ))) {
319
+ MemUpdateOwner (element , file , line );
320
+ }
321
+
322
+ return (element );
323
+ }
324
+
310
325
typedef struct WJEMemArgs
311
326
{
312
327
char * json ;
@@ -315,7 +330,7 @@ typedef struct WJEMemArgs
315
330
size_t len ;
316
331
} WJEMemArgs ;
317
332
318
- EXPORT size_t WJEMemCallback (char * buffer , size_t length , size_t seen , void * userdata )
333
+ static size_t WJEMemCallback (char * buffer , size_t length , size_t seen , void * userdata )
319
334
{
320
335
WJEMemArgs * args = (WJEMemArgs * ) userdata ;
321
336
char * json ;
@@ -371,7 +386,7 @@ EXPORT size_t WJEMemCallback(char *buffer, size_t length, size_t seen, void *use
371
386
and allows parsing documents with a non standard quote char for the sake of
372
387
embedding documents directly in C code.
373
388
*/
374
- EXPORT WJElement _WJEParse (const char * json , char quote )
389
+ EXPORT WJElement __WJEFromString (const char * json , char quote , const char * file , const int line )
375
390
{
376
391
WJElement doc ;
377
392
WJEMemArgs args ;
@@ -385,24 +400,13 @@ EXPORT WJElement _WJEParse(const char *json, char quote)
385
400
}
386
401
387
402
if (json && (reader = WJROpenDocument (WJEMemCallback , & args , NULL , 0 ))) {
388
- doc = WJEOpenDocument (reader , NULL , NULL , NULL );
403
+ doc = _WJEOpenDocument (reader , NULL , NULL , NULL , file , line );
389
404
WJRCloseDocument (reader );
390
405
}
391
406
392
407
return (doc );
393
408
}
394
409
395
- EXPORT WJElement _WJEOpenDocument (WJReader reader , char * where , WJELoadCB loadcb , void * data , const char * file , const int line )
396
- {
397
- WJElement element ;
398
-
399
- if ((element = _WJELoad (NULL , reader , where , loadcb , data , file , line ))) {
400
- MemUpdateOwner (element , file , line );
401
- }
402
-
403
- return (element );
404
- }
405
-
406
410
EXPORT char * _WJEToString (WJElement document , XplBool pretty , const char * file , const int line )
407
411
{
408
412
WJWriter writer ;
@@ -656,7 +660,7 @@ EXPORT XplBool _WJEWriteDocument(WJElement document, WJWriter writer, char *name
656
660
return (TRUE);
657
661
}
658
662
659
- EXPORT XplBool WJECloseDocument (WJElement document )
663
+ EXPORT XplBool _WJECloseDocument (WJElement document , const char * file , const int line )
660
664
{
661
665
_WJElement * current = (_WJElement * ) document ;
662
666
WJElement child ;
@@ -697,26 +701,26 @@ EXPORT XplBool WJECloseDocument(WJElement document)
697
701
/* Destroy all children */
698
702
while ((child = document -> child )) {
699
703
WJEDetach (child );
700
- WJECloseDocument (child );
704
+ _WJECloseDocument (child , file , line );
701
705
}
702
706
703
707
if (current -> pub .type == WJR_TYPE_STRING ) {
704
- MemFree (current -> value .string );
708
+ MemFreeEx (current -> value .string , file , line );
705
709
current -> pub .length = 0 ;
706
710
}
707
711
708
712
if (document -> name && current -> _name != document -> name ) {
709
- MemRelease (& document -> name );
713
+ MemReleaseEx (& document -> name , file , line );
710
714
}
711
715
712
- MemFree (current );
716
+ MemFreeEx (current , file , line );
713
717
714
718
return (TRUE);
715
719
}
716
720
717
721
EXPORT void WJEDump (WJElement document )
718
722
{
719
- WJEWriteFILE (document , stdout );
723
+ WJEWriteFILE (document , stdout );
720
724
}
721
725
722
726
EXPORT void WJEWriteFILE (WJElement document , FILE * fd )
@@ -728,6 +732,7 @@ EXPORT void WJEWriteFILE(WJElement document, FILE* fd)
728
732
WJWCloseDocument (dumpWriter );
729
733
}
730
734
fprintf (fd , "\n" );
735
+ fflush (fd );
731
736
}
732
737
733
738
EXPORT void WJEDumpFile (WJElement document )
@@ -750,47 +755,26 @@ EXPORT void WJEDumpFile(WJElement document)
750
755
}
751
756
}
752
757
753
- typedef struct _MemWriterData {
754
- size_t maxlength ;
755
- size_t length ;
756
- char * buffer ;
757
- } _MemWriterData ;
758
- static size_t MemWriteCB (char * data , size_t size , void * writedata ) {
759
- size_t write ;
760
- _MemWriterData * w = (_MemWriterData * )writedata ;
761
- if (w -> maxlength ) {
762
- write = w -> maxlength - strlen (w -> buffer ) - 1 ;
763
- } else {
764
- if (size > w -> length - strlen (w -> buffer )) {
765
- w -> length += 4096 ;
766
- w -> buffer = MemReallocWait (w -> buffer , w -> length );
767
- }
768
- write = size ;
769
- }
770
- if (size < write ) {
771
- write = size ;
772
- }
773
- if (w -> buffer ) {
774
- strncat (w -> buffer , data , write );
758
+ static size_t fileReaderCB ( char * data , size_t length , size_t seen , void * client )
759
+ {
760
+ DebugAssert (length );
761
+ DebugAssert (data );
762
+ if (!data ) {
763
+ return 0 ;
775
764
}
776
- return size ;
765
+ return fread ( data , 1 , length , client ) ;
777
766
}
778
767
779
- EXPORT char * WJEWriteMEM ( WJElement document , XplBool pretty , size_t maxlength )
768
+ EXPORT WJElement WJEReadFILE ( FILE * fd )
780
769
{
781
- WJWriter memWriter ;
782
- _MemWriterData data ;
783
-
784
- data .length = 0 ;
785
- data .maxlength = maxlength ;
786
- data .buffer = MemMalloc (maxlength );
787
- if (data .buffer ) {
788
- * data .buffer = '\0' ;
789
- }
770
+ WJReader reader ;
771
+ WJElement obj = NULL ;
790
772
791
- if ((memWriter = _WJWOpenDocument ( pretty , MemWriteCB , & data , maxlength ))) {
792
- WJEWriteDocument ( document , memWriter , NULL );
793
- WJWCloseDocument ( memWriter );
773
+ if ((reader = WJROpenDocument ( fileReaderCB , fd , NULL , 0 ))) {
774
+ obj = WJEOpenDocument ( reader , NULL , NULL , NULL );
775
+ WJRCloseDocument ( reader );
794
776
}
795
- return MemRealloc ( data . buffer , strlen ( data . buffer ) + 1 ) ;
777
+ return obj ;
796
778
}
779
+
780
+
0 commit comments