1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-11-29 07:24:13 +01:00
LibrePilot/flight/libraries/PyMite/vm/sli.c
2013-04-25 13:13:36 +03:00

152 lines
2.8 KiB
C

/*
# This file is Copyright 2003, 2006, 2007, 2009, 2010 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++;
}
}