app_qp.c

来自「最新MTK手机软件源码」· C语言 代码 · 共 466 行 · 第 1/2 页

C
466
字号

        destl -= temp_len;

        kal_mem_cpy(dest + rt, dst, temp_len);
        kal_mem_set(dst, 0, APP_QP_BUF_LEN);
        rt += temp_len;
    }

    if (destl < 1)
    {
        return -1;
    }

    *(dest + rt) = '\0';    /* tie off results */

    return (kal_int32) rt;

}   /* end of applib_qprint_decode */


/*****************************************************************************
 * FUNCTION
 *  applib_find_qprint_boundary
 * DESCRIPTION
 *  This function finds the boundary in the qprint encoded text.
 * PARAMETERS
 *  ptr     [IN]        Pointer to the encoded buffer
 *  len     [IN]        Length of encoded data
 * RETURNS
 *  number of bytes shall be skipped.
 *****************************************************************************/
kal_uint16 applib_find_qprint_boundary(kal_char *ptr, kal_int32 len)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    /* with initial values */
    kal_uint16 left_over_bytes = 0;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (len >= 2 && *(ptr + len - 2) == '=')    /* penultimate */
    {
        left_over_bytes = 2;
    }
    else if (len >= 1 && *(ptr + len - 1) == '=')   /* ultimate */
    {
        left_over_bytes = 1;
    }

    return left_over_bytes;

}   /* end of applib_find_qprint_boundary */


/*****************************************************************************
 * FUNCTION
 *  applib_qprint_encode_ext
 * DESCRIPTION
 *  This function is used to encode given string into QP encoded string.
 * PARAMETERS
 *  src             [IN]            Source
 *  srcl            [IN]            Source length
 *  dest            [IN/OUT]        Dest buffer
 *  destl           [IN]            Destination buffer length
 *  encode_crlf     [IN]            TRUE:  "\r\n" ==> "=0D=0A"
 *  FALSE: "\r\n" ==> "\r\n"(?)
 * RETURNS
 *  negative: error
 *  ow: length of QP encoded buffer
 *****************************************************************************/
kal_int32 applib_qprint_encode_ext(
            kal_char *src,
            kal_uint32 srcl,
            kal_char *dest,
            kal_uint32 destl,
            kal_bool encode_crlf)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint32 lp = 0;
    kal_char *d;
    const kal_char *hex = "0123456789ABCDEF";
    kal_char c;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    d = dest;
    while (srcl--)
    {   /* for each character */
        /* true line break? */
        if (((c = *src++) == '\015') && (*src == '\012') && srcl)
        {
            if (encode_crlf == KAL_FALSE)
            {
                if (destl < 2)
                {
                    return -1;
                }

                *d++ = '\015';
                *d++ = *src++;
                srcl--;
                lp = 0; /* reset line count */

                destl -= 2;

            }
            else
            {
                if (destl < 6)
                {
                    return -1;
                }

                *d++ = '=';
                *d++ = '0';
                *d++ = 'D';
                *d++ = '=';
                *d++ = '0';
                *d++ = 'A';

                src++;
                srcl--;
                lp = 0; /* reset line count */

                destl -= 6;

            }

        }
        else
        {   /* not a line break */
            /* quoting required? */
            if (iscntrl(c) || (c == 0x7f) || (c & 0x80) || (c == '=') || ((c == ' ') && (*src == '\015')))
            {
                if ((lp += 3) > APP_MAX_ENC_LINE_LIMIT)
                {   /* yes, would line overflow? */
                    if (destl < 3)
                    {
                        return -1;
                    }

                    *d++ = '=';
                    *d++ = '\015';
                    *d++ = '\012';
                    lp = 3; /* set line count */

                    destl -= 3;
                }

                if (destl < 3)
                {
                    return -1;
                }

                *d++ = '=';                         /* quote character */
                *d++ = hex[(unsigned char)c >> 4];  /* high order 4 bits */
                *d++ = hex[c & 0xf];                /* low order 4 bits */

                destl -= 3;
            }
            else
            {       /* ordinary character */
                if ((++lp) > APP_MAX_ENC_LINE_LIMIT)
                {   /* would line overflow? */
                    if (destl < 3)
                    {
                        return -1;
                    }

                    *d++ = '=';
                    *d++ = '\015';
                    *d++ = '\012';
                    lp = 1; /* set line count */

                    destl -= 3;
                }

                if (destl < 1)
                {
                    return -1;
                }

                *d++ = c;   /* ordinary character */
                destl--;
            }
        }
    }   /* while */

    if (destl < 1)
    {
        return -1;
    }

    destl--;
    *d = '\0';  /* tie off destination */

    return (kal_int32) (d - dest);

}   /* end of applib_qprint_encode */


/*****************************************************************************
 * FUNCTION
 *  applib_qprint_encode
 * DESCRIPTION
 *  This function is used to encode given string into QP encoded string.
 * PARAMETERS
 *  src         [IN]            Source
 *  srcl        [IN]            Source length
 *  dest        [IN/OUT]        Dest buffer
 *  destl       [IN]            Destination buffer length
 * RETURNS
 *  negative: error
 *  ow: length of QP encoded buffer
 *****************************************************************************/
kal_int32 applib_qprint_encode(kal_char *src, kal_uint32 srcl, kal_char *dest, kal_uint32 destl)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    return applib_qprint_encode_ext(src, srcl, dest, destl, KAL_FALSE);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?