blob: 6606c5630e68ff8156c8e6bfd468f0a067d5052d [file] [log] [blame]
Ben Cheng21eab512012-03-13 23:04:57 -07001/*
Elliott Hughes409302f2012-08-13 17:02:11 -07002 * Copyright (C) 2012 The Android Open Source Project
Ben Cheng21eab512012-03-13 23:04:57 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Ben Cheng21eab512012-03-13 23:04:57 -070017#include <search.h>
18#include <stdlib.h>
19
Elliott Hughes5702c6f2017-08-31 17:27:05 -070020struct node_t {
21 char* key;
22 struct node* llink;
23 struct node* rlink;
24};
25
Elliott Hughes409302f2012-08-13 17:02:11 -070026// Destroy a tree and free all allocated resources.
Elliott Hughes3e424d02014-07-23 16:02:26 -070027// This is a GNU extension, not available from BSD.
Elliott Hughes409302f2012-08-13 17:02:11 -070028void tdestroy(void* root, void (*destroy_func)(void*)) {
Elliott Hughes8b5df392015-01-21 16:19:07 -080029 node_t* root_node = reinterpret_cast<node_t*>(root);
Yi Kong32bc0fc2018-08-02 17:31:13 -070030 if (root_node == nullptr) {
Elliott Hughes409302f2012-08-13 17:02:11 -070031 return;
32 }
33 if (root_node->llink) {
34 tdestroy(root_node->llink, destroy_func);
35 }
36 if (root_node->rlink) {
37 tdestroy(root_node->rlink, destroy_func);
38 }
39 (*destroy_func)(root_node->key);
40 free(root);
Ben Cheng21eab512012-03-13 23:04:57 -070041}