📄 lib_str.c
字号:
*
* (2) String copy terminates when :
*
* (a) Destination/Source string pointer(s) are passed NULL pointers.
* (1) No string copy performed; NULL pointer returned.
*
* (b) Destination/Source string pointer(s) points to NULL.
* (1) String buffer(s) overlap with NULL address.
* (2) Source string copied into destination string buffer up to but NOT beyond or
* including the NULL address; destination string buffer properly terminated
* with NULL character.
*
* (c) Source string's terminating NULL character found.
* (1) Entire source string copied into destination string buffer.
*
* (d) 'len_max' number of characters copied.
* (1) 'len_max' number of characters does NOT include the terminating NULL character.
*
* See also Note #1a.
*********************************************************************************************************
*/
CPU_CHAR *Str_Copy_N (CPU_CHAR *pdest,
CPU_CHAR *psrc,
CPU_SIZE_T len_max)
{
CPU_CHAR *pstr;
CPU_CHAR *pstr_next;
CPU_SIZE_T len_copy;
/* Rtn NULL if str ptr(s) NULL (see Note #2a). */
if (pdest == (CPU_CHAR *)0) {
return ((CPU_CHAR *)0);
}
if (psrc == (CPU_CHAR *)0) {
return ((CPU_CHAR *)0);
}
if (len_max == (CPU_SIZE_T)0) { /* Rtn NULL if copy len equals zero (see Note #2d). */
return ((CPU_CHAR *)0);
}
pstr = pdest;
pstr_next = pstr;
pstr_next++;
len_copy = 0;
while (( pstr_next != (CPU_CHAR *)0) && /* Copy str until NULL ptr(s) (see Note #2b) ... */
( psrc != (CPU_CHAR *)0) &&
(*psrc != (CPU_CHAR )0) && /* ... or NULL char found (see Note #2c); ... */
( len_copy < (CPU_SIZE_T)len_max)) { /* ... or max nbr chars copied (see Note #2d). */
*pstr = *psrc;
pstr++;
pstr_next++;
psrc++;
len_copy++;
}
*pstr = (CPU_CHAR)0; /* Append NULL char (see Note #2b2). */
return (pdest);
}
/*$PAGE*/
/*
*********************************************************************************************************
* Str_Cat()
*
* Description : Append concatenation string to destination string.
*
* Argument(s) : pdest Pointer to destination string to append concatenation string (see Note #1).
*
* pstr_cat Pointer to concatenation string to append to destination string.
*
* Return(s) : Pointer to destination string, if NO errors (see Note #2).
*
* Pointer to NULL, otherwise.
*
* Caller(s) : Application.
*
* Note(s) : (1) Destination string buffer size NOT validated; buffer overruns MUST be prevented by caller.
*
* (a) Destination buffer size MUST be large enough to accommodate the entire concatenated
* string size including the terminating NULL character.
*
* (2) String concatenation terminates when :
*
* (a) Destination/Concatenation string pointer(s) are passed NULL pointers.
* (1) No string concatenation performed; NULL pointer returned.
*
* (b) Destination string overlaps with NULL address.
* (1) No string concatenation performed; NULL pointer returned.
*
* (c) Destination/Concatenation string pointer(s) points to NULL.
* (1) String buffer(s) overlap with NULL address.
* (2) Concatenation string appended into destination string buffer up to but NOT
* beyond or including the NULL address; destination string buffer properly
* terminated with NULL character.
*
* (d) Concatenation string's terminating NULL character found.
* (1) Entire concatenation string appended to destination string.
*********************************************************************************************************
*/
CPU_CHAR *Str_Cat (CPU_CHAR *pdest,
CPU_CHAR *pstr_cat)
{
CPU_CHAR *pstr;
CPU_CHAR *pstr_next;
/* Rtn NULL if str ptr(s) NULL (see Note #2a). */
if (pdest == (CPU_CHAR *)0) {
return ((CPU_CHAR *)0);
}
if (pstr_cat == (CPU_CHAR *)0) {
return ((CPU_CHAR *)0);
}
pstr = pdest;
while (( pstr != (CPU_CHAR *)0) && /* Adv to end of cur dest str until NULL ptr ... */
(*pstr != (CPU_CHAR )0)) { /* ... or NULL char found.. */
pstr++;
}
if (pstr == (CPU_CHAR *)0) { /* If NULL str overrun, rtn NULL (see Note #2b). */
return ((CPU_CHAR *)0);
}
pstr_next = pstr;
pstr_next++;
while (( pstr_next != (CPU_CHAR *)0) && /* Cat str until NULL ptr(s) (see Note #2c) ... */
( pstr_cat != (CPU_CHAR *)0) &&
(*pstr_cat != (CPU_CHAR )0)) { /* ... or NULL char found (see Note #2d). */
*pstr = *pstr_cat;
pstr++;
pstr_next++;
pstr_cat++;
}
*pstr = (CPU_CHAR)0; /* Append NULL char (see Note #2c2). */
return (pdest);
}
/*$PAGE*/
/*
*********************************************************************************************************
* Str_Cat_N()
*
* Description : Append concatenation string to destination string, up to a maximum number of characters.
*
* Argument(s) : pdest Pointer to destination string to append concatenation string (see Note #1).
*
* pstr_cat Pointer to concatenation string to append to destination string.
*
* len_max Maximum number of characters to concatenate (see Note #2e).
*
* Return(s) : Pointer to destination string, if NO errors (see Note #2).
*
* Pointer to NULL, otherwise.
*
* Caller(s) : Application.
*
* Note(s) : (1) Destination string buffer size NOT validated; buffer overruns MUST be prevented by caller.
*
* (a) Destination buffer size MUST be large enough to accommodate the entire concatenated
* string size including the terminating NULL character.
*
* (2) String concatenation terminates when :
*
* (a) Destination/Concatenation string pointer(s) are passed NULL pointers.
* (1) No string concatenation performed; NULL pointer returned.
*
* (b) Destination string overlaps with NULL address.
* (1) No string concatenation performed; NULL pointer returned.
*
* (c) Destination/Concatenation string pointer(s) points to NULL.
* (1) String buffer(s) overlap with NULL address.
* (2) Concatenation string appended into destination string buffer up to but NOT
* beyond or including the NULL address; destination string buffer properly
* terminated with NULL character.
*
* (d) Concatenation string's terminating NULL character found.
* (1) Entire concatenation string appended to destination string.
*
* (e) 'len_max' number of characters concatenated.
* (1) 'len_max' number of characters does NOT include the terminating NULL character.
*
* See also Note #1a.
*********************************************************************************************************
*/
/*$PAGE*/
CPU_CHAR *Str_Cat_N (CPU_CHAR *pdest,
CPU_CHAR *pstr_cat,
CPU_SIZE_T len_max)
{
CPU_CHAR *pstr;
CPU_CHAR *pstr_next;
CPU_SIZE_T len_cat;
/* Rtn NULL if str ptr(s) NULL (see Note #2a). */
if (pdest == (CPU_CHAR *)0) {
return ((CPU_CHAR *)0);
}
if (pstr_cat == (CPU_CHAR *)0) {
return ((CPU_CHAR *)0);
}
if (len_max == (CPU_SIZE_T)0) { /* Rtn NULL if cat len equals zero (see Note #2e). */
return ((CPU_CHAR *)0);
}
pstr = pdest;
while (( pstr != (CPU_CHAR *)0) && /* Adv to end of cur dest str until NULL ptr ... */
(*pstr != (CPU_CHAR )0)) { /* ... or NULL char found.. */
pstr++;
}
if (pstr == (CPU_CHAR *)0) { /* If NULL str overrun, rtn NULL (see Note #2b). */
return ((CPU_CHAR *)0);
}
pstr_next = pstr;
pstr_next++;
len_cat = 0;
while (( pstr_next != (CPU_CHAR *)0) && /* Cat str until NULL ptr(s) (see Note #2c) ... */
( pstr_cat != (CPU_CHAR *)0) &&
(*pstr_cat != (CPU_CHAR )0) && /* ... or NULL char found (see Note #2d); ... */
( len_cat < (CPU_SIZE_T)len_max)) { /* ... or max nbr chars cat'd (see Note #2d). */
*pstr = *pstr_cat;
pstr++;
pstr_next++;
pstr_cat++;
len_cat++;
}
*pstr = (CPU_CHAR)0; /* Append NULL char (see Note #2c2). */
return (pdest);
}
/*$PAGE*/
/*
*********************************************************************************************************
* Str_Cmp()
*
* Description : Determine if two strings are identical.
*
* Argument(s) : p1_str Pointer to first string (see Note #1).
*
* p2_str Pointer to second string (see Note #1).
*
* Return(s) : 0, if strings are identical (see Notes #2a, #2e, & #2f).
*
* Negative value, if 'p1_str' is less than 'p2_str' (see Notes #2b, #2g, & #2d).
*
* Positive value, if 'p1_str' is greater than 'p2_str' (see Notes #2c, #2h, & #2d).
*
* Caller(s) : Application.
*
* Note(s) : (1) String buffers NOT modified.
*
* (2) String comparison terminates when :
*
* (a) BOTH string pointer(s) are passed NULL pointers.
* (1) NULL strings identical; return 0.
*
* (b) 'p1_str' passed a NULL pointer.
* (1) Return negative value of character pointed to by 'p2_str'.
*
* (c) 'p2_str' passed a NULL pointer.
* (1) Return positive value of character pointed to by 'p1_str'.
*
* (d) Non-matching characters found.
* (1) Return signed-integer difference of the character pointed to by 'p2_str'
* from the character pointed to by 'p1_str'.
*
* (e) Terminating NULL character found in both strings.
* (1) Strings identical; return 0.
* (2) Only one NULL character test required in conditional since previous condition
* tested character equality.
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -