📄 lib_str.c
字号:
* (2) ... number of digits to format is non-zero, ...
* (3) ... & the 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' character array is pre-/post-terminated, NULL-character
* terminate option DISABLED will cause character string run-on.
*
* (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' +
* 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) Base is passed an invalid base (see Note #2).
* (1) No string format performed; NULL pointer returned.
*
* (c) Number successfully formatted into character string array.
*********************************************************************************************************
*/
/*$PAGE*/
CPU_CHAR *Str_FmtNbr_Int32U (CPU_INT32U nbr,
CPU_INT08U nbr_dig,
CPU_INT08U nbr_base,
CPU_BOOLEAN lead_zeros,
CPU_BOOLEAN lower_case,
CPU_BOOLEAN nul,
CPU_CHAR *pstr)
{
CPU_CHAR *pstr_fmt;
CPU_INT32U nbr_fmt;
CPU_INT32U nbr_exp;
CPU_INT32U nbr_dig_val;
CPU_INT08U log_ceil;
CPU_INT08U i;
CPU_BOOLEAN ovf;
if (pstr == (CPU_CHAR *)0) { /* Rtn NULL if str ptr NULL (see Note #6a). */
return ((CPU_CHAR *)0);
}
/* Rtn NULL if invalid base (see Note #6b). */
if ((nbr_base < 2) ||
(nbr_base > 36)) {
return ((CPU_CHAR *)0);
}
if (lead_zeros != DEF_YES) { /* If lead zeros NOT ENABLED, ... */
log_ceil = 1; /* ... calc ceil[log(nbr)] ... */
nbr_exp = nbr_base;
ovf = DEF_NO;
while ((nbr_exp <= nbr) &&
(ovf == DEF_NO)) {
if (nbr_exp < Str_FmtNbr_Int32U_MultOvfThTbl[nbr_base]) {
nbr_exp *= nbr_base;
} else {
ovf = DEF_YES;
}
log_ceil++;
}
if (nbr_dig > log_ceil) {
nbr_dig = log_ceil; /* ... & lim max nbr digs. */
}
}
nbr_fmt = nbr;
pstr_fmt = pstr + nbr_dig;
if (nul != DEF_NO) { /* If NOT DISABLED, append NULL char (see Note #4). */
*pstr_fmt = (CPU_CHAR)0;
}
pstr_fmt--;
if (nbr_dig > 0) {
for (i = 1; i <= nbr_dig; i++) { /* Fmt str for desired nbr digs. */
nbr_dig_val = nbr_fmt % nbr_base;
if (nbr_dig_val <= 9) {
*pstr_fmt-- = (CPU_CHAR)(nbr_dig_val + '0');
} else {
if (lower_case != DEF_YES) {
*pstr_fmt-- = (CPU_CHAR)(nbr_dig_val + 'A' - 10);
} else {
*pstr_fmt-- = (CPU_CHAR)(nbr_dig_val + 'a' - 10);
}
}
nbr_fmt /= nbr_base; /* Shift nbr to next more significant dig. */
}
}
return (pstr); /* Rtn ptr to fmt'd str (see Note #6c). */
}
/*$PAGE*/
/*
*********************************************************************************************************
* Str_FmtNbr_Int32S()
*
* Description : Format signed integer into a multi-digit character string.
*
* Argument(s) : nbr Number to format.
*
* nbr_dig Number of digits to format (see Note #1).
*
* nbr_base Base of number to format (see Note #2).
*
* lead_zeros Prepend leading zeros (see Note #3) :
*
* DEF_NO Do NOT prepend leading zeros to string.
* DEF_YES Prepend leading zeros to string.
*
* lower_case Format alphabetic characters (if any) in lower case :
*
* DEF_NO Format alphabetic characters in upper case.
* DEF_YES Format alphabetic characters in lower case.
*
* nul Append terminating NULL-character (see Note #4) :
*
* DEF_NO Do NOT append terminating NULL-character to string.
* DEF_YES Append terminating NULL-character to string.
*
* pstr 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) : Application.
*
* Note(s) : (1) (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
* nbr_dig = 3
*
* pstr = "456"
*
* (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
* nbr_dig = 3
*
* pstr = "-456"
*
* (2) The number's base MUST be between 2 & 36, inclusive.
*
* (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 is DISABLED, ...
* (2) ... number of digits to format is non-zero, ...
* (3) ... & the 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' 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' +
* 1 negative sign +
* 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) Base is passed an invalid base (see Note #2).
* (1) No string format performed; NULL pointer returned.
*
* (c) Number successfully formatted into character string array.
*********************************************************************************************************
*/
CPU_CHAR *Str_FmtNbr_Int32S (CPU_INT32S nbr,
CPU_INT08U nbr_dig,
CPU_INT08U nbr_base,
CPU_BOOLEAN lead_zeros,
CPU_BOOLEAN lower_case,
CPU_BOOLEAN nul,
CPU_CHAR *pstr)
{
CPU_CHAR *pstr_fmt;
CPU_CHAR *pstr_nbr;
CPU_INT32S nbr_fmt;
if (pstr == (CPU_CHAR *)0) { /* Rtn NULL if str ptr NULL (see Note #6a). */
return ((CPU_CHAR *)0);
}
/* Rtn NULL if invalid base (see Note #6b). */
if ((nbr_base < 2) ||
(nbr_base > 36)) {
return ((CPU_CHAR *)0);
}
nbr_fmt = nbr;
pstr_fmt = pstr;
if (nbr_fmt < 0) { /* If nbr neg, ... */
nbr_fmt = -nbr_fmt; /* ... negate nbr; ... */
if (nbr_dig > 0) { /* ... & if at least one dig, ... */
*pstr_fmt++ = '-'; /* ... prepend a neg sign. */
}
}
/* Fmt rem'ing unsigned nbr. */
pstr_nbr = Str_FmtNbr_Int32U((CPU_INT32U )nbr_fmt,
(CPU_INT08U )nbr_dig,
(CPU_INT08U )nbr_base,
(CPU_BOOLEAN)lead_zeros,
(CPU_BOOLEAN)lower_case,
(CPU_BOOLEAN)nul,
(CPU_CHAR *)pstr_fmt);
if (pstr_nbr == (CPU_CHAR *)0) {
return ((CPU_CHAR *)0);
}
return (pstr); /* Rtn ptr to fmt'd str (see Note #6c). */
}
/*$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 decimal digits to format (see Note #2).
*
* nbr_dp Number of decimal point digits to format.
*
* lead_zeros Prepend leading zeros (see Note #3) :
*
* DEF_NO Do NOT prepend leading zeros to string.
* DEF_YES Prepend leading zeros to string.
*
* nul Append terminating NULL-character (see Note #4) :
*
* DEF_NO Do NOT append terminating NULL-character to string.
* DEF_YES Append terminating NULL-character to string.
*
* pstr 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) : Application.
*
* Note(s) : (1) (a) The maximum accuracy for 32-bit floating-point numbers :
*
*
* Maximum Accuracy log [Internal-Base ^ (Number-Internal-Base-Digit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -