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

📄 psnprintf.c

📁 COS 0.0.1.rar Cos操作系统源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
            nprinted = pad;                memset(*pinsertion, padchar, nprinted);        *pinsertion += nprinted;        *nmax -= nprinted;    }    /* Output string */    if (*nmax <= 1)        nprinted = 0;    else if (*nmax - 1 < len)        nprinted = *nmax - 1;    else        nprinted = len;            memcpy(*pinsertion, str, nprinted);    *pinsertion += nprinted;    *nmax -= nprinted;        /* If left aligned, add pad */    if (flags & FLAG_LEFT_ALIGN)    {        if (*nmax <= 1)            nprinted = 0;        else if (*nmax - 1 < pad)            nprinted = *nmax - 1;        else            nprinted = pad;                    memset(*pinsertion, ' ', nprinted);        *pinsertion += nprinted;        *nmax -= nprinted;    }        return len + pad; /* Return total length of pad + string even if some                       * was truncated                       */}/* Format an integer into the buffer.  Parameters: *   **pinsertion   Pointer to pointer to buffer (can be reference to NULL) *   *nmax          Pointer to size of buffer.  This is may be modified *   fmt            Format character (one of "diuoxX") *   flags          0 or combination of flags (see .h file for #defines) *   width          Width of integer, as defined in printf *   precision      Precision of integer, as defined in printf *   ap             Argument list */int pvsnfmt_int(char **pinsertion, size_t *nmax, char fmt, int flags,                 int width, int precision, char prefix, va_list *ap){    long int number = 0;    unsigned long int unumber = 0;    char numbersigned = 1;     char iszero = 0; /* bool */    int base = 0;    int len = 0; /* length of number component (no sign or padding) */    char char10 = 0;    char sign = 0;    int widthpad = 0;    int addprefix = 0; /* optional "0x" = 2 */    int totallen = 0;    /* Stack used to hold digits, which are generated backwards     * and need to be popped off in the correct order     */    char numstack[22];    /* largest 64 bit number has 22 octal digits */    char *stackpos = numstack;    #define PUSH(x) \    *stackpos++ = x    #define POP() \    *(--stackpos)          /* Retrieve value */    switch (prefix)    {    case 'h':        switch (fmt)        {            case 'd':            case 'i':                number = (signed short int) va_arg(*ap, int);                break;            case 'u':            case 'o':            case 'x':            case 'X':                unumber = (unsigned short int) va_arg(*ap, int);                numbersigned = 0;                break;             case 'p':                unumber = (unsigned long) va_arg(*ap, void *);                numbersigned = 0;        }        break;    case 'l':        switch (fmt)        {            case 'd':            case 'i':                number = va_arg(*ap, signed long int);                break;            case 'u':            case 'o':            case 'x':            case 'X':                unumber = va_arg(*ap, unsigned long int);                numbersigned = 0;                break;             case 'p':                unumber = (unsigned long) va_arg(*ap, void *);                numbersigned = numbersigned;        }        break;    default:        switch (fmt)        {            case 'd':            case 'i':                number = va_arg(*ap, signed int);                break;            case 'u':            case 'o':            case 'x':            case 'X':                unumber = va_arg(*ap, unsigned int);                numbersigned = 0;                break;             case 'p':                unumber = (unsigned long) va_arg(*ap, void *);                numbersigned = 0;         }    } /* switch fmt to retrieve number */    if (fmt == 'p')    {        fmt = 'x';        flags |= FLAG_HASH;    }        /* Discover base */    switch (fmt)    {        case 'd':        case 'i':        case 'u':            base = 10;            break;        case 'o':            base = 8;            break;        case 'X':            base = 16;            char10 = 'A';            break;        case 'x':            base = 16;            char10 = 'a';    }    if (numbersigned)    {            if (number < 0)        {            /* Deal with negativity */            sign = '-';            number = -number;        }        else if (flags & FLAG_SIGNED)        {            sign = '+';        }        else if (flags & FLAG_SIGN_PAD)        {            sign = ' ';        }    }        /* Create number */    if (numbersigned)    {             if (number == 0)            iszero = 1;        do        {            PUSH(number % base);            number /= base;            len++;        } while (number != 0);    }    else    {        if (unumber == 0)            iszero = 1;        do        {            PUSH(unumber % base);            unumber /= base;            len++;        } while (unumber != 0);    }            /* Octal hash character (alternate form) */    if (fmt == 'o' && (flags & FLAG_HASH) && precision <= len &&        precision != 0 && !iszero )    {        precision = len + 1;    }    /* Determine width of sign, if any. */    if ( (fmt == 'x' || fmt == 'X') && (flags & FLAG_HASH) && !iszero )        addprefix = 2;    else if (sign != 0)        addprefix = 1;    /* Make up precision (zero pad on left) */    while (len < precision)    {        PUSH(0);        len++;    }           if (len + addprefix < width)    {        totallen = width;        widthpad = width - (len + addprefix);    }    else        totallen = len + addprefix;               if (*nmax <= 1)        return totallen;    /* Write sign or "0x" */    if (flags & FLAG_ZERO_PAD)    {        if (addprefix == 2) /* 0x */        {            if (*nmax > 1)            {                *(*pinsertion)++ = '0';                (*nmax)--;            }            if (*nmax > 1)            {                *(*pinsertion)++ = fmt;                (*nmax)--;            }        }        else if (addprefix == 1) /* sign */        {            if (*nmax > 1)            {                *(*pinsertion)++ = sign;                (*nmax)--;            }        }    }    /* Width pad */    if ( !(flags & FLAG_LEFT_ALIGN) )    {        if (*nmax <= 1)            widthpad = 0;        else if (*nmax + 1 < widthpad)            widthpad = *nmax - 1;                if (flags & FLAG_ZERO_PAD)            memset(*pinsertion, '0', widthpad);        else            memset(*pinsertion, ' ', widthpad);        *pinsertion += widthpad;        *nmax -= widthpad;    }        /* Write sign or "0x" */    if ( !(flags & FLAG_ZERO_PAD) )    {        if (addprefix == 2) /* 0x */        {            if (*nmax > 1)            {                *(*pinsertion)++ = '0';                (*nmax)--;            }            if (*nmax > 1)            {                *(*pinsertion)++ = fmt;                (*nmax)--;            }        }        else if (addprefix == 1) /* sign */        {            if (*nmax > 1)            {                *(*pinsertion)++ = sign;                (*nmax)--;            }        }    }        /* Write number */    if (*nmax <= 1)        len = 0;    else if (*nmax + 1 < len)        len = *nmax - 1;        for (; len > 0; len--)    {        char n = POP();        if (n <= 9)            *(*pinsertion)++ = n + '0';        else            *(*pinsertion)++ = n - 10 + char10;    }            *nmax -= len;        if (flags & FLAG_LEFT_ALIGN)    {        if (*nmax <= 1)            widthpad = 0;        else if (*nmax + 1 < widthpad)            widthpad = *nmax - 1;                    memset(*pinsertion, ' ', widthpad);        *pinsertion += widthpad;        *nmax -= widthpad;    }            return totallen;}/* Almost 400 lines of floating point stuff have been cut out. Sorry Alex!*/

⌨️ 快捷键说明

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