1*61145dc2SMartin Matuska // SPDX-License-Identifier: CDDL-1.0 2eda14cbcSMatt Macy /* 3eda14cbcSMatt Macy * CDDL HEADER START 4eda14cbcSMatt Macy * 5eda14cbcSMatt Macy * The contents of this file are subject to the terms of the 6eda14cbcSMatt Macy * Common Development and Distribution License (the "License"). 7eda14cbcSMatt Macy * You may not use this file except in compliance with the License. 8eda14cbcSMatt Macy * 9eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10271171e0SMartin Matuska * or https://opensource.org/licenses/CDDL-1.0. 11eda14cbcSMatt Macy * See the License for the specific language governing permissions 12eda14cbcSMatt Macy * and limitations under the License. 13eda14cbcSMatt Macy * 14eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each 15eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the 17eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying 18eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner] 19eda14cbcSMatt Macy * 20eda14cbcSMatt Macy * CDDL HEADER END 21eda14cbcSMatt Macy */ 22eda14cbcSMatt Macy /* 23eda14cbcSMatt Macy * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 24eda14cbcSMatt Macy */ 25eda14cbcSMatt Macy 26eda14cbcSMatt Macy #ifndef _LIBUUTIL_H 27eda14cbcSMatt Macy #define _LIBUUTIL_H 28eda14cbcSMatt Macy 29eda14cbcSMatt Macy #include <sys/types.h> 30eda14cbcSMatt Macy #include <stdarg.h> 31eda14cbcSMatt Macy #include <stdio.h> 32eda14cbcSMatt Macy 33eda14cbcSMatt Macy #ifdef __cplusplus 34eda14cbcSMatt Macy extern "C" { 35eda14cbcSMatt Macy #endif 36eda14cbcSMatt Macy 37eda14cbcSMatt Macy /* 38eda14cbcSMatt Macy * Standard flags codes. 39eda14cbcSMatt Macy */ 40eda14cbcSMatt Macy #define UU_DEFAULT 0 41eda14cbcSMatt Macy 42eda14cbcSMatt Macy /* 43eda14cbcSMatt Macy * Standard error codes. 44eda14cbcSMatt Macy */ 45eda14cbcSMatt Macy #define UU_ERROR_NONE 0 /* no error */ 46eda14cbcSMatt Macy #define UU_ERROR_INVALID_ARGUMENT 1 /* invalid argument */ 47eda14cbcSMatt Macy #define UU_ERROR_UNKNOWN_FLAG 2 /* passed flag invalid */ 48eda14cbcSMatt Macy #define UU_ERROR_NO_MEMORY 3 /* out of memory */ 49eda14cbcSMatt Macy #define UU_ERROR_CALLBACK_FAILED 4 /* callback-initiated error */ 50eda14cbcSMatt Macy #define UU_ERROR_NOT_SUPPORTED 5 /* operation not supported */ 51eda14cbcSMatt Macy #define UU_ERROR_EMPTY 6 /* no value provided */ 52eda14cbcSMatt Macy #define UU_ERROR_UNDERFLOW 7 /* value is too small */ 53eda14cbcSMatt Macy #define UU_ERROR_OVERFLOW 8 /* value is too value */ 54eda14cbcSMatt Macy #define UU_ERROR_INVALID_CHAR 9 /* value contains unexpected char */ 55eda14cbcSMatt Macy #define UU_ERROR_INVALID_DIGIT 10 /* value contains digit not in base */ 56eda14cbcSMatt Macy 57eda14cbcSMatt Macy #define UU_ERROR_SYSTEM 99 /* underlying system error */ 58eda14cbcSMatt Macy #define UU_ERROR_UNKNOWN 100 /* error status not known */ 59eda14cbcSMatt Macy 60eda14cbcSMatt Macy /* 61eda14cbcSMatt Macy * Exit status profiles. 62eda14cbcSMatt Macy */ 63eda14cbcSMatt Macy #define UU_PROFILE_DEFAULT 0 64eda14cbcSMatt Macy #define UU_PROFILE_LAUNCHER 1 65eda14cbcSMatt Macy 66eda14cbcSMatt Macy /* 67eda14cbcSMatt Macy * Error reporting functions. 68eda14cbcSMatt Macy */ 69eda14cbcSMatt Macy uint32_t uu_error(void); 70eda14cbcSMatt Macy const char *uu_strerror(uint32_t); 71eda14cbcSMatt Macy 72eda14cbcSMatt Macy /* 73eda14cbcSMatt Macy * Identifier test flags and function. 74eda14cbcSMatt Macy */ 75eda14cbcSMatt Macy #define UU_NAME_DOMAIN 0x1 /* allow SUNW, or com.sun, prefix */ 76eda14cbcSMatt Macy #define UU_NAME_PATH 0x2 /* allow '/'-delimited paths */ 77eda14cbcSMatt Macy 78eda14cbcSMatt Macy int uu_check_name(const char *, uint_t); 79eda14cbcSMatt Macy 80eda14cbcSMatt Macy /* 81eda14cbcSMatt Macy * Convenience functions. 82eda14cbcSMatt Macy */ 83eda14cbcSMatt Macy #define UU_NELEM(a) (sizeof (a) / sizeof ((a)[0])) 84eda14cbcSMatt Macy 851f88aa09SMartin Matuska extern char *uu_msprintf(const char *format, ...) 861f88aa09SMartin Matuska __attribute__((format(printf, 1, 2))); 87eda14cbcSMatt Macy extern void *uu_zalloc(size_t); 88eda14cbcSMatt Macy extern char *uu_strdup(const char *); 89eda14cbcSMatt Macy extern void uu_free(void *); 90eda14cbcSMatt Macy 91eda14cbcSMatt Macy extern boolean_t uu_strcaseeq(const char *a, const char *b); 92eda14cbcSMatt Macy extern boolean_t uu_streq(const char *a, const char *b); 93eda14cbcSMatt Macy extern char *uu_strndup(const char *s, size_t n); 94eda14cbcSMatt Macy extern boolean_t uu_strbw(const char *a, const char *b); 95eda14cbcSMatt Macy extern void *uu_memdup(const void *buf, size_t sz); 96eda14cbcSMatt Macy 97eda14cbcSMatt Macy /* 98eda14cbcSMatt Macy * Comparison function type definition. 99eda14cbcSMatt Macy * Developers should be careful in their use of the _private argument. If you 100eda14cbcSMatt Macy * break interface guarantees, you get undefined behavior. 101eda14cbcSMatt Macy */ 102eda14cbcSMatt Macy typedef int uu_compare_fn_t(const void *__left, const void *__right, 103eda14cbcSMatt Macy void *__private); 104eda14cbcSMatt Macy 105eda14cbcSMatt Macy /* 106eda14cbcSMatt Macy * Walk variant flags. 107eda14cbcSMatt Macy * A data structure need not provide support for all variants and 108eda14cbcSMatt Macy * combinations. Refer to the appropriate documentation. 109eda14cbcSMatt Macy */ 110eda14cbcSMatt Macy #define UU_WALK_ROBUST 0x00000001 /* walk can survive removes */ 111eda14cbcSMatt Macy #define UU_WALK_REVERSE 0x00000002 /* reverse walk order */ 112eda14cbcSMatt Macy 113eda14cbcSMatt Macy #define UU_WALK_PREORDER 0x00000010 /* walk tree in pre-order */ 114eda14cbcSMatt Macy #define UU_WALK_POSTORDER 0x00000020 /* walk tree in post-order */ 115eda14cbcSMatt Macy 116eda14cbcSMatt Macy /* 117eda14cbcSMatt Macy * Walk callback function return codes. 118eda14cbcSMatt Macy */ 119eda14cbcSMatt Macy #define UU_WALK_ERROR -1 120eda14cbcSMatt Macy #define UU_WALK_NEXT 0 121eda14cbcSMatt Macy #define UU_WALK_DONE 1 122eda14cbcSMatt Macy 123eda14cbcSMatt Macy /* 124eda14cbcSMatt Macy * Walk callback function type definition. 125eda14cbcSMatt Macy */ 126eda14cbcSMatt Macy typedef int uu_walk_fn_t(void *_elem, void *_private); 127eda14cbcSMatt Macy 128eda14cbcSMatt Macy /* 129eda14cbcSMatt Macy * lists: opaque structures 130eda14cbcSMatt Macy */ 131eda14cbcSMatt Macy typedef struct uu_list_pool uu_list_pool_t; 132eda14cbcSMatt Macy typedef struct uu_list uu_list_t; 133eda14cbcSMatt Macy 134eda14cbcSMatt Macy typedef struct uu_list_node { 135eda14cbcSMatt Macy uintptr_t uln_opaque[2]; 136eda14cbcSMatt Macy } uu_list_node_t; 137eda14cbcSMatt Macy 138eda14cbcSMatt Macy typedef struct uu_list_walk uu_list_walk_t; 139eda14cbcSMatt Macy 140eda14cbcSMatt Macy typedef uintptr_t uu_list_index_t; 141eda14cbcSMatt Macy 142eda14cbcSMatt Macy /* 143eda14cbcSMatt Macy * lists: interface 144eda14cbcSMatt Macy * 145eda14cbcSMatt Macy * basic usage: 146eda14cbcSMatt Macy * typedef struct foo { 147eda14cbcSMatt Macy * ... 148eda14cbcSMatt Macy * uu_list_node_t foo_node; 149eda14cbcSMatt Macy * ... 150eda14cbcSMatt Macy * } foo_t; 151eda14cbcSMatt Macy * 152eda14cbcSMatt Macy * static int 153eda14cbcSMatt Macy * foo_compare(void *l_arg, void *r_arg, void *private) 154eda14cbcSMatt Macy * { 155eda14cbcSMatt Macy * foo_t *l = l_arg; 156eda14cbcSMatt Macy * foo_t *r = r_arg; 157eda14cbcSMatt Macy * 158eda14cbcSMatt Macy * if (... l greater than r ...) 159eda14cbcSMatt Macy * return (1); 160eda14cbcSMatt Macy * if (... l less than r ...) 161eda14cbcSMatt Macy * return (-1); 162eda14cbcSMatt Macy * return (0); 163eda14cbcSMatt Macy * } 164eda14cbcSMatt Macy * 165eda14cbcSMatt Macy * ... 166eda14cbcSMatt Macy * // at initialization time 167eda14cbcSMatt Macy * foo_pool = uu_list_pool_create("foo_pool", 168eda14cbcSMatt Macy * sizeof (foo_t), offsetof(foo_t, foo_node), foo_compare, 169eda14cbcSMatt Macy * debugging? 0 : UU_AVL_POOL_DEBUG); 170eda14cbcSMatt Macy * ... 171eda14cbcSMatt Macy */ 172eda14cbcSMatt Macy uu_list_pool_t *uu_list_pool_create(const char *, size_t, size_t, 173eda14cbcSMatt Macy uu_compare_fn_t *, uint32_t); 174eda14cbcSMatt Macy #define UU_LIST_POOL_DEBUG 0x00000001 175eda14cbcSMatt Macy 176eda14cbcSMatt Macy void uu_list_pool_destroy(uu_list_pool_t *); 177eda14cbcSMatt Macy 178eda14cbcSMatt Macy /* 179eda14cbcSMatt Macy * usage: 180eda14cbcSMatt Macy * 181eda14cbcSMatt Macy * foo_t *a; 182eda14cbcSMatt Macy * a = malloc(sizeof (*a)); 183eda14cbcSMatt Macy * uu_list_node_init(a, &a->foo_list, pool); 184eda14cbcSMatt Macy * ... 185eda14cbcSMatt Macy * uu_list_node_fini(a, &a->foo_list, pool); 186eda14cbcSMatt Macy * free(a); 187eda14cbcSMatt Macy */ 188eda14cbcSMatt Macy void uu_list_node_init(void *, uu_list_node_t *, uu_list_pool_t *); 189eda14cbcSMatt Macy void uu_list_node_fini(void *, uu_list_node_t *, uu_list_pool_t *); 190eda14cbcSMatt Macy 191eda14cbcSMatt Macy uu_list_t *uu_list_create(uu_list_pool_t *, void *_parent, uint32_t); 192eda14cbcSMatt Macy #define UU_LIST_DEBUG 0x00000001 193eda14cbcSMatt Macy #define UU_LIST_SORTED 0x00000002 /* list is sorted */ 194eda14cbcSMatt Macy 195eda14cbcSMatt Macy void uu_list_destroy(uu_list_t *); /* list must be empty */ 196eda14cbcSMatt Macy 197eda14cbcSMatt Macy size_t uu_list_numnodes(uu_list_t *); 198eda14cbcSMatt Macy 199eda14cbcSMatt Macy void *uu_list_first(uu_list_t *); 200eda14cbcSMatt Macy void *uu_list_last(uu_list_t *); 201eda14cbcSMatt Macy 202eda14cbcSMatt Macy void *uu_list_next(uu_list_t *, void *); 203eda14cbcSMatt Macy void *uu_list_prev(uu_list_t *, void *); 204eda14cbcSMatt Macy 205eda14cbcSMatt Macy int uu_list_walk(uu_list_t *, uu_walk_fn_t *, void *, uint32_t); 206eda14cbcSMatt Macy 207eda14cbcSMatt Macy uu_list_walk_t *uu_list_walk_start(uu_list_t *, uint32_t); 208eda14cbcSMatt Macy void *uu_list_walk_next(uu_list_walk_t *); 209eda14cbcSMatt Macy void uu_list_walk_end(uu_list_walk_t *); 210eda14cbcSMatt Macy 211eda14cbcSMatt Macy void *uu_list_find(uu_list_t *, void *, void *, uu_list_index_t *); 212eda14cbcSMatt Macy void uu_list_insert(uu_list_t *, void *, uu_list_index_t); 213eda14cbcSMatt Macy 214eda14cbcSMatt Macy void *uu_list_nearest_next(uu_list_t *, uu_list_index_t); 215eda14cbcSMatt Macy void *uu_list_nearest_prev(uu_list_t *, uu_list_index_t); 216eda14cbcSMatt Macy 217eda14cbcSMatt Macy void *uu_list_teardown(uu_list_t *, void **); 218eda14cbcSMatt Macy 219eda14cbcSMatt Macy void uu_list_remove(uu_list_t *, void *); 220eda14cbcSMatt Macy 221eda14cbcSMatt Macy /* 222eda14cbcSMatt Macy * lists: interfaces for non-sorted lists only 223eda14cbcSMatt Macy */ 224eda14cbcSMatt Macy int uu_list_insert_before(uu_list_t *, void *_target, void *_elem); 225eda14cbcSMatt Macy int uu_list_insert_after(uu_list_t *, void *_target, void *_elem); 226eda14cbcSMatt Macy 227eda14cbcSMatt Macy /* 228eda14cbcSMatt Macy * avl trees: opaque structures 229eda14cbcSMatt Macy */ 230eda14cbcSMatt Macy typedef struct uu_avl_pool uu_avl_pool_t; 231eda14cbcSMatt Macy typedef struct uu_avl uu_avl_t; 232eda14cbcSMatt Macy 233eda14cbcSMatt Macy typedef struct uu_avl_node { 234eda14cbcSMatt Macy #ifdef _LP64 235eda14cbcSMatt Macy uintptr_t uan_opaque[3]; 236eda14cbcSMatt Macy #else 237eda14cbcSMatt Macy uintptr_t uan_opaque[4]; 238eda14cbcSMatt Macy #endif 239eda14cbcSMatt Macy } uu_avl_node_t; 240eda14cbcSMatt Macy 241eda14cbcSMatt Macy typedef struct uu_avl_walk uu_avl_walk_t; 242eda14cbcSMatt Macy 243eda14cbcSMatt Macy typedef uintptr_t uu_avl_index_t; 244eda14cbcSMatt Macy 245eda14cbcSMatt Macy /* 246eda14cbcSMatt Macy * avl trees: interface 247eda14cbcSMatt Macy * 248eda14cbcSMatt Macy * basic usage: 249eda14cbcSMatt Macy * typedef struct foo { 250eda14cbcSMatt Macy * ... 251eda14cbcSMatt Macy * uu_avl_node_t foo_node; 252eda14cbcSMatt Macy * ... 253eda14cbcSMatt Macy * } foo_t; 254eda14cbcSMatt Macy * 255eda14cbcSMatt Macy * static int 256eda14cbcSMatt Macy * foo_compare(void *l_arg, void *r_arg, void *private) 257eda14cbcSMatt Macy * { 258eda14cbcSMatt Macy * foo_t *l = l_arg; 259eda14cbcSMatt Macy * foo_t *r = r_arg; 260eda14cbcSMatt Macy * 261eda14cbcSMatt Macy * if (... l greater than r ...) 262eda14cbcSMatt Macy * return (1); 263eda14cbcSMatt Macy * if (... l less than r ...) 264eda14cbcSMatt Macy * return (-1); 265eda14cbcSMatt Macy * return (0); 266eda14cbcSMatt Macy * } 267eda14cbcSMatt Macy * 268eda14cbcSMatt Macy * ... 269eda14cbcSMatt Macy * // at initialization time 270eda14cbcSMatt Macy * foo_pool = uu_avl_pool_create("foo_pool", 271eda14cbcSMatt Macy * sizeof (foo_t), offsetof(foo_t, foo_node), foo_compare, 272eda14cbcSMatt Macy * debugging? 0 : UU_AVL_POOL_DEBUG); 273eda14cbcSMatt Macy * ... 274eda14cbcSMatt Macy */ 275eda14cbcSMatt Macy uu_avl_pool_t *uu_avl_pool_create(const char *, size_t, size_t, 276eda14cbcSMatt Macy uu_compare_fn_t *, uint32_t); 277eda14cbcSMatt Macy #define UU_AVL_POOL_DEBUG 0x00000001 278eda14cbcSMatt Macy 279eda14cbcSMatt Macy void uu_avl_pool_destroy(uu_avl_pool_t *); 280eda14cbcSMatt Macy 281eda14cbcSMatt Macy /* 282eda14cbcSMatt Macy * usage: 283eda14cbcSMatt Macy * 284eda14cbcSMatt Macy * foo_t *a; 285eda14cbcSMatt Macy * a = malloc(sizeof (*a)); 286eda14cbcSMatt Macy * uu_avl_node_init(a, &a->foo_avl, pool); 287eda14cbcSMatt Macy * ... 288eda14cbcSMatt Macy * uu_avl_node_fini(a, &a->foo_avl, pool); 289eda14cbcSMatt Macy * free(a); 290eda14cbcSMatt Macy */ 291eda14cbcSMatt Macy void uu_avl_node_init(void *, uu_avl_node_t *, uu_avl_pool_t *); 292eda14cbcSMatt Macy void uu_avl_node_fini(void *, uu_avl_node_t *, uu_avl_pool_t *); 293eda14cbcSMatt Macy 294eda14cbcSMatt Macy uu_avl_t *uu_avl_create(uu_avl_pool_t *, void *_parent, uint32_t); 295eda14cbcSMatt Macy #define UU_AVL_DEBUG 0x00000001 296eda14cbcSMatt Macy 297eda14cbcSMatt Macy void uu_avl_destroy(uu_avl_t *); /* list must be empty */ 298eda14cbcSMatt Macy 299eda14cbcSMatt Macy size_t uu_avl_numnodes(uu_avl_t *); 300eda14cbcSMatt Macy 301eda14cbcSMatt Macy void *uu_avl_first(uu_avl_t *); 302eda14cbcSMatt Macy void *uu_avl_last(uu_avl_t *); 303eda14cbcSMatt Macy 304eda14cbcSMatt Macy void *uu_avl_next(uu_avl_t *, void *); 305eda14cbcSMatt Macy void *uu_avl_prev(uu_avl_t *, void *); 306eda14cbcSMatt Macy 307eda14cbcSMatt Macy int uu_avl_walk(uu_avl_t *, uu_walk_fn_t *, void *, uint32_t); 308eda14cbcSMatt Macy 309eda14cbcSMatt Macy uu_avl_walk_t *uu_avl_walk_start(uu_avl_t *, uint32_t); 310eda14cbcSMatt Macy void *uu_avl_walk_next(uu_avl_walk_t *); 311eda14cbcSMatt Macy void uu_avl_walk_end(uu_avl_walk_t *); 312eda14cbcSMatt Macy 313eda14cbcSMatt Macy void *uu_avl_find(uu_avl_t *, void *, void *, uu_avl_index_t *); 314eda14cbcSMatt Macy void uu_avl_insert(uu_avl_t *, void *, uu_avl_index_t); 315eda14cbcSMatt Macy 316eda14cbcSMatt Macy void *uu_avl_nearest_next(uu_avl_t *, uu_avl_index_t); 317eda14cbcSMatt Macy void *uu_avl_nearest_prev(uu_avl_t *, uu_avl_index_t); 318eda14cbcSMatt Macy 319eda14cbcSMatt Macy void *uu_avl_teardown(uu_avl_t *, void **); 320eda14cbcSMatt Macy 321eda14cbcSMatt Macy void uu_avl_remove(uu_avl_t *, void *); 322eda14cbcSMatt Macy 323eda14cbcSMatt Macy #ifdef __cplusplus 324eda14cbcSMatt Macy } 325eda14cbcSMatt Macy #endif 326eda14cbcSMatt Macy 327eda14cbcSMatt Macy #endif /* _LIBUUTIL_H */ 328