xref: /plan9/sys/src/libc/port/runestrstr.c (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
1*59cc4ca5SDavid du Colombier #include <u.h>
2*59cc4ca5SDavid du Colombier #include <libc.h>
3*59cc4ca5SDavid du Colombier 
4*59cc4ca5SDavid du Colombier /*
5*59cc4ca5SDavid du Colombier  * Return pointer to first occurrence of s2 in s1,
6*59cc4ca5SDavid du Colombier  * 0 if none
7*59cc4ca5SDavid du Colombier  */
8*59cc4ca5SDavid du Colombier Rune*
runestrstr(Rune * s1,Rune * s2)9*59cc4ca5SDavid du Colombier runestrstr(Rune *s1, Rune *s2)
10*59cc4ca5SDavid du Colombier {
11*59cc4ca5SDavid du Colombier 	Rune *p, *pa, *pb;
12*59cc4ca5SDavid du Colombier 	int c0, c;
13*59cc4ca5SDavid du Colombier 
14*59cc4ca5SDavid du Colombier 	c0 = *s2;
15*59cc4ca5SDavid du Colombier 	if(c0 == 0)
16*59cc4ca5SDavid du Colombier 		return s1;
17*59cc4ca5SDavid du Colombier 	s2++;
18*59cc4ca5SDavid du Colombier 	for(p=runestrchr(s1, c0); p; p=runestrchr(p+1, c0)) {
19*59cc4ca5SDavid du Colombier 		pa = p;
20*59cc4ca5SDavid du Colombier 		for(pb=s2;; pb++) {
21*59cc4ca5SDavid du Colombier 			c = *pb;
22*59cc4ca5SDavid du Colombier 			if(c == 0)
23*59cc4ca5SDavid du Colombier 				return p;
24*59cc4ca5SDavid du Colombier 			if(c != *++pa)
25*59cc4ca5SDavid du Colombier 				break;
26*59cc4ca5SDavid du Colombier 		}
27*59cc4ca5SDavid du Colombier 	}
28*59cc4ca5SDavid du Colombier 	return 0;
29*59cc4ca5SDavid du Colombier }
30