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 }