mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-11-29 07:24:13 +01:00
152 lines
2.8 KiB
C
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++;
|
||
|
}
|
||
|
}
|