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

📄 lib_str.c

📁 ucosII在DRAGONBALL MX21上的移植 开发环境为IAR
💻 C
📖 第 1 页 / 共 3 页
字号:
* Caller(s)   : various.
*
* Note(s)     : (1) String buffer NOT modified.
*
*               (2) String search terminates when :
*
*                   (a) String pointer passed a NULL pointer.
*                       (1) No string search performed; NULL pointer returned.
*
*                   (b) 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.
*
*                   (c) Search character found.
*                       (1) Return pointer to first occurrence of search character in search string.
*********************************************************************************************************
*/
CPU_CHAR  *Str_Char_R (CPU_CHAR  *pstr,
                       CPU_CHAR   srch_char)
{
    CPU_CHAR  *pstr_next;


    if (pstr == (CPU_CHAR *)0) {                                /* Rtn NULL if srch str ptr NULL (see Note #2a).        */
        return ((CPU_CHAR *)0);
    }


    pstr_next  = pstr;
    pstr_next += Str_Len(pstr);
    while (( pstr_next != pstr) &&                              /* Srch str from end until beg (see Note #2b) ...       */
           (*pstr_next != srch_char)) {                         /* ... or srch char (see Note #2c) found.               */
        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).                        */
    }

    return (pstr_next);                                         /* Else rtn ptr to found srch char (see Note #2c).      */
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                             Str_Str()
*
* Description : Search string for substring.
*
* Argument(s) : pstr            Pointer to string (see Note #1).
*
*               psrch_str       Pointer to search substring (see Note #2).
*
* Return(s)   : Pointer to first occurrence of search substring in string, if any.
*
*               Pointer to NULL,                                           otherwise.
*
* Caller(s)   : various.
*
* Note(s)     : (1) String buffer NOT modified.
*
*               (2) Search substring buffer NOT modified.
*
*               (3) Substring search terminates when :
*
*                   (a) String pointer passed a NULL pointer.
*                       (1) No string search performed; NULL pointer returned.
*
*                   (b) Substring pointer passed a NULL pointer.
*                       (1) No string search performed; NULL pointer returned.
*
*                   (c) Search substring length > String length
*                       (1) No string search performed; NULL pointer returned.
*
*                   (d) All search space have been tried.
*                       (1) Size of search space is defined as the substraction
*                           of the search substring length to the string length.
*                       (2) Search substring not found; NULL pointer returned.
*
*                   (e) Search substring found.
*                       (1) Search substring is found according to Str_Cmp_N() return value.
*                       (2) Return pointer to first occurrence of search substring in string.
*********************************************************************************************************
*/

CPU_CHAR  *Str_Str (CPU_CHAR  *pstr,
                    CPU_CHAR  *psrch_str)
{
    CPU_INT32S  str_len;
    CPU_INT32S  srch_str_len;
    CPU_INT32S  srch_nb;
    CPU_INT32S  srch_res;
    CPU_INT32U  ix;


    if (pstr == (CPU_CHAR *)0) {                                /* Rtn NULL if pstr ptr NULL (see Note #3a).            */
        return ((CPU_CHAR *)0);
    }

    if (psrch_str == (CPU_CHAR *)0) {                           /* Rtn NULL if srch str ptr NULL (see Note #3b).        */
        return ((CPU_CHAR *)0);
    }

    str_len       = Str_Len(pstr);
    srch_str_len  = Str_Len((CPU_CHAR *)psrch_str);
    srch_nb       = str_len - srch_str_len;                     /* Determine the search space length (see Note #3d).    */
    if (srch_nb < 0) {                                          /* Srch substr len > str len, rtn NULL (see Note #3c).  */
        return ((CPU_CHAR *)0);
    }

    for (ix = 0; ix <= srch_nb; ix++) {
        srch_res = Str_Cmp_N(pstr + ix, (CPU_CHAR *)psrch_str, srch_str_len);
        if (srch_res == 0) {
            break;
        }
    }

    if (srch_res != 0) {                                        /* All search space tried, rtn NULL (see Note #3d).     */
        return ((CPU_CHAR *)0);
    }

    return (pstr + ix);                                         /* Substr found, rtn substr pos in str (see Note #3e).  */
}


/*$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 + -