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

📄 printf_p.c

📁 此程序是无传感器无刷电机控制程序(mege8)
💻 C
📖 第 1 页 / 共 2 页
字号:
                } else if (ch=='.') {
                        if ((ch = PRG_RDB(fmt++)) == '*') {
                                n = va_arg(ap, int);
                                prec = n < 0 ? -1 : n;
                                goto rflag;
                        }
                        n = 0;
                        while (is_digit(ch)) {
                                n = n*10 + to_digit(ch);
                                ch = PRG_RDB(fmt++);
                        }
                        prec = n < 0 ? -1 : n;
                        goto reswitch;
                } else
#endif /* LIGHTPRINTF */
                if (ch=='0') {
                        /*
                         * ``Note that 0 is taken as a flag, not as the
                         * beginning of a field width.''
                         *      -- ANSI X3J11
                         */
                        if (!(flags & LADJUST))
                            flags |= ZEROPAD; /* '-' disables '0' */
                        goto rflag;
                } else if (ch>='1' && ch<='9') {
                        n = 0;
                        do {
                                n = 10 * n + to_digit(ch);
                                ch = PRG_RDB(fmt++);
                        } while (is_digit(ch));
                        width = n;
                        goto reswitch;
                } else if (ch=='h') {
                        flags |= SHORTINT;
                        goto rflag;
                } else if (ch=='l') {
                        flags |= LONGINT;
                        goto rflag;
                } else if (ch=='c') {
                        *(cp = buf) = va_arg(ap, int);
                        size = 1;
                        sign = '\0';
                } else if (ch=='D'||ch=='d'||ch=='i') {
                        if(ch=='D')
                                flags |= LONGINT;
                        if (flags&LONGINT) {
                                _ulong=va_arg(ap, long);
                        } else {
                                register int _d;
                                _d=va_arg(ap, int);
                                _ulong = flags&SHORTINT ? (long)(short)_d : (long)_d;
                        }
                        
                        if ((long)_ulong < 0) {
                                _ulong = -_ulong;
                                sign = '-';
                        }
                        base = DEC;
                        goto number;
                } else
/*              
                if (ch=='n') {
                        if (flags & LONGINT)
                                *va_arg(ap, long *) = ret;
                        else if (flags & SHORTINT)
                                *va_arg(ap, short *) = ret;
                        else
                                *va_arg(ap, int *) = ret;
                        continue;       // no output 
                } else
*/
#ifndef LIGHTPRINTF                     
                if (ch=='O'||ch=='o') {
                        if (ch=='O')
                                flags |= LONGINT;
                        base = OCT;
                        goto nosign;
                } else if (ch=='p') {
                        /*
                         * ``The argument shall be a pointer to void.  The
                         * value of the pointer is converted to a sequence
                         * of printable characters, in an implementation-
                         * defined manner.''
                         *      -- ANSI X3J11
                         */
                        /* NOSTRICT */
                        _ulong = (unsigned int)va_arg(ap, void *);
                        base = HEX;
                        flags |= HEXPREFIX;
                        ch = 'x';
                        goto nosign;
                } else if (ch=='s') {  // print a string from RAM
                        if ((cp = va_arg(ap, char *)) == NULL) {
                                cp=buf;
                                cp[0] = '(';
                                cp[1] = 'n';
                                cp[2] = 'u';
                                cp[4] = cp[3] = 'l';
                                cp[5] = ')';
                                cp[6] = '\0';
                        }
                        if (prec >= 0) {
                                /*
                                 * can't use strlen; can only look for the
                                 * NUL in the first `prec' characters, and
                                 * strlen() will go further.
                                 */
                                char *p = (char*)memchr(cp, 0, prec);

                                if (p != NULL) {
                                        size = p - cp;
                                        if (size > prec)
                                                size = prec;
                                } else
                                        size = prec;
                        } else
                                size = strlen(cp);
                        sign = '\0';
                } else
#endif /* LIGHTPRINTF */                        
                if(ch=='U'||ch=='u') {
                        if (ch=='U')
                                flags |= LONGINT;
                        base = DEC;
                        goto nosign;
                } else if (ch=='X'||ch=='x') {
                        base = HEX;
                        /* leading 0x/X only if non-zero */
                        if (flags & ALT && _ulong != 0)
                                flags |= HEXPREFIX;

                        /* unsigned conversions */
nosign:                 sign = '\0';
                        /*
                         * ``... diouXx conversions ... if a precision is
                         * specified, the 0 flag will be ignored.''
                         *      -- ANSI X3J11
                         */
number: if ((dprec = prec) >= 0)
                                flags &= ~ZEROPAD;

                        /*
                         * ``The result of converting a zero value with an
                         * explicit precision of zero is no characters.''
                         *      -- ANSI X3J11
                         */
                        cp = buf + BUF;
                        if (_ulong != 0 || prec != 0) {
                                register unsigned char _d,notlastdigit;
                                do {
                                        notlastdigit=(_ulong>=base);
                                        _d = _ulong % base;

                                        if (_d<10) {
                                                _d+='0';
                                        } else {
                                                _d+='a'-10;
                                                if (ch=='X') _d&=~0x20;
                                        }
                                        *--cp=_d;
                                        _ulong /= base;
                                } while (notlastdigit);
#ifndef LIGHTPRINTF
                                // handle octal leading 0 
                                if (base==OCT && flags & ALT && *cp != '0')
                                        *--cp = '0';
#endif

                        }

                        size = buf + BUF - cp;
        } else {  //default
                /* "%?" prints ?, unless ? is NUL */
                        if (ch == '\0')
                                goto done;
                        /* pretend it was %c with argument ch */
                        cp = buf;
                        *cp = ch;
                        size = 1;
                        sign = '\0';
                }

                /*
                 * All reasonable formats wind up here.  At this point,
                 * `cp' points to a string which (if not flags&LADJUST)
                 * should be padded out to `width' places.  If
                 * flags&ZEROPAD, it should first be prefixed by any
                 * sign or other prefix; otherwise, it should be blank
                 * padded before the prefix is emitted.  After any
                 * left-hand padding and prefixing, emit zeroes
                 * required by a decimal [diouxX] precision, then print
                 * the string proper, then emit zeroes required by any
                 * leftover floating precision; finally, if LADJUST,
                 * pad with blanks.
                 */

                /*
                 * compute actual size, so we know how much to pad.
                 */
                fieldsz = size;

                dpad = dprec - size;
                if (dpad < 0)
                    dpad = 0;

                if (sign)
                        fieldsz++;
                else if (flags & HEXPREFIX)
                        fieldsz += 2;
                fieldsz += dpad;

                /* right-adjusting blank padding */
                if ((flags & (LADJUST|ZEROPAD)) == 0)
                        PAD_SP(width - fieldsz);

                /* prefix */
                if (sign) {
                        PRINT(&sign, 1);
                } else if (flags & HEXPREFIX) {
                        ox[0] = '0';
                        ox[1] = ch;
                        PRINT(ox, 2);
                }

                /* right-adjusting zero padding */
                if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD)
                        PAD_0(width - fieldsz);

                /* leading zeroes from decimal precision */
                PAD_0(dpad);

                /* the string or number proper */
                PRINT(cp, size);

                /* left-adjusting padding (always blank) */
                if (flags & LADJUST)
                        PAD_SP(width - fieldsz);
        }
done:
        va_end(ap);
}

⌨️ 快捷键说明

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