CMGDK r49-rc2
|
00001 / * C o p y r i g h t ( C ) 2 0 0 5 M y S Q L A B 00002 00003 T h i s p r o g r a m i s f r e e s o f t w a r e ; y o u c a n r e d i s t r i b u t e i t a n d / o r m o d i f y 00004 00005 i t u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e a s p u b l i s h e d b y 00006 00007 t h e F r e e S o f t w a r e F o u n d a t i o n ; v e r s i o n 2 o f t h e L i c e n s e . 00008 00009 T h i s p r o g r a m i s d i s t r i b u t e d i n t h e h o p e t h a t i t w i l l b e u s e f u l , 00010 00011 b u t W I T H O U T A N Y W A R R A N T Y ; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y o f 00012 00013 M E R C H A N T A B I L I T Y o r F I T N E S S F O R A P A R T I C U L A R P U R P O S E . S e e t h e 00014 00015 G N U G e n e r a l P u b l i c L i c e n s e f o r m o r e d e t a i l s . 00016 00017 Y o u s h o u l d h a v e r e c e i v e d a c o p y o f t h e G N U G e n e r a l P u b l i c L i c e n s e 00018 00019 a l o n g w i t h t h i s p r o g r a m ; i f n o t , w r i t e t o t h e F r e e S o f t w a r e 00020 00021 F o u n d a t i o n , I n c . , 5 9 T e m p l e P l a c e , S u i t e 3 3 0 , B o s t o n , M A 0 2 1 1 1 - 1 3 0 7 U S A * / 00022 00023 # i f n d e f _ t r i e _ h 00024 00025 # d e f i n e _ t r i e _ h 00026 00027 # i f d e f _ _ c p l u s p l u s 00028 00029 e x t e r n " C " { 00030 00031 # e n d i f 00032 00033 t y p e d e f s t r u c t s t _ t r i e _ n o d e 00034 00035 { 00036 00037 u i n t 1 6 l e a f ; / * D e p t h f r o m r o o t n o d e i f m a t c h , 0 e l s e * / 00038 00039 u c h a r c ; / * L a b e l o n t h i s e d g e * / 00040 00041 s t r u c t s t _ t r i e _ n o d e * n e x t ; / * N e x t l a b e l * / 00042 00043 s t r u c t s t _ t r i e _ n o d e * l i n k s ; / * A r r a y o f e d g e s l e a v i n g t h i s n o d e * / 00044 00045 s t r u c t s t _ t r i e _ n o d e * f a i l ; / * A C f a i l u r e f u n c t i o n * / 00046 00047 } T R I E _ N O D E ; 00048 00049 t y p e d e f s t r u c t s t _ t r i e 00050 00051 { 00052 00053 T R I E _ N O D E r o o t ; 00054 00055 M E M _ R O O T m e m _ r o o t ; 00056 00057 C H A R S E T _ I N F O * c h a r s e t ; 00058 00059 u i n t 3 2 n n o d e s ; 00060 00061 u i n t 3 2 n w o r d s ; 00062 00063 } T R I E ; 00064 00065 t y p e d e f s t r u c t s t _ a c _ t r i e _ s t a t e 00066 00067 { 00068 00069 T R I E * t r i e ; 00070 00071 T R I E _ N O D E * n o d e ; 00072 00073 } A C _ T R I E _ S T A T E ; 00074 00075 e x t e r n T R I E * t r i e _ i n i t ( T R I E * t r i e , C H A R S E T _ I N F O * c h a r s e t ) ; 00076 00077 e x t e r n v o i d t r i e _ f r e e ( T R I E * t r i e ) ; 00078 00079 e x t e r n m y _ b o o l t r i e _ i n s e r t ( T R I E * t r i e , c o n s t u c h a r * k e y , u i n t k e y l e n ) ; 00080 00081 e x t e r n m y _ b o o l a c _ t r i e _ p r e p a r e ( T R I E * t r i e ) ; 00082 00083 e x t e r n v o i d a c _ t r i e _ i n i t ( T R I E * t r i e , A C _ T R I E _ S T A T E * s t a t e ) ; 00084 00085 00086 00087 / * ` t r i e _ g o t o ' i s i n t e r n a l f u n c t i o n a n d s h o u l d n ' t b e u s e d . * / 00088 00089 s t a t i c i n l i n e T R I E _ N O D E * t r i e _ g o t o ( T R I E _ N O D E * r o o t , T R I E _ N O D E * n o d e , u c h a r c ) 00090 00091 { 00092 00093 T R I E _ N O D E * n e x t ; 00094 00095 D B U G _ E N T E R ( " t r i e _ g o t o " ) ; 00096 00097 f o r ( n e x t = n o d e - > l i n k s ; n e x t ; n e x t = n e x t - > n e x t ) 00098 00099 i f ( n e x t - > c = = c ) 00100 00101 D B U G _ R E T U R N ( n e x t ) ; 00102 00103 i f ( r o o t = = n o d e ) 00104 00105 D B U G _ R E T U R N ( r o o t ) ; 00106 00107 D B U G _ R E T U R N ( N U L L ) ; 00108 00109 } 00110 00111 00112 00113 / * 00114 00115 S Y N O P S I S 00116 00117 i n t a c _ t r i e _ n e x t ( A C _ T R I E _ S T A T E * s t a t e , u c h a r * c ) ; 00118 00119 s t a t e - v a l i d p o i n t e r t o ` A C _ T R I E _ S T A T E ' 00120 00121 c - c h a r a c t e r t o l o o k u p 00122 00123 D E S C R I P T I O N 00124 00125 I m p l e m e n t a t i o n o f s e a r c h u s i n g A h o - C o r a s i c k a u t o m a t o n . 00126 00127 P e r f o r m s c h a r - b y - c h a r s e a r c h . 00128 00129 R E T U R N V A L U E 00130 00131 ` a c _ t r i e _ n e x t ' r e t u r n s l e n g t h o f m a t c h e d w o r d o r 0 . 00132 00133 * / 00134 00135 s t a t i c i n l i n e i n t a c _ t r i e _ n e x t ( A C _ T R I E _ S T A T E * s t a t e , u c h a r * c ) 00136 00137 { 00138 00139 T R I E _ N O D E * r o o t , * n o d e ; 00140 00141 D B U G _ E N T E R ( " a c _ t r i e _ n e x t " ) ; 00142 00143 D B U G _ A S S E R T ( s t a t e & & c ) ; 00144 00145 r o o t = & s t a t e - > t r i e - > r o o t ; 00146 00147 n o d e = s t a t e - > n o d e ; 00148 00149 w h i l e ( ! ( s t a t e - > n o d e = t r i e _ g o t o ( r o o t , n o d e , * c ) ) ) 00150 00151 n o d e = n o d e - > f a i l ; 00152 00153 D B U G _ R E T U R N ( s t a t e - > n o d e - > l e a f ) ; 00154 00155 } 00156 00157 00158 00159 / * 00160 00161 S Y N O P S I S 00162 00163 m y _ b o o l t r i e _ s e a r c h ( T R I E * t r i e , c o n s t u c h a r * k e y , u i n t k e y l e n ) ; 00164 00165 t r i e - v a l i d p o i n t e r t o ` T R I E ' 00166 00167 k e y - v a l i d p o i n t e r t o k e y t o i n s e r t 00168 00169 k e y l e n - n o n - 0 k e y l e n g t h 00170 00171 D E S C R I P T I O N 00172 00173 P e r f o r m s k e y l o o k u p i n t r i e . 00174 00175 R E T U R N V A L U E 00176 00177 ` t r i e _ s e a r c h ' r e t u r n s ` t r u e ' i f k e y i s i n ` t r i e ' . O t h e r w i s e , 00178 00179 ` f a l s e ' i s r e t u r n e d . 00180 00181 N O T E S 00182 00183 C o n s e c u t i v e s e a r c h h e r e i s " b e s t b y t e s t " . a r r a y s a r e v e r y s h o r t , s o 00184 00185 b i n a r y s e a r c h o r h a s h i n g w o u l d a d d t o o m u c h c o m p l e x i t y t h a t w o u l d 00186 00187 o v e r w e i g h t s p e e d g a i n . E s p e c i a l l y b e c a u s e c o m p i l e r c a n o p t i m i z e s i m p l e 00188 00189 c o n s e c u t i v e l o o p b e t t e r ( t e s t e d ) 00190 00191 * / 00192 00193 s t a t i c i n l i n e m y _ b o o l t r i e _ s e a r c h ( T R I E * t r i e , c o n s t u c h a r * k e y , u i n t k e y l e n ) 00194 00195 { 00196 00197 T R I E _ N O D E * n o d e ; 00198 00199 u i n t k ; 00200 00201 D B U G _ E N T E R ( " t r i e _ s e a r c h " ) ; 00202 00203 D B U G _ A S S E R T ( t r i e & & k e y & & k e y l e n ) ; 00204 00205 n o d e = & t r i e - > r o o t ; 00206 00207 f o r ( k = 0 ; k < k e y l e n ; k + + ) 00208 00209 { 00210 00211 u c h a r p ; 00212 00213 i f ( ! ( n o d e = n o d e - > l i n k s ) ) 00214 00215 D B U G _ R E T U R N ( F A L S E ) ; 00216 00217 p = k e y [ k ] ; 00218 00219 w h i l e ( p ! = n o d e - > c ) 00220 00221 i f ( ! ( n o d e = n o d e - > n e x t ) ) 00222 00223 D B U G _ R E T U R N ( F A L S E ) ; 00224 00225 } 00226 00227 D B U G _ R E T U R N ( n o d e - > l e a f > 0 ) ; 00228 00229 } 00230 00231 # i f d e f _ _ c p l u s p l u s 00232 00233 } 00234 00235 # e n d i f 00236 00237 # e n d i f 00238 00239