1 /*-
2 * SSLsplit - transparent SSL/TLS interception
3 * https://www.roe.ch/SSLsplit
4 *
5 * Copyright (c) 2009-2019, Daniel Roethlisberger <daniel@roe.ch>.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 * 1. Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include <string.h>
30
31 /*
32 * Various utility functions.
33 */
34
35 /*
36 * Returns a pointer to the first non-whitespace character in s.
37 * Only space and tab characters are considered whitespace.
38 */
39 char *
util_skipws(const char * s)40 util_skipws(const char *s)
41 {
42 return (char*) s + strspn(s, " \t");
43 }
44
45 /*
46 * Returns the length of the first word in a given memory area.
47 * Memory area may not be null-terminated, hence we cannot use string
48 * manipulation functions.
49 */
50 size_t
util_get_first_word_len(char * mem,size_t size)51 util_get_first_word_len(char *mem, size_t size)
52 {
53 char *end;
54 // @attention The detection order of ws chars is important: space, tab, cr, and nl
55 if ((end = memchr(mem, ' ', size)) ||
56 (end = memchr(mem, '\t', size)) ||
57 (end = memchr(mem, '\r', size)) ||
58 (end = memchr(mem, '\n', size)) ||
59 (end = memchr(mem, '\0', size))) {
60 return (size_t)(end - mem);
61 }
62 return size;
63 }
64
65 /* vim: set noet ft=c: */
66