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 9eda14cbcSMatt Macy * or http://www.opensolaris.org/os/licensing. 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 * Standard program exit codes. 61eda14cbcSMatt Macy */ 62eda14cbcSMatt Macy #define UU_EXIT_OK (*(uu_exit_ok())) 63eda14cbcSMatt Macy #define UU_EXIT_FATAL (*(uu_exit_fatal())) 64eda14cbcSMatt Macy #define UU_EXIT_USAGE (*(uu_exit_usage())) 65eda14cbcSMatt Macy 66eda14cbcSMatt Macy /* 67eda14cbcSMatt Macy * Exit status profiles. 68eda14cbcSMatt Macy */ 69eda14cbcSMatt Macy #define UU_PROFILE_DEFAULT 0 70eda14cbcSMatt Macy #define UU_PROFILE_LAUNCHER 1 71eda14cbcSMatt Macy 72eda14cbcSMatt Macy /* 73eda14cbcSMatt Macy * Error reporting functions. 74eda14cbcSMatt Macy */ 75eda14cbcSMatt Macy uint32_t uu_error(void); 76eda14cbcSMatt Macy const char *uu_strerror(uint32_t); 77eda14cbcSMatt Macy 78eda14cbcSMatt Macy /* 79eda14cbcSMatt Macy * Program notification functions. 80eda14cbcSMatt Macy */ 81eda14cbcSMatt Macy extern void uu_alt_exit(int); 82eda14cbcSMatt Macy extern const char *uu_setpname(char *); 83eda14cbcSMatt Macy extern const char *uu_getpname(void); 84*1f88aa09SMartin Matuska extern void uu_warn(const char *, ...) 85*1f88aa09SMartin Matuska __attribute__((format(printf, 1, 2))); 86*1f88aa09SMartin Matuska extern void uu_vwarn(const char *, va_list) 87*1f88aa09SMartin Matuska __attribute__((format(printf, 1, 0))); 88*1f88aa09SMartin Matuska extern void uu_die(const char *, ...) 89*1f88aa09SMartin Matuska __attribute__((format(printf, 1, 2))) __NORETURN; 90*1f88aa09SMartin Matuska extern void uu_vdie(const char *, va_list) 91*1f88aa09SMartin Matuska __attribute__((format(printf, 1, 0))) __NORETURN; 92*1f88aa09SMartin Matuska extern void uu_xdie(int, const char *, ...) 93*1f88aa09SMartin Matuska __attribute__((format(printf, 2, 3))) __NORETURN; 94*1f88aa09SMartin Matuska extern void uu_vxdie(int, const char *, va_list) 95*1f88aa09SMartin Matuska __attribute__((format(printf, 2, 0))) __NORETURN; 96eda14cbcSMatt Macy 97eda14cbcSMatt Macy /* 98eda14cbcSMatt Macy * Exit status functions (not to be used directly) 99eda14cbcSMatt Macy */ 100eda14cbcSMatt Macy extern int *uu_exit_ok(void); 101eda14cbcSMatt Macy extern int *uu_exit_fatal(void); 102eda14cbcSMatt Macy extern int *uu_exit_usage(void); 103eda14cbcSMatt Macy 104eda14cbcSMatt Macy /* 105eda14cbcSMatt Macy * Identifier test flags and function. 106eda14cbcSMatt Macy */ 107eda14cbcSMatt Macy #define UU_NAME_DOMAIN 0x1 /* allow SUNW, or com.sun, prefix */ 108eda14cbcSMatt Macy #define UU_NAME_PATH 0x2 /* allow '/'-delimited paths */ 109eda14cbcSMatt Macy 110eda14cbcSMatt Macy int uu_check_name(const char *, uint_t); 111eda14cbcSMatt Macy 112eda14cbcSMatt Macy /* 113eda14cbcSMatt Macy * Convenience functions. 114eda14cbcSMatt Macy */ 115eda14cbcSMatt Macy #define UU_NELEM(a) (sizeof (a) / sizeof ((a)[0])) 116eda14cbcSMatt Macy 117*1f88aa09SMartin Matuska extern char *uu_msprintf(const char *format, ...) 118*1f88aa09SMartin Matuska __attribute__((format(printf, 1, 2))); 119eda14cbcSMatt Macy extern void *uu_zalloc(size_t); 120eda14cbcSMatt Macy extern char *uu_strdup(const char *); 121eda14cbcSMatt Macy extern void uu_free(void *); 122eda14cbcSMatt Macy 123eda14cbcSMatt Macy extern boolean_t uu_strcaseeq(const char *a, const char *b); 124eda14cbcSMatt Macy extern boolean_t uu_streq(const char *a, const char *b); 125eda14cbcSMatt Macy extern char *uu_strndup(const char *s, size_t n); 126eda14cbcSMatt Macy extern boolean_t uu_strbw(const char *a, const char *b); 127eda14cbcSMatt Macy extern void *uu_memdup(const void *buf, size_t sz); 128eda14cbcSMatt Macy 129eda14cbcSMatt Macy /* 130eda14cbcSMatt Macy * Comparison function type definition. 131eda14cbcSMatt Macy * Developers should be careful in their use of the _private argument. If you 132eda14cbcSMatt Macy * break interface guarantees, you get undefined behavior. 133eda14cbcSMatt Macy */ 134eda14cbcSMatt Macy typedef int uu_compare_fn_t(const void *__left, const void *__right, 135eda14cbcSMatt Macy void *__private); 136eda14cbcSMatt Macy 137eda14cbcSMatt Macy /* 138eda14cbcSMatt Macy * Walk variant flags. 139eda14cbcSMatt Macy * A data structure need not provide support for all variants and 140eda14cbcSMatt Macy * combinations. Refer to the appropriate documentation. 141eda14cbcSMatt Macy */ 142eda14cbcSMatt Macy #define UU_WALK_ROBUST 0x00000001 /* walk can survive removes */ 143eda14cbcSMatt Macy #define UU_WALK_REVERSE 0x00000002 /* reverse walk order */ 144eda14cbcSMatt Macy 145eda14cbcSMatt Macy #define UU_WALK_PREORDER 0x00000010 /* walk tree in pre-order */ 146eda14cbcSMatt Macy #define UU_WALK_POSTORDER 0x00000020 /* walk tree in post-order */ 147eda14cbcSMatt Macy 148eda14cbcSMatt Macy /* 149eda14cbcSMatt Macy * Walk callback function return codes. 150eda14cbcSMatt Macy */ 151eda14cbcSMatt Macy #define UU_WALK_ERROR -1 152eda14cbcSMatt Macy #define UU_WALK_NEXT 0 153eda14cbcSMatt Macy #define UU_WALK_DONE 1 154eda14cbcSMatt Macy 155eda14cbcSMatt Macy /* 156eda14cbcSMatt Macy * Walk callback function type definition. 157eda14cbcSMatt Macy */ 158eda14cbcSMatt Macy typedef int uu_walk_fn_t(void *_elem, void *_private); 159eda14cbcSMatt Macy 160eda14cbcSMatt Macy /* 161eda14cbcSMatt Macy * lists: opaque structures 162eda14cbcSMatt Macy */ 163eda14cbcSMatt Macy typedef struct uu_list_pool uu_list_pool_t; 164eda14cbcSMatt Macy typedef struct uu_list uu_list_t; 165eda14cbcSMatt Macy 166eda14cbcSMatt Macy typedef struct uu_list_node { 167eda14cbcSMatt Macy uintptr_t uln_opaque[2]; 168eda14cbcSMatt Macy } uu_list_node_t; 169eda14cbcSMatt Macy 170eda14cbcSMatt Macy typedef struct uu_list_walk uu_list_walk_t; 171eda14cbcSMatt Macy 172eda14cbcSMatt Macy typedef uintptr_t uu_list_index_t; 173eda14cbcSMatt Macy 174eda14cbcSMatt Macy /* 175eda14cbcSMatt Macy * lists: interface 176eda14cbcSMatt Macy * 177eda14cbcSMatt Macy * basic usage: 178eda14cbcSMatt Macy * typedef struct foo { 179eda14cbcSMatt Macy * ... 180eda14cbcSMatt Macy * uu_list_node_t foo_node; 181eda14cbcSMatt Macy * ... 182eda14cbcSMatt Macy * } foo_t; 183eda14cbcSMatt Macy * 184eda14cbcSMatt Macy * static int 185eda14cbcSMatt Macy * foo_compare(void *l_arg, void *r_arg, void *private) 186eda14cbcSMatt Macy * { 187eda14cbcSMatt Macy * foo_t *l = l_arg; 188eda14cbcSMatt Macy * foo_t *r = r_arg; 189eda14cbcSMatt Macy * 190eda14cbcSMatt Macy * if (... l greater than r ...) 191eda14cbcSMatt Macy * return (1); 192eda14cbcSMatt Macy * if (... l less than r ...) 193eda14cbcSMatt Macy * return (-1); 194eda14cbcSMatt Macy * return (0); 195eda14cbcSMatt Macy * } 196eda14cbcSMatt Macy * 197eda14cbcSMatt Macy * ... 198eda14cbcSMatt Macy * // at initialization time 199eda14cbcSMatt Macy * foo_pool = uu_list_pool_create("foo_pool", 200eda14cbcSMatt Macy * sizeof (foo_t), offsetof(foo_t, foo_node), foo_compare, 201eda14cbcSMatt Macy * debugging? 0 : UU_AVL_POOL_DEBUG); 202eda14cbcSMatt Macy * ... 203eda14cbcSMatt Macy */ 204eda14cbcSMatt Macy uu_list_pool_t *uu_list_pool_create(const char *, size_t, size_t, 205eda14cbcSMatt Macy uu_compare_fn_t *, uint32_t); 206eda14cbcSMatt Macy #define UU_LIST_POOL_DEBUG 0x00000001 207eda14cbcSMatt Macy 208eda14cbcSMatt Macy void uu_list_pool_destroy(uu_list_pool_t *); 209eda14cbcSMatt Macy 210eda14cbcSMatt Macy /* 211eda14cbcSMatt Macy * usage: 212eda14cbcSMatt Macy * 213eda14cbcSMatt Macy * foo_t *a; 214eda14cbcSMatt Macy * a = malloc(sizeof (*a)); 215eda14cbcSMatt Macy * uu_list_node_init(a, &a->foo_list, pool); 216eda14cbcSMatt Macy * ... 217eda14cbcSMatt Macy * uu_list_node_fini(a, &a->foo_list, pool); 218eda14cbcSMatt Macy * free(a); 219eda14cbcSMatt Macy */ 220eda14cbcSMatt Macy void uu_list_node_init(void *, uu_list_node_t *, uu_list_pool_t *); 221eda14cbcSMatt Macy void uu_list_node_fini(void *, uu_list_node_t *, uu_list_pool_t *); 222eda14cbcSMatt Macy 223eda14cbcSMatt Macy uu_list_t *uu_list_create(uu_list_pool_t *, void *_parent, uint32_t); 224eda14cbcSMatt Macy #define UU_LIST_DEBUG 0x00000001 225eda14cbcSMatt Macy #define UU_LIST_SORTED 0x00000002 /* list is sorted */ 226eda14cbcSMatt Macy 227eda14cbcSMatt Macy void uu_list_destroy(uu_list_t *); /* list must be empty */ 228eda14cbcSMatt Macy 229eda14cbcSMatt Macy size_t uu_list_numnodes(uu_list_t *); 230eda14cbcSMatt Macy 231eda14cbcSMatt Macy void *uu_list_first(uu_list_t *); 232eda14cbcSMatt Macy void *uu_list_last(uu_list_t *); 233eda14cbcSMatt Macy 234eda14cbcSMatt Macy void *uu_list_next(uu_list_t *, void *); 235eda14cbcSMatt Macy void *uu_list_prev(uu_list_t *, void *); 236eda14cbcSMatt Macy 237eda14cbcSMatt Macy int uu_list_walk(uu_list_t *, uu_walk_fn_t *, void *, uint32_t); 238eda14cbcSMatt Macy 239eda14cbcSMatt Macy uu_list_walk_t *uu_list_walk_start(uu_list_t *, uint32_t); 240eda14cbcSMatt Macy void *uu_list_walk_next(uu_list_walk_t *); 241eda14cbcSMatt Macy void uu_list_walk_end(uu_list_walk_t *); 242eda14cbcSMatt Macy 243eda14cbcSMatt Macy void *uu_list_find(uu_list_t *, void *, void *, uu_list_index_t *); 244eda14cbcSMatt Macy void uu_list_insert(uu_list_t *, void *, uu_list_index_t); 245eda14cbcSMatt Macy 246eda14cbcSMatt Macy void *uu_list_nearest_next(uu_list_t *, uu_list_index_t); 247eda14cbcSMatt Macy void *uu_list_nearest_prev(uu_list_t *, uu_list_index_t); 248eda14cbcSMatt Macy 249eda14cbcSMatt Macy void *uu_list_teardown(uu_list_t *, void **); 250eda14cbcSMatt Macy 251eda14cbcSMatt Macy void uu_list_remove(uu_list_t *, void *); 252eda14cbcSMatt Macy 253eda14cbcSMatt Macy /* 254eda14cbcSMatt Macy * lists: interfaces for non-sorted lists only 255eda14cbcSMatt Macy */ 256eda14cbcSMatt Macy int uu_list_insert_before(uu_list_t *, void *_target, void *_elem); 257eda14cbcSMatt Macy int uu_list_insert_after(uu_list_t *, void *_target, void *_elem); 258eda14cbcSMatt Macy 259eda14cbcSMatt Macy /* 260eda14cbcSMatt Macy * avl trees: opaque structures 261eda14cbcSMatt Macy */ 262eda14cbcSMatt Macy typedef struct uu_avl_pool uu_avl_pool_t; 263eda14cbcSMatt Macy typedef struct uu_avl uu_avl_t; 264eda14cbcSMatt Macy 265eda14cbcSMatt Macy typedef struct uu_avl_node { 266eda14cbcSMatt Macy #ifdef _LP64 267eda14cbcSMatt Macy uintptr_t uan_opaque[3]; 268eda14cbcSMatt Macy #else 269eda14cbcSMatt Macy uintptr_t uan_opaque[4]; 270eda14cbcSMatt Macy #endif 271eda14cbcSMatt Macy } uu_avl_node_t; 272eda14cbcSMatt Macy 273eda14cbcSMatt Macy typedef struct uu_avl_walk uu_avl_walk_t; 274eda14cbcSMatt Macy 275eda14cbcSMatt Macy typedef uintptr_t uu_avl_index_t; 276eda14cbcSMatt Macy 277eda14cbcSMatt Macy /* 278eda14cbcSMatt Macy * avl trees: interface 279eda14cbcSMatt Macy * 280eda14cbcSMatt Macy * basic usage: 281eda14cbcSMatt Macy * typedef struct foo { 282eda14cbcSMatt Macy * ... 283eda14cbcSMatt Macy * uu_avl_node_t foo_node; 284eda14cbcSMatt Macy * ... 285eda14cbcSMatt Macy * } foo_t; 286eda14cbcSMatt Macy * 287eda14cbcSMatt Macy * static int 288eda14cbcSMatt Macy * foo_compare(void *l_arg, void *r_arg, void *private) 289eda14cbcSMatt Macy * { 290eda14cbcSMatt Macy * foo_t *l = l_arg; 291eda14cbcSMatt Macy * foo_t *r = r_arg; 292eda14cbcSMatt Macy * 293eda14cbcSMatt Macy * if (... l greater than r ...) 294eda14cbcSMatt Macy * return (1); 295eda14cbcSMatt Macy * if (... l less than r ...) 296eda14cbcSMatt Macy * return (-1); 297eda14cbcSMatt Macy * return (0); 298eda14cbcSMatt Macy * } 299eda14cbcSMatt Macy * 300eda14cbcSMatt Macy * ... 301eda14cbcSMatt Macy * // at initialization time 302eda14cbcSMatt Macy * foo_pool = uu_avl_pool_create("foo_pool", 303eda14cbcSMatt Macy * sizeof (foo_t), offsetof(foo_t, foo_node), foo_compare, 304eda14cbcSMatt Macy * debugging? 0 : UU_AVL_POOL_DEBUG); 305eda14cbcSMatt Macy * ... 306eda14cbcSMatt Macy */ 307eda14cbcSMatt Macy uu_avl_pool_t *uu_avl_pool_create(const char *, size_t, size_t, 308eda14cbcSMatt Macy uu_compare_fn_t *, uint32_t); 309eda14cbcSMatt Macy #define UU_AVL_POOL_DEBUG 0x00000001 310eda14cbcSMatt Macy 311eda14cbcSMatt Macy void uu_avl_pool_destroy(uu_avl_pool_t *); 312eda14cbcSMatt Macy 313eda14cbcSMatt Macy /* 314eda14cbcSMatt Macy * usage: 315eda14cbcSMatt Macy * 316eda14cbcSMatt Macy * foo_t *a; 317eda14cbcSMatt Macy * a = malloc(sizeof (*a)); 318eda14cbcSMatt Macy * uu_avl_node_init(a, &a->foo_avl, pool); 319eda14cbcSMatt Macy * ... 320eda14cbcSMatt Macy * uu_avl_node_fini(a, &a->foo_avl, pool); 321eda14cbcSMatt Macy * free(a); 322eda14cbcSMatt Macy */ 323eda14cbcSMatt Macy void uu_avl_node_init(void *, uu_avl_node_t *, uu_avl_pool_t *); 324eda14cbcSMatt Macy void uu_avl_node_fini(void *, uu_avl_node_t *, uu_avl_pool_t *); 325eda14cbcSMatt Macy 326eda14cbcSMatt Macy uu_avl_t *uu_avl_create(uu_avl_pool_t *, void *_parent, uint32_t); 327eda14cbcSMatt Macy #define UU_AVL_DEBUG 0x00000001 328eda14cbcSMatt Macy 329eda14cbcSMatt Macy void uu_avl_destroy(uu_avl_t *); /* list must be empty */ 330eda14cbcSMatt Macy 331eda14cbcSMatt Macy size_t uu_avl_numnodes(uu_avl_t *); 332eda14cbcSMatt Macy 333eda14cbcSMatt Macy void *uu_avl_first(uu_avl_t *); 334eda14cbcSMatt Macy void *uu_avl_last(uu_avl_t *); 335eda14cbcSMatt Macy 336eda14cbcSMatt Macy void *uu_avl_next(uu_avl_t *, void *); 337eda14cbcSMatt Macy void *uu_avl_prev(uu_avl_t *, void *); 338eda14cbcSMatt Macy 339eda14cbcSMatt Macy int uu_avl_walk(uu_avl_t *, uu_walk_fn_t *, void *, uint32_t); 340eda14cbcSMatt Macy 341eda14cbcSMatt Macy uu_avl_walk_t *uu_avl_walk_start(uu_avl_t *, uint32_t); 342eda14cbcSMatt Macy void *uu_avl_walk_next(uu_avl_walk_t *); 343eda14cbcSMatt Macy void uu_avl_walk_end(uu_avl_walk_t *); 344eda14cbcSMatt Macy 345eda14cbcSMatt Macy void *uu_avl_find(uu_avl_t *, void *, void *, uu_avl_index_t *); 346eda14cbcSMatt Macy void uu_avl_insert(uu_avl_t *, void *, uu_avl_index_t); 347eda14cbcSMatt Macy 348eda14cbcSMatt Macy void *uu_avl_nearest_next(uu_avl_t *, uu_avl_index_t); 349eda14cbcSMatt Macy void *uu_avl_nearest_prev(uu_avl_t *, uu_avl_index_t); 350eda14cbcSMatt Macy 351eda14cbcSMatt Macy void *uu_avl_teardown(uu_avl_t *, void **); 352eda14cbcSMatt Macy 353eda14cbcSMatt Macy void uu_avl_remove(uu_avl_t *, void *); 354eda14cbcSMatt Macy 355eda14cbcSMatt Macy #ifdef __cplusplus 356eda14cbcSMatt Macy } 357eda14cbcSMatt Macy #endif 358eda14cbcSMatt Macy 359eda14cbcSMatt Macy #endif /* _LIBUUTIL_H */ 360