const prop_info *prop_area::find_property(prop_bt *const trie, const char *name, uint8_t namelen, const char *value, uint8_t valuelen, bool alloc_if_needed) { if (!trie) return NULL; const char *remaining_name = name; prop_bt* current = trie; while (true) { const char *sep = strchr(remaining_name, '.'); const bool want_subtree = (sep != NULL); const uint8_t substr_size = (want_subtree) ? sep - remaining_name : strlen(remaining_name); if (!substr_size) { return NULL; } prop_bt* root = NULL; uint_least32_t children_offset = atomic_load_explicit(¤t->children, memory_order_relaxed); if (children_offset != 0) { root = to_prop_bt(¤t->children); } else if (alloc_if_needed) { uint_least32_t new_offset; root = new_prop_bt(remaining_name, substr_size, &new_offset); if (root) { atomic_store_explicit(¤t->children, new_offset, memory_order_release); } } if (!root) { return NULL; } current = find_prop_bt(root, remaining_name, substr_size, alloc_if_needed); if (!current) { return NULL; } if (!want_subtree) break; remaining_name = sep + 1; } uint_least32_t prop_offset = atomic_load_explicit(¤t->prop, memory_order_relaxed); if (prop_offset != 0) { return to_prop_info(¤t->prop); } else if (alloc_if_needed) { uint_least32_t new_offset; prop_info* new_info = new_prop_info(name, namelen, value, valuelen, &new_offset); if (new_info) { atomic_store_explicit(¤t->prop, new_offset, memory_order_release); } return new_info; } else { return NULL; } }
static const prop_info *find_property(prop_bt *const trie, const char *name, uint8_t namelen, const char *value, uint8_t valuelen, bool alloc_if_needed) { if (!trie) return NULL; const char *remaining_name = name; prop_bt* current = trie; while (true) { const char *sep = strchr(remaining_name, '.'); const bool want_subtree = (sep != NULL); const uint8_t substr_size = (want_subtree) ? sep - remaining_name : strlen(remaining_name); if (!substr_size) { return NULL; } prop_bt* root = NULL; if (current->children) { root = reinterpret_cast<prop_bt*>(to_prop_obj(current->children)); } else if (alloc_if_needed) { uint32_t new_bt_offset; root = new_prop_bt(remaining_name, substr_size, &new_bt_offset); if (root) { current->children = new_bt_offset; } } if (!root) { return NULL; } current = find_prop_bt(root, remaining_name, substr_size, alloc_if_needed); if (!current) { return NULL; } if (!want_subtree) break; remaining_name = sep + 1; } if (current->prop) { return reinterpret_cast<prop_info*>(to_prop_obj(current->prop)); } else if (alloc_if_needed) { uint32_t new_info_offset; prop_info* new_info = new_prop_info(name, namelen, value, valuelen, &new_info_offset); if (new_info) { current->prop = new_info_offset; } return new_info; } else { return NULL; } }