[c] bonjour

Viewer

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "string.h"
  4. #include "stdbool.h"
  5.  
  6. typedef struct {
  7.     char* key;
  8.     char* value;
  9. } prop_t;
  10.  
  11. typedef struct tag_s {
  12.     char* name;
  13.     struct tag_s* children;
  14.     size_t children_count;
  15.     prop_t* props;
  16.     size_t props_count;
  17. } tag_t;
  18.  
  19. static void print_object(char *prefix, tag_t *tag)
  20. {
  21.     printf("%s{\n", prefix);
  22.     for (size_t i = 0; i < tag->props_count; i++) {
  23.         if (!= 0)
  24.             printf(",\n");
  25.         printf(
  26.             "%s  \"%s\"\"%s\"",
  27.             prefix, tag->props[i].key, tag->props[i].value
  28.         );
  29.     }
  30.     printf("\n");
  31.     printf("%s}", prefix);
  32. }
  33.  
  34. static char* find_prop(
  35.     tag_t *tag, char *key, char *value, bool recursive, tag_t **out_holder
  36. )
  37. {
  38.     if (tag == NULL)
  39.         return NULL;
  40.     for (size_t i = 0; i < tag->props_count; i++)
  41.         if (
  42.             (key == NULL || strcmp(tag->props[i].key, key) == 0) &&
  43.             (value == NULL || strcmp(tag->props[i].value, value) == 0)
  44.         ) {
  45.             if (out_holder != NULL)
  46.                 *out_holder = tag;
  47.             return tag->props[i].value;
  48.         }
  49.     for (size_t i = 0; recursive && i < tag->children_count; i++) {
  50.         char *found = find_prop(
  51.             &tag->children[i], key, value, recursive, out_holder
  52.         );
  53.         if (found != NULL)
  54.             return found;
  55.     }
  56.     return NULL;
  57. }
  58.  
  59. static bool print_childrens_of_child(
  60.     tag_t *root, char* child_name, char *id, char *id_compartment
  61. )
  62. {
  63.     tag_t *child = root;
  64.     printf("\"%s\" : [\n", child->name);
  65.     bool had = false;
  66.     for (size_t i = 0; i < child->children_count; i++) {
  67.         if (id && strcmp(child->children[i].name, "speciesReference") &&
  68.             !find_prop(&child->children[i], 0, id, 1, 0) &&
  69.             !find_prop(&child->children[i], "id", id_compartment, 0, 0)) {
  70.             had = false;
  71.             continue;
  72.         }
  73.         had && printf(",\n");
  74.         print_object("  ", &child->children[i]);
  75.         had = true;
  76.     }
  77.     printf("\n]");
  78.     return true;
  79. }
  80.  
  81. static bool find_print_parameters(
  82.     tag_t *root, char *id,
  83.     tag_t **out_to_print, char **out_props,
  84.     tag_t **out_id_holder
  85. )
  86. {
  87.     memcpy(out_props, (char*[]){ "listOfCompartments", "listOfSpecies",
  88.         "listOfReactions", NULL }, sizeof(char*) * 4);
  89.  
  90.     if (id == NULL)
  91.         return true;
  92.  
  93.     find_prop(root, "id", id, true, out_id_holder);
  94.  
  95.     if (*out_id_holder == NULL)
  96.         return false;
  97.  
  98.     if (strcmp((*out_id_holder)->name, "reaction") == 0) {
  99.         *out_to_print = *out_id_holder;
  100.         memcpy(out_props, (char*[]){ "listOfReactants", "listOfProducts",
  101.             NULL }, sizeof(char*) * 4);
  102.     }
  103.  
  104.     return true;
  105. }
  106.  
  107. /// objects is an array of all objects in the document
  108. /// objects_len is the number of objects in the objects array
  109. /// compartment is either null or the name of the compartment to print
  110. bool to_json(tag_t *root, char *id)
  111. {
  112.     tag_t *to_print = root, *id_holder = NULL;
  113.     char *props[50];
  114.     find_print_parameters(root, id, &to_print, props, &id_holder);
  115.     char *id_compartment = find_prop(id_holder, "compartment", 0,0,0);
  116.     printf("{\n");
  117.     char **= props;
  118.     bool printed = false;
  119.     for (char **= props; *!= NULL; t++) {
  120.         printed && printf(",\n");
  121.         tag_t *child = to_print;
  122.         for (
  123.             size_t i = 0;
  124.             i < root->children_count && strcmp(child->name, *t);
  125.             child = &root->children[i++]
  126.         );
  127.         printed = print_childrens_of_child(child, *t, id, id_compartment);
  128.     }
  129.     printf("\n}\n");
  130.     return true;
  131. }
  132.  

Editor

You can edit this paste and save as new:


File Description
  • bonjour
  • Paste Code
  • 09 Jun-2023
  • 3.63 Kb
You can Share it: