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