nisse

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

test.c (7886B)


      1 #define NISSE_IMPL
      2 #include "nisse.h"
      3 
      4 /*
      5 ** You generate a following structure as you need for you application.
      6 ** This structure contains enough information for nisse to serialise
      7 */
      8 
      9 nde_t fmt_item = nisse_andea(1, nisse_tndea("type", 0,));
     10 nde_t fmt_ranged = nisse_andea(2, nisse_andea(1, nisse_andes("damage")),
     11                                   nisse_andea(1, nisse_andes("range")));
     12 nde_t fmt_weapon = nisse_andea(1, nisse_tndea("damage", 0,));
     13 
     14 nde_t nde_arr[] = {
     15         {
     16                 .type = NISSE_TYPE_ARRAY,
     17                 .new_line_at_end_of_subsequent_elements = 1,
     18                 .nde = (nde_t[]){
     19                         nisse_andes("player"),
     20                         nisse_andei(-100), // just here for example purposes
     21                         nisse_tndef("hp", 2.0f),
     22                         {
     23                                 .type = NISSE_TYPE_ARRAY,
     24                                 .new_line_at_end_of_subsequent_elements = 1,
     25                                 .new_line_at_start = 1,
     26                                 .nde = (nde_t[]){
     27                                         nisse_andes("items"),
     28                                         nisse_tndea("sword", 2,
     29                                                    nisse_tndes("type", "weapon"),
     30                                                    nisse_tndei("damage", 10)
     31                                                 ),
     32                                         nisse_tndea("knife", 2,
     33                                                     nisse_tndes("type", "weapon"),
     34                                                     nisse_tndei("damage", 4)
     35                                                 ),
     36                                         nisse_tndea("bow", 3,
     37                                                    nisse_tndes("type", "ranged"),
     38                                                    nisse_tndei("damage", 10),
     39                                                    nisse_tndei("range", 15)
     40                                                 ),
     41                                         nisse_tndeanl("crossbow", 4,
     42                                                      nisse_tndes("type", "ranged"),
     43                                                      nisse_tndei("damage", 16),
     44                                                      nisse_tndei("range", 25),
     45                                                      nisse_tndea("properties", 2,
     46                                                                 nisse_andes("poison"),
     47                                                                 nisse_andes("fire")
     48                                                              ),
     49                                                 ),
     50                                         nisse_tndea("sling", 3,
     51                                                    nisse_tndes("type", "ranged"),
     52                                                    nisse_tndei("damage", 4),
     53                                                    nisse_tndei("range", 3)
     54                                                 ),
     55                                 },
     56                                 .nde_len = 6,
     57                         }
     58                 },
     59                 .nde_len = 4,
     60         },
     61         {
     62                 .type = NISSE_TYPE_ARRAY,
     63                 .new_line_at_end_of_subsequent_elements = 1,
     64                 .nde = (nde_t[]){
     65                         nisse_andes("test-array"),
     66                         nisse_andea(1, nisse_andes("test")),
     67                         nisse_andea(0, ),
     68                         nisse_andea(1, nisse_andea(0, )),
     69                         nisse_tndea("sword", 1, nisse_tndei("damage", 10)),
     70                         nisse_andea(3, nisse_andes("test 1"), nisse_andes("2 test"), nisse_andes("test3")),
     71                 },
     72                 .nde_len = 6,
     73         },
     74         nisse_tndeanl("v3 array", 4,
     75                     nisse_andea(3,
     76                                 nisse_andef(1.0f),
     77                                 nisse_andef(2.0f),
     78                                 nisse_andef(3.0f),
     79                             ),
     80                     nisse_andea(3,
     81                                 nisse_andef(4.0f),
     82                                 nisse_andef(5.0f),
     83                                 nisse_andef(6.0f),
     84                             ),
     85                     nisse_andea(3,
     86                                 nisse_andef(7.0f),
     87                                 nisse_andef(8.0f),
     88                                 nisse_andef(9.0f),
     89                             ),
     90                     nisse_andea(3,
     91                                 nisse_andef(10.0f),
     92                                 nisse_andef(0.00001f),
     93                                 nisse_andef(420.69f),
     94                             ),
     95                 ),
     96 };
     97 
     98 #define ARR_SZ(__ARR) sizeof(__ARR) / sizeof(__ARR[0])
     99 
    100 static nde_t
    101 get_v3_fmt()
    102 {
    103         // This would normaly be an error since the compound literals are stack allocated,
    104         // but the dup command converts everything to heap allocation.
    105         return nisse_dup_nde(&(nde_t)nisse_andea(3, nisse_andef(0), nisse_andef(0), nisse_andef(0)), 1);
    106 }
    107 
    108 int main()
    109 {
    110         nde_t test = {.type = NISSE_TYPE_ARRAY, .nde_len = ARR_SZ(nde_arr), .nde = nde_arr};
    111 #if 1
    112         nisse_write_to_file("./test.nisse", test);
    113 #endif
    114         nde_t nde = nisse_parse_file("./test.nisse");
    115 
    116 #if 1
    117         nde_t* player_true = nisse_nde_get_index(&test, 0);
    118         nde_t* player_parsed = nisse_nde_get_index(&nde, 0);
    119         assert(player_true);
    120         assert(player_parsed);
    121 
    122         printf("test->player has some of player? %s.\n", nisse_nde_fits_format(player_parsed, player_true) ? "yes" : "no");
    123         printf("test->player has at least all of player? %s.\n", nisse_nde_fits_format(player_true, player_parsed) ? "yes" : "no");
    124 
    125         // check if items are correct
    126 
    127         nde_t* items_parsed = nisse_nde_get_tagged(player_parsed, "items");
    128         assert(items_parsed && items_parsed->type == NISSE_TYPE_ARRAY);
    129 
    130         for (int i = 1; i < items_parsed->nde_len; i++) {
    131                 if (!nisse_nde_fits_format(&fmt_item, items_parsed->nde + i)) {
    132                         printf("item does not define a type %s:%d\n", items_parsed->nde[i].nde->type == NISSE_TYPE_STRING ? items_parsed->nde[i].nde->str : NULL, i);
    133                         continue;
    134                 }
    135 
    136                 nde_t* type_parsed = nisse_nde_get_tagged(items_parsed->nde + i, "type");
    137                 if (!type_parsed || type_parsed->type != NISSE_TYPE_ARRAY || type_parsed->nde_len != 2 || type_parsed->nde[1].type != NISSE_TYPE_STRING) {
    138                         printf("invalid item, wrong type value %s:%d\n", items_parsed->nde[i].nde->type == NISSE_TYPE_STRING ? items_parsed->nde[i].nde->str : NULL, i);
    139                 } else {
    140                         const char* item_type = nisse_nde_get_value(type_parsed, NULL)->str;
    141                         if (strcmp(item_type, "weapon") == 0 && !nisse_nde_fits_format(&fmt_weapon, items_parsed->nde + i))
    142                                 printf("invalid weapon %s:%d\n", items_parsed->nde[i].nde->type == NISSE_TYPE_STRING ? items_parsed->nde[i].nde->str : NULL, i);
    143                         else if (strcmp(item_type, "ranged") == 0 && !nisse_nde_fits_format(&fmt_ranged, items_parsed->nde + i))
    144                                 printf("invalid ranged %s:%d\n", items_parsed->nde[i].nde->type == NISSE_TYPE_STRING ? items_parsed->nde[i].nde->str : NULL, i);
    145                 }
    146         }
    147 #endif
    148 
    149         nde_t* v3a = nisse_nde_get_tagged(&nde, "v3 array");
    150         assert(v3a);
    151         nde_t fmt_v3 = get_v3_fmt();
    152         for (int i = 1; i < v3a->nde_len; i++)
    153                 if (!nisse_nde_fits_format(v3a->nde+ i, &fmt_v3))
    154                         printf("infalid v3 array %d!\n", i);
    155 
    156         nisse_write_to_file("./test2.nisse", nde);
    157 
    158         nisse_free_nde(&nde);
    159         nisse_free_nde(&fmt_v3);
    160 }