Find the first occurrence of a character in a buffer
#include <string.h> void* memchr( void* buf, int ch, size_t length ); void* memchr_isr( void* buf, int ch, size_t length );
libc
Use the -l c option to qcc to link against this library. This library is usually included automatically.
The memchr() function locates the first occurrence of ch (converted to an unsigned char) in the first length bytes of the buffer pointed to by buf. The memchr_isr() function is similar, but it's safe for you to use it in an interrupt service routine.
char buf[16]; char *p = memchr(buf, 'a', 100);
If the letter a doesn't appear within buf and if the memory at buf + 40 happens to be an a, then the call returns &buf[40], but that's outside the allocated buffer and in most circumstances would represent a bogus return value. If a page boundary is crossed between buf and buf + 100, then the function can result in the delivery of a fatal signal to the process. The only way to avoid these issues is ensure that &buf[length - 1] is within the region allocated for buf.
A pointer to the located character, or NULL if ch couldn't be found.
#include <stdio.h> #include <string.h> #include <stdlib.h> int main( void ) { char buffer[80]; char* where; strcpy( buffer, "video x-rays" ); where = (char *) memchr( buffer, 'x', 6 ); if( where == NULL ) { printf( "'x' not found\n" ); } else { printf( "%s\n", where ); } where = (char *) memchr( buffer, 'r', 9 ); if( where == NULL ) { printf( "'r' not found\n" ); } else { printf( "%s\n", where ); } return EXIT_SUCCESS; }
produces the output:
'x' not found rays
Processes that register ISRs shouldn't use the NEON versions.
memchr() is ANSI, POSIX 1003.1; memchr_isr() is QNX Neutrino.
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | Read the Caveats |
Signal handler | Yes |
Thread | Yes |
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | Yes |
Signal handler | Yes |
Thread | Yes |
Implementations of memchr() that are optimized using SIMD instructions aren't safe to use in an interrupt handler. These include the NEON implementations on ARMv7 and AArch64.