1168404Spjd/* 2168404Spjd * CDDL HEADER START 3168404Spjd * 4168404Spjd * The contents of this file are subject to the terms of the 5185029Spjd * Common Development and Distribution License (the "License"). 6185029Spjd * You may not use this file except in compliance with the License. 7168404Spjd * 8168404Spjd * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9168404Spjd * or http://www.opensolaris.org/os/licensing. 10168404Spjd * See the License for the specific language governing permissions 11168404Spjd * and limitations under the License. 12168404Spjd * 13168404Spjd * When distributing Covered Code, include this CDDL HEADER in each 14168404Spjd * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15168404Spjd * If applicable, add the following below this CDDL HEADER, with the 16168404Spjd * fields enclosed by brackets "[]" replaced with your own identifying 17168404Spjd * information: Portions Copyright [yyyy] [name of copyright owner] 18168404Spjd * 19168404Spjd * CDDL HEADER END 20168404Spjd */ 21168404Spjd/* 22219089Spjd * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 23168404Spjd */ 24168404Spjd 25168404Spjd#ifndef _LIBUUTIL_H 26168404Spjd#define _LIBUUTIL_H 27168404Spjd 28168404Spjd#include <solaris.h> 29168404Spjd#include <sys/types.h> 30168404Spjd#include <stdarg.h> 31219089Spjd#include <stdio.h> 32168404Spjd 33168404Spjd#ifdef __cplusplus 34168404Spjdextern "C" { 35168404Spjd#endif 36168404Spjd 37168404Spjd/* 38168404Spjd * Standard flags codes. 39168404Spjd */ 40168404Spjd#define UU_DEFAULT 0 41168404Spjd 42168404Spjd/* 43168404Spjd * Standard error codes. 44168404Spjd */ 45168404Spjd#define UU_ERROR_NONE 0 /* no error */ 46168404Spjd#define UU_ERROR_INVALID_ARGUMENT 1 /* invalid argument */ 47168404Spjd#define UU_ERROR_UNKNOWN_FLAG 2 /* passed flag invalid */ 48168404Spjd#define UU_ERROR_NO_MEMORY 3 /* out of memory */ 49168404Spjd#define UU_ERROR_CALLBACK_FAILED 4 /* callback-initiated error */ 50168404Spjd#define UU_ERROR_NOT_SUPPORTED 5 /* operation not supported */ 51168404Spjd#define UU_ERROR_EMPTY 6 /* no value provided */ 52168404Spjd#define UU_ERROR_UNDERFLOW 7 /* value is too small */ 53168404Spjd#define UU_ERROR_OVERFLOW 8 /* value is too value */ 54168404Spjd#define UU_ERROR_INVALID_CHAR 9 /* value contains unexpected char */ 55168404Spjd#define UU_ERROR_INVALID_DIGIT 10 /* value contains digit not in base */ 56168404Spjd 57168404Spjd#define UU_ERROR_SYSTEM 99 /* underlying system error */ 58168404Spjd#define UU_ERROR_UNKNOWN 100 /* error status not known */ 59168404Spjd 60168404Spjd/* 61168404Spjd * Standard program exit codes. 62168404Spjd */ 63168404Spjd#define UU_EXIT_OK (*(uu_exit_ok())) 64168404Spjd#define UU_EXIT_FATAL (*(uu_exit_fatal())) 65168404Spjd#define UU_EXIT_USAGE (*(uu_exit_usage())) 66168404Spjd 67168404Spjd/* 68168404Spjd * Exit status profiles. 69168404Spjd */ 70168404Spjd#define UU_PROFILE_DEFAULT 0 71168404Spjd#define UU_PROFILE_LAUNCHER 1 72168404Spjd 73168404Spjd/* 74168404Spjd * Error reporting functions. 75168404Spjd */ 76168404Spjduint32_t uu_error(void); 77168404Spjdconst char *uu_strerror(uint32_t); 78168404Spjd 79168404Spjd/* 80168404Spjd * Program notification functions. 81168404Spjd */ 82168404Spjdextern void uu_alt_exit(int); 83168404Spjdextern const char *uu_setpname(char *); 84168404Spjdextern const char *uu_getpname(void); 85168404Spjd/*PRINTFLIKE1*/ 86168404Spjdextern void uu_warn(const char *, ...); 87168404Spjdextern void uu_vwarn(const char *, va_list); 88168404Spjd/*PRINTFLIKE1*/ 89168404Spjdextern void uu_die(const char *, ...) __NORETURN; 90168404Spjdextern void uu_vdie(const char *, va_list) __NORETURN; 91168404Spjd/*PRINTFLIKE2*/ 92168404Spjdextern void uu_xdie(int, const char *, ...) __NORETURN; 93168404Spjdextern void uu_vxdie(int, const char *, va_list) __NORETURN; 94168404Spjd 95168404Spjd/* 96168404Spjd * Exit status functions (not to be used directly) 97168404Spjd */ 98168404Spjdextern int *uu_exit_ok(void); 99168404Spjdextern int *uu_exit_fatal(void); 100168404Spjdextern int *uu_exit_usage(void); 101168404Spjd 102168404Spjd/* 103168404Spjd * string->number conversions 104168404Spjd */ 105168404Spjdextern int uu_strtoint(const char *, void *, size_t, int, int64_t, int64_t); 106168404Spjdextern int uu_strtouint(const char *, void *, size_t, int, uint64_t, uint64_t); 107168404Spjd 108168404Spjd/* 109168404Spjd * Debug print facility functions. 110168404Spjd */ 111168404Spjdtypedef struct uu_dprintf uu_dprintf_t; 112168404Spjd 113168404Spjdtypedef enum { 114168404Spjd UU_DPRINTF_SILENT, 115168404Spjd UU_DPRINTF_FATAL, 116168404Spjd UU_DPRINTF_WARNING, 117168404Spjd UU_DPRINTF_NOTICE, 118168404Spjd UU_DPRINTF_INFO, 119168404Spjd UU_DPRINTF_DEBUG 120168404Spjd} uu_dprintf_severity_t; 121168404Spjd 122168404Spjdextern uu_dprintf_t *uu_dprintf_create(const char *, uu_dprintf_severity_t, 123168404Spjd uint_t); 124168404Spjd/*PRINTFLIKE3*/ 125168404Spjdextern void uu_dprintf(uu_dprintf_t *, uu_dprintf_severity_t, 126168404Spjd const char *, ...); 127168404Spjdextern void uu_dprintf_destroy(uu_dprintf_t *); 128168404Spjdextern const char *uu_dprintf_getname(uu_dprintf_t *); 129168404Spjd 130168404Spjd/* 131168404Spjd * Identifier test flags and function. 132168404Spjd */ 133168404Spjd#define UU_NAME_DOMAIN 0x1 /* allow SUNW, or com.sun, prefix */ 134168404Spjd#define UU_NAME_PATH 0x2 /* allow '/'-delimited paths */ 135168404Spjd 136168404Spjdint uu_check_name(const char *, uint_t); 137168404Spjd 138168404Spjd/* 139168404Spjd * File creation functions. 140168404Spjd */ 141168404Spjdextern int uu_open_tmp(const char *dir, uint_t uflags); 142168404Spjd 143168404Spjd/* 144168404Spjd * Convenience functions. 145168404Spjd */ 146219089Spjd#define UU_NELEM(a) (sizeof (a) / sizeof ((a)[0])) 147219089Spjd 148168404Spjd/*PRINTFLIKE1*/ 149168404Spjdextern char *uu_msprintf(const char *format, ...); 150168404Spjdextern void *uu_zalloc(size_t); 151185029Spjdextern char *uu_strdup(const char *); 152168404Spjdextern void uu_free(void *); 153168404Spjd 154219089Spjdextern boolean_t uu_strcaseeq(const char *a, const char *b); 155219089Spjdextern boolean_t uu_streq(const char *a, const char *b); 156219089Spjdextern char *uu_strndup(const char *s, size_t n); 157219089Spjdextern boolean_t uu_strbw(const char *a, const char *b); 158219089Spjdextern void *uu_memdup(const void *buf, size_t sz); 159219089Spjdextern void uu_dump(FILE *out, const char *prefix, const void *buf, size_t len); 160219089Spjd 161168404Spjd/* 162168404Spjd * Comparison function type definition. 163168404Spjd * Developers should be careful in their use of the _private argument. If you 164168404Spjd * break interface guarantees, you get undefined behavior. 165168404Spjd */ 166168404Spjdtypedef int uu_compare_fn_t(const void *__left, const void *__right, 167168404Spjd void *__private); 168168404Spjd 169168404Spjd/* 170168404Spjd * Walk variant flags. 171168404Spjd * A data structure need not provide support for all variants and 172168404Spjd * combinations. Refer to the appropriate documentation. 173168404Spjd */ 174168404Spjd#define UU_WALK_ROBUST 0x00000001 /* walk can survive removes */ 175168404Spjd#define UU_WALK_REVERSE 0x00000002 /* reverse walk order */ 176168404Spjd 177168404Spjd#define UU_WALK_PREORDER 0x00000010 /* walk tree in pre-order */ 178168404Spjd#define UU_WALK_POSTORDER 0x00000020 /* walk tree in post-order */ 179168404Spjd 180168404Spjd/* 181168404Spjd * Walk callback function return codes. 182168404Spjd */ 183168404Spjd#define UU_WALK_ERROR -1 184168404Spjd#define UU_WALK_NEXT 0 185168404Spjd#define UU_WALK_DONE 1 186168404Spjd 187168404Spjd/* 188168404Spjd * Walk callback function type definition. 189168404Spjd */ 190168404Spjdtypedef int uu_walk_fn_t(void *_elem, void *_private); 191168404Spjd 192168404Spjd/* 193168404Spjd * lists: opaque structures 194168404Spjd */ 195168404Spjdtypedef struct uu_list_pool uu_list_pool_t; 196168404Spjdtypedef struct uu_list uu_list_t; 197168404Spjd 198168404Spjdtypedef struct uu_list_node { 199168404Spjd uintptr_t uln_opaque[2]; 200168404Spjd} uu_list_node_t; 201168404Spjd 202168404Spjdtypedef struct uu_list_walk uu_list_walk_t; 203168404Spjd 204168404Spjdtypedef uintptr_t uu_list_index_t; 205168404Spjd 206168404Spjd/* 207168404Spjd * lists: interface 208168404Spjd * 209168404Spjd * basic usage: 210168404Spjd * typedef struct foo { 211168404Spjd * ... 212168404Spjd * uu_list_node_t foo_node; 213168404Spjd * ... 214168404Spjd * } foo_t; 215168404Spjd * 216168404Spjd * static int 217168404Spjd * foo_compare(void *l_arg, void *r_arg, void *private) 218168404Spjd * { 219168404Spjd * foo_t *l = l_arg; 220168404Spjd * foo_t *r = r_arg; 221168404Spjd * 222168404Spjd * if (... l greater than r ...) 223168404Spjd * return (1); 224168404Spjd * if (... l less than r ...) 225168404Spjd * return (-1); 226168404Spjd * return (0); 227168404Spjd * } 228168404Spjd * 229168404Spjd * ... 230168404Spjd * // at initialization time 231168404Spjd * foo_pool = uu_list_pool_create("foo_pool", 232168404Spjd * sizeof (foo_t), offsetof(foo_t, foo_node), foo_compare, 233168404Spjd * debugging? 0 : UU_AVL_POOL_DEBUG); 234168404Spjd * ... 235168404Spjd */ 236168404Spjduu_list_pool_t *uu_list_pool_create(const char *, size_t, size_t, 237168404Spjd uu_compare_fn_t *, uint32_t); 238168404Spjd#define UU_LIST_POOL_DEBUG 0x00000001 239168404Spjd 240168404Spjdvoid uu_list_pool_destroy(uu_list_pool_t *); 241168404Spjd 242168404Spjd/* 243168404Spjd * usage: 244168404Spjd * 245168404Spjd * foo_t *a; 246168404Spjd * a = malloc(sizeof(*a)); 247168404Spjd * uu_list_node_init(a, &a->foo_list, pool); 248168404Spjd * ... 249168404Spjd * uu_list_node_fini(a, &a->foo_list, pool); 250168404Spjd * free(a); 251168404Spjd */ 252168404Spjdvoid uu_list_node_init(void *, uu_list_node_t *, uu_list_pool_t *); 253168404Spjdvoid uu_list_node_fini(void *, uu_list_node_t *, uu_list_pool_t *); 254168404Spjd 255168404Spjduu_list_t *uu_list_create(uu_list_pool_t *, void *_parent, uint32_t); 256168404Spjd#define UU_LIST_DEBUG 0x00000001 257168404Spjd#define UU_LIST_SORTED 0x00000002 /* list is sorted */ 258168404Spjd 259168404Spjdvoid uu_list_destroy(uu_list_t *); /* list must be empty */ 260168404Spjd 261168404Spjdsize_t uu_list_numnodes(uu_list_t *); 262168404Spjd 263168404Spjdvoid *uu_list_first(uu_list_t *); 264168404Spjdvoid *uu_list_last(uu_list_t *); 265168404Spjd 266168404Spjdvoid *uu_list_next(uu_list_t *, void *); 267168404Spjdvoid *uu_list_prev(uu_list_t *, void *); 268168404Spjd 269168404Spjdint uu_list_walk(uu_list_t *, uu_walk_fn_t *, void *, uint32_t); 270168404Spjd 271168404Spjduu_list_walk_t *uu_list_walk_start(uu_list_t *, uint32_t); 272168404Spjdvoid *uu_list_walk_next(uu_list_walk_t *); 273168404Spjdvoid uu_list_walk_end(uu_list_walk_t *); 274168404Spjd 275168404Spjdvoid *uu_list_find(uu_list_t *, void *, void *, uu_list_index_t *); 276168404Spjdvoid uu_list_insert(uu_list_t *, void *, uu_list_index_t); 277168404Spjd 278168404Spjdvoid *uu_list_nearest_next(uu_list_t *, uu_list_index_t); 279168404Spjdvoid *uu_list_nearest_prev(uu_list_t *, uu_list_index_t); 280168404Spjd 281168404Spjdvoid *uu_list_teardown(uu_list_t *, void **); 282168404Spjd 283168404Spjdvoid uu_list_remove(uu_list_t *, void *); 284168404Spjd 285168404Spjd/* 286168404Spjd * lists: interfaces for non-sorted lists only 287168404Spjd */ 288168404Spjdint uu_list_insert_before(uu_list_t *, void *_target, void *_elem); 289168404Spjdint uu_list_insert_after(uu_list_t *, void *_target, void *_elem); 290168404Spjd 291168404Spjd/* 292168404Spjd * avl trees: opaque structures 293168404Spjd */ 294168404Spjdtypedef struct uu_avl_pool uu_avl_pool_t; 295168404Spjdtypedef struct uu_avl uu_avl_t; 296168404Spjd 297168404Spjdtypedef struct uu_avl_node { 298168404Spjd#ifdef _LP64 299168404Spjd uintptr_t uan_opaque[3]; 300168404Spjd#else 301168404Spjd uintptr_t uan_opaque[4]; 302168404Spjd#endif 303168404Spjd} uu_avl_node_t; 304168404Spjd 305168404Spjdtypedef struct uu_avl_walk uu_avl_walk_t; 306168404Spjd 307168404Spjdtypedef uintptr_t uu_avl_index_t; 308168404Spjd 309168404Spjd/* 310168404Spjd * avl trees: interface 311168404Spjd * 312168404Spjd * basic usage: 313168404Spjd * typedef struct foo { 314168404Spjd * ... 315168404Spjd * uu_avl_node_t foo_node; 316168404Spjd * ... 317168404Spjd * } foo_t; 318168404Spjd * 319168404Spjd * static int 320168404Spjd * foo_compare(void *l_arg, void *r_arg, void *private) 321168404Spjd * { 322168404Spjd * foo_t *l = l_arg; 323168404Spjd * foo_t *r = r_arg; 324168404Spjd * 325168404Spjd * if (... l greater than r ...) 326168404Spjd * return (1); 327168404Spjd * if (... l less than r ...) 328168404Spjd * return (-1); 329168404Spjd * return (0); 330168404Spjd * } 331168404Spjd * 332168404Spjd * ... 333168404Spjd * // at initialization time 334168404Spjd * foo_pool = uu_avl_pool_create("foo_pool", 335168404Spjd * sizeof (foo_t), offsetof(foo_t, foo_node), foo_compare, 336168404Spjd * debugging? 0 : UU_AVL_POOL_DEBUG); 337168404Spjd * ... 338168404Spjd */ 339168404Spjduu_avl_pool_t *uu_avl_pool_create(const char *, size_t, size_t, 340168404Spjd uu_compare_fn_t *, uint32_t); 341168404Spjd#define UU_AVL_POOL_DEBUG 0x00000001 342168404Spjd 343168404Spjdvoid uu_avl_pool_destroy(uu_avl_pool_t *); 344168404Spjd 345168404Spjd/* 346168404Spjd * usage: 347168404Spjd * 348168404Spjd * foo_t *a; 349168404Spjd * a = malloc(sizeof(*a)); 350168404Spjd * uu_avl_node_init(a, &a->foo_avl, pool); 351168404Spjd * ... 352168404Spjd * uu_avl_node_fini(a, &a->foo_avl, pool); 353168404Spjd * free(a); 354168404Spjd */ 355168404Spjdvoid uu_avl_node_init(void *, uu_avl_node_t *, uu_avl_pool_t *); 356168404Spjdvoid uu_avl_node_fini(void *, uu_avl_node_t *, uu_avl_pool_t *); 357168404Spjd 358168404Spjduu_avl_t *uu_avl_create(uu_avl_pool_t *, void *_parent, uint32_t); 359168404Spjd#define UU_AVL_DEBUG 0x00000001 360168404Spjd 361168404Spjdvoid uu_avl_destroy(uu_avl_t *); /* list must be empty */ 362168404Spjd 363168404Spjdsize_t uu_avl_numnodes(uu_avl_t *); 364168404Spjd 365168404Spjdvoid *uu_avl_first(uu_avl_t *); 366168404Spjdvoid *uu_avl_last(uu_avl_t *); 367168404Spjd 368168404Spjdvoid *uu_avl_next(uu_avl_t *, void *); 369168404Spjdvoid *uu_avl_prev(uu_avl_t *, void *); 370168404Spjd 371168404Spjdint uu_avl_walk(uu_avl_t *, uu_walk_fn_t *, void *, uint32_t); 372168404Spjd 373168404Spjduu_avl_walk_t *uu_avl_walk_start(uu_avl_t *, uint32_t); 374168404Spjdvoid *uu_avl_walk_next(uu_avl_walk_t *); 375168404Spjdvoid uu_avl_walk_end(uu_avl_walk_t *); 376168404Spjd 377168404Spjdvoid *uu_avl_find(uu_avl_t *, void *, void *, uu_avl_index_t *); 378168404Spjdvoid uu_avl_insert(uu_avl_t *, void *, uu_avl_index_t); 379168404Spjd 380168404Spjdvoid *uu_avl_nearest_next(uu_avl_t *, uu_avl_index_t); 381168404Spjdvoid *uu_avl_nearest_prev(uu_avl_t *, uu_avl_index_t); 382168404Spjd 383168404Spjdvoid *uu_avl_teardown(uu_avl_t *, void **); 384168404Spjd 385168404Spjdvoid uu_avl_remove(uu_avl_t *, void *); 386168404Spjd 387168404Spjd#ifdef __cplusplus 388168404Spjd} 389168404Spjd#endif 390168404Spjd 391168404Spjd#endif /* _LIBUUTIL_H */ 392