You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
4.3 KiB
240 lines
4.3 KiB
/*
|
|
*
|
|
@file util.c
|
|
@brief The utility functions for AVREVB. (AVR-GCC Compiler)
|
|
*
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
#include "types.h"
|
|
#include "util.h"
|
|
|
|
|
|
static char * ___strtok=NULL;
|
|
|
|
|
|
/**
|
|
@brief CONVERT HEX INTO CHAR
|
|
@return a character
|
|
|
|
This function converts HEX(0-F) to a character
|
|
*/
|
|
u_char D2C(
|
|
char c /**< is a Hex(0x00~0x0F) to convert to a character */
|
|
)
|
|
{
|
|
u_int t = (u_int) c;
|
|
if (t >= 0 && t <= 9)
|
|
return '0' + c;
|
|
if (t >= 10 && t <= 15)
|
|
return 'A' + c - 10;
|
|
|
|
return c;
|
|
}
|
|
|
|
|
|
/**
|
|
@brief CONVERT CHAR INTO HEX
|
|
@return HEX
|
|
|
|
This function converts HEX(0-F) to a character
|
|
*/
|
|
char C2D(
|
|
u_char c /**< is a character('0'-'F') to convert to HEX */
|
|
)
|
|
{
|
|
if (c >= '0' && c <= '9')
|
|
return c - '0';
|
|
if (c >= 'a' && c <= 'f')
|
|
return 10 + c -'a';
|
|
if (c >= 'A' && c <= 'F')
|
|
return 10 + c -'A';
|
|
|
|
return (char)c;
|
|
}
|
|
|
|
|
|
/**
|
|
@brief CONVERT STRING INTO INTEGER
|
|
@return a integer number
|
|
*/
|
|
u_int ATOI(
|
|
char* str, /**< is a pointer to convert */
|
|
u_int base /**< is a base value (must be in the range 2 - 16) */
|
|
)
|
|
{
|
|
unsigned int num = 0;
|
|
while (*str !=0)
|
|
num = num * base + C2D(*str++);
|
|
return num;
|
|
}
|
|
|
|
|
|
/**
|
|
@brief CONVERT STRING INTO HEX OR DECIMAL
|
|
@return success - 1, fail - 0
|
|
*/
|
|
int ValidATOI(
|
|
char* str, /**< is a pointer to string to be converted */
|
|
int base, /**< is a base value (must be in the range 2 - 16) */
|
|
int* ret /**< is a integer pointer to return */
|
|
)
|
|
{
|
|
int c;
|
|
char* tstr = str;
|
|
if(str == 0 || *str == '\0') return 0;
|
|
while(*tstr != '\0')
|
|
{
|
|
c = C2D(*tstr);
|
|
if( c >= 0 && c < base) tstr++;
|
|
else return 0;
|
|
}
|
|
|
|
*ret = ATOI(str,base);
|
|
return 1;
|
|
}
|
|
|
|
|
|
/**
|
|
@brief Calculate the length of the initial substring of "s" which only contain letters in "accept"
|
|
@return The string to search for
|
|
*/
|
|
size_t strspn(
|
|
const char *s, /**< The string to be searched */
|
|
const char *accept /**< The string to search for */
|
|
)
|
|
{
|
|
const char *p;
|
|
const char *a;
|
|
size_t count = 0;
|
|
|
|
for (p = s; *p != '\0'; ++p) {
|
|
for (a = accept; *a != '\0'; ++a) {
|
|
if (*p == *a)
|
|
break;
|
|
}
|
|
if (*a == '\0')
|
|
return count;
|
|
++count;
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
|
|
/**
|
|
@brief Find the first occurrence of a set of characters
|
|
*/
|
|
char * strpbrk(
|
|
const char * cs, /**< The string to be searched */
|
|
const char * ct /**< The characters to search for */
|
|
)
|
|
{
|
|
const char *sc1,*sc2;
|
|
|
|
for( sc1 = cs; *sc1 != '\0'; ++sc1) {
|
|
for( sc2 = ct; *sc2 != '\0'; ++sc2) {
|
|
if (*sc1 == *sc2)
|
|
return (char *) sc1;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/**
|
|
@brief Split a string into tokens
|
|
|
|
WARNING: strtok is deprecated, use strsep instead.
|
|
*/
|
|
char * strtok(
|
|
char * s, /**< The string to be searched */
|
|
const char * ct /**< The characters to search for */
|
|
)
|
|
{
|
|
char *sbegin, *send;
|
|
|
|
sbegin = s ? s : ___strtok;
|
|
if (!sbegin) {
|
|
return NULL;
|
|
}
|
|
sbegin += strspn(sbegin,ct);
|
|
if (*sbegin == '\0') {
|
|
___strtok = NULL;
|
|
return( NULL );
|
|
}
|
|
send = strpbrk( sbegin, ct);
|
|
if (send && *send != '\0')
|
|
*send++ = '\0';
|
|
___strtok = send;
|
|
return (sbegin);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
@brief replace the specified character in a string with new character
|
|
*/
|
|
void replacetochar(
|
|
char * str, /**< pointer to be replaced */
|
|
char oldchar, /**< old character */
|
|
char newchar /**< new character */
|
|
)
|
|
{
|
|
int x;
|
|
for (x = 0; str[x]; x++)
|
|
if (str[x] == oldchar) str[x] = newchar;
|
|
}
|
|
|
|
|
|
u_short swaps(u_int i)
|
|
{
|
|
u_short ret=0;
|
|
ret = (i & 0xFF) << 8;
|
|
ret |= ((i >> 8)& 0xFF);
|
|
return ret;
|
|
}
|
|
|
|
u_long swapl(u_long l)
|
|
{
|
|
u_long ret=0;
|
|
ret = (l & 0xFF) << 24;
|
|
ret |= ((l >> 8) & 0xFF) << 16;
|
|
ret |= ((l >> 16) & 0xFF) << 8;
|
|
ret |= ((l >> 24) & 0xFF);
|
|
return ret;
|
|
}
|
|
|
|
#ifndef NO_USE_UTIL_FUNC
|
|
/**
|
|
@brief This function converts a integer number to a string.
|
|
@return a pointer to string
|
|
*/
|
|
char* ITOA(
|
|
u_int value, /**< is a integer value to be converted */
|
|
char* str, /**< is a pointer to string to be returned */
|
|
u_int base /**< is a base value (must be in the range 2 - 16) */
|
|
)
|
|
{
|
|
char c;
|
|
char* tstr = str;
|
|
char* ret = str;
|
|
if(value == 0) *str++='0';
|
|
while(value > 0)
|
|
{
|
|
*str++ =(char)D2C((char)(value%base));
|
|
value /= base;
|
|
}
|
|
*str-- ='\0';
|
|
while(tstr < str )
|
|
{
|
|
c = *tstr;
|
|
*tstr++ = *str;
|
|
*str-- = c;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
#endif
|