/* Copyright (C) 1991-2015 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
. */
#include
#include
#undef strpbrk
#undef strcspn
#ifdef AS_STRCSPN
# ifndef STRPBRK
# define STRPBRK strcspn
# endif
# define RETURN_TYPE size_t
# define RETURN(c) return c
#else
# define RETURN_TYPE char *
# define RETURN(c) return (char *) (s[c] != '\0' ? s + c : NULL)
#endif
#ifndef STRPBRK
#define STRPBRK strpbrk
#endif
/* Find the first occurrence in S of any character in ACCEPT. */
RETURN_TYPE
STRPBRK (const char *_s, const char *_accept)
{
unsigned char *s = (unsigned char *) _s;
unsigned char *a = (unsigned char *) _accept;
#ifndef LATE_CHECK
/* We need to align s to 4 bytes. We do check now to avoid expensive table
construction. */
do
{
if (s[0] == *a)
RETURN(0);
}
while (*a++);
a = (unsigned char *) _accept;
/* We couldn't do these checks in one loop as gcc
messes up register allocation. */
do
{
if (s[1] == *a)
RETURN(1);
}
while (*a++);
a = (unsigned char *) _accept;
do
{
if (s[2] == *a)
RETURN(2);
}
while (*a++);
a = (unsigned char *) _accept;
do
{
if (s[3] == *a)
RETURN(3);
}
while (*a++);
a = (unsigned char *) _accept;
#endif
unsigned char table[256];
memset (table, 0, 256);
do
{
table[*a] = 1;
}
while (*a++);
unsigned char s0, s1, s2, s3;
size_t count = 0;
#ifdef LATE_CHECK
s0 = s[count + 0];
s1 = s[count + 1];
s2 = s[count + 2];
s3 = s[count + 3];
if (table[s0])
goto ret0;
if (table[s1])
goto ret1;
if (table[s2])
goto ret2;
if (table[s3])
goto ret3;
#endif
count = 4 - ((uintptr_t) s) % 4;
while (1)
{
s0 = s[count + 0];
s1 = s[count + 1];
s2 = s[count + 2];
s3 = s[count + 3];
if (table[s0])
goto ret0;
if (table[s1])
goto ret1;
if (table[s2])
goto ret2;
if (table[s3])
goto ret3;
count += 4;
}
ret3:
count++;
ret2:
count++;
ret1:
count++;
ret0:
RETURN(count);
}
libc_hidden_builtin_def (STRPBRK)