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, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2003 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _STRING_TABLE_DOT_H 28 #define _STRING_TABLE_DOT_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #include <stdio.h> 33 #include <sys/types.h> 34 #include <sys/avl.h> 35 #include <sgs.h> 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 typedef struct str_hash Str_hash; 42 typedef struct str_tbl Str_tbl; 43 typedef struct str_master Str_master; 44 45 46 /* 47 * The Stringlist is the list of 'input strings' 48 * associatied with the AVL nodes Stringelem. 49 */ 50 typedef struct stringlist { 51 const char *sl_string; 52 struct stringlist *sl_next; 53 } Stringlist; 54 55 /* 56 * Nodes for the initial AVL tree which contains all of 57 * the input strings. The AVL tree is indexed off of 58 * the length of the strings. This permits later traversal 59 * of all of the strings based off of their string length. 60 */ 61 typedef struct { 62 avl_node_t se_avlnode; 63 Stringlist *se_strlist; 64 uint_t se_stlen; 65 } Stringelem; 66 67 68 /* 69 * Pointer to the Master string, other strings may be suffixes 70 * of this string. 71 */ 72 struct str_master { 73 const char *sm_str; /* pointer to master string */ 74 Str_master *sm_next; /* used for tracking master strings */ 75 uint_t sm_stlen; /* length of master string */ 76 uint_t sm_hashval; /* hashval of master string */ 77 uint_t sm_stoff; /* offset into destination strtab */ 78 }; 79 80 81 /* 82 * Represents a individual string that was input into 83 * the String hash table. The string may either be a 84 * suffix of another string or a master string. 85 */ 86 struct str_hash { 87 uint_t hi_stlen; /* string length */ 88 uint_t hi_refcnt; /* # of references to str */ 89 uint_t hi_hashval; /* hash for string */ 90 Str_master *hi_mstr; /* pointer to master string */ 91 Str_hash *hi_next; /* next entry in hash bckt */ 92 }; 93 94 /* 95 * Controlling data structure for a String Table 96 */ 97 struct str_tbl { 98 avl_tree_t *st_strtree; /* avl tree of initial strs */ 99 char *st_strbuf; /* string buffer */ 100 Str_hash **st_hashbcks; /* hash buckets */ 101 Str_master *st_mstrlist; /* list of all master strings */ 102 uint_t st_fullstringsize; /* uncompressed table size */ 103 uint_t st_nextoff; /* next available string */ 104 uint_t st_stringsize; /* compressed size */ 105 uint_t st_stringcnt; /* # of strings */ 106 uint_t st_hbckcnt; /* # of buckets in hashlist */ 107 uint_t st_flags; 108 }; 109 110 #define FLG_STTAB_COOKED 0x00000001 /* offset has been assigned */ 111 #define FLG_STTAB_COMPRESS 0x00000002 /* build compressed str tab */ 112 113 /* 114 * starting value for use with string hashing functions 115 * inside of string_table.c 116 */ 117 #define HASHSEED 5381 118 119 /* 120 * Flags for st_new 121 */ 122 #define FLG_STNEW_COMPRESS 0x00000001 /* build compressed str tab */ 123 124 /* 125 * exported string_table.c functions 126 */ 127 extern int st_delstring(Str_tbl *, const char *); 128 extern void st_destroy(Str_tbl *); 129 extern uint_t st_getstrtab_sz(Str_tbl *); 130 extern const char *st_getstrbuf(Str_tbl *); 131 extern int st_insert(Str_tbl *, const char *); 132 extern int st_setstrbuf(Str_tbl *, char *, uint_t); 133 extern int st_setstring(Str_tbl *, const char *, uint_t *); 134 extern Str_tbl *st_new(uint_t); 135 136 #ifdef __cplusplus 137 } 138 #endif 139 140 #endif /* _STRING_TABLE_DOT_H */ 141