Minix1.5/lib/string/strtok.x

/* strtok.x
 *	char *strtok(char *s1, const char *s2)
 *
 *	Returns a pointer to the "next" token in s1.  Tokens are 
 *	delimited by the characters in the string pointed to by s2.
 */

.define	_strtok
.data
scan:	.word	0
.text
_strtok:
	push	bp
	mov	bp,sp
	push	si
	push	di
	cld
	mov	bx,4(bp)
	or	bx,bx		/* if s != NULL, */
	jnz	s2_length	/*   we start a new string */
	mov	bx,scan
	or	bx,bx		/* if old string exhausted, */
	jz	exit		/*   exit early */
s2_length:			/* find length of s2 */
	mov	di,6(bp)
	mov	cx,#-1
	xorb	al,al
	repne
	scab
	not	cx
	dec	cx
	jz	string_finished	/* if s2 has length zero, we are done */
	mov	dx,cx		/* save length of s2 */

	mov	si,bx
	xor	bx,bx		/* return value is NULL */
delim_loop:			/* dispose of leading delimiters */
	lodb
	orb	al,al
	jz	string_finished
	mov	di,6(bp)
	mov	cx,dx
	repne
	scab
	je	delim_loop

	lea	bx,-1(si)	/* return value is start of token */
token_loop:			/* find end of token */
	lodb
	orb	al,al
	jz	string_finished
	mov	di,6(bp)
	mov	cx,dx
	repne
	scab
	jne	token_loop
	movb	-1(si),*0	/* terminate token */
	mov	scan,si		/* set up for next call */
	jmp	exit
string_finished:
	mov	scan,#0		/* ensure NULL return in future */
exit:
	mov	ax,bx
	pop	di
	pop	si
	mov	sp,bp
	pop	bp
	ret