1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef __CONV_DOT_H 28 #define __CONV_DOT_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 /* 33 * Local include file for conversion library. 34 */ 35 #include <conv.h> 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 /* 42 * Some format strings differ depending on whether they are used for 32-bit 43 * or 64-bit values. 44 */ 45 #if defined(_ELF64) 46 #define MSG_GBL_FMT_DEC MSG_GBL_FMT_DEC_64 47 #define MSG_GBL_FMT_DECS MSG_GBL_FMT_DECS_64 48 #define MSG_GBL_FMT_HEX MSG_GBL_FMT_HEX_64 49 #define MSG_GBL_FMT_HEXS MSG_GBL_FMT_HEXS_64 50 51 #define MSG_SYM_FMT_VAL MSG_SYM_FMT_VAL_64 52 #else 53 #define MSG_GBL_FMT_DEC MSG_GBL_FMT_DEC_32 54 #define MSG_GBL_FMT_DECS MSG_GBL_FMT_DECS_32 55 #define MSG_GBL_FMT_HEX MSG_GBL_FMT_HEX_32 56 #define MSG_GBL_FMT_HEXS MSG_GBL_FMT_HEXS_32 57 58 #define MSG_SYM_FMT_VAL MSG_SYM_FMT_VAL_32 59 #endif 60 61 62 63 /* 64 * Map an integer into a descriptive string. 65 * 66 * entry: 67 * buf - A buffer into which this routine can format 68 * a result string, if necessary. 69 * bufsize - sizeof(buf) 70 * val - The value for which a string is desired. 71 * flags - CONV_FMT_* values, used to influence formatting of 72 * the resulting string. 73 * num_msg - # of Msg entries in msg, msg_altdump, and msg_altfile. 74 * msg - Array of num_msg Msg items corresponding to the possible 75 * strings corresponding to val. 76 * msg_altdump - NULL, or array of num_msg Msg items, to be used 77 * instead of msg when the CONV_FMT_ALTDUMP flag is set. 78 * msg_altfile - NULL, or array of num_msg Msg items, to be used 79 * instead of msg when the CONV_FMT_ALTFILE flag is set. 80 * 81 * exit: 82 * If val lies in the range [0-(num_msg-1)], then the string 83 * corresponding to it is returned: 84 * 1) If CONV_FMT_ALTDUMP is set and msg_altdump is non-NULL, 85 * the string comes from msg_altdump. 86 * 2) If CONV_FMT_ALTFILE is set and msg_altfile is non-NULL, 87 * the string comes from msg_altfile. 88 * 3) If neither of the previous rules holds, the string 89 * comes from msg. 90 * if val is outside the range, an ASCII representation of it is 91 * formatted into string, and that is returned. 92 * 93 * note: 94 * Ideally, this would be a function defined in globals.c. 95 * However, it uses the MSG_ORIG macro, which uses an array 96 * that is local to each module. Hence, this is a static function, 97 * defined by this macro. Once defined by a module, the routine 98 * is called normally. 99 */ 100 #define DEFINE_conv_map2str \ 101 static \ 102 const char * \ 103 conv_map2str(char *buf, size_t bufsize, int val, int flags, int num_msg, \ 104 const Msg *msg, const Msg *msg_altdump, const Msg *msg_altfile) \ 105 { \ 106 if ((val >= 0) && (val < num_msg)) { \ 107 if ((flags & CONV_FMT_ALTDUMP) && msg_altdump) { \ 108 return (MSG_ORIG(msg_altdump[val])); \ 109 } else if ((flags & CONV_FMT_ALTFILE) && msg_altfile) { \ 110 return (MSG_ORIG(msg_altfile[val])); \ 111 } else { \ 112 return (MSG_ORIG(msg[val])); \ 113 } \ 114 } \ 115 \ 116 /* If we get here, it's an unknown value */ \ 117 return (conv_invalid_val(buf, bufsize, val, flags)); \ 118 } 119 120 /* # of elements in an array */ 121 #define ARRAY_NELTS(arr) (sizeof (arr) / sizeof (*arr)) 122 123 124 125 #ifdef __cplusplus 126 } 127 #endif 128 129 #endif /* __CONV_DOT_H */ 130