Review Board 1.7.16


utils: Create ast_strsep function that ignores separators inside quotes.

Review Request #3989 - Created Sept. 10, 2014 and submitted

George Joseph
12
Reviewers
asterisk-dev
rmudgett
Asterisk
I'm going to need this for my imminent manager and config
enhancements but I thought I'd post this separately.

/*!
  \brief Act like strsep but ignore separators inside quotes.
  \param s Pointer to address of the the string to be processed.
  Will be modified and can't be constant.
  \param sep A single character delimiter.
  \param flags Controls post-processing of the result.
  AST_STRSEP_TRIM trims all leading and trailing whitespace from the result.
  AST_STRSEP_STRIP does a trim then strips the outermost quotes.  You may want
  to trim again after the strip.  Just OR both the TRIM and STRIP flags.
  AST_STRSEP_UNESCAPE unescapes '\' sequences.
  AST_STRSEP_ALL does all of the above processing.
  \return The next token or NULL if done or if there are more than 8 levels of
  nested quotes.

  This function acts like strsep with three exceptions...
  The separator is a single character instead of a string.
  Separators inside quotes are treated literally instead of like separators.
  You can elect to have leading and trailing whitespace and quotes
  stripped from the result and have '\' sequences unescaped.

  Like strsep, ast_strsep maintains no internal state and you can call it
  recursively using different separators on the same storage.

  Also like strsep, for consistent results, consecutive separators are not
  collapsed so you may get an empty string as a valid result.

  Examples:
  \code
	char *mystr = ast_strdupa("abc=def,ghi='zzz=yyy,456',jkl");
	char *token, *token2, *token3;

	while((token = ast_strsep(&mystr, ',', AST_SEP_STRIP))) {
		// 1st token will be aaa=def
		// 2nd token will be ghi='zzz=yyy,456'
		while((token2 = ast_strsep(&token, '=', AST_SEP_STRIP))) {
			// 1st token2 will be ghi
			// 2nd token2 will be zzz=yyy,456
			while((token3 = ast_strsep(&token2, ',', AST_SEP_STRIP))) {
				// 1st token3 will be zzz=yyy
				// 2nd token3 will be 456
				// and so on
			}
		}
		// 3rd token will be jkl
	}

  \endcode
 */
char *ast_strsep(char **s, const char sep, uint32_t flags);

 

Diff revision 4 (Latest)

1 2 3 4
1 2 3 4

  1. branches/12/include/asterisk/strings.h: Loading...
  2. branches/12/main/utils.c: Loading...
  3. branches/12/tests/test_strings.c: Loading...
branches/12/include/asterisk/strings.h
Revision 422963 New Change
[20] 233 lines
[+20] [+] char *ast_strip(char *s),
234
  \endcode
234
  \endcode
235
 */
235
 */
236
char *ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes);
236
char *ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes);
237

    
   
237

   
238
/*!
238
/*!

    
   
239
  \brief Flags for ast_strsep

    
   
240
 */

    
   
241
enum ast_strsep_flags {

    
   
242
	AST_STRSEP_STRIP =    0x01, /*!< Trim, then strip quotes.  You may want to trim again */

    
   
243
	AST_STRSEP_TRIM =     0x02, /*!< Trim leading and trailing whitespace */

    
   
244
	AST_STRSEP_UNESCAPE = 0x04, /*!< Unescape '\' */

    
   
245
	AST_STRSEP_ALL =      0x07, /*!< Trim, strip, unescape */

    
   
246
};

    
   
247

   

    
   
248
/*!

    
   
249
  \brief Act like strsep but ignore separators inside quotes.

    
   
250
  \param s Pointer to address of the the string to be processed.

    
   
251
  Will be modified and can't be constant.

    
   
252
  \param sep A single character delimiter.

    
   
253
  \param flags Controls post-processing of the result.

    
   
254
  AST_STRSEP_TRIM trims all leading and trailing whitespace from the result.

    
   
255
  AST_STRSEP_STRIP does a trim then strips the outermost quotes.  You may want

    
   
256
  to trim again after the strip.  Just OR both the TRIM and STRIP flags.

    
   
257
  AST_STRSEP_UNESCAPE unescapes '\' sequences.

    
   
258
  AST_STRSEP_ALL does all of the above processing.

    
   
259
  \return The next token or NULL if done or if there are more than 8 levels of

    
   
260
  nested quotes.

    
   
261

   

    
   
262
  This function acts like strsep with three exceptions...

    
   
263
  The separator is a single character instead of a string.

    
   
264
  Separators inside quotes are treated literally instead of like separators.

    
   
265
  You can elect to have leading and trailing whitespace and quotes

    
   
266
  stripped from the result and have '\' sequences unescaped.

    
   
267

   

    
   
268
  Like strsep, ast_strsep maintains no internal state and you can call it

    
   
269
  recursively using different separators on the same storage.

    
   
270

   

    
   
271
  Also like strsep, for consistent results, consecutive separators are not

    
   
272
  collapsed so you may get an empty string as a valid result.

    
   
273

   

    
   
274
  Examples:

    
   
275
  \code

    
   
276
	char *mystr = ast_strdupa("abc=def,ghi='zzz=yyy,456',jkl");

    
   
277
	char *token, *token2, *token3;

    
   
278

   

    
   
279
	while((token = ast_strsep(&mystr, ',', AST_SEP_STRIP))) {

    
   
280
		// 1st token will be aaa=def

    
   
281
		// 2nd token will be ghi='zzz=yyy,456'

    
   
282
		while((token2 = ast_strsep(&token, '=', AST_SEP_STRIP))) {

    
   
283
			// 1st token2 will be ghi

    
   
284
			// 2nd token2 will be zzz=yyy,456

    
   
285
			while((token3 = ast_strsep(&token2, ',', AST_SEP_STRIP))) {

    
   
286
				// 1st token3 will be zzz=yyy

    
   
287
				// 2nd token3 will be 456

    
   
288
				// and so on

    
   
289
			}

    
   
290
		}

    
   
291
		// 3rd token will be jkl

    
   
292
	}

    
   
293

   

    
   
294
  \endcode

    
   
295
 */

    
   
296
char *ast_strsep(char **s, const char sep, uint32_t flags);

    
   
297

   

    
   
298
/*!
239
  \brief Strip backslash for "escaped" semicolons, 
299
  \brief Strip backslash for "escaped" semicolons, 
240
	the string to be stripped (will be modified).
300
	the string to be stripped (will be modified).
241
  \return The stripped string.
301
  \return The stripped string.
242
 */
302
 */
243
char *ast_unescape_semicolon(char *s);
303
char *ast_unescape_semicolon(char *s);
[+20] [20] 956 lines
branches/12/main/utils.c
Revision 422963 New Change
 
branches/12/tests/test_strings.c
Revision 422963 New Change
 
  1. branches/12/include/asterisk/strings.h: Loading...
  2. branches/12/main/utils.c: Loading...
  3. branches/12/tests/test_strings.c: Loading...

https://reviewboard.asterisk.org/ runs on a server provided by Digium, Inc. and uses bandwidth donated to the open source Asterisk community by API Digital Communications in Huntsville, AL USA.
Please report problems with this site to asteriskteam@digium.com.