| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 | /* * Adapted from strchr.c code * * Copyright (C) 2008 Denys Vlasenko <vda.linux@googlemail.com> * * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */#include <string.h>#undef strchrnul/*#define strchrnul TESTING*/char *strchrnul(const char *s, int c){	int esi;	char *eax;	__asm__ __volatile__(		"	movb	%%al, %%ah\n"		"1:	lodsb\n"		"	cmpb	%%ah, %%al\n"		"	je	2f\n"		"	testb	%%al, %%al\n"		"	jnz	1b\n"		/* with this, we'd get strchr(): */		/* "	movl	$1, %%esi\n" */		"2:	leal	-1(%%esi), %%eax\n"		: "=a" (eax), "=&S" (esi)		: "0" (c), "1" (s)		/* no clobbers */	);	return eax;}#ifndef strchrnullibc_hidden_def(strchrnul)#else/* Uncomment TESTING, gcc -D_GNU_SOURCE -m32 -Os strchrnul.c -o strchrnul * and run ./strchrnul */int main(){	static const char str[] = "abc.def";	printf((char*)strchrnul(str, '.') - str == 3 ? "ok\n" : "BAD!\n");	printf((char*)strchrnul(str, '*') - str == 7 ? "ok\n" : "BAD!\n");	printf((char*)strchrnul(str,   0) - str == 7 ? "ok\n" : "BAD!\n");	printf((char*)strchrnul(str+3, '.') - str == 3 ? "ok\n" : "BAD!\n");}#endif
 |