Commit | Line | Data |
---|---|---|
984263bc | 1 | /*- |
a025257a JS |
2 | * Copyright (c) 2005 The DragonFly Project. All rights reserved. |
3 | * | |
4 | * This code is derived from software contributed to The DragonFly Project | |
5 | * by Andreas Hauser <andy-dragonfly@splashground.de> | |
6 | * | |
984263bc MD |
7 | * Redistribution and use in source and binary forms, with or without |
8 | * modification, are permitted provided that the following conditions | |
9 | * are met: | |
a025257a | 10 | * |
984263bc MD |
11 | * 1. Redistributions of source code must retain the above copyright |
12 | * notice, this list of conditions and the following disclaimer. | |
13 | * 2. Redistributions in binary form must reproduce the above copyright | |
a025257a JS |
14 | * notice, this list of conditions and the following disclaimer in |
15 | * the documentation and/or other materials provided with the | |
16 | * distribution. | |
17 | * 3. Neither the name of The DragonFly Project nor the names of its | |
18 | * contributors may be used to endorse or promote products derived | |
19 | * from this software without specific, prior written permission. | |
20 | * | |
21 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
22 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
23 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |
24 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |
25 | * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | |
26 | * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, | |
27 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
28 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED | |
29 | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
30 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |
31 | * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
984263bc | 32 | * SUCH DAMAGE. |
1de703da | 33 | * |
2b09fabe | 34 | * $DragonFly: src/lib/libc/string/strcspn.c,v 1.5 2008/05/15 03:48:58 dillon Exp $ |
984263bc MD |
35 | */ |
36 | ||
a025257a JS |
37 | #include <assert.h> |
38 | #include <limits.h> | |
39 | #include <stdbool.h> | |
984263bc MD |
40 | #include <string.h> |
41 | ||
42 | /* | |
a025257a | 43 | * Longest initial segment of string *str, not containing any chars from *chars. |
984263bc MD |
44 | */ |
45 | size_t | |
a025257a | 46 | strcspn(const char *str, const char *chars) |
984263bc | 47 | { |
a025257a | 48 | const char *s; |
2b09fabe | 49 | bool charset[UCHAR_MAX + 1]; |
a025257a JS |
50 | |
51 | _DIAGASSERT(str != NULL); | |
52 | _DIAGASSERT(chars != NULL); | |
53 | ||
54 | if(*str == '\0') | |
55 | return 0; | |
56 | if(*chars == '\0') | |
57 | return strlen(str); | |
58 | ||
59 | memset(charset, false, sizeof(charset)); | |
60 | do | |
61 | charset[*(const unsigned char *)chars] = true; | |
62 | while(*chars++ != '\0'); | |
63 | ||
64 | for(s = str; charset[*(const unsigned char *)s] == false; s++) | |
65 | /* NOTHING */ | |
66 | ; | |
984263bc | 67 | |
a025257a | 68 | return (s - str); |
984263bc | 69 | } |