1 2 #include "cs_config.h" 3 #include <unistd.h> 4 #include <string.h> 5 #include "util/neo_misc.h" 6 #include "util/neo_hdf.h" 7 #include "util/neo_rand.h" 8 9 #define DIE_NOT_OK(err) \ 10 if (err != STATUS_OK) { \ 11 nerr_log_error(err); \ 12 exit(-1); \ 13 } 14 15 16 int rand_name (char *s, int slen) 17 { 18 char buf[256]; 19 int x, m, l, rl; 20 21 m = neo_rand(10); 22 while (1) { 23 neo_rand_word(s, slen); 24 if (!strchr(s, '.')) break; 25 } 26 27 for (x = 1; x < m; x++) 28 { 29 l = strlen(s); 30 neo_rand_word(buf, sizeof(buf)); 31 rl = strlen(buf); 32 /* fprintf(stderr, "%s\n", buf); */ 33 if (rl && slen - l - rl > 1 && !strchr(buf, '.')) { 34 snprintf(s + l, slen - l, ".%s", buf); 35 } 36 } 37 38 return 0; 39 } 40 41 static int sortByName(const void *a, const void *b) { 42 HDF **ha = (HDF **)a; 43 HDF **hb = (HDF **)b; 44 45 /* fprintf(stderr, "%s <=> %s\n", hdf_obj_name(*ha), hdf_obj_name(*hb)); */ 46 return strcasecmp(hdf_obj_name(*ha), hdf_obj_name(*hb)); 47 } 48 49 50 int main(int argc, char *argv[]) 51 { 52 NEOERR *err; 53 HDF *hdf; 54 int x; 55 char name[256]; 56 char value[256]; 57 double tstart = 0; 58 59 err = hdf_init(&hdf); 60 DIE_NOT_OK(err); 61 62 err = hdf_set_value (hdf, "Beware", "1"); 63 DIE_NOT_OK(err); 64 err = hdf_set_value (hdf, "Beware.The", "2"); 65 DIE_NOT_OK(err); 66 err = hdf_set_valuef (hdf, "Beware.The.%s=%d", "Ides", 3); 67 DIE_NOT_OK(err); 68 err = hdf_set_value (hdf, "Beware.Off", "4"); 69 DIE_NOT_OK(err); 70 err = hdf_set_value (hdf, "Beware.The.Ides.Of", "5"); 71 DIE_NOT_OK(err); 72 err = hdf_set_value (hdf, "Beware.The.Butter", "6"); 73 DIE_NOT_OK(err); 74 err = hdf_set_attr (hdf, "Beware.The.Butter", "Lang", "en"); 75 DIE_NOT_OK(err); 76 err = hdf_set_attr (hdf, "Beware.The.Butter", "Lang", "1"); 77 DIE_NOT_OK(err); 78 err = hdf_set_attr (hdf, "Beware.The.Butter", "Lang", NULL); 79 DIE_NOT_OK(err); 80 81 err = hdf_read_file (hdf, "test.hdf"); 82 DIE_NOT_OK(err); 83 hdf_dump(hdf, NULL); 84 85 86 x = hdf_get_int_value (hdf, "Beware.The.Ides", 0); 87 if (x != 3) 88 { 89 ne_warn("hdf_get_int_value returned %d, expected 3", x); 90 return -1; 91 } 92 93 /* test symlinks */ 94 { 95 const char *v; 96 err = hdf_set_value(hdf, "Destination.Foo", "bar"); 97 DIE_NOT_OK(err); 98 err = hdf_set_symlink(hdf, "Symlink.baz", "Destination.Foo"); 99 DIE_NOT_OK(err); 100 v = hdf_get_value(hdf, "Symlink.baz", "notfound"); 101 if (strcmp(v, "bar")) { 102 ne_warn("hdf_get_value through symlink returned %s, expected bar", v); 103 return -1; 104 } 105 err = hdf_set_value(hdf, "Symlink.baz", "newvalue"); 106 DIE_NOT_OK(err); 107 v = hdf_get_value(hdf, "Symlink.baz", "notfound"); 108 if (strcmp(v, "newvalue")) { 109 ne_warn("hdf_get_value through symlink returned %s, expected newvalue", 110 v); 111 return -1; 112 } 113 err = hdf_set_value(hdf, "Symlink.baz.too", "newtoo"); 114 DIE_NOT_OK(err); 115 v = hdf_get_value(hdf, "Symlink.baz.too", "newtoo"); 116 if (strcmp(v, "newtoo")) { 117 ne_warn("hdf_get_value through symlink returned %s, expected newtoo", 118 v); 119 return -1; 120 } 121 v = hdf_get_value(hdf, "Destination.Foo.too", "newtoo"); 122 if (strcmp(v, "newtoo")) { 123 ne_warn("hdf_get_value through symlink returned %s, expected newtoo", 124 v); 125 return -1; 126 } 127 } 128 129 for (x = 0; x < 10000; x++) 130 { 131 rand_name(name, sizeof(name)); 132 neo_rand_word(value, sizeof(value)); 133 /* ne_warn("Setting %s = %s", name, value); */ 134 err = hdf_set_value (hdf, name, value); 135 DIE_NOT_OK(err); 136 } 137 138 tstart = ne_timef(); 139 hdf_sort_obj(hdf, sortByName); 140 ne_warn("sort took %5.5fs", ne_timef() - tstart); 141 142 hdf_dump(hdf, NULL); 143 144 hdf_destroy(&hdf); 145 146 return 0; 147 } 148