|
|
/**
|
|
|
* Copyright (c) 2019, The Linux Foundation. All rights reserved.
|
|
|
*
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
* modification, are permitted provided that the following conditions are
|
|
|
* met:
|
|
|
* * Redistributions of source code must retain the above copyright
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
* * Redistributions in binary form must reproduce the above
|
|
|
* copyright notice, this list of conditions and the following
|
|
|
* disclaimer in the documentation and/or other materials provided
|
|
|
* with the distribution.
|
|
|
* * Neither the name of The Linux Foundation nor the names of its
|
|
|
* contributors may be used to endorse or promote products derived
|
|
|
* from this software without specific prior written permission.
|
|
|
*
|
|
|
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
|
|
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
|
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
|
|
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
*/
|
|
|
|
|
|
#ifndef AEESTD_H
|
|
|
#define AEESTD_H
|
|
|
/*====================================================================
|
|
|
|
|
|
DESCRIPTION: Standard library; general-purpose utility functions.
|
|
|
|
|
|
====================================================================*/
|
|
|
#include "AEEVaList.h"
|
|
|
#include "AEEStdDef.h"
|
|
|
#include "string.h"
|
|
|
|
|
|
#define STD_CONSTRAIN( val, min, max ) (((val) < (min)) ? (min) : ((val) > (max)) ? (max) : (val))
|
|
|
#define STD_BETWEEN( val, minGE, maxLT ) \
|
|
|
( (unsigned long)((unsigned long)(val) - (unsigned long)(minGE)) < \
|
|
|
(unsigned long)((unsigned long)(maxLT) - (unsigned long)(minGE)) )
|
|
|
#define STD_ARRAY_SIZE(a) ((int)((sizeof((a))/sizeof((a)[0]))))
|
|
|
#define STD_ARRAY_MEMBER(p,a) (((p) >= (a)) && ((p) < ((a) + STD_ARRAY_SIZE(a))))
|
|
|
|
|
|
#define STD_SIZEOF(x) ((int)sizeof(x))
|
|
|
#define STD_OFFSETOF(type,member) (((char*)(&((type*)1)->member))-((char*)1))
|
|
|
|
|
|
#define STD_RECOVER_REC(type,member,p) ((void)((p)-&(((type*)1)->member)),\
|
|
|
(type*)(void*)(((char*)(void*)(p))-STD_OFFSETOF(type,member)))
|
|
|
#define STD_MIN(a,b) ((a)<(b)?(a):(b))
|
|
|
#define STD_MAX(a,b) ((a)>(b)?(a):(b))
|
|
|
//lint -emacro(545,STD_ZEROAT)
|
|
|
#define STD_ZEROAT(p) std_memset((p), 0, sizeof(*p))
|
|
|
|
|
|
#define _STD_BITS_PER(bits) (8*sizeof((bits)[0]))
|
|
|
|
|
|
#define STD_BIT_SET(bits, ix) ((bits)[(ix)/_STD_BITS_PER((bits))] |= 0x1<<((ix) & (_STD_BITS_PER((bits))-1)))
|
|
|
#define STD_BIT_CLEAR(bits, ix) ((bits)[(ix)/_STD_BITS_PER((bits))] &= ~(0x1<<((ix) & (_STD_BITS_PER((bits))-1))))
|
|
|
#define STD_BIT_TEST(bits, ix) ((bits)[(ix)/_STD_BITS_PER((bits))] & (0x1<<((ix) & (_STD_BITS_PER((bits))-1))))
|
|
|
|
|
|
//
|
|
|
// Error codes
|
|
|
//
|
|
|
#define STD_NODIGITS 1
|
|
|
#define STD_NEGATIVE 2
|
|
|
#define STD_OVERFLOW 3
|
|
|
#define STD_BADPARAM 4
|
|
|
#define STD_UNDERFLOW 5
|
|
|
|
|
|
//Compute string length using strlen
|
|
|
#define std_strlen strlen
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
extern "C" {
|
|
|
#endif /* #ifdef __cplusplus */
|
|
|
|
|
|
//Version function
|
|
|
extern int std_getversion(char *pcDst, int nDestSize);
|
|
|
|
|
|
//String functions
|
|
|
extern int std_strcmp(const char *s1, const char *s2);
|
|
|
extern int std_strncmp(const char *s1, const char *s2, int n);
|
|
|
extern int std_stricmp(const char *s1, const char *s2);
|
|
|
extern int std_strnicmp(const char *s1, const char *s2, int n);
|
|
|
extern int std_strlcpy(char *pcDst, const char *pszSrc, int nDestSize);
|
|
|
extern int std_strlcat(char *pcDst, const char *pszSrc, int nDestSize);
|
|
|
extern char * std_strstr(const char *pszString, const char *pszSearch);
|
|
|
|
|
|
//Character functions
|
|
|
extern char std_tolower(char c);
|
|
|
extern char std_toupper(char c);
|
|
|
|
|
|
// Mem functions
|
|
|
extern void * std_memset(void *p, int c, int nLen);
|
|
|
extern void * std_memmove(void *pTo, const void *cpFrom, int nLen);
|
|
|
extern int std_memscpy(void *dst, int dst_size, const void *src, int src_size);
|
|
|
extern int std_memsmove(void *dst, int dst_size, const void *src, int src_size);
|
|
|
extern int std_memcmp(const void *a, const void *b, int length);
|
|
|
extern void * std_memchr(const void* s, int c, int n);
|
|
|
extern void * std_memstr(const char* cpHaystack, const char* cpszNeedle, int nHaystackLen);
|
|
|
extern void * std_memrchr(const void* s, int c, int n);
|
|
|
extern void * std_memrchrbegin(const void* p, int c, int nLen);
|
|
|
extern void * std_memchrend(const void* cpcSrch, int c, int nLen);
|
|
|
extern void * std_memchrsend(const void *cpSrch, const char* cpszChars, int nLen);
|
|
|
|
|
|
//Other String functions
|
|
|
extern char * std_strchr(const char* s, int c);
|
|
|
extern char * std_strchrs(const char* sSrch, const char *sChars);
|
|
|
extern char * std_strrchr(const char* s, int c);
|
|
|
extern char * std_strchrend(const char *cpszSrch, char c);
|
|
|
extern char * std_strchrsend(const char* s, const char* cpszSrch);
|
|
|
extern char * std_strends(const char* cpsz, const char* cpszSuffix);
|
|
|
extern char * std_striends(const char* cpsz, const char* cpszSuffix);
|
|
|
extern char * std_strbegins(const char* cpsz, const char* cpszPrefix);
|
|
|
extern char * std_stribegins(const char* cpsz, const char* cpszPrefix);
|
|
|
extern int std_strcspn(const char* s, const char* cpszSrch);
|
|
|
extern int std_strspn(const char* s, const char* cpszSrch);
|
|
|
|
|
|
//Wide char string functions
|
|
|
extern int std_wstrlen(const AECHAR *s);
|
|
|
extern int std_wstrlcpy(AECHAR *pcDst, const AECHAR *pszSrc, int nDestSize);
|
|
|
extern int std_wstrlcat(AECHAR *pcDst, const AECHAR *pszSrc, int nDestSize);
|
|
|
extern int std_wstrncmp(const AECHAR* s1, const AECHAR* s2, int nLen);
|
|
|
extern int std_wstrcmp(const AECHAR* s1, const AECHAR* s2);
|
|
|
extern AECHAR* std_wstrchr(const AECHAR* cpwszText, AECHAR ch);
|
|
|
extern AECHAR* std_wstrrchr(const AECHAR* cpwszText, AECHAR ch);
|
|
|
|
|
|
//Path functions
|
|
|
extern int std_makepath(const char *cpszDir,
|
|
|
const char *cpszFile,
|
|
|
char *pszDest, int nDestSize);
|
|
|
extern char * std_splitpath(const char *cpszPath, const char *cpszDir);
|
|
|
extern char * std_cleanpath(char *pszPath);
|
|
|
extern char * std_basename(const char *pszPath);
|
|
|
|
|
|
//Inet functions, number functions
|
|
|
extern unsigned int std_scanul(const char *pchBuf, int nRadix,
|
|
|
const char **ppchEnd, int *pnError);
|
|
|
extern uint64 std_scanull(const char *pchBuf, int nRadix,
|
|
|
const char **ppchEnd, int *pnError);
|
|
|
extern double std_scand(const char *pchBuf, const char **ppchEnd);
|
|
|
|
|
|
// Rand functions
|
|
|
extern unsigned std_rand_next(unsigned uRand);
|
|
|
extern uint32 std_rand(uint32 uSeed, byte* pDest, int nSize);
|
|
|
|
|
|
|
|
|
// printf functions
|
|
|
extern int std_vstrlprintf(char *pszDest, int nDestSize,
|
|
|
const char *pszFmt, AEEVaList args);
|
|
|
|
|
|
extern int std_strlprintf(char *pszDest, int nDestSize,
|
|
|
const char *pszFmt, ...);
|
|
|
|
|
|
extern int std_vsnprintf(char *pszDest, int nDestSize,
|
|
|
const char *cpszFmt, AEEVaList args);
|
|
|
|
|
|
extern int std_snprintf(char *pszDest, int nDestSize,
|
|
|
const char *pszFmt, ...);
|
|
|
|
|
|
// endian swapping functions
|
|
|
extern int std_CopyLE(void *pvDest, int nDestSize,
|
|
|
const void *pvSrc, int nSrcSize,
|
|
|
const char *pszFields);
|
|
|
|
|
|
extern int std_CopyBE(void *pvDest, int nDestSize,
|
|
|
const void *pvSrc, int nSrcSize,
|
|
|
const char *pszFields);
|
|
|
|
|
|
// sorting utilities
|
|
|
extern void std_qsort(void* pElems, int nNumElems, int nElemWidth,
|
|
|
int (*pfnCompare)(void*, const void*, const void*),
|
|
|
void* pCompareCx);
|
|
|
|
|
|
extern int std_bisect(const void* pElems, int nNumElems, int nElemWidth,
|
|
|
const void* pElem,
|
|
|
int (*pfnCompare)(void*, const void*, const void*),
|
|
|
void* pCompareCx);
|
|
|
|
|
|
extern void std_merge(void* vpDst, int nDst,
|
|
|
const void* vpA, int nA,
|
|
|
const void* vpB, int nB,
|
|
|
int nElemWidth,
|
|
|
int (*pfnCompare)(void*, const void*, const void*),
|
|
|
void* pCompareCx);
|
|
|
|
|
|
extern int std_uniq(void* vpElems, int nNumElems, int nElemWidth,
|
|
|
int (*pfnCompare)(void*, const void*, const void*),
|
|
|
void* pCompareCx);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
}
|
|
|
#endif /* #ifdef __cplusplus */
|
|
|
|
|
|
|
|
|
#define STD_SWAPS(us) \
|
|
|
((((us) & 0xff) << 8) + (((us) & 0xff00) >> 8))
|
|
|
|
|
|
|
|
|
static __inline unsigned short std_swaps(unsigned short us)
|
|
|
{
|
|
|
return STD_SWAPS(us);
|
|
|
}
|
|
|
|
|
|
/* note, STD_SWAPL() requires that ul be an l-value, and destroyable.
|
|
|
this macro is not intended for use outside AEEstd.h */
|
|
|
#define STD_SWAPL(ul) \
|
|
|
(((ul) = (((ul) & 0x00ff00ff) << 8) | (((ul)>>8) & 0x00ff00ff)),(((ul) >> 16) | ((ul) << 16)))
|
|
|
|
|
|
static __inline unsigned long std_swapl(unsigned long ul)
|
|
|
{
|
|
|
return STD_SWAPL(ul);
|
|
|
}
|
|
|
|
|
|
#ifdef AEE_BIGENDIAN
|
|
|
# define STD_HTONL(u) (u)
|
|
|
# define STD_HTONS(u) (u)
|
|
|
# define STD_HTOLEL(u) (STD_SWAPL(u))
|
|
|
# define STD_HTOLES(u) (STD_SWAPS(u))
|
|
|
#else
|
|
|
# define STD_HTONL(u) (STD_SWAPL(u))
|
|
|
# define STD_HTONS(u) (STD_SWAPS(u))
|
|
|
# define STD_HTOLEL(u) (u)
|
|
|
# define STD_HTOLES(u) (u)
|
|
|
#endif
|
|
|
|
|
|
static __inline unsigned short std_letohs(unsigned short us)
|
|
|
{
|
|
|
return STD_HTOLES(us);
|
|
|
}
|
|
|
|
|
|
static __inline unsigned short std_htoles(unsigned short us)
|
|
|
{
|
|
|
return STD_HTOLES(us);
|
|
|
}
|
|
|
|
|
|
static __inline unsigned long std_letohl(unsigned long ul)
|
|
|
{
|
|
|
return STD_HTOLEL(ul);
|
|
|
}
|
|
|
|
|
|
static __inline unsigned long std_htolel(unsigned long ul)
|
|
|
{
|
|
|
return STD_HTOLEL(ul);
|
|
|
}
|
|
|
|
|
|
static __inline unsigned short std_ntohs(unsigned short us)
|
|
|
{
|
|
|
return STD_HTONS(us);
|
|
|
}
|
|
|
|
|
|
static __inline unsigned short std_htons(unsigned short us)
|
|
|
{
|
|
|
return STD_HTONS(us);
|
|
|
}
|
|
|
|
|
|
static __inline unsigned long std_ntohl(unsigned long ul)
|
|
|
{
|
|
|
return STD_HTONL(ul);
|
|
|
}
|
|
|
|
|
|
static __inline unsigned long std_htonl(unsigned long ul)
|
|
|
{
|
|
|
return STD_HTONL(ul);
|
|
|
}
|
|
|
|
|
|
|
|
|
#undef STD_HTONL // private macro; not exported as a supported API
|
|
|
#undef STD_HTONS // private macro; not exported as a supported API
|
|
|
#undef STD_HTOLEL // private macro; not exported as a supported API
|
|
|
#undef STD_HTOLES // private macro; not exported as a supported API
|
|
|
#undef STD_SWAPS // private macro; not exported as a supported API
|
|
|
#undef STD_SWAPL // private macro; not exported as a supported API
|
|
|
|
|
|
|
|
|
/*
|
|
|
=======================================================================
|
|
|
MACROS DOCUMENTATION
|
|
|
=======================================================================
|
|
|
|
|
|
STD_CONTSTRAIN()
|
|
|
|
|
|
Description:
|
|
|
STD_CONTSTRAIN() constrains a number to be between two other numbers.
|
|
|
|
|
|
Definition:
|
|
|
STD_CONSTRAIN( val, min, max ) \
|
|
|
(((val) < (min)) ? (min) : ((val) > (max)) ? (max) : (val))
|
|
|
|
|
|
Parameters:
|
|
|
val: number to constrain
|
|
|
min: number to stay greater than or equal to
|
|
|
max: number to stay less than or equal to
|
|
|
|
|
|
Evaluation Value:
|
|
|
the constrained number
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
STD_BETWEEN()
|
|
|
|
|
|
Description:
|
|
|
STD_BETWEEN() tests whether a number is between two other numbers.
|
|
|
|
|
|
Definition:
|
|
|
STD_BETWEEN( val, minGE, maxLT ) \
|
|
|
((unsigned)((unsigned)(val) - (unsigned)(minGE)) < \
|
|
|
(unsigned)((unsigned)(maxLT) - (unsigned)(minGE)))
|
|
|
|
|
|
Parameters:
|
|
|
val: value to test
|
|
|
minGE: lower bound
|
|
|
maxLT: upper bound
|
|
|
|
|
|
Evaluation Value:
|
|
|
1 if val >= minGE and val < maxLT
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
STD_ARRAY_SIZE()
|
|
|
|
|
|
Description:
|
|
|
STD_ARRAY_SIZE() gives the number of elements in a statically allocated array.
|
|
|
|
|
|
Definition:
|
|
|
STD_ARRAY_SIZE(a) (sizeof((a))/sizeof((a)[0]))
|
|
|
|
|
|
Parameters:
|
|
|
a: array to test
|
|
|
|
|
|
Evaluation Value:
|
|
|
number of elements in a
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
STD_ARRAY_MEMBER()
|
|
|
|
|
|
Description:
|
|
|
STD_ARRAY_MEMBER() tests whether an item is a member of a statically allocated array.
|
|
|
|
|
|
Definition:
|
|
|
STD_ARRAY_MEMBER(p,a) (((p) >= (a)) && ((p) < ((a) + STD_ARRAY_SIZE(a))))
|
|
|
|
|
|
Parameters:
|
|
|
p: item to test
|
|
|
a: array to check
|
|
|
|
|
|
Evaluation Value:
|
|
|
1 if p is in a
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
STD_OFFSETOF()
|
|
|
|
|
|
Description:
|
|
|
STD_OFFSETOF() gives the offset of member of a struct.
|
|
|
|
|
|
Definition:
|
|
|
STD_OFFSETOF(type,member) (((char *)(&((type *)0)->member))-((char *)0))
|
|
|
|
|
|
Parameters:
|
|
|
type: structured type
|
|
|
member: name of member in the struct
|
|
|
|
|
|
Evaluation Value:
|
|
|
offset of member (in bytes) in type
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
STD_RECOVER_REC()
|
|
|
|
|
|
Description:
|
|
|
STD_RECOVER_REC() provides a safe cast from a pointer to a member
|
|
|
of a struct to a pointer to the containing struct
|
|
|
|
|
|
Definition:
|
|
|
STD_RECOVER_REC(type,member,p) ((type*)(((char*)(p))-STD_OFFSETOF(type,member)))
|
|
|
|
|
|
Parameters:
|
|
|
type: structured type
|
|
|
member: name of member in the struct
|
|
|
p: pointer to the member of the struct
|
|
|
|
|
|
Evaluation Value:
|
|
|
a pointer of type type to the containing struct
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
STD_MIN()
|
|
|
|
|
|
Description:
|
|
|
STD_MIN() finds the smaller of two values.
|
|
|
|
|
|
Definition:
|
|
|
STD_MIN(a,b) ((a)<(b)?(a):(b))
|
|
|
|
|
|
Parameters:
|
|
|
a, b: values to compare
|
|
|
|
|
|
Evaluation Value:
|
|
|
smaller of a and b
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
STD_MAX()
|
|
|
|
|
|
Description:
|
|
|
STD_MAX() finds the larger of two values.
|
|
|
|
|
|
Definition:
|
|
|
STD_MAX(a,b) ((a)>(b)?(a):(b))
|
|
|
|
|
|
Parameters:
|
|
|
a, b: values to compare
|
|
|
|
|
|
Evaluation Value:
|
|
|
larger of a and b
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
STD_ZEROAT()
|
|
|
|
|
|
Description:
|
|
|
STD_ZEROAT() zero-initializes the contents of a typed chunk of memory.
|
|
|
|
|
|
Definition:
|
|
|
STD_ZEROAT(p) std_memset((p), 0, sizeof(*p))
|
|
|
|
|
|
Parameters:
|
|
|
p: the chunk to initialize
|
|
|
|
|
|
Evaluation Value:
|
|
|
p
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
STD_BIT_SET()
|
|
|
|
|
|
Description:
|
|
|
STD_BIT_SET(bits, ix) sets the bit in the memory stored in bits at
|
|
|
index ix
|
|
|
|
|
|
Parameters:
|
|
|
bits: the memory address holding the bits
|
|
|
ix: the index of the bit to set;
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
STD_BIT_CLEAR()
|
|
|
|
|
|
Description:
|
|
|
STD_BIT_CLEAR(bits, ix) clears the bit in the memory stored in bits
|
|
|
at index ix
|
|
|
|
|
|
Parameters:
|
|
|
bits: the memory address holding the bits
|
|
|
ix: the index of the bit to clear
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
STD_BIT_TEST()
|
|
|
|
|
|
Description:
|
|
|
STD_BIT_TEST(bits, ix) returns the bit in the memory stored in bits
|
|
|
at index ix
|
|
|
|
|
|
Parameters:
|
|
|
bits: the memory address holding the bits
|
|
|
ix: the index of the bit to test
|
|
|
|
|
|
Evaluation Value:
|
|
|
0x1 if set 0x0 if not set
|
|
|
|
|
|
=====================================================================
|
|
|
INTERFACES DOCUMENTATION
|
|
|
=======================================================================
|
|
|
|
|
|
std Interface
|
|
|
|
|
|
Description:
|
|
|
This library provides a set of general-purpose utility functions.
|
|
|
Functionality may overlap that of a subset of the C standard library, but
|
|
|
this library differs in a few respects:
|
|
|
|
|
|
- Functions are fully reentrant and avoid use of static variables.
|
|
|
|
|
|
- The library can be supported consistently across all environments.
|
|
|
Compiler-supplied libraries sometimes behave inconsistently and are
|
|
|
unavailable in some environments.
|
|
|
|
|
|
- Omits "unsafe" functions. C standard library includes many functions
|
|
|
that are best avoided entirely: strcpy, strcat, strtok, etc.
|
|
|
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_getversion()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_getversion() copies the stdlib version to pcDst. This function
|
|
|
takes the size of the destination buffer as an argument and guarantees
|
|
|
to zero-terminate the result and not to overflow the nDestSize size.
|
|
|
|
|
|
This function copies up to size-1 characters from the stdlib version
|
|
|
string to pcDest and NUL-terminates the pcDest string.
|
|
|
|
|
|
Prototype:
|
|
|
int std_getversion(char *pcDst, int nDestSize)
|
|
|
|
|
|
|
|
|
Parameters:
|
|
|
pcDst : Destination string
|
|
|
nDestSize: Size of the destination buffer in bytes
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
Returns the length of the version string (in characters).
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strlen()
|
|
|
|
|
|
Description:
|
|
|
The std_strlen() computes the length of the given string.
|
|
|
|
|
|
Prototype:
|
|
|
int std_strlen(const char *cpszStr)
|
|
|
|
|
|
Parameters:
|
|
|
cpszStr : String whose length will be computed
|
|
|
|
|
|
Return Value:
|
|
|
Length of the string in characters that precede the terminating NULL character.
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strcmp()
|
|
|
|
|
|
Description:
|
|
|
The std_strcmp() compares two NUL-terminated character strings.
|
|
|
Comparison is strictly by byte values with no character set
|
|
|
interpretation.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_strcmp(const char *s1, const char *s2);
|
|
|
|
|
|
Parameters:
|
|
|
s1, s2: strings to compare
|
|
|
|
|
|
Return Value:
|
|
|
0 if strings are the same ~
|
|
|
< 0 if s1 is less than s2 ~
|
|
|
> 0 if s1 is greater than s2
|
|
|
|
|
|
See Also:
|
|
|
std_wstrcmp
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strncmp()
|
|
|
|
|
|
Description:
|
|
|
The std_strncmp() compares at most n bytes of two NUL-terminated character strings.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_strncmp(const char *s1, const char *s2, int n);
|
|
|
|
|
|
Parameters:
|
|
|
s1, s2: strings to compare
|
|
|
n: maximum number of bytes to compare. if either s1 or s2 is
|
|
|
shorter than n, the function terminates there
|
|
|
|
|
|
Return Value:
|
|
|
0 if strings are the same ~
|
|
|
< 0 if s1 is less than s2 ~
|
|
|
> 0 if s1 is greater than s2
|
|
|
|
|
|
See Also:
|
|
|
std_wstrncmp
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_stricmp()
|
|
|
|
|
|
Description:
|
|
|
The std_stricmp() compares two NUL-terminated character strings, case-folding any
|
|
|
ASCII characters.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_stricmp(const char *s1, const char *s2);
|
|
|
|
|
|
Parameters:
|
|
|
s1, s2: strings to compare
|
|
|
|
|
|
Return Value:
|
|
|
0 if strings are the same ~
|
|
|
< 0 if s1 is less than s2 ~
|
|
|
> 0 if s1 is greater than s2
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strnicmp()
|
|
|
|
|
|
Description:
|
|
|
The std_strnicmp() compares at most n bytes of 2 NUL-terminated character strings,
|
|
|
case-folding any ASCII characters.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_strnicmp(const char *s1, const char *s2, int n);
|
|
|
|
|
|
Parameters:
|
|
|
s1, s2: strings to compare
|
|
|
n: maximum number of bytes to compare. if either s1 or s2 is
|
|
|
shorter than n, the function terminates there
|
|
|
|
|
|
Return Value:
|
|
|
0 if strings are the same ~
|
|
|
< 0 if s1 is less than s2 ~
|
|
|
> 0 if s1 is greater than s2
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strlcpy()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_strlcpy() copies pszSrc string to the pcDst. It is a safer
|
|
|
alternative to strcpy() or strncpy(). This function takes the size of the
|
|
|
destination buffer as an argument and guarantees to NUL-terminate the
|
|
|
result and not to overflow the nDestSize size.
|
|
|
|
|
|
This function copies up to nDestSize-1 characters from the pszSrc string
|
|
|
to pcDest and NUL-terminates the pcDest string.
|
|
|
|
|
|
Prototype:
|
|
|
int std_strlcpy(char *pcDst, const char *pszSrc, int nDestSize)
|
|
|
|
|
|
Parameters:
|
|
|
pcDst : Destination string
|
|
|
pcSrc : Source string
|
|
|
nDestSize: Size of the destination buffer in bytes
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
Returns the length of the string (in characters) it tried to create,
|
|
|
which is same as length of pszSrc.
|
|
|
|
|
|
Example:
|
|
|
|
|
|
{
|
|
|
char buf[64];
|
|
|
if (std_strlcpy(buf, file_name, STD_ARRAY_SIZE(buf) >=
|
|
|
STD_ARRAY_SIZE(buf)) {
|
|
|
//Truncated -- Handle overflow....
|
|
|
}
|
|
|
}
|
|
|
|
|
|
Comment:
|
|
|
|
|
|
Unlike strlcpy, std_strlcpy accepts an integer size and does nothing when a
|
|
|
negative value is passed. When passing valid sizes for objects on our
|
|
|
supported platforms, this should not result in any observed difference.
|
|
|
However, calling strlcpy() with UINT_MAX will result in the entire source
|
|
|
string being copied, whereas std_strlcpy() will do nothing. Passing INT_MAX
|
|
|
to str_strlcpy() will achieve the same result (although both these cases are
|
|
|
bad practice since they defeat bounds checking).
|
|
|
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strlcat()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_strlcat() function concatenates a string to a string already
|
|
|
residing in a buffer. It is a safer alternative to strcat() or strncat().
|
|
|
This function takes the size of the destination buffer as an argument and
|
|
|
guarantees not to create an improperly terminated string and not to
|
|
|
overflow the nDestSize size.
|
|
|
|
|
|
This function appends pszSrc to pcDst, copying at most nDestSize minus
|
|
|
the length of the string in pcDest minus 1 bytes, always NUL-terminating
|
|
|
the result.
|
|
|
|
|
|
For compatibility with "strlcat()", std_strlcat() does *not* zero-terminate
|
|
|
the destination buffer in cases where the buffer lacks termination on entry
|
|
|
to the function. Do not rely on std_strlcat() to zero-terminate a buffer
|
|
|
that is not already zero-terminated; instead ensure that the buffer is
|
|
|
properly initialized using std_strlcpy() or some other means.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_strlcat(char *pcDst, const char *pszSrc, int nDestSize)
|
|
|
|
|
|
Parameters:
|
|
|
|
|
|
pcDst : Destination string
|
|
|
pcSrc : Source string
|
|
|
nDestSize: Size of the destination buffer in bytes
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
Returns the length of the string (in characters) it tried to create,
|
|
|
which is same as length of pszSrc plus the length of pszDest.
|
|
|
|
|
|
Example:
|
|
|
|
|
|
{
|
|
|
char buf[64];
|
|
|
if (std_strlcat(buf, file_name, STD_ARRAY_SIZE(buf) >=
|
|
|
STD_ARRAY_SIZE(buf)) {
|
|
|
//Truncated -- Handle overflow....
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strstr()
|
|
|
|
|
|
Description:
|
|
|
The std_strstr() finds the first occurrence of a substring in a string.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char * std_strstr(const char *pszString, const char *pszSearch);
|
|
|
|
|
|
Parameters:
|
|
|
pszString: string to search
|
|
|
pszSearch: sub string to search for
|
|
|
|
|
|
Return Value:
|
|
|
A pointer to the first character in the first occurrence of the substring if found, NULL otherwise
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_tolower()
|
|
|
|
|
|
Description:
|
|
|
The std_tolower() converts an uppercase letter to the corresponding
|
|
|
lowercase letter.
|
|
|
|
|
|
Prototype:
|
|
|
char std_tolower(char c);
|
|
|
|
|
|
Parameters:
|
|
|
c: A character.
|
|
|
|
|
|
Return Value:
|
|
|
the corresponding lowercase letter if c is an ASCII character whose
|
|
|
value is representable as an uppercase letter, else the same character
|
|
|
c is returned.
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_toupper()
|
|
|
|
|
|
Description:
|
|
|
The std_toupper() converts an lowercase letter to the corresponding
|
|
|
uppercase letter.
|
|
|
|
|
|
Prototype:
|
|
|
char std_toupper(char c);
|
|
|
|
|
|
Parameters:
|
|
|
c: is a character.
|
|
|
|
|
|
Return Value:
|
|
|
The corresponding uppercase letter if c is an ASCII character whose
|
|
|
value is representable as an lowercase letter; else the same character
|
|
|
c is returned.
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_memset()
|
|
|
|
|
|
Description:
|
|
|
The std_memset() sets each byte in a block of memory to a value.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
void *std_memset(void *p, int c, int nLen);
|
|
|
|
|
|
Parameters:
|
|
|
p: memory block to set
|
|
|
c: value to set each byte to
|
|
|
nLen: size of p in bytes
|
|
|
|
|
|
Return Value:
|
|
|
p
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_memmove()
|
|
|
|
|
|
Description:
|
|
|
The std_memmove() copies a block of memory from one buffer to another.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
void *std_memmove(void *pTo, const void *cpFrom, int nLen);
|
|
|
|
|
|
Parameters:
|
|
|
pTo: destination buffer
|
|
|
cpFrom: source buffer
|
|
|
nLen: number of bytes to copy
|
|
|
|
|
|
Return Value:
|
|
|
pTo
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_memsmove()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
Size bounded memory move.
|
|
|
|
|
|
Moves bytes from the source buffer to the destination buffer.
|
|
|
|
|
|
This function ensures that there will not be a copy beyond
|
|
|
the size of the destination buffer.
|
|
|
|
|
|
This function should be used in preference to memscpy() if there
|
|
|
is the possiblity of source and destination buffers overlapping.
|
|
|
The result of the operation is defined to be as if the copy were from
|
|
|
the source to a temporary buffer that overlaps neither source nor
|
|
|
destination, followed by a copy from that temporary buffer to the
|
|
|
destination.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_memsmove(void *dst, int dst_size, const void *src, int src_size);
|
|
|
|
|
|
Parameters:
|
|
|
@param[out] dst Destination buffer.
|
|
|
@param[in] dst_size Size of the destination buffer in bytes.
|
|
|
@param[in] src Source buffer.
|
|
|
@param[in] src_size Number of bytes to copy from source buffer.
|
|
|
|
|
|
Return value:
|
|
|
The number of bytes copied to the destination buffer. It is the
|
|
|
caller's responsibility to check for trunction if it cares about it -
|
|
|
truncation has occurred if the return value is less than src_size.
|
|
|
A negative return value indicates an error
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_memcmp()
|
|
|
|
|
|
Description:
|
|
|
The std_memcmp() compares two memory buffers, byte-wise.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_memcmp(const void *a, const void *b, int length);
|
|
|
|
|
|
Parameters:
|
|
|
a, b: buffers to compare
|
|
|
length: number of bytes to compare
|
|
|
|
|
|
Return Value:
|
|
|
0 if buffers are the same for nLength ~
|
|
|
< 0 if a is less than b ~
|
|
|
> 0 if a is greater than b
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_memscpy - Size bounded memory copy.
|
|
|
|
|
|
Description:
|
|
|
|
|
|
Copies bytes from the source buffer to the destination buffer.
|
|
|
|
|
|
This function ensures that there will not be a copy beyond
|
|
|
the size of the destination buffer.
|
|
|
|
|
|
The result of calling this on overlapping source and destination
|
|
|
buffers is undefined.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_memscpy(void *dst, int dst_size, const void *src, int src_size);
|
|
|
|
|
|
Parameters:
|
|
|
|
|
|
@param[out] dst Destination buffer.
|
|
|
@param[in] dst_size Size of the destination buffer in bytes.
|
|
|
@param[in] src Source buffer.
|
|
|
@param[in] src_size Number of bytes to copy from source buffer.
|
|
|
|
|
|
Return value:
|
|
|
|
|
|
The number of bytes copied to the destination buffer. It is the
|
|
|
caller's responsibility to check for trunction if it cares about it -
|
|
|
truncation has occurred if the return value is less than src_size.
|
|
|
Returs a negative value on error.
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_memchr()
|
|
|
|
|
|
Description:
|
|
|
The std_memchr() finds the first occurrence of a character in a memory
|
|
|
buffer.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
void *std_memchr(const void* s, int c, int n);
|
|
|
|
|
|
Parameters:
|
|
|
s: buffer to search
|
|
|
c: value of byte to look for
|
|
|
n: size of s in bytes
|
|
|
|
|
|
Return Value:
|
|
|
A pointer to the occurrence of c. NULL if not found.
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_memstr()
|
|
|
|
|
|
Description:
|
|
|
The std_memstr() finds the first occurrence of a substring in a memory
|
|
|
buffer.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
void *std_memstr(const char* cpHaystack, const char* cpszNeedle,
|
|
|
int nHaystackLen);
|
|
|
|
|
|
Parameters:
|
|
|
cpHaystack: buffer to search
|
|
|
cpszNeedle: NUL-terminated string to search for
|
|
|
nHaystackLen: size of cpHaystack in bytes
|
|
|
|
|
|
Return Value:
|
|
|
a pointer to the first occurrence of cpszNeedle if found,
|
|
|
NULL otherwise
|
|
|
|
|
|
Comments:
|
|
|
None
|
|
|
|
|
|
Side Effects:
|
|
|
None
|
|
|
|
|
|
See Also:
|
|
|
None
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_memrchr()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_memrchr() finds the last occurrence of a character in a memory
|
|
|
buffer.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
void *std_memrchr(const void* s, int c, int n);
|
|
|
|
|
|
Parameters:
|
|
|
s: buffer to search
|
|
|
c: value of byte to look for
|
|
|
n: size of s in bytes
|
|
|
|
|
|
Return Value:
|
|
|
a pointer to the last occurrence of c, NULL if not found
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_memrchrbegin()
|
|
|
|
|
|
Description:
|
|
|
The std_memrchrbegin() finds the last occurrence of a character in a
|
|
|
memory buffer.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
void *std_memrchrbegin(const void* s, int c, int n);
|
|
|
|
|
|
Parameters:
|
|
|
s: buffer to search
|
|
|
c: value of byte to look for
|
|
|
n: size of s in bytes
|
|
|
|
|
|
Return Value:
|
|
|
a pointer to the last occurrence of c, or s if not found
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_memchrend()
|
|
|
|
|
|
Description:
|
|
|
The std_memchrend() finds the first occurrence of a character in a
|
|
|
memory buffer.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
void *std_memchrend(const void* s, int c, int n);
|
|
|
|
|
|
Parameters:
|
|
|
s: buffer to search
|
|
|
c: value of byte to look for
|
|
|
n: size of s in bytes
|
|
|
|
|
|
Return Value:
|
|
|
a pointer to the occurrence of c, s + n if not found
|
|
|
|
|
|
=======================================================================
|
|
|
std_memchrsend()
|
|
|
|
|
|
Description:
|
|
|
The std_memchrsend() finds the first occurrence of any character in a
|
|
|
NUL-terminated list of characters in a memory buffer.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
void *std_memchrend(const void* s, const char* cpszChars, int n);
|
|
|
|
|
|
Parameters:
|
|
|
s: buffer to search
|
|
|
cpszChars: characters to look for
|
|
|
n: size of s in bytes
|
|
|
|
|
|
Return Value:
|
|
|
a pointer to the first occurrence of one of cpszChars, s + n if not found
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strchr()
|
|
|
|
|
|
Description:
|
|
|
The std_strchr() finds the first occurrence of a character in a
|
|
|
NUL-terminated string.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char *std_strchr(const char* s, int c);
|
|
|
|
|
|
Parameters:
|
|
|
s: string to search
|
|
|
c: char to search for
|
|
|
|
|
|
Return Value:
|
|
|
pointer to first occurrence, NULL if not found
|
|
|
|
|
|
See Also:
|
|
|
std_wstrchr
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strchrs()
|
|
|
|
|
|
Description:
|
|
|
The std_strchrs() searches s, a NUL-terminated string, for the first
|
|
|
occurrence of any characters in cpszSrch, a NUL-terminated list of
|
|
|
characters.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char *std_strchrs(const char* s, const char *cpszSrch);
|
|
|
|
|
|
Parameters:
|
|
|
s: string to search
|
|
|
cpszSrch: a list of characters to search for
|
|
|
|
|
|
Return Value:
|
|
|
first occurrence of any of cpszSrch, NULL if not found
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strrchr()
|
|
|
|
|
|
Description:
|
|
|
The std_strrchr() finds the last occurrence of a character in a
|
|
|
NUL-terminated string.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char *std_strrchr(const char* s, int c);
|
|
|
|
|
|
Parameters:
|
|
|
s: string to search
|
|
|
c: char to search for
|
|
|
|
|
|
Return Value:
|
|
|
pointer to last occurrence, NULL if not found
|
|
|
|
|
|
See Also:
|
|
|
std_wstrrchr
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strchrend()
|
|
|
|
|
|
Description:
|
|
|
The std_strchrend() finds the first occurrence of a character in a
|
|
|
NUL-terminated string.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char *std_strchrend(const char* s, int c);
|
|
|
|
|
|
Parameters:
|
|
|
s: string to search
|
|
|
c: char to search for
|
|
|
|
|
|
Return Value:
|
|
|
pointer to first occurrence, s + std_strlen(s) if not found
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strchrsend()
|
|
|
|
|
|
Description:
|
|
|
The std_strchrsend() searches s, a NUL-terminated string, for the first
|
|
|
occurrence of any characters in cpszSrch, a NUL-terminated list of
|
|
|
characters.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char *std_strchrsend(const char* s, const char* cpszSrch);
|
|
|
|
|
|
Parameters:
|
|
|
s: string to search
|
|
|
cpszSrch: a list of characters to search for
|
|
|
|
|
|
Return Value:
|
|
|
first occurrence of any of cpszSrch or s+strlen(s) if not found
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strends()
|
|
|
|
|
|
Description:
|
|
|
The std_strends() tests whether a string ends in a particular suffix.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char *std_strends(const char* cpsz, const char* cpszSuffix);
|
|
|
|
|
|
Parameters:
|
|
|
cpsz: string to test
|
|
|
cpszSuffix: suffix to test for
|
|
|
|
|
|
Return Value:
|
|
|
the first character of cpsz+std_strlen(cpsz)-std_strlen(cpszSuffix)
|
|
|
if cpsz ends with cpszSuffix. NULL otherwise.
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_striends()
|
|
|
|
|
|
Description:
|
|
|
The std_striends() tests whether a string ends in a particular suffix,
|
|
|
case-folding ASCII characters.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char *std_striends(const char* cpsz, const char* cpszSuffix);
|
|
|
|
|
|
Parameters:
|
|
|
cpsz: string to test
|
|
|
cpszSuffix: suffix to test for
|
|
|
|
|
|
Return Value:
|
|
|
the first character of cpsz+std_strlen(cpsz)-std_strlen(cpszSuffix)
|
|
|
if cpsz ends with cpszSuffix. NULL otherwise.
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strbegins()
|
|
|
|
|
|
Description:
|
|
|
The std_strbegins() tests whether a string begins with a particular
|
|
|
prefix string.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char *std_strbegins(const char* cpsz, const char* cpszPrefix);
|
|
|
|
|
|
Parameters:
|
|
|
cpsz: string to test
|
|
|
cpszPrefix: prefix to test for
|
|
|
|
|
|
Return Value:
|
|
|
cpsz + std_strlen(cpszPrefix) if cpsz does begin with cpszPrefix,
|
|
|
NULL otherwise
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_stribegins()
|
|
|
|
|
|
Description:
|
|
|
The std_stribegins() tests whether a string begins with a particular
|
|
|
prefix string, case-folding ASCII characters.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char *std_stribegins(const char* cpsz, const char* cpszPrefix);
|
|
|
|
|
|
Parameters:
|
|
|
cpsz: string to test
|
|
|
cpszPrefix: prefix to test for
|
|
|
|
|
|
Return Value:
|
|
|
cpsz + std_strlen(cpszPrefix) if cpsz does begin with cpszPrefix,
|
|
|
NULL otherwise
|
|
|
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strcspn()
|
|
|
|
|
|
Description:
|
|
|
The std_strcspn() function searches s, a NUL-terminated string, for
|
|
|
the first occurrence of any characters in cpszSrch, a NUL-terminated
|
|
|
list of characters. This function returns the length of the longest
|
|
|
initial substring of s which consists of characters not present in
|
|
|
cpszSrch.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_strcspn(const char* s, const char* cpszSrch);
|
|
|
|
|
|
Parameters:
|
|
|
s: string to search
|
|
|
cpszSrch: a list of characters to search for
|
|
|
|
|
|
Return Value:
|
|
|
The index into the string s of the first occurrence of any of the
|
|
|
characters in cpszSrch. If no match is found, then index of the
|
|
|
terminating NUL character is returned.
|
|
|
|
|
|
See Also:
|
|
|
std_strspn, std_strchr, std_strchrs
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strspn()
|
|
|
|
|
|
Description:
|
|
|
The std_strspn() functions searches s, a NUL-terminated string, for
|
|
|
the first occurrence of a character that matches none of the
|
|
|
characters in cpszSrch, a NUL-terminated list of characters. This
|
|
|
function returns the length of the longest initial substring of s
|
|
|
which consists of characters present in cpszSrch.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_strspn(const char* s, const char* cpszSrch);
|
|
|
|
|
|
Parameters:
|
|
|
s: string to search
|
|
|
cpszSrch: a list of characters to search for
|
|
|
|
|
|
Return Value:
|
|
|
The index into the string s of the first occurrence of any character
|
|
|
that matches none of the characters in cpszSrch. If all characters
|
|
|
in s are present in cpszSrch, the index of the terminating NUL
|
|
|
character is returned.
|
|
|
|
|
|
See Also:
|
|
|
std_strcspn, std_strchr, std_strchrs
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_wstrlcpy()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_wstrlcpy() function copies a string. It is equivalent to
|
|
|
str_strlcpy() except that it operates on wide (16-bit) character strings.
|
|
|
See std_strlcpy() for details.
|
|
|
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_wstrlcpy(AECHAR *pcDest, const AECHAR *pszSrc, int nDestSize);
|
|
|
|
|
|
Parameters:
|
|
|
pcDst: destination string
|
|
|
pszSrc: source string
|
|
|
int nDestSize: size of pcDest __in AECHARs__
|
|
|
|
|
|
Return Value:
|
|
|
Returns the length of the string (in AECHARs) it tried to create,
|
|
|
which is same as length of pszSrc.
|
|
|
|
|
|
Example:
|
|
|
|
|
|
{
|
|
|
AECHAR buf[64];
|
|
|
if (std_wstrlcpy(buf, file_name, STD_ARRAY_SIZE(buf)) >=
|
|
|
STD_ARRAY_SIZE(buf)) {
|
|
|
//Truncated -- Handle overflow....
|
|
|
}
|
|
|
}
|
|
|
|
|
|
See Also:
|
|
|
std_wstrlcat
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_wstrlcat()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_wstrlcat() function concatenates two strings. It is equivalent to
|
|
|
std_strlcat() except that it operates on wide (16-bit) character strings.
|
|
|
See std_strlcat() for more information.
|
|
|
|
|
|
Prototype:
|
|
|
int std_wstrlcat(AECHAR *pcDst, const AECHAR *pszSrc, int nDestSize)
|
|
|
|
|
|
Parameters:
|
|
|
pcDst[out]: Destination string
|
|
|
pcSrc : Source string
|
|
|
nDestSize: Size of the destination buffer in AECHARs
|
|
|
|
|
|
Return Value:
|
|
|
Returns the length of the string (in AECHARs) it tried to create,
|
|
|
which is same as length of pszSrc + the length of pszDest.
|
|
|
|
|
|
Example:
|
|
|
|
|
|
{
|
|
|
char buf[64];
|
|
|
if (std_wstrlcat(buf, file_name, STD_ARRAY_SIZE(buf)) >=
|
|
|
STD_ARRAY_SIZE(buf)) {
|
|
|
//Truncated -- Handle overflow....
|
|
|
}
|
|
|
}
|
|
|
|
|
|
See Also:
|
|
|
std_wstrlcpy
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_wstrncmp()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_wstrncmp() function compares up to a specified number of bytes
|
|
|
in two NUL-terminated strings. It is equivalent to std_strncmp() except
|
|
|
that it operates on wide (16-bit) character strings.
|
|
|
|
|
|
Prototype:
|
|
|
int std_wstrncmp(const AECHAR* s1, const AECHAR* s2, int nLen);
|
|
|
|
|
|
Parameters:
|
|
|
s1, s2: strings to compare
|
|
|
n: maximum number of AECHARs to compare. if either s1 or s2 is
|
|
|
shorter than n, the function terminates there.
|
|
|
|
|
|
Return Value:
|
|
|
0 if strings are the same ~
|
|
|
< 0 if s1 is less than s2 ~
|
|
|
> 0 if s1 is greater than s2
|
|
|
|
|
|
See Also:
|
|
|
std_strncmp
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_wstrcmp()
|
|
|
|
|
|
Description:
|
|
|
The std_wstrcmp() compares two NUL-terminated strings. It is equivalent
|
|
|
to std_strncmp() except that it operates on wide (16-bit) character
|
|
|
strings. Comparison is strictly by byte values with no character set
|
|
|
interpretation.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_wstrcmp(const AECHAR* s1, const AECHAR* s2);
|
|
|
|
|
|
Parameters:
|
|
|
s1, s2: strings to compare
|
|
|
|
|
|
Return Value:
|
|
|
0 if strings are the same ~
|
|
|
< 0 if s1 is less than s2 ~
|
|
|
> 0 if s1 is greater than s2
|
|
|
|
|
|
See Also:
|
|
|
std_strcmp
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_wstrchr()
|
|
|
|
|
|
Description:
|
|
|
This function is the wide string counterpart of std_strchr().
|
|
|
The std_wstrchr() finds the first occurrence of a character in a
|
|
|
NUL-terminated wide (16-bit) character string.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
AECHAR* std_wstrchr(const AECHAR* s, AECHAR ch);
|
|
|
|
|
|
Parameters:
|
|
|
s: string to search
|
|
|
ch: char to search for
|
|
|
|
|
|
Return Value:
|
|
|
pointer to first occurrence, NULL if not found
|
|
|
|
|
|
See Also:
|
|
|
std_strchr
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_wstrrchr()
|
|
|
|
|
|
Description:
|
|
|
This function is the wide string counterpart of std_strrchr().
|
|
|
The std_wstrrchr() finds the last occurrence of a character in a
|
|
|
NUL-terminated wide (16-bit) character string.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
AECHAR* std_wstrrchr(const AECHAR* s, AECHAR ch);
|
|
|
|
|
|
Parameters:
|
|
|
s: string to search
|
|
|
ch: char to search for
|
|
|
|
|
|
Return Value:
|
|
|
pointer to last occurrence, NULL if not found
|
|
|
|
|
|
See Also:
|
|
|
std_strrchr
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_makepath()
|
|
|
|
|
|
Description:
|
|
|
The std_makepath() constructs a path from a directory portion and a file
|
|
|
portion, using forward slashes, adding necessary slashes and deleting extra
|
|
|
slashes. This function guarantees NUL-termination of pszDest
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_makepath(const char *cpszDir, const char *cpszFile,
|
|
|
char *pszDest, int nDestSize)
|
|
|
|
|
|
Parameters:
|
|
|
cpszDir: directory part
|
|
|
cpszFile: file part
|
|
|
pszDest: output buffer
|
|
|
nDestSize: size of output buffer in bytes
|
|
|
|
|
|
Return Value:
|
|
|
the required length to construct the path, not including
|
|
|
NUL-termination
|
|
|
|
|
|
Comments:
|
|
|
The following list of examples shows the strings returned by
|
|
|
std_makepath() for different paths.
|
|
|
|
|
|
Example:
|
|
|
|
|
|
cpszDir cpszFile std_makepath()
|
|
|
"" "" ""
|
|
|
"" "/" ""
|
|
|
"/" "" "/"
|
|
|
"/" "/" "/"
|
|
|
"/" "f" "/f"
|
|
|
"/" "/f" "/f"
|
|
|
"d" "f" "d/f"
|
|
|
"d/" "f" "d/f"
|
|
|
"d" "/f" "d/f"
|
|
|
"d/" "/f" "d/f"
|
|
|
|
|
|
See Also:
|
|
|
std_splitpath
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_splitpath()
|
|
|
|
|
|
Description:
|
|
|
The std_splitpath() finds the filename part of a path given an inclusive
|
|
|
directory, tests for cpszPath being in cpszDir. The forward slashes are
|
|
|
used as directory delimiters.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char *std_splitpath(const char *cpszPath, const char *cpszDir);
|
|
|
|
|
|
Parameters:
|
|
|
cpszPath: path to test for inclusion
|
|
|
cpszDir: directory that cpszPath might be in
|
|
|
|
|
|
Return Value:
|
|
|
the part of cpszPath that actually falls beneath cpszDir, NULL if
|
|
|
cpszPath is not under cpszDir
|
|
|
|
|
|
Comments:
|
|
|
The std_splitpath() is similar to std_strbegins(), but it ignores trailing
|
|
|
slashes on cpszDir, and it returns a pointer to the first character of
|
|
|
the subpath.
|
|
|
|
|
|
The return value of std_splitpath() will never begin with a '/'.
|
|
|
|
|
|
The following list of examples shows the strings returned by
|
|
|
std_splitpath() for different paths.
|
|
|
|
|
|
Example:
|
|
|
cpszPath cpszDir std_splitpath()
|
|
|
"" "" ""
|
|
|
"" "/" ""
|
|
|
"/" "" ""
|
|
|
"/" "/" ""
|
|
|
"/d" "d" null
|
|
|
"/d" "/" "d"
|
|
|
"/d/" "/d" ""
|
|
|
"/d/f" "/" "d/f"
|
|
|
"/d/f" "/d" "f"
|
|
|
"/d/f" "/d/" "f"
|
|
|
|
|
|
See Also:
|
|
|
std_makepath
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_cleanpath()
|
|
|
|
|
|
Description:
|
|
|
The std_cleanpath() removes double slashes, ".", and ".." from
|
|
|
slash-delimited paths,. It operates in-place.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char *std_cleanpath(char *pszPath);
|
|
|
|
|
|
Parameters:
|
|
|
pszPath[in/out]: path to "clean"
|
|
|
|
|
|
Return Value:
|
|
|
pszPath
|
|
|
|
|
|
Comments:
|
|
|
Passing an "fs:/" path to this function may produce undesirable
|
|
|
results. This function assumes '/' is the root.
|
|
|
|
|
|
Examples:
|
|
|
pszPath std_cleanpath()
|
|
|
"", "",
|
|
|
"/", "/",
|
|
|
|
|
|
// here"s, mostly alone
|
|
|
"./", "/",
|
|
|
"/.", "/",
|
|
|
"/./", "/",
|
|
|
|
|
|
// "up"s, mostly alone
|
|
|
"..", "",
|
|
|
"/..", "/",
|
|
|
"../", "/",
|
|
|
"/../", "/",
|
|
|
|
|
|
// fun with x
|
|
|
"x/.", "x",
|
|
|
"x/./", "x/",
|
|
|
"x/..", "",
|
|
|
"/x/..", "/",
|
|
|
"x/../", "/",
|
|
|
"/x/../", "/",
|
|
|
"/x/../..", "/",
|
|
|
"x/../..", "",
|
|
|
"x/../../", "/",
|
|
|
"x/./../", "/",
|
|
|
"x/././", "x/",
|
|
|
"x/.././", "/",
|
|
|
"x/../.", "",
|
|
|
"x/./..", "",
|
|
|
"../x", "/x",
|
|
|
"../../x", "/x",
|
|
|
"/../x", "/x",
|
|
|
"./../x", "/x",
|
|
|
|
|
|
// double slashes
|
|
|
"//", "/",
|
|
|
"///", "/",
|
|
|
"////", "/",
|
|
|
"x//x", "x/x",
|
|
|
|
|
|
|
|
|
Side Effects:
|
|
|
None
|
|
|
|
|
|
See Also:
|
|
|
None
|
|
|
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_basename()
|
|
|
|
|
|
Description:
|
|
|
The std_basename() returns the filename part of a string,
|
|
|
assuming '/' delimited filenames.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
char *std_basename(const char *cpszPath);
|
|
|
|
|
|
Parameters:
|
|
|
cpszPath: path of interest
|
|
|
|
|
|
Return Value:
|
|
|
pointer into cpszPath that denotes part of the string immediately
|
|
|
following the last '/'
|
|
|
|
|
|
Examples:
|
|
|
cpszPath std_basename()
|
|
|
"" ""
|
|
|
"/" ""
|
|
|
"x" "x"
|
|
|
"/x" "x"
|
|
|
"y/x" "x"
|
|
|
"/y/x" "x"
|
|
|
|
|
|
See Also:
|
|
|
None
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_rand_next()
|
|
|
|
|
|
Description:
|
|
|
The std_rand_next() generates pseudo-random bytes.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
unsigned std_rand_next(unsigned uRand);
|
|
|
|
|
|
Parameters:
|
|
|
uRand: a seed for the pseudo-random generator
|
|
|
|
|
|
Return Value:
|
|
|
the next value in the generator from uRand
|
|
|
|
|
|
Comments:
|
|
|
for best results, this function should be called with its last
|
|
|
generated output.
|
|
|
|
|
|
This is an example of code to generate 256 bytes of pseudo-random data.
|
|
|
|
|
|
This is not crypto quality and should not be used for key generation
|
|
|
and the like.
|
|
|
|
|
|
Example:
|
|
|
{
|
|
|
unsigned rand_buf[256/sizeof(unsigned)];
|
|
|
int i;
|
|
|
unsigned uLast = std_rand_next(uCurrentTime);
|
|
|
for (i = 0; i < STD_ARRAY_SIZE(rand_buf); i++) {
|
|
|
rand_buf[i] = (uLast = std_rand_next(uLast));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
See Also:
|
|
|
std_rand()
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_rand()
|
|
|
|
|
|
Description:
|
|
|
The std_rand() functions generates pseudo-random bytes and places it
|
|
|
in an output buffer of specified size.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
uint32 std_rand(uint32 uSeed, byte* pDest, int nSize);
|
|
|
|
|
|
Parameters:
|
|
|
uSeed: A seed for the pseudo-random generator
|
|
|
pDest: The output buffer where the random bytes are placed.
|
|
|
nSize: The size in bytes of pDest.
|
|
|
|
|
|
Return Value:
|
|
|
The new seed value that can be used in a subsequent call to
|
|
|
std_rand().
|
|
|
|
|
|
Comments:
|
|
|
|
|
|
std_rand() is a linear congruent psuedo-random number generator that
|
|
|
is seeded using the input seed. This makes the ouput predictable if
|
|
|
you can determine (or influence) the seed value used. Furthermore,
|
|
|
the random sequence of bytes generated by two different calls to this
|
|
|
function will be identical if both the calls use the same seed value.
|
|
|
|
|
|
This is not crypto quality and should not be used for key generation
|
|
|
and other cryptographic uses.
|
|
|
|
|
|
See Also:
|
|
|
std_rand_next()
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_CopyLE()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_CopyLE() function copies data while translating numeric values
|
|
|
between host byte ordering and "little endian" byte ordering.
|
|
|
|
|
|
pvDest and pvSrc are NOT required to be 16 or 32-bit word aligned.
|
|
|
|
|
|
Behavior is undefined when the destination and source arrays overlap,
|
|
|
except in the special case where pvDest and pvSrc are equal. In that case,
|
|
|
std_CopyLE() modifies the buffer in-place.
|
|
|
|
|
|
When the target byte ordering (little endian) matches the host byte
|
|
|
ordering, in-place translations reduce to a no-op, and copies are
|
|
|
delegated directly to std_memmove().
|
|
|
|
|
|
|
|
|
Prototype:
|
|
|
int std_CopyLE(void *pvDest, int nDestSize,
|
|
|
const void *pvSrc, int nSrcSize,
|
|
|
const char *pszFields);
|
|
|
|
|
|
Parameters:
|
|
|
pvDest: Pointer to destination buffer.
|
|
|
nDestSize: Size of the destination buffer.
|
|
|
pvSrc: Pointer to buffer containing source data.
|
|
|
nSrcSize: Size of source data.
|
|
|
pszFields: Description of the fields that comprise the source data.
|
|
|
|
|
|
Each field size is given by a positive decimal integer or one of
|
|
|
the following characters: "S", "L", "Q", or "*". The letters
|
|
|
denote fields that should be converted to the desired byte
|
|
|
ordering:
|
|
|
|
|
|
===pre>
|
|
|
S : a 2 byte (16 bit) value.
|
|
|
L : a 4 byte (32 bit) value.
|
|
|
Q : a 8 byte (64 bit) value.
|
|
|
===/pre>
|
|
|
|
|
|
An integer gives a number of bytes and "*" represents the
|
|
|
remainder of the pvSrc[] buffer. No reordering is performed on
|
|
|
data in these fields.
|
|
|
|
|
|
Comparisons are case-sensitive. Behavior is undefined when
|
|
|
other characters are supplied in pszFields.
|
|
|
|
|
|
For example: "L12S*" would be appropriate to copy a structure
|
|
|
containing a uint32 followed by a 12 byte character array,
|
|
|
followed by a uint16, followed by an arbitrary amount of
|
|
|
character data.
|
|
|
|
|
|
If nSrcSize is greater than the structure size (total of all the
|
|
|
sizes in pszFields[]) then pvSrc[] is treated as an array of
|
|
|
structures, each of which is described by pszFields.
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
The number of bytes actually copied or translated in-place. This will be
|
|
|
the smaller of nDestSize and nSrcSize, or zero if one of them are negative.
|
|
|
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_CopyBE()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_CopyBE() function has the same semantics as std_CopyLE() except it
|
|
|
copies between host byte ordering and big-endian ("network") byte order.
|
|
|
|
|
|
See std_CopyLE() for more details.
|
|
|
|
|
|
|
|
|
Prototype:
|
|
|
void *std_CopyBE(void *pvDest, const void *pvSrc,
|
|
|
int cbDest, int nItems, const char *pszFields);
|
|
|
|
|
|
Parameters:
|
|
|
pvDest: Pointer to destination buffer.
|
|
|
nDestSize: Size of the destination buffer.
|
|
|
pvSrc: Pointer to buffer containing source data.
|
|
|
nSrcSize: Size of source data.
|
|
|
pszFields: Description of the fields that comprise the source data,
|
|
|
as defined in std_CopyLE.
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
The number of bytes actually copied or translated in-place. This will be
|
|
|
the smaller of nDestSize and nSrcSize, or zero if one of them are negative.
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_swapl()
|
|
|
|
|
|
Description:
|
|
|
The std_swapl() changes endianness of an unsigned long.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
unsigned long std_swapl(unsigned long ul)
|
|
|
|
|
|
Parameters:
|
|
|
ul: input unsigned long
|
|
|
|
|
|
Return Value:
|
|
|
ul, reversed in byte-ordering
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_swaps()
|
|
|
|
|
|
Description:
|
|
|
The std_swaps() changes endianness of an unsigned short.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
unsigned short std_swaps(unsigned short us)
|
|
|
|
|
|
Parameters:
|
|
|
us: input unsigned short
|
|
|
|
|
|
Return Value:
|
|
|
us, reversed in byte-ordering
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_letohs()
|
|
|
|
|
|
Description:
|
|
|
The std_letohs() changes a short from little-endian to host byte order.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
unsigned short std_letohs(unsigned short us)
|
|
|
|
|
|
Parameters:
|
|
|
us: short to convert
|
|
|
|
|
|
Return Value:
|
|
|
us converted from little-endian to host byte order. If the
|
|
|
host is little endian, just returns us
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_htoles()
|
|
|
|
|
|
Description:
|
|
|
The std_htoles() converts a short from host byte-order to little-endian.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
unsigned short std_htoles(unsigned short us)
|
|
|
|
|
|
Parameters:
|
|
|
us: short to convert
|
|
|
|
|
|
Return Value:
|
|
|
us converted from host byte order to little-endian. If the
|
|
|
host is little endian, just returns us
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_letohl()
|
|
|
|
|
|
Description:
|
|
|
The std_letohl() changes a long from little-endian to host byte order.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
unsigned long std_letohl(unsigned long ul)
|
|
|
|
|
|
Parameters:
|
|
|
ul: long to convert
|
|
|
|
|
|
Return Value:
|
|
|
ul converted from little-endian to host byte order. If the
|
|
|
host is little endian, just returns ul
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_htolel()
|
|
|
|
|
|
Description:
|
|
|
The std_htolel() converts a long from host byte-order to little-endian.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
unsigned long std_htolel(unsigned long ul)
|
|
|
|
|
|
Parameters:
|
|
|
ul: long to convert
|
|
|
|
|
|
Return Value:
|
|
|
ul converted from host byte order to little-endian. If the
|
|
|
host is little endian, just returns ul.
|
|
|
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_ntohs()
|
|
|
|
|
|
Description:
|
|
|
The std_ntohs() changes a short from big-endian to host byte order.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
unsigned short std_ntohs(unsigned short us)
|
|
|
|
|
|
Parameters:
|
|
|
us: short to convert
|
|
|
|
|
|
Return Value:
|
|
|
us converted from big-endian to host byte order. If the
|
|
|
host is big endian, just returns us.
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_htons()
|
|
|
|
|
|
Description:
|
|
|
The std_htons() converts a short from host byte-order to big-endian.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
unsigned short std_htons(unsigned short us)
|
|
|
|
|
|
Parameters:
|
|
|
us: short to convert
|
|
|
|
|
|
Return Value:
|
|
|
us converted from host byte order to big-endian. If the
|
|
|
host is big endian, just returns us.
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_ntohl()
|
|
|
|
|
|
Description:
|
|
|
The std_ntohl() changes a long from big-endian to host byte order.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
unsigned long std_ntohl(unsigned long ul)
|
|
|
|
|
|
Parameters:
|
|
|
ul: long to convert
|
|
|
|
|
|
Return Value:
|
|
|
ul converted from big-endian to host byte order. If the
|
|
|
host is big endian, just returns ul.
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_htonl()
|
|
|
|
|
|
Description:
|
|
|
The std_htonl() converts a long from host byte-order to big-endian.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
unsigned long std_htonl(unsigned long ul)
|
|
|
|
|
|
Parameters:
|
|
|
ul: long to convert
|
|
|
|
|
|
Return Value:
|
|
|
ul converted from host byte order to big-endian. If the
|
|
|
host is big endian, just returns ul.
|
|
|
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_strlprintf()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The functions std_strlprintf() and std_vstrlprintf() write formatted
|
|
|
output to a string. These functions guarantee NUL-termination of
|
|
|
the output buffer when its size is greater than zero.
|
|
|
|
|
|
A format string is copied to the output buffer, except for conversion
|
|
|
specifiers contained within the format string. Conversion specifiers
|
|
|
begin with a "%" and specify some action that consumes an argument from
|
|
|
the argument list.
|
|
|
|
|
|
Conversion specifiers have the following form:
|
|
|
===pre>
|
|
|
%[FLAGS] [WIDTH] [.PRECISION] [TYPE] CONV
|
|
|
===/pre>
|
|
|
|
|
|
CONV is the only required field. It is always a single character,
|
|
|
and determines the action to be taken. Supported values are:
|
|
|
|
|
|
===pre>
|
|
|
CONV | Description
|
|
|
======|=======================================================
|
|
|
c | Output a single character.
|
|
|
|
|
|
|
s | Output a NUL-terminated single-byte character string.
|
|
|
|
|
|
|
d, i | Ouptut a signed decimal integer.
|
|
|
|
|
|
|
u | Output an unsigned decimal integer.
|
|
|
|
|
|
|
o | Output an unsigned octal integer.
|
|
|
|
|
|
|
x | Output an unsigned hexadecimal integer, using
|
|
|
| lower case digits.
|
|
|
|
|
|
|
X | Output an unsigned hexadecimal integer, using
|
|
|
| upper case digits.
|
|
|
|
|
|
|
p | Output a pointer value as eight hexadecimal digits,
|
|
|
| using upper case digits.
|
|
|
===/pre>
|
|
|
|
|
|
The next argument from the argument list supplies the value to be
|
|
|
formatted and output.
|
|
|
|
|
|
FLAGS, WIDTH, and PRECISION can modify the formatting of the value.
|
|
|
|
|
|
FLAGS consists of one or more of the following characters:
|
|
|
|
|
|
===pre>
|
|
|
Flag | Meaning
|
|
|
=====|=================================================================
|
|
|
+ | Prefix positive numbers with "+" (%d and %i only).
|
|
|
-----|-----------------------------------------------------------------
|
|
|
- | When padding to meet WIDTH, pad on the right.
|
|
|
-----|-----------------------------------------------------------------
|
|
|
0 | Pad with '0' characters when padding on the left to meet WIDTH.
|
|
|
-----|-----------------------------------------------------------------
|
|
|
blank| Prefix positive numbers with " " (%d and %i only).
|
|
|
space|
|
|
|
-----|-----------------------------------------------------------------
|
|
|
# | With %x or %X: prefixes non-zero values with "0x"/"0X".
|
|
|
| With %o, ensure the value begins with "0" (increasing PRECISION
|
|
|
| if necessary).
|
|
|
| Ignored for all other CONV specifiers.
|
|
|
-----|-----------------------------------------------------------------
|
|
|
===/pre>
|
|
|
|
|
|
WIDTH is an unsigned decimal integer or the character "*".
|
|
|
|
|
|
WIDTH gives the minimum number of characters to be written. The
|
|
|
formatted value will be padded with spaces until the minimum size is
|
|
|
met; it never causes a value to be truncated The sign of the WIDTH
|
|
|
integer selects between left and right padding. Padding will be on
|
|
|
the left unless the "-" flag is specified.
|
|
|
|
|
|
When "*" is used, an 'int' argument is consumed from the argument
|
|
|
list and used as the WIDTH. A negative argument specifies padding on
|
|
|
the right, and its absolute value gives the amount of padding.
|
|
|
|
|
|
If the "0" flags is specified, any padding on the left will consist
|
|
|
of "0" characters. An exception to this rule is that the "0" flag is
|
|
|
ignored when precision is specified for a numeric value.
|
|
|
|
|
|
PRECISION is a non-negative decimal integer or "*" preceded by ".".
|
|
|
|
|
|
When PRECISION accompanies any of the numeric conversions, it
|
|
|
specifies the minimum number of digits to output. Values are padded
|
|
|
on the left with '0' to meet the specified size. PRECISION defaults
|
|
|
to 1 for numbers.
|
|
|
|
|
|
When PRECISION accompanies other conversions, it specifies the
|
|
|
maximum number of characters from the value to output. The value
|
|
|
will be truncated to ensure that at most PRECISION characters are
|
|
|
output.
|
|
|
|
|
|
TYPE provides information about the type of arguments. This is used
|
|
|
to determine the size of integer arguments. Values larger than 'int'
|
|
|
can be properly obtained from the argument list. Their behavior
|
|
|
should be considered undefined for CONV operations other than integer
|
|
|
formatting.
|
|
|
|
|
|
===pre>
|
|
|
TYPE | Meaning
|
|
|
=======|=====================
|
|
|
hh | sizeof(char)
|
|
|
-------|---------------------
|
|
|
h | sizeof(short)
|
|
|
-------|---------------------
|
|
|
l | sizeof(long)
|
|
|
-------|---------------------
|
|
|
L, ll | sizeof(long long)
|
|
|
-------|---------------------
|
|
|
j | sizeof(int64)
|
|
|
-------|---------------------
|
|
|
z | sizeof(size_t)
|
|
|
-------|---------------------
|
|
|
===/pre>
|
|
|
|
|
|
For 64-bit integers, "ll" may be the most widely-supported type
|
|
|
specifier in other printf implementation, but "j" has been introduced
|
|
|
in ISO C99. This implementation supports both.
|
|
|
|
|
|
Note that arguments to variadic functions are promoted to 'int' when
|
|
|
smaller than 'int', so 'h' and 'hh' have no observable effect.
|
|
|
Static analysis tools that understand standard format string syntax
|
|
|
may use this information for other purposes.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_strlprintf(char *pszDest, int nDestSize,
|
|
|
const char *pszFmt, ...);
|
|
|
Parameters:
|
|
|
pszDest [out]: output buffer, where output will be placed
|
|
|
nDestSize: size of pszDest in bytes
|
|
|
pszFmt: format string
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
The size required to hold the entire untruncated output, NOT
|
|
|
including NUL-termination.
|
|
|
|
|
|
Comments:
|
|
|
|
|
|
Notable omissions from std_strlprintf() are lack of support for
|
|
|
floating point and lack of support for "%n".
|
|
|
|
|
|
Side Effects:
|
|
|
None
|
|
|
|
|
|
See Also:
|
|
|
None
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_vstrlprintf()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_vstrlprintf() is documented with std_strlprintf(), it's the
|
|
|
vector form of std_strlprintf(). See std_strlprintf() for a
|
|
|
more complete description.
|
|
|
|
|
|
Prototype:
|
|
|
int std_vstrlprintf(char *pszDest, int nDestSize,
|
|
|
const char *pszFmt, AEEVaList args);
|
|
|
|
|
|
Parameters:
|
|
|
pszDest [out]: output buffer, where output will be placed
|
|
|
nDestSize: size of pszDest in bytes
|
|
|
pszFmt: format string
|
|
|
args: arguments
|
|
|
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_snprintf()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The functions std_snprintf() and std_vsnprintf() are similar to
|
|
|
std_strlprintf and std_vstrlprintf that write formatted output to a
|
|
|
string. Unlike std_strlprintf, std_snprintf also support the floating
|
|
|
point conversion specifiers. These functions guarantee NUL-termination
|
|
|
of the output buffer when its size is greater than zero.
|
|
|
|
|
|
A format string is copied to the output buffer, except for conversion
|
|
|
specifiers contained within the format string. Conversion specifiers
|
|
|
begin with a "%" and specify some action that consumes an argument from
|
|
|
the argument list.
|
|
|
|
|
|
Conversion specifiers have the following form:
|
|
|
===pre>
|
|
|
%[FLAGS] [WIDTH] [.PRECISION] [TYPE] CONV
|
|
|
===/pre>
|
|
|
|
|
|
CONV is the only required field. It is always a single character,
|
|
|
and determines the action to be taken. For a detailed description of
|
|
|
conversion sepcifiers, please refer to the documentation of
|
|
|
std_strlprintf(). Here. we only provide description of these fields
|
|
|
as it applies to the additional CONV values supported by
|
|
|
std_snprintf().
|
|
|
|
|
|
In addition to the values for CONV supported by std_strlprintf, this
|
|
|
function supports the following values:
|
|
|
|
|
|
===pre>
|
|
|
CONV | Description
|
|
|
======|=======================================================
|
|
|
e, E | Outputs a double value representing a floating point
|
|
|
| number in the style [-]d.ddd e<>dd, where there is one
|
|
|
| digit (which is nonzero if the argument is nonzero)
|
|
|
| before the decimal-point character and the number of
|
|
|
| digits after it is equal to the precision. If the
|
|
|
| precision is missing, it is taken as 6. If the precision
|
|
|
| is zero and the # flag is not specified, no decimal-point
|
|
|
| character appears. The value is rounded to the appropriate
|
|
|
| number of digits. The E conversion specifier produces a
|
|
|
| number with E instead of e introducing the exponent. The
|
|
|
| exponent always contains at least two digits, and only as
|
|
|
| many more digits as necessary to represent the exponent.
|
|
|
| If the value is zero, the exponent is zero.
|
|
|
|
|
|
|
f, F | Outputs a double value representing a floating point
|
|
|
| number in the style [-]ddd.ddd, where the number of
|
|
|
| digits after the decimal-point character is equal to the
|
|
|
| precision specification. If the precision is missing, it
|
|
|
| is taken as 6. If the precision is zero and the # flag is
|
|
|
| not specified, no decimal-point character appears. If a
|
|
|
| decimal-point character appears, at least one digit
|
|
|
| appears before it. The value is rounded to the appropriate
|
|
|
| number of digits.
|
|
|
|
|
|
|
g, G | Outputs a double value representing a floating point
|
|
|
| number in the style f or e (or in style F or E in the case
|
|
|
| of a G conversion specifier), with the precision specifying
|
|
|
| the number of significant digits. If the precision is zero,
|
|
|
| it is taken as 1. The style used depends on the value
|
|
|
| converted. Style e (or E) is used only if the exponent
|
|
|
| resulting from such a conversion is less than -4 or greater
|
|
|
| than or equal to the precision. Trailing zeros are removed
|
|
|
| from the fractional portion of the result unless the # flag
|
|
|
| is specified; a decimal-point character appears only if it
|
|
|
| is followed by a digit.
|
|
|
|
|
|
|
a, A | Outputs a double value representing a floating point
|
|
|
| number in the style [-]0xh.hhhh p<>d, where there is one
|
|
|
| non-zero hexadecimal digit before the decimal-point
|
|
|
| character and the number of hexadecimal digits after it is
|
|
|
| equal to the precision. If the precision is missing then
|
|
|
| the precision is assumed to be sufficient for an exact
|
|
|
| representation of the value, except that trailing zeros
|
|
|
| may be omitted. If the precision is zero and the # flag is
|
|
|
| not specified, no decimal point character appears. The
|
|
|
| letters 'abcdef' are used for '%a' conversion and the
|
|
|
| letters ABCDEF for '%A' conversion. The '%A' conversion
|
|
|
| specifier produces a number with 'X' and 'P' instead of 'x'
|
|
|
| and 'p'. The exponent always contains at least one digit,
|
|
|
| and only as many more digits as necessary to represent the
|
|
|
| decimal exponent of 2. If the value is zero, the exponent
|
|
|
| is zero.
|
|
|
|
|
|
|
===/pre>
|
|
|
|
|
|
For 'e', 'f', 'g' and 'a' convervsion specifiers, a double argument
|
|
|
representing an infinity is converted in to the style '[-]inf' and
|
|
|
a double argument representing a NaN is converted in to the stlye
|
|
|
'nan'. The 'E', 'F', 'G' and 'A' conversion specifiers result in
|
|
|
'INF' or 'NAN' instead of 'inf' or 'nan', respectively.
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
int std_snprintf(char *pszDest, int nDestSize,
|
|
|
const char *pszFmt, ...);
|
|
|
Parameters:
|
|
|
pszDest [out]: output buffer, where output will be placed
|
|
|
nDestSize: size of pszDest in bytes
|
|
|
pszFmt: format string
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
The size required to hold the entire untruncated output, NOT
|
|
|
including NUL-termination.
|
|
|
|
|
|
Comments:
|
|
|
|
|
|
Notable omissions from std_strlprintf() lack of support for "%n".
|
|
|
|
|
|
Side Effects:
|
|
|
None
|
|
|
|
|
|
See Also:
|
|
|
std_strlprintf()
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_vsnprintf()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_vsnprintf() is documented with std_snprintf(), it's the
|
|
|
vector form of std_snprintf(). See std_snprintf() for a more complete
|
|
|
description.
|
|
|
|
|
|
Prototype:
|
|
|
int std_vsnprintf(char *pszDest, int nDestSize,
|
|
|
const char *pszFmt, AEEVaList args);
|
|
|
|
|
|
Parameters:
|
|
|
pszDest [out]: output buffer, where output will be placed
|
|
|
nDestSize: size of pszDest in bytes
|
|
|
pszFmt: format string
|
|
|
args: arguments
|
|
|
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_scanul()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_scanul() converts an ASCII representation of a number to an unsigned
|
|
|
long. It expects strings that match the following pattern:
|
|
|
===pre>
|
|
|
spaces [+|-] digits
|
|
|
===/pre>
|
|
|
|
|
|
'Spaces' is zero or more ASCII space or tab characters.
|
|
|
|
|
|
'Digits' is any number of digits valid in the radix. Letters 'A' through
|
|
|
'Z' are treated as digits with values 10 through 35. 'Digits' may begin
|
|
|
with "0x" when a radix of 0 or 16 is specified.
|
|
|
|
|
|
Upper and lower case letters can be used interchangeably.
|
|
|
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
uint32 std_scanul( const char *pchBuf, int nRadix, const char **ppchEnd,
|
|
|
int *pnError)
|
|
|
|
|
|
Parameters:
|
|
|
|
|
|
pchBuf [in] : the start of the string to scan.
|
|
|
|
|
|
nRadix [in] : the numeric radix (or base) of the number. Valid values are
|
|
|
2 through 36 or zero, which implies auto-detection.
|
|
|
Auto-detection examines the digits field. If it begins with
|
|
|
"0x", radix 16 is selected. Otherwise, if it begins with
|
|
|
"0" radix 8 is selected. Otherwise, radix 10 is selected.
|
|
|
|
|
|
ppchEnd [out] : if ppchEnd is not NULL, *ppchEnd points to the first
|
|
|
character that did not match the expected pattern shown
|
|
|
above, except on STD_BADPARAM and STD_OVERFLOW when it is
|
|
|
set to the start of the string.
|
|
|
|
|
|
pnError [out] : If pnError is not NULL, *pnError holds the error code,
|
|
|
which is one of the following:
|
|
|
~
|
|
|
0 : Numeric value is from 0 to MAX_UINT32.
|
|
|
|
|
|
STD_NEGATIVE : The scanned value was negative and its absolute value was
|
|
|
from 1 to MAX_UINT32. The result is the negated value
|
|
|
(cast to a uint32).
|
|
|
|
|
|
STD_NODIGITS : No digits were found. The result is zero.
|
|
|
|
|
|
STD_OVERFLOW : The absolute value exceeded MAX_UINT32. The result
|
|
|
is set to MAX_UINT32 and *ppchEnd is set to pchBuf.
|
|
|
|
|
|
STD_BADPARAM : An improper value for nRadix was received. The result
|
|
|
is set to zero, and *ppchEnd is set to pchBuf.
|
|
|
*
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
The converted numeric result.
|
|
|
|
|
|
Comments:
|
|
|
|
|
|
The std_scanul() is similar to ANSI C's strtoul() but differs in the following
|
|
|
respects:
|
|
|
|
|
|
1. It returns an error/success code. strtoul() results are ambiguous
|
|
|
unless the caller sets errno to zero before calling it.
|
|
|
|
|
|
2. std_scanul() is free of references to current locale and errno. Some
|
|
|
strtoul() implementations use locale; some don't.
|
|
|
|
|
|
3. It provides more complete reporting of range underflow. strtoul()
|
|
|
does not distinguish between "-1" and "0xFFFFFFFF", and underflow is
|
|
|
poorly defined.
|
|
|
|
|
|
4. std_scanul() reports a "no digits" error code to distinguish "0" from
|
|
|
whitespace, "+", etc..
|
|
|
|
|
|
See Also:
|
|
|
|
|
|
std_scanull()
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_scanull()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_scanull() converts an ASCII representation of a number to an
|
|
|
unsigned long long. It expects strings that match the following pattern:
|
|
|
===pre>
|
|
|
spaces [+|-] digits
|
|
|
===/pre>
|
|
|
|
|
|
'Spaces' is zero or more ASCII space or tab characters.
|
|
|
|
|
|
'Digits' is any number of digits valid in the radix. Letters 'A' through
|
|
|
'Z' are treated as digits with values 10 through 35. 'Digits' may begin
|
|
|
with "0x" when a radix of 0 or 16 is specified.
|
|
|
|
|
|
Upper and lower case letters can be used interchangeably.
|
|
|
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
uint64 std_scanull(const char *pchBuf, int nRadix, const char **ppchEnd,
|
|
|
int *pnError)
|
|
|
|
|
|
Parameters:
|
|
|
|
|
|
pchBuf [in] : the start of the string to scan.
|
|
|
|
|
|
nRadix [in] : the numeric radix (or base) of the number. Valid values are
|
|
|
2 through 36 or zero, which implies auto-detection.
|
|
|
Auto-detection examines the digits field. If it begins with
|
|
|
"0x", radix 16 is selected. Otherwise, if it begins with
|
|
|
"0" radix 8 is selected. Otherwise, radix 10 is selected.
|
|
|
|
|
|
ppchEnd [out] : if ppchEnd is not NULL, *ppchEnd points to the first
|
|
|
character that did not match the expected pattern shown
|
|
|
above, except on STD_BADPARAM and STD_OVERFLOW when it is
|
|
|
set to the start of the string.
|
|
|
|
|
|
pnError [out] : If pnError is not NULL, *pnError holds the error code,
|
|
|
which is one of the following:
|
|
|
~
|
|
|
0 : Numeric value is from 0 to MAX_UINT64.
|
|
|
|
|
|
STD_NEGATIVE : The scanned value was negative and its absolute value was
|
|
|
from 1 to MAX_UINT64. The result is the negated value
|
|
|
(cast to a uint64).
|
|
|
|
|
|
STD_NODIGITS : No digits were found. The result is zero.
|
|
|
|
|
|
STD_OVERFLOW : The absolute value exceeded MAX_UINT64. The result
|
|
|
is set to MAX_UINT64 and *ppchEnd is set to pchBuf.
|
|
|
|
|
|
STD_BADPARAM : An improper value for nRadix was received. The result
|
|
|
is set to zero, and *ppchEnd is set to pchBuf.
|
|
|
*
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
The converted numeric result.
|
|
|
|
|
|
Comments:
|
|
|
|
|
|
The std_scanull() is similar to ANSI C's strtoull() but differs in the following
|
|
|
respects:
|
|
|
|
|
|
1. It returns an error/success code. strtoull() results are ambiguous
|
|
|
unless the caller sets errno to zero before calling it.
|
|
|
|
|
|
2. std_scanull() is free of references to current locale and errno. Some
|
|
|
strtoull() implementations use locale; some don't.
|
|
|
|
|
|
3. It provides more complete reporting of range underflow. strtoul()
|
|
|
does not distinguish between "-1" and "0xFFFFFFFFFFFFFFFF", and underflow
|
|
|
is poorly defined.
|
|
|
|
|
|
4. std_scanull() reports a "no digits" error code to distinguish "0" from
|
|
|
whitespace, "+", etc..
|
|
|
|
|
|
See Also:
|
|
|
|
|
|
std_scanul()
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_qsort()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
An implementation of the quicksort algorithm, a massively recursive,
|
|
|
in-place sorting algorithm for an array.
|
|
|
|
|
|
The contents of the array are sorted in ascending order according to
|
|
|
the comparison function pointed to by pfnCompare.
|
|
|
|
|
|
pfnCompare must return a value less than, equal to, or
|
|
|
greater than zero if the first argument is considered to be
|
|
|
less than, equal to, or greater than the second, respectively.
|
|
|
|
|
|
std_qsort() is not a stable sort.
|
|
|
|
|
|
Prototype:
|
|
|
void std_qsort(void* pElems, int nNumElems, int nElemWidth,
|
|
|
int (*pfnCompare)(void*, const void*, const void*),
|
|
|
void* pCompareCx);
|
|
|
|
|
|
|
|
|
Parameters:
|
|
|
pElems: array of elements to be sorted in place. It's size
|
|
|
must be nNumElems * nElemWidth in bytes.
|
|
|
nNumElems: number of elements in pElems
|
|
|
nElemWidth: the width, in bytes of each element of pElems
|
|
|
pfnCompare: callback comparison function, should return 0, less than
|
|
|
zero or greater than zero if the left comparand is equal to, less
|
|
|
than, or greater than, the right comparand, respectively.
|
|
|
pCompareCx: the context passed as the first parameter by pfnCompare
|
|
|
|
|
|
Return Value:
|
|
|
None
|
|
|
|
|
|
Comments:
|
|
|
If nElemWidth is 2, 4, or 8, pElems is accessed internally as
|
|
|
integer values for the purposes of reading and writing elements.
|
|
|
Therefore, pElems must be aligned on a memory boundary compatible
|
|
|
with integer access of the array elements. I.e. if you pass 4 as
|
|
|
nElemWidth, *(int*)pElems must succeed.
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_bisect()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
Find an element in a sorted array of elements. Uses a binary
|
|
|
search.
|
|
|
|
|
|
Prototype:
|
|
|
int std_bisect(const void* pElems, int nNumElems, int nElemWidth,
|
|
|
const void* pElemFind,
|
|
|
int (*pfnCompare)(void*, const void*, const void*),
|
|
|
void* pCompareCx);
|
|
|
|
|
|
Parameters:
|
|
|
pElems: array of elements to be searched. It's size
|
|
|
must be nNumElems * nElemWidth in bytes.
|
|
|
nNumElems: number of elements in pElems
|
|
|
nElemWidth: the width, in bytes of each element of pElems
|
|
|
pElemFind: the element value to find in the array
|
|
|
pfnCompare: callback comparison function, should return 0, less than
|
|
|
zero or greater than zero if the left comparand is equal to, less
|
|
|
than, or greater than, the right comparand, respectively.
|
|
|
pCompareCx: the context passed as the first parameter by pfnCompare
|
|
|
|
|
|
Return Value:
|
|
|
index of the element such that pElems[index] <= elem < pElems[index + 1]
|
|
|
nNumElems if elem is greater than all the elements in the list
|
|
|
0 if the elem is less than or equal to the all the elements in the list
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_merge()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
Merge two sorted arrays into another array.
|
|
|
|
|
|
Prototype:
|
|
|
void std_merge(void* vpDst, int nDst,
|
|
|
const void* vpA, int nA,
|
|
|
const void* vpB, int nB,
|
|
|
int nElemWidth,
|
|
|
int (*pfnCompare)(void*, const void*, const void*),
|
|
|
void* pCompareCx);
|
|
|
|
|
|
Parameters:
|
|
|
vpDst: destination array. It's size must be nDst * nElemWidth in bytes.
|
|
|
nDst: number of elements that vpDst can accomodate
|
|
|
vpA: array of elements to be merged, it's size must be nA * nElemWidth
|
|
|
in bytes.
|
|
|
nA: number of elements in vpA
|
|
|
vpB: array of elements to be merged, it's size must be nB * nElemWidth
|
|
|
in bytes.
|
|
|
nB: number of elements in vpB
|
|
|
nElemWidth: the width, in bytes of each element of pElems
|
|
|
pfnCompare: callback comparison function, should return 0, less than
|
|
|
zero or greater than zero if the left comparand is equal to, less
|
|
|
than, or greater than, the right comparand, respectively.
|
|
|
pCompareCx: the context passed as the first parameter by pfnCompare
|
|
|
|
|
|
Return Value:
|
|
|
none
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_uniq()
|
|
|
|
|
|
Description:
|
|
|
Removes duplicate entries from a sorted array.
|
|
|
|
|
|
Prototype:
|
|
|
int std_uniq(void* vpElems, int nNumElems, int nElemWidth,
|
|
|
int (*pfnCompare)(void*, const void*, const void*),
|
|
|
void* pCompareCx);
|
|
|
|
|
|
Parameters:
|
|
|
pElems: array of elements to be searched. It's size
|
|
|
must be nNumElems * nElemWidth in bytes.
|
|
|
nNumElems: number of elements in pElems
|
|
|
nElemWidth: the width, in bytes of each element of pElems
|
|
|
pfnCompare: callback comparison function, should return 0, less than
|
|
|
zero or greater than zero if the left comparand is equal to, less
|
|
|
than, or greater than, the right comparand, respectively.
|
|
|
pCompareCx: the context passed as the first parameter by pfnCompare
|
|
|
|
|
|
Return Value:
|
|
|
the number of uniq elements left in vpElems
|
|
|
|
|
|
=======================================================================
|
|
|
|
|
|
std_scand()
|
|
|
|
|
|
Description:
|
|
|
|
|
|
The std_scand() converts the initial portion of an input ASCII string
|
|
|
to it's corresponding floating point value. It expects the input
|
|
|
string to match the following pattern:
|
|
|
===pre>
|
|
|
<Spaces><Subject String><Rest Of The String>
|
|
|
===/pre>
|
|
|
|
|
|
'Spaces' - is zero or more ASCII space or tab characters.
|
|
|
'Subject String' - is the part of the input string that represents a
|
|
|
valid floating point constant.
|
|
|
'Rest Of The String' - is the remaining sequence of one or more
|
|
|
characters including the terminating null
|
|
|
character of the input string.
|
|
|
|
|
|
A valid subject string can be one of the following:
|
|
|
-- <NAN>, ignoring case. This is interpreted as a quiet NAN.
|
|
|
-- [+|-]<INF|INFINITY>, ignoring case. This is interpreted as an
|
|
|
infinity.
|
|
|
-- [+|-]<Valid Floating Point Number>
|
|
|
|
|
|
In general, a valid floating poing number can either be a decimal
|
|
|
number or an hexadecimal number, and has the following form:
|
|
|
<Integral Part>[.[<Fractional Part>]][<Exponent>]
|
|
|
where the intergral, fractional and the exponent part may consist of
|
|
|
sequence of valid decimal or hexadecimal digits. More specifically:
|
|
|
|
|
|
For a decimal floating point number:
|
|
|
'Integral Part' - <Decimal Digits>
|
|
|
'Fractional Part' - <Decimal Digits>
|
|
|
'Exponent' - <e|E><Decimal Digits>
|
|
|
For a hexadecimal floating point number:
|
|
|
'Integral Part' - <Hexadecimal Digits>
|
|
|
'Fractional Part' - <Hexadecimal Digits>
|
|
|
'Exponent' - <p|P><Decimal Digits>
|
|
|
|
|
|
where:
|
|
|
'Decimal Digits' - is any number of digits in the range [0,10].
|
|
|
'Hexadecimal Digits' - is any number of digits in the range [0,10]
|
|
|
or the alphabets A through F.
|
|
|
'e','E','p','P' - represent the exponent characters
|
|
|
|
|
|
Prototype:
|
|
|
|
|
|
double std_scand(const char *pchBuf, const char **ppchEnd);
|
|
|
|
|
|
Parameters:
|
|
|
|
|
|
pchBuf [in] : the start of the string to scan.
|
|
|
|
|
|
ppchEnd [out] : if ppchEnd is not NULL, *ppchEnd points to the first
|
|
|
character after the parsed number.
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
This function returns the converted numeric result. If the string
|
|
|
does not contain a valid floating point number then the function
|
|
|
returns zero. If the converted value is outside the range of
|
|
|
representable values (overflow), [-]INFINITY is
|
|
|
returned. In case of an underflow, the function returns zero.
|
|
|
|
|
|
=======================================================================*/
|
|
|
|
|
|
#endif // AEESTD_H
|
|
|
|
|
|
|