|
|
1.1 ! root 1: .file "strpbrk.s" ! 2: # @(#)strpbrk.s 1.5 ! 3: # Fast assembler language version of the following C-program ! 4: # strpbrk ! 5: # which represents the `standard' for the C-library. ! 6: ! 7: # Return ptr to first occurance of any character from `brkset' ! 8: # in the character string `string'; NULL if none exists. ! 9: ! 10: # char * ! 11: # strpbrk(string, brkset) ! 12: # register char *string, *brkset; ! 13: # { ! 14: # register char *p; ! 15: # ! 16: # if(!string || !brkset) ! 17: # return(0); ! 18: # do { ! 19: # for(p=brkset; *p != '\0' && *p != *string; ++p) ! 20: # ; ! 21: # if(*p != '\0') ! 22: # return(string); ! 23: # } ! 24: # while(*string++); ! 25: # return(0); ! 26: # } ! 27: .globl _strpbrk ! 28: .text ! 29: .align 2 ! 30: _strpbrk: ! 31: .word 0x0000 # pgm uses regs 0,1,2,3,4 ! 32: movab -256(sp),sp # get table space ! 33: movc5 $0,(ap),$0,$256,(sp) # and zero it out ! 34: movl 8(ap),r0 # charset ptr in r0 ! 35: beql L5 # return 0 if arg was NULL ! 36: L0: ! 37: movzbl (r0)+,r3 # byte from charset for index ! 38: beql L1 # hop if found ending NULL ! 39: movb $255,(sp)[r3] # make entry in scanc table ! 40: jmp L0 # get next byte from charset ! 41: L1: ! 42: movl 4(ap),r1 # string ptr in r1 ! 43: beql L4 # if it's NULL, return 0 ! 44: L2: ! 45: movl r1,r4 # preserve a copy of this ptr ! 46: locc $0,$65535,(r1) # get length of string ! 47: bneq L3 # skip if string not > 65535 ! 48: scanc $65535,(r4),(sp),$255 # else scanc the first 65535 ! 49: bneq L4 # hop ahead if we found one ! 50: jmp L2 # else go back and do next 65535 ! 51: L3: ! 52: subl3 r4,r1,r0 # length to end of string in r0 ! 53: scanc r0,(r4),(sp),$255 # this is the main function ! 54: beql L5 # skip if none (r0 already 0) ! 55: L4: ! 56: movl r1,r0 # return ptr to brk char ! 57: L5: ! 58: movab 256(sp),sp # restore the stack pointer ! 59: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.