?? lib_str.c
字號:
*
* (c) String searched from end to beginning.
* (1) Search character NOT found in search string; NULL pointer returned.
* (2) Applicable ONLY IF search character is NOT the terminating NULL character.
*
* (d) Search character found.
* (1) Return pointer to first occurrence of search character in search string.
*********************************************************************************************************
*/
CPU_CHAR *Str_Char_Last (CPU_CHAR *pstr,
CPU_CHAR srch_char)
{
CPU_CHAR *pstr_next;
CPU_SIZE_T str_len;
if (pstr == (CPU_CHAR *)0) { /* Rtn NULL if srch str ptr NULL (see Note #2a). */
return ((CPU_CHAR *)0);
}
pstr_next = pstr;
str_len = Str_Len(pstr);
pstr_next += str_len;
while (( pstr_next != pstr) && /* Srch str from end until beg (see Note #2c) ... */
(*pstr_next != srch_char)) { /* ... until srch char found (see Note #2d). */
pstr_next--;
}
if (*pstr_next != srch_char) { /* If srch char NOT found, str points to NULL; ... */
return ((CPU_CHAR *)0); /* ... rtn NULL (see Notes #2b & #2c). */
}
return (pstr_next); /* Else rtn ptr to found srch char (see Note #2d). */
}
/*$PAGE*/
/*
*********************************************************************************************************
* Str_Str()
*
* Description : Search string for first occurence of a specific search string.
*
* Argument(s) : pstr Pointer to string (see Note #1).
*
* psrch_str Pointer to search string (see Note #1).
*
* Return(s) : Pointer to first occurrence of search string in string, if any.
*
* Pointer to NULL, otherwise.
*
* Caller(s) : various.
*
* Note(s) : (1) String buffers NOT modified.
*
* (2) String search terminates when :
*
* (a) String pointer passed a NULL pointer.
* (1) No string search performed; NULL pointer returned.
*
* (b) Search string length greater than string length.
* (1) No string search performed; NULL pointer returned.
*
* (c) Search string length equal to zero.
* (1) NULL search string at end of string returned.
*
* (d) Entire string has been searched.
* (1) Maximum size of the search is defined as the subtraction of the
* search string length from the string length.
* (2) Search string not found; NULL pointer returned.
*
* (e) Search string found.
* (1) Search string found according to Str_Cmp_N() return value.
* (2) Return pointer to first occurrence of search string in string.
*********************************************************************************************************
*/
CPU_CHAR *Str_Str (CPU_CHAR *pstr,
CPU_CHAR *psrch_str)
{
CPU_SIZE_T str_len;
CPU_SIZE_T srch_str_len;
CPU_SIZE_T srch_len;
CPU_SIZE_T srch_ix;
CPU_BOOLEAN srch_done;
CPU_INT16S srch_cmp;
CPU_CHAR *pstr_srch_ix;
/* Rtn NULL if str ptr(s) NULL (see Note #2a). */
if (pstr == (CPU_CHAR *)0) {
return ((CPU_CHAR *)0);
}
if (psrch_str == (CPU_CHAR *)0) {
return ((CPU_CHAR *)0);
}
str_len = Str_Len(pstr);
srch_str_len = Str_Len(psrch_str);
if (srch_str_len > str_len) { /* If srch str len > str len, rtn NULL (see Note #2b). */
return ((CPU_CHAR *)0);
}
if (srch_str_len == 0) { /* If srch str len = 0, srch str equal NULL str; ... */
pstr_srch_ix = (CPU_CHAR *)(pstr + str_len); /* ... rtn ptr to NULL str found in str (see Note #2c). */
return (pstr_srch_ix);
}
srch_len = str_len - srch_str_len; /* Determine srch len (see Note #2d1). */
srch_ix = 0;
srch_done = DEF_NO;
while ((srch_done == DEF_NO) && (srch_ix <= srch_len)) {
pstr_srch_ix = (CPU_CHAR *)(pstr + srch_ix);
srch_cmp = Str_Cmp_N(pstr_srch_ix, psrch_str, srch_str_len);
srch_done = (srch_cmp == 0) ? DEF_YES : DEF_NO;
srch_ix++;
}
if (srch_cmp != 0) { /* If srch str NOT found, rtn NULL (see Note #2d). */
return ((CPU_CHAR *)0);
}
return (pstr_srch_ix); /* Rtn ptr to srch str found in str (see Note #2e). */
}
/*$PAGE*/
/*
*********************************************************************************************************
* Str_FmtNbr_32()
*
* Description : Format number into a multi-digit character string.
*
* Argument(s) : nbr Number to format (see Note #1).
*
* nbr_dig Number of integer digits to format (see Note #2).
*
* nbr_dp Number of decimal point digits to format.
*
* lead_zeros Prepend leading zeros option (DEF_YES/DEF_NO) [see Note #3].
*
* nul NULL-character terminate option (DEF_YES/DEF_NO) [see Note #4].
*
* pstr_fmt Pointer to character array to return formatted number string (see Note #5).
*
* Return(s) : Pointer to formatted string, if NO errors (see Note #6).
*
* Pointer to NULL, otherwise.
*
* Caller(s) : various.
*
* Note(s) : (1) (a) The maximum accuracy for 32-bit floating-point numbers :
*
*
* Maximum Accuracy log [Internal-Base ^ (Number-Internal-Base-Digits)]
* 32-bit Floating-point Number = -----------------------------------------------------
* log [External-Base]
*
* log [2 ^ 24]
* = --------------
* log [10]
*
* < 7.225 Base-10 Digits
*
* where
* Internal-Base Internal number base of floating-
* point numbers (i.e. 2)
* External-Base External number base of floating-
* point numbers (i.e. 10)
* Number-Internal-Base-Digits Number of internal number base
* significant digits (i.e. 24)
*
* (b) Some compilers' floating-point routines MAY further reduce the maximum accuracy.
*
* (c) If the total number of digits to format ('nbr_dig + nbr_dp') is greater than the
* maximum accuracy; digits following the first, significantly-accurate digits will
* be inaccurate.
*
* (2) (a) If the number of digits to format ('nbr_dig') is less than the number of significant
* integer digits of the number to format ('nbr'); then the most-significant digits of
* the formatted number will be truncated.
*
* Example :
*
* nbr = 23456.789
* nbr_dig = 3
* nbr_dp = 2
*
* pstr_fmt = "456.78"
*
* (b) If number to format ('nbr') is negative but the most-significant digits of the
* formatted number are truncated (see Note #2a); the negative sign still prefixes
* the truncated formatted number.
*
* Example :
*
* nbr = -23456.789
* nbr_dig = 3
* nbr_dp = 2
*
* pstr_fmt = "-456.78"
*
* (3) (a) Leading zeros option prepends leading '0's prior to the first non-zero digit.
* The number of leading zeros is such that the total number integer digits is
* equal to the requested number of integer digits to format ('nbr_dig').
*
* (b) (1) If leading zeros option DISABLED, ...
* (2) ... number of digits to format is non-zero, ...
* (3) ... & the integer value of the number to format is zero; ...
* (4) ... then one digit of '0' value is formatted.
*
* This is NOT a leading zero; but a single integer digit of '0' value.
*
* (4) (a) NULL-character terminate option DISABLED prevents overwriting previous character
* array formatting.
*
* (b) WARNING: Unless 'pstr_fmt' character array is pre-/post-terminated, NULL-character
* terminate option DISABLED will cause character string run-on.
*$PAGE*
* (5) (a) Format buffer size NOT validated; buffer overruns MUST be prevented by caller.
*
* (b) To prevent character buffer overrun :
*
* Character array size MUST be >= ('nbr_dig' +
* 'nbr_dp' +
* 1 negative sign +
* 1 decimal point +
* 1 'NUL' terminator) characters
*
* (6) String format terminates when :
*
* (a) Format string pointer is passed a NULL pointer.
* (1) No string format performed; NULL pointer returned.
*
* (b) Number successfully formatted into character string array.
*********************************************************************************************************
*/
#if (LIB_STR_CFG_FP_EN == DEF_ENABLED)
CPU_CHAR *Str_FmtNbr_32 (CPU_FP32 nbr,
CPU_INT08U nbr_dig,
CPU_INT08U nbr_dp,
CPU_BOOLEAN lead_zeros,
CPU_BOOLEAN nul,
CPU_CHAR *pstr_fmt)
{
CPU_CHAR *pstr;
CPU_INT08U i;
CPU_INT32U dig_nbr;
CPU_INT32U dig_val;
CPU_FP32 dig_exp;
CPU_FP32 dp_exp;
/* Rtn NULL if str ptr NULL (see Note #6a). */
if (pstr_fmt == (CPU_CHAR *)0) {
return ((CPU_CHAR *)0);
}
pstr = pstr_fmt;
if (nbr < 0.0) { /* If nbr neg, ... */
if ((nbr_dig > 0) || /* ... & at least one dig ... */
(nbr_dp > 0)) { /* ... or at least one dp; ... */
nbr = -nbr; /* ... negate nbr & ... */
*pstr++ = '-'; /* ... prefix with neg sign (see Note #2b). */
}
}
if (nbr_dig > 0) {
dig_exp = 1.0;
for (i = 1; i < nbr_dig; i++) {
dig_exp *= 10.0;
}
for (i = nbr_dig; i > 0; i--) { /* Fmt str for desired nbr digs. */
dig_nbr = (CPU_INT32U)(nbr / dig_exp);
if ((dig_nbr > 0) || /* If dig nbr > 0, ... */
(nbr_dig == 1) || /* ... OR exactly 1 dig to fmt, ... */
(i == 1) || /* ... OR on one's dig to fmt, ... */
(lead_zeros == DEF_YES)) { /* ... OR lead zeros opt ENABLED (see Note #3), ... */
/* ... calc & fmt dig val. */
dig_val = (CPU_INT32U)(dig_nbr % 10 );
*pstr++ = (CPU_CHAR )(dig_val + '0');
}
dig_exp /= 10.0; /* Shift to next least-significant dig. */
}
}
if (nbr_dp > 0) {
*pstr++ = '.'; /* Append dp prior to dp conversion. */
dp_exp = 10.0;
for (i = 0; i < nbr_dp; i++) { /* Fmt str for desired nbr dp. */
dig_nbr = (CPU_INT32U)(nbr * dp_exp );
dig_val = (CPU_INT32U)(dig_nbr % 10 );
*pstr++ = (CPU_CHAR )(dig_val + '0');
dp_exp *= 10.0; /* Shift to next least-significant dp. */
}
}
if (nul != DEF_NO) { /* If NOT DISABLED, append NULL char (see Note #4). */
*pstr = (CPU_CHAR)0;
}
return (pstr_fmt);
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -