Blame view

include/linux/textsearch.h 4.73 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
2
3
  #ifndef __LINUX_TEXTSEARCH_H
  #define __LINUX_TEXTSEARCH_H
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
4
5
6
  #include <linux/types.h>
  #include <linux/list.h>
  #include <linux/kernel.h>
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
7
  #include <linux/err.h>
4e57b6817   Tim Schmielau   [PATCH] fix missi...
8
  #include <linux/slab.h>
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
9

de4772542   Paul Gortmaker   include: replace ...
10
  struct module;
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
11
  struct ts_config;
b9c796783   Joonwoo Park   textsearch: suppo...
12
13
  #define TS_AUTOLOAD	1 /* Automatically load textsearch modules when needed */
  #define TS_IGNORECASE	2 /* Searches string case insensitively */
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
14
15
16
17
  
  /**
   * struct ts_state - search state
   * @offset: offset for next match
03a67a46a   Jan Engelhardt   Fix typos in doc ...
18
   * @cb: control buffer, for persistent variables of get_next_block()
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
   */
  struct ts_state
  {
  	unsigned int		offset;
  	char			cb[40];
  };
  
  /**
   * struct ts_ops - search module operations
   * @name: name of search algorithm
   * @init: initialization function to prepare a search
   * @find: find the next occurrence of the pattern
   * @destroy: destroy algorithm specific parts of a search configuration
   * @get_pattern: return head of pattern
   * @get_pattern_len: return length of pattern
   * @owner: module reference to algorithm
   */
  struct ts_ops
  {
  	const char		*name;
b9c796783   Joonwoo Park   textsearch: suppo...
39
  	struct ts_config *	(*init)(const void *, unsigned int, gfp_t, int);
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
40
41
42
43
44
45
46
47
48
49
50
51
  	unsigned int		(*find)(struct ts_config *,
  					struct ts_state *);
  	void			(*destroy)(struct ts_config *);
  	void *			(*get_pattern)(struct ts_config *);
  	unsigned int		(*get_pattern_len)(struct ts_config *);
  	struct module		*owner;
  	struct list_head	list;
  };
  
  /**
   * struct ts_config - search configuration
   * @ops: operations of chosen algorithm
b9c796783   Joonwoo Park   textsearch: suppo...
52
   * @flags: flags
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
53
54
55
56
57
58
   * @get_next_block: callback to fetch the next block to search in
   * @finish: callback to finalize a search
   */
  struct ts_config
  {
  	struct ts_ops		*ops;
b9c796783   Joonwoo Park   textsearch: suppo...
59
  	int 			flags;
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
60
61
  
  	/**
5968a70d7   Randy Dunlap   textsearch: fix k...
62
  	 * @get_next_block: fetch next block of data
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
63
64
65
66
67
68
69
70
  	 * @consumed: number of bytes consumed by the caller
  	 * @dst: destination buffer
  	 * @conf: search configuration
  	 * @state: search state
  	 *
  	 * Called repeatedly until 0 is returned. Must assign the
  	 * head of the next block of data to &*dst and return the length
  	 * of the block or 0 if at the end. consumed == 0 indicates
03a67a46a   Jan Engelhardt   Fix typos in doc ...
71
  	 * a new search. May store/read persistent values in state->cb.
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
72
73
74
75
76
77
78
  	 */
  	unsigned int		(*get_next_block)(unsigned int consumed,
  						  const u8 **dst,
  						  struct ts_config *conf,
  						  struct ts_state *state);
  
  	/**
5968a70d7   Randy Dunlap   textsearch: fix k...
79
  	 * @finish: finalize/clean a series of get_next_block() calls
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
  	 * @conf: search configuration
  	 * @state: search state
  	 *
  	 * Called after the last use of get_next_block(), may be used
  	 * to cleanup any leftovers.
  	 */
  	void			(*finish)(struct ts_config *conf,
  					  struct ts_state *state);
  };
  
  /**
   * textsearch_next - continue searching for a pattern
   * @conf: search configuration
   * @state: search state
   *
   * Continues a search looking for more occurrences of the pattern.
   * textsearch_find() must be called to find the first occurrence
   * in order to reset the state.
   *
   * Returns the position of the next occurrence of the pattern or
   * UINT_MAX if not match was found.
   */ 
  static inline unsigned int textsearch_next(struct ts_config *conf,
  					   struct ts_state *state)
  {
  	unsigned int ret = conf->ops->find(conf, state);
  
  	if (conf->finish)
  		conf->finish(conf, state);
  
  	return ret;
  }
  
  /**
   * textsearch_find - start searching for a pattern
   * @conf: search configuration
   * @state: search state
   *
   * Returns the position of first occurrence of the pattern or
   * UINT_MAX if no match was found.
   */ 
  static inline unsigned int textsearch_find(struct ts_config *conf,
  					   struct ts_state *state)
  {
  	state->offset = 0;
  	return textsearch_next(conf, state);
  }
  
  /**
   * textsearch_get_pattern - return head of the pattern
   * @conf: search configuration
   */
  static inline void *textsearch_get_pattern(struct ts_config *conf)
  {
  	return conf->ops->get_pattern(conf);
  }
  
  /**
   * textsearch_get_pattern_len - return length of the pattern
   * @conf: search configuration
   */
  static inline unsigned int textsearch_get_pattern_len(struct ts_config *conf)
  {
  	return conf->ops->get_pattern_len(conf);
  }
  
  extern int textsearch_register(struct ts_ops *);
  extern int textsearch_unregister(struct ts_ops *);
  extern struct ts_config *textsearch_prepare(const char *, const void *,
fd4f2df24   Al Viro   [PATCH] gfp_t: lib/*
149
  					    unsigned int, gfp_t, int);
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
150
151
152
153
154
155
156
157
  extern void textsearch_destroy(struct ts_config *conf);
  extern unsigned int textsearch_find_continuous(struct ts_config *,
  					       struct ts_state *,
  					       const void *, unsigned int);
  
  
  #define TS_PRIV_ALIGNTO	8
  #define TS_PRIV_ALIGN(len) (((len) + TS_PRIV_ALIGNTO-1) & ~(TS_PRIV_ALIGNTO-1))
3d2aef668   Randy Dunlap   [TEXTSEARCH]: fix...
158
  static inline struct ts_config *alloc_ts_config(size_t payload,
dd0fc66fb   Al Viro   [PATCH] gfp flags...
159
  						gfp_t gfp_mask)
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
160
161
  {
  	struct ts_config *conf;
dde77e604   Joonwoo Park   textsearch: conve...
162
  	conf = kzalloc(TS_PRIV_ALIGN(sizeof(*conf)) + payload, gfp_mask);
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
163
164
  	if (conf == NULL)
  		return ERR_PTR(-ENOMEM);
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
165
166
167
168
169
170
171
  	return conf;
  }
  
  static inline void *ts_config_priv(struct ts_config *conf)
  {
  	return ((u8 *) conf + TS_PRIV_ALIGN(sizeof(struct ts_config)));
  }
2de4ff7bd   Thomas Graf   [LIB]: Textsearch...
172
  #endif