📄 lib_str.c
字号:
*
* (2) (A) "The initial byte of 's2' ('pstr_cat') overwrites the null byte at the
* end of 's1' ('pstr_dest')."
* (B) A "terminating null byte" is appended at the end of the concatenated
* destination strings.
*
* (b) IEEE Std 1003.1, 2004 Edition, Section 'strcat() : RETURN VALUE' states that :
*
* (1) "The strcat() function shall return 's1' ('pstr_dest');" ...
* (2) "no return value shall be reserved to indicate an error."
* (A) #### This requirement is intentionally NOT implemented in order to return
* NULL for any error(s).
*
* (c) IEEE Std 1003.1, 2004 Edition, Section 'strcat() : DESCRIPTION' states that "if
* copying takes place between objects that overlap, the behavior is undefined."
*
* (3) String concatenation terminates when :
*
* (a) Destination/Concatenation string pointer(s) are passed NULL pointers.
* (1) No string concatenation performed; NULL pointer returned.
*
* (b) Destination/Concatenation string pointer(s) point to NULL.
* (1) String buffer(s) overlap with NULL address; NULL pointer returned.
*
* (c) Concatenation string's terminating NULL character found.
* (1) Entire concatenation string appended to destination string (see Note #2a1).
*********************************************************************************************************
*/
CPU_CHAR *Str_Cat ( CPU_CHAR *pstr_dest,
const CPU_CHAR *pstr_cat)
{
CPU_CHAR *pstr_rtn;
pstr_rtn = Str_Cat_N(pstr_dest,
pstr_cat,
DEF_INT_CPU_U_MAX_VAL);
return (pstr_rtn);
}
/*$PAGE*/
/*
*********************************************************************************************************
* Str_Cat_N()
*
* Description : Append concatenation string to destination string, up to a maximum number of characters.
*
* Argument(s) : pstr_dest Pointer to destination string to append concatenation string (see Note #1a).
*
* pstr_cat Pointer to concatenation string to append to destination string (see Note #1b).
*
* len_max Maximum number of characters to concatenate (see Notes #2a1B & #3d).
*
* Return(s) : Pointer to destination string, if NO error(s) [see Note #2b1].
*
* Pointer to NULL, otherwise (see Note #2b2A).
*
* Caller(s) : Application.
*
* Note(s) : (1) (a) Destination buffer size NOT validated; buffer overruns MUST be prevented by caller.
*
* (1) Destination buffer size MUST be large enough to accommodate the entire
* concatenated string size including the terminating NULL character.
*
* (b) Concatenation string buffer NOT modified.
*
* (2) (a) IEEE Std 1003.1, 2004 Edition, Section 'strncat() : DESCRIPTION' states that :
*
* (1) (A) "The strncat() function shall append ... the array pointed to by 's2'
* ('pstr_cat') to the end of the string pointed to by 's1' ('pstr_dest')" ...
* (B) but "not more than 'n' ('len_max') bytes".
*
* (2) (A) "The initial byte of 's2' ('pstr_cat') overwrites the null byte at the
* end of 's1' ('pstr_dest')."
* (B) "(a null byte and bytes that follow it are not appended)."
* (C) "A terminating null byte is always appended to the result."
*
* (b) IEEE Std 1003.1, 2004 Edition, Section 'strncat() : RETURN VALUE' states that :
*
* (1) "The strncat() function shall return 's1' ('pstr_dest');" ...
* (2) "no return value shall be reserved to indicate an error."
* (A) #### This requirement is intentionally NOT implemented in order to return
* NULL for any error(s).
*
* (c) IEEE Std 1003.1, 2004 Edition, Section 'strncat() : DESCRIPTION' states that "if
* copying takes place between objects that overlap, the behavior is undefined."
*
* (3) String concatenation terminates when :
*
* (a) Destination/Concatenation string pointer(s) are passed NULL pointers.
* (1) No string concatenation performed; NULL pointer returned.
*
* (b) Destination/Concatenation string pointer(s) point to NULL.
* (1) String buffer(s) overlap with NULL address; NULL pointer returned.
*
* (c) Concatenation string's terminating NULL character found.
* (1) Entire concatenation string appended to destination string (see Note #2a1A).
*
* (d) 'len_max' number of characters concatenated.
*
* (1) 'len_max' number of characters does NOT include the terminating NULL character
* (see Note #2a2).
*
* (2) Null concatenations allowed (i.e. zero-length concatenations).
* (A) No string concatenation performed; destination string returned
* (see Note #2b1).
*********************************************************************************************************
*/
/*$PAGE*/
CPU_CHAR *Str_Cat_N ( CPU_CHAR *pstr_dest,
const CPU_CHAR *pstr_cat,
CPU_SIZE_T len_max)
{
CPU_CHAR *pstr_cat_dest;
const CPU_CHAR *pstr_cat_src;
CPU_SIZE_T len_cat;
/* Rtn NULL if str ptr(s) NULL (see Note #3a1). */
if (pstr_dest == (CPU_CHAR *)0) {
return ((CPU_CHAR *)0);
}
if (pstr_cat == (const CPU_CHAR *)0) {
return ((CPU_CHAR *)0);
}
if (len_max < 1) { /* Rtn dest str if cat len = 0 (see Note #3d2A). */
return ((CPU_CHAR *)pstr_dest);
}
pstr_cat_dest = pstr_dest;
while (( pstr_cat_dest != (CPU_CHAR *) 0 ) && /* Adv to end of cur dest str until NULL ptr ... */
(*pstr_cat_dest != (CPU_CHAR )'\0')) { /* ... or NULL char found.. */
pstr_cat_dest++;
}
if (pstr_cat_dest == (CPU_CHAR *)0) { /* Rtn NULL if NULL ptr found (see Note #3b1). */
return ((CPU_CHAR *)0);
}
pstr_cat_src = pstr_cat;
len_cat = 0u;
while (( pstr_cat_dest != ( CPU_CHAR *) 0 ) && /* Cat str until NULL ptr(s) [see Note #3b] ... */
( pstr_cat_src != (const CPU_CHAR *) 0 ) &&
(*pstr_cat_src != ( CPU_CHAR )'\0') && /* ... or NULL char found (see Note #3c); ... */
( len_cat < ( CPU_SIZE_T)len_max)) { /* ... or max nbr chars cat'd (see Note #3d). */
*pstr_cat_dest = *pstr_cat_src;
pstr_cat_dest++;
pstr_cat_src++;
len_cat++;
}
/* Rtn NULL if NULL ptr(s) found (see Note #3b1). */
if ((pstr_cat_dest == ( CPU_CHAR *)0) ||
(pstr_cat_src == (const CPU_CHAR *)0)) {
return ((CPU_CHAR *)0);
}
*pstr_cat_dest = (CPU_CHAR)'\0'; /* Append NULL char (see Note #2a2C). */
return (pstr_dest); /* Rtn ptr to dest str (see Note #2b1). */
}
/*$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 #3a1A, #3a2A, & #3b).
*
* Negative value, if 'p1_str' is less than 'p2_str' (see Notes #3a1B1, #3a2B1, & #3c).
*
* Positive value, if 'p1_str' is greater than 'p2_str' (see Notes #3a1B2, #3a2B2, & #3c).
*
* See also Note #2b.
*
* Caller(s) : Application.
*
* Note(s) : (1) String buffers NOT modified.
*
* (2) (a) IEEE Std 1003.1, 2004 Edition, Section 'strcmp() : DESCRIPTION' states that "the
* strcmp() function shall compare the string pointed to by 's1' ('p1_str') to the
* string pointed to by 's2' ('p2_str)".
*
* (b) (1) IEEE Std 1003.1, 2004 Edition, Section 'strcmp() : RETURN VALUE' states that
* "upon successful completion, strcmp() shall return an integer greater than,
* equal to, or less than 0".
*
* (2) IEEE Std 1003.1, 2004 Edition, Section 'strcmp() : DESCRIPTION' adds that "the
* sign of a non-zero return value shall be determined by the sign of the difference
* between the values of the first pair of bytes ... that differ in the strings
* being compared".
*
* (3) String comparison terminates when :
*
* (a) (1) (A) BOTH string pointer(s) are passed NULL pointers.
* (1) NULL strings identical; 0 returned.
*
* (B) (1) 'p1_str' passed a NULL pointer.
* (a) Return negative value of character pointed to by 'p2_str'.
*
* (2) 'p2_str' passed a NULL pointer.
* (a) Return positive value of character pointed to by 'p1_str'.
*
* (2) (A) BOTH strings point to NULL.
* (1) Strings overlap with NULL address.
* (2) Strings identical up to but NOT beyond or including the NULL address;
* 0 returned.
*
* (B) (1) 'p1_str_cmp_next' points to NULL.
* (a) 'p1_str' overlaps with NULL address.
* (b) Strings compared up to but NOT beyond or including the NULL address.
* (c) Return negative value of character pointed to by 'p2_str_cmp_next'.
*
* (2) 'p2_str_cmp_next' points to NULL.
* (a) 'p2_str' overlaps with NULL address.
* (b) Strings compared up to but NOT beyond or including the NULL address.
* (c) Return positive value of character pointed to by 'p1_str_cmp_next'.
*
* (b) Terminating NULL character found in both strings.
* (1) Strings identical; 0 returned.
* (2) Only one NULL character test required in conditional since previous condition
* tested character equality.
*
* (c) 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'.
*
* (4) Since 16-bit signed arithmetic is performed to calculate a non-identical comparison
* return value, 'CPU_CHAR' native data type size MUST be 8-bit.
*********************************************************************************************************
*/
CPU_INT16S Str_Cmp (const CPU_CHAR *p1_str,
const CPU_CHAR *p2_str)
{
CPU_INT16S cmp_val;
cmp_val = Str_Cmp_N(p1_str,
p2_str,
DEF_INT_CPU_U_MAX_VAL);
return (cmp_val);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -