~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/lib/ts_kmp.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /lib/ts_kmp.c (Version linux-6.11.5) and /lib/ts_kmp.c (Version linux-6.10.4)


** Warning: Cannot open xref database.

  1 // SPDX-License-Identifier: GPL-2.0-or-later        1 
  2 /*                                                
  3  * lib/ts_kmp.c         Knuth-Morris-Pratt tex    
  4  *                                                
  5  * Authors:     Thomas Graf <tgraf@suug.ch>       
  6  *                                                
  7  * ===========================================    
  8  *                                                
  9  *   Implements a linear-time string-matching     
 10  *   Morris, and Pratt [1]. Their algorithm av    
 11  *   computation of the transition function DE    
 12  *   matching time is O(n), for n being length    
 13  *   auxiliary function PI[1..m], for m being     
 14  *   precomputed from the pattern in time O(m)    
 15  *   the transition function DELTA to be compu    
 16  *   "on the fly" as needed. Roughly speaking,    
 17  *   "q" = 0,1,...,m and any character "a" in     
 18  *   PI["q"] contains the information that is     
 19  *   is needed to compute DELTA("q", "a") [2].    
 20  *   has only m entries, whereas DELTA has O(m    
 21  *   save a factor of |SIGMA| in the preproces    
 22  *   PI rather than DELTA.                        
 23  *                                                
 24  *   [1] Cormen, Leiserson, Rivest, Stein         
 25  *       Introdcution to Algorithms, 2nd Editi    
 26  *   [2] See finite automaton theory              
 27  */                                               
 28                                                   
 29 #include <linux/module.h>                         
 30 #include <linux/types.h>                          
 31 #include <linux/string.h>                         
 32 #include <linux/ctype.h>                          
 33 #include <linux/textsearch.h>                     
 34                                                   
 35 struct ts_kmp                                     
 36 {                                                 
 37         u8 *            pattern;                  
 38         unsigned int    pattern_len;              
 39         unsigned int    prefix_tbl[];             
 40 };                                                
 41                                                   
 42 static unsigned int kmp_find(struct ts_config     
 43 {                                                 
 44         struct ts_kmp *kmp = ts_config_priv(co    
 45         unsigned int i, q = 0, text_len, consu    
 46         const u8 *text;                           
 47         const int icase = conf->flags & TS_IGN    
 48                                                   
 49         for (;;) {                                
 50                 text_len = conf->get_next_bloc    
 51                                                   
 52                 if (unlikely(text_len == 0))      
 53                         break;                    
 54                                                   
 55                 for (i = 0; i < text_len; i++)    
 56                         while (q > 0 && kmp->p    
 57                             != (icase ? touppe    
 58                                 q = kmp->prefi    
 59                         if (kmp->pattern[q]       
 60                             == (icase ? touppe    
 61                                 q++;              
 62                         if (unlikely(q == kmp-    
 63                                 state->offset     
 64                                 return state->    
 65                         }                         
 66                 }                                 
 67                                                   
 68                 consumed += text_len;             
 69         }                                         
 70                                                   
 71         return UINT_MAX;                          
 72 }                                                 
 73                                                   
 74 static inline void compute_prefix_tbl(const u8    
 75                                       unsigned    
 76 {                                                 
 77         unsigned int k, q;                        
 78         const u8 icase = flags & TS_IGNORECASE    
 79                                                   
 80         for (k = 0, q = 1; q < len; q++) {        
 81                 while (k > 0 && (icase ? toupp    
 82                     != (icase ? toupper(patter    
 83                         k = prefix_tbl[k-1];      
 84                 if ((icase ? toupper(pattern[k    
 85                     == (icase ? toupper(patter    
 86                         k++;                      
 87                 prefix_tbl[q] = k;                
 88         }                                         
 89 }                                                 
 90                                                   
 91 static struct ts_config *kmp_init(const void *    
 92                                   gfp_t gfp_ma    
 93 {                                                 
 94         struct ts_config *conf;                   
 95         struct ts_kmp *kmp;                       
 96         int i;                                    
 97         unsigned int prefix_tbl_len = len * si    
 98         size_t priv_size = sizeof(*kmp) + len     
 99                                                   
100         conf = alloc_ts_config(priv_size, gfp_    
101         if (IS_ERR(conf))                         
102                 return conf;                      
103                                                   
104         conf->flags = flags;                      
105         kmp = ts_config_priv(conf);               
106         kmp->pattern_len = len;                   
107         compute_prefix_tbl(pattern, len, kmp->    
108         kmp->pattern = (u8 *) kmp->prefix_tbl     
109         if (flags & TS_IGNORECASE)                
110                 for (i = 0; i < len; i++)         
111                         kmp->pattern[i] = toup    
112         else                                      
113                 memcpy(kmp->pattern, pattern,     
114                                                   
115         return conf;                              
116 }                                                 
117                                                   
118 static void *kmp_get_pattern(struct ts_config     
119 {                                                 
120         struct ts_kmp *kmp = ts_config_priv(co    
121         return kmp->pattern;                      
122 }                                                 
123                                                   
124 static unsigned int kmp_get_pattern_len(struct    
125 {                                                 
126         struct ts_kmp *kmp = ts_config_priv(co    
127         return kmp->pattern_len;                  
128 }                                                 
129                                                   
130 static struct ts_ops kmp_ops = {                  
131         .name             = "kmp",                
132         .find             = kmp_find,             
133         .init             = kmp_init,             
134         .get_pattern      = kmp_get_pattern,      
135         .get_pattern_len  = kmp_get_pattern_le    
136         .owner            = THIS_MODULE,          
137         .list             = LIST_HEAD_INIT(kmp    
138 };                                                
139                                                   
140 static int __init init_kmp(void)                  
141 {                                                 
142         return textsearch_register(&kmp_ops);     
143 }                                                 
144                                                   
145 static void __exit exit_kmp(void)                 
146 {                                                 
147         textsearch_unregister(&kmp_ops);          
148 }                                                 
149                                                   
150 MODULE_DESCRIPTION("Knuth-Morris-Pratt text se    
151 MODULE_LICENSE("GPL");                            
152                                                   
153 module_init(init_kmp);                            
154 module_exit(exit_kmp);                            
155                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php