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