Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: src/vm/sli.c
- Revision:
- 0:14e5e829dffe
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/vm/sli.c Wed Jul 21 12:50:41 2010 +0000 @@ -0,0 +1,151 @@ +/* +# This file is Copyright 2003, 2006, 2007, 2009 Dean Hall. +# +# This file is part of the PyMite VM. +# The PyMite VM is free software: you can redistribute it and/or modify +# it under the terms of the GNU GENERAL PUBLIC LICENSE Version 2. +# +# The PyMite VM 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. +# A copy of the GNU GENERAL PUBLIC LICENSE Version 2 +# is seen in the file COPYING in this directory. +*/ + + +#undef __FILE_ID__ +#define __FILE_ID__ 0x11 + + +/** + * \file + * \brief Standard Library Interface + * + * PyMite requires a few functions from a few different + * standard C libraries (memory, string, etc). + */ + + +#include "pm.h" + + +/** use Duff's Device or simple for-loop for memcpy. */ +#define USE_DUFFS_DEVICE 0 + + +#if !HAVE_STRING_H + +void * +sli_memcpy(unsigned char *to, unsigned char const *from, unsigned int n) +{ + unsigned char *tobak; + + /* Store init value of to */ + tobak = to; + +#if USE_DUFFS_DEVICE + if (n > 0) + { + switch (n & 0x7) + do + { + case 0: + *to++ = *from++; + case 7: + *to++ = *from++; + case 6: + *to++ = *from++; + case 5: + *to++ = *from++; + case 4: + *to++ = *from++; + case 3: + *to++ = *from++; + case 2: + *to++ = *from++; + case 1: + *to++ = *from++; + } + while ((n -= 8) > 0); + } +#else + for (; n > 0; n--) + { + *to = *from; + from++; + to++; + } +#endif /* USE_DUFFS_DEVICE */ + return tobak; +} + + +int +sli_strlen(char const *s) +{ + char const *si = s; + int len = 0; + + while (*si++) + { + len++; + } + return len; +} + + +int +sli_strcmp(char const *s1, char const *s2) +{ + /* While not at either strings' end and they're same */ + while ((*s1 != C_NULL) && (*s2 != C_NULL) && (*s1 == *s2)) + { + s1++; + s2++; + } + + /* Return string difference */ + return *s1 - *s2; +} + + +int +sli_strncmp(char const *s1, char const *s2, unsigned int n) +{ + unsigned int i = 0; + + if (n == 0) + { + return 0; + } + + /* Scan n bytes in string */ + for (i = 0; i < n; i++) + { + /* If bytes differ, return difference */ + if (s1[i] != s2[i]) + { + return s1[i] - s2[i]; + } + } + return 0; +} + +#endif /* HAVE_STRING_H */ + + +/* + * This function is moved outside of HAVE_STRING_H because the one in string.h + * will not accept a null value for the second arg + */ +void +sli_memset(unsigned char *dest, char const val, unsigned int n) +{ + unsigned int i; + + for (i = 0; i < n; i++) + { + *dest = (unsigned char)val; + dest++; + } +}