2.11BSD/src/lib/libc/pdp/gen/rindex.s
/*
* Copyright (c) 1987 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifdef LIBC_SCCS
<@(#)rindex.s 1.2 (2.11BSD) 1996/1/12\0>
.even
#endif LIBC_SCCS
/*
* Find the last occurence of c in the string cp.
* Return pointer to match or null pointer.
*
* char *
* rindex(cp, c)
* char *cp, c;
*/
#include "DEFS.h"
.globl _strrchr
_strrchr = _rindex ^ .
ENTRY(rindex)
mov 2(sp),r0 / r0 = cp
mov 4(sp),r1 / r1 = c
beq 3f / check for special case of c == '\0'
mov r2,-(sp) / need an extra register to keep track of
clr r2 / last occurance of c (not found == 0)
1:
cmpb (r0),r1 / look for c ...
beq 2f
tstb (r0)+ / but don't pass end of string ...
bne 1b
mov r2,r0 / fell off the end of the string - return
mov (sp)+,r2 / last occurance of c
rts pc
2:
mov r0,r2 / remember position of c and bounce back into
inc r0 / loop one position further
br 1b
3:
tstb (r0)+ / just find end of string
bne 3b
dec r0 / back up to '\0'
rts pc / and return pointer