⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib_str.c

📁 lpc2478+ucosII+ucgui源码
💻 C
📖 第 1 页 / 共 5 页
字号:
*                       (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 + -