124 lines
2.1 KiB
C
124 lines
2.1 KiB
C
/**
|
|
* @file fmt/str.c String format functions
|
|
*
|
|
* Copyright (C) 2010 Creytiv.com
|
|
*/
|
|
#undef __STRICT_ANSI__ /* for mingw32 */
|
|
#include <string.h>
|
|
#ifdef HAVE_STRINGS_H
|
|
#include <strings.h>
|
|
#endif
|
|
#include <re_types.h>
|
|
#include <re_mem.h>
|
|
#include <re_fmt.h>
|
|
|
|
|
|
/**
|
|
* Convert a ascii hex string to binary format
|
|
*
|
|
* @param hex Destinatin binary buffer
|
|
* @param len Length of binary buffer
|
|
* @param str Source ascii string
|
|
*
|
|
* @return 0 if success, otherwise errorcode
|
|
*/
|
|
int str_hex(uint8_t *hex, size_t len, const char *str)
|
|
{
|
|
size_t i;
|
|
|
|
if (!hex || !str || (strlen(str) != (2 * len)))
|
|
return EINVAL;
|
|
|
|
for (i=0; i<len*2; i+=2) {
|
|
hex[i/2] = ch_hex(str[i]) << 4;
|
|
hex[i/2] += ch_hex(str[i+1]);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/**
|
|
* Copy a 0-terminated string with maximum length
|
|
*
|
|
* @param dst Destinatin string
|
|
* @param src Source string
|
|
* @param n Maximum size of destination, including 0-terminator
|
|
*/
|
|
void str_ncpy(char *dst, const char *src, size_t n)
|
|
{
|
|
if (!dst || !src || !n)
|
|
return;
|
|
|
|
(void)strncpy(dst, src, n-1);
|
|
dst[n-1] = '\0'; /* strncpy does not null terminate if overflow */
|
|
}
|
|
|
|
|
|
/**
|
|
* Duplicate a 0-terminated string
|
|
*
|
|
* @param dst Pointer to destination string (set on return)
|
|
* @param src Source string
|
|
*
|
|
* @return 0 if success, otherwise errorcode
|
|
*/
|
|
int str_dup(char **dst, const char *src)
|
|
{
|
|
char *p;
|
|
size_t sz;
|
|
|
|
if (!dst || !src)
|
|
return EINVAL;
|
|
|
|
sz = strlen(src) + 1;
|
|
|
|
p = mem_alloc(sz, NULL);
|
|
if (!p)
|
|
return ENOMEM;
|
|
|
|
memcpy(p, src, sz);
|
|
|
|
*dst = p;
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/**
|
|
* Compare two 0-terminated strings
|
|
*
|
|
* @param s1 First string
|
|
* @param s2 Second string
|
|
*
|
|
* @return an integer less than, equal to, or greater than zero if s1 is found
|
|
* respectively, to be less than, to match, or be greater than s2
|
|
*/
|
|
int str_casecmp(const char *s1, const char *s2)
|
|
{
|
|
/* Same strings -> equal */
|
|
if (s1 == s2)
|
|
return 0;
|
|
|
|
if (!s1 || !s2)
|
|
return 1;
|
|
|
|
#ifdef WIN32
|
|
return _stricmp(s1, s2);
|
|
#else
|
|
return strcasecmp(s1, s2);
|
|
#endif
|
|
}
|
|
|
|
|
|
/**
|
|
* Calculate the length of a string, safe version.
|
|
*
|
|
* @param s String
|
|
*
|
|
* @return Length of the string
|
|
*/
|
|
size_t str_len(const char *s)
|
|
{
|
|
return s ? strlen(s) : 0;
|
|
}
|