X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=device%2Flib%2F_strlen.c;h=e2cbf4280475cc2d32eca004cd93361f74ff89b5;hb=95076014fa7ba0e0e3a04d537ff1f2eca72a5467;hp=4172d1a367f45bf210db13312e6af1048f8035c6;hpb=ccaa1364f24ea0207b04e628c45f4ca2ff3e5083;p=fw%2Fsdcc diff --git a/device/lib/_strlen.c b/device/lib/_strlen.c index 4172d1a3..e2cbf428 100644 --- a/device/lib/_strlen.c +++ b/device/lib/_strlen.c @@ -1,35 +1,79 @@ /*------------------------------------------------------------------------- - _strcpy.c - part of string library functions + _strlen.c - part of string library functions Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) + mcs51 assembler by Frieder Ferlemann (2007) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - + You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - + In other words, you are welcome to use, share and improve this program. You are forbidden to forbid anyone else to use, share and improve - what you give them. Help stamp out software-hoarding! + what you give them. Help stamp out software-hoarding! -------------------------------------------------------------------------*/ -#include "string.h" -#define NULL (void *)0 -int strlen ( char _generic *str ) -{ - register int i = 0 ; +#if (!defined (SDCC_mcs51)) + + /* Generic routine first */ + int strlen ( char * str ) + { + register int i = 0 ; + + while (*str++) + i++ ; + + return i; + } + +#else + + /* Assembler version for mcs51 */ + int strlen ( char * str ) __naked + { + str; /* hush the compiler */ + + __asm + ; dptr holds pointer + ; b holds pointer memspace + ; + + ; char *ptr = str: + mov r2,dpl + mov r3,dph + ; + + ; while ( *ptr ) ptr++; + L00101$: + lcall __gptrget + jz L00102$ + inc dptr + sjmp L00101$ + ; - while (*str++) - i++ ; + L00102$: + ; return ptr - str; + clr c + mov a,dpl + subb a,r2 + mov dpl,a + ; + mov a,dph + subb a,r3 + mov dph,a + ; + ret + __endasm; + } - return i; -} +#endif