/ Serialize a JSON document tree: */ /
| 256 | /* Serialize a JSON document tree: */ |
| 257 | /***********************************************************************/ |
| 258 | PSZ Serialize(PGLOBAL g, PJSON jsp, char* fn, int pretty) { |
| 259 | PSZ str = NULL; |
| 260 | bool b = false, err = true; |
| 261 | JOUT* jp; |
| 262 | FILE* fs = NULL; |
| 263 | PJDOC jdp = NULL; |
| 264 | |
| 265 | g->Message[0] = 0; |
| 266 | |
| 267 | try { |
| 268 | jdp = new(g) JDOC; // MUST BE ALLOCATED BEFORE jp !!!!! |
| 269 | jdp->dfp = GetDefaultPrec(); |
| 270 | |
| 271 | if (!jsp) { |
| 272 | snprintf(g->Message, sizeof(g->Message), "Null json tree"); |
| 273 | throw 1; |
| 274 | } else if (!fn) { |
| 275 | // Serialize to a string |
| 276 | jp = new(g) JOUTSTR(g); |
| 277 | b = pretty == 1; |
| 278 | } else { |
| 279 | if (!(fs = fopen(fn, "wb"))) { |
| 280 | snprintf(g->Message, sizeof(g->Message), MSG(OPEN_MODE_ERROR) ": %s", |
| 281 | "w", (int)errno, fn, strerror(errno)); |
| 282 | throw 2; |
| 283 | } else if (pretty >= 2) { |
| 284 | // Serialize to a pretty file |
| 285 | jp = new(g)JOUTPRT(g, fs); |
| 286 | } else { |
| 287 | // Serialize to a flat file |
| 288 | b = true; |
| 289 | jp = new(g)JOUTFILE(g, fs, pretty); |
| 290 | } // endif's |
| 291 | |
| 292 | } // endif's |
| 293 | |
| 294 | jdp->SetJp(jp); |
| 295 | |
| 296 | switch (jsp->GetType()) { |
| 297 | case TYPE_JAR: |
| 298 | err = jdp->SerializeArray((PJAR)jsp, b); |
| 299 | break; |
| 300 | case TYPE_JOB: |
| 301 | err = ((b && jp->Prty()) && jp->WriteChr('\t')); |
| 302 | err |= jdp->SerializeObject((PJOB)jsp); |
| 303 | break; |
| 304 | case TYPE_JVAL: |
| 305 | err = jdp->SerializeValue((PJVAL)jsp); |
| 306 | break; |
| 307 | default: |
| 308 | snprintf(g->Message, sizeof(g->Message), "Invalid json tree"); |
| 309 | } // endswitch Type |
| 310 | |
| 311 | if (fs) { |
| 312 | fputs(EL, fs); |
| 313 | fclose(fs); |
| 314 | if(err) { |
| 315 | str = NULL; |
no test coverage detected