Rev 2131 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2131 | Rev 2307 | ||
|---|---|---|---|
| Line 36... | Line 36... | ||
| 36 | */ |
36 | */ |
| 37 | 37 | ||
| 38 | #include <printf/printf_core.h> |
38 | #include <printf/printf_core.h> |
| 39 | #include <putchar.h> |
39 | #include <putchar.h> |
| 40 | #include <print.h> |
40 | #include <print.h> |
| 41 | #include <synch/spinlock.h> |
- | |
| 42 | #include <arch/arg.h> |
41 | #include <arch/arg.h> |
| 43 | #include <arch/asm.h> |
- | |
| 44 | - | ||
| 45 | #include <arch.h> |
42 | #include <arch.h> |
| 46 | 43 | ||
| 47 | SPINLOCK_INITIALIZE(printflock); /**< printf spinlock */ |
- | |
| 48 | - | ||
| 49 | #define __PRINTF_FLAG_PREFIX 0x00000001 /**< show prefixes 0x or 0*/ |
44 | #define __PRINTF_FLAG_PREFIX 0x00000001 /**< show prefixes 0x or 0*/ |
| 50 | #define __PRINTF_FLAG_SIGNED 0x00000002 /**< signed / unsigned number */ |
45 | #define __PRINTF_FLAG_SIGNED 0x00000002 /**< signed / unsigned number */ |
| 51 | #define __PRINTF_FLAG_ZEROPADDED 0x00000004 /**< print leading zeroes */ |
46 | #define __PRINTF_FLAG_ZEROPADDED 0x00000004 /**< print leading zeroes */ |
| 52 | #define __PRINTF_FLAG_LEFTALIGNED 0x00000010 /**< align to left */ |
47 | #define __PRINTF_FLAG_LEFTALIGNED 0x00000010 /**< align to left */ |
| 53 | #define __PRINTF_FLAG_SHOWPLUS 0x00000020 /**< always show + sign */ |
48 | #define __PRINTF_FLAG_SHOWPLUS 0x00000020 /**< always show + sign */ |
| Line 456... | Line 451... | ||
| 456 | * @param fmt Formatting NULL terminated string. |
451 | * @param fmt Formatting NULL terminated string. |
| 457 | * @return Number of printed characters or negative value on failure. |
452 | * @return Number of printed characters or negative value on failure. |
| 458 | */ |
453 | */ |
| 459 | int printf_core(const char *fmt, struct printf_spec *ps, va_list ap) |
454 | int printf_core(const char *fmt, struct printf_spec *ps, va_list ap) |
| 460 | { |
455 | { |
| 461 | int irqpri; |
- | |
| 462 | int i = 0, j = 0; /**< i is index of currently processed char from fmt, j is index to the first not printed nonformating character */ |
456 | int i = 0, j = 0; /**< i is index of currently processed char from fmt, j is index to the first not printed nonformating character */ |
| 463 | int end; |
457 | int end; |
| 464 | int counter; /**< counter of printed characters */ |
458 | int counter; /**< counter of printed characters */ |
| 465 | int retval; /**< used to store return values from called functions */ |
459 | int retval; /**< used to store return values from called functions */ |
| 466 | char c; |
460 | char c; |
| Line 470... | Line 464... | ||
| 470 | size_t size; /**< byte size of integer parameter */ |
464 | size_t size; /**< byte size of integer parameter */ |
| 471 | int width, precision; |
465 | int width, precision; |
| 472 | uint64_t flags; |
466 | uint64_t flags; |
| 473 | 467 | ||
| 474 | counter = 0; |
468 | counter = 0; |
| 475 | 469 | ||
| 476 | irqpri = interrupts_disable(); |
- | |
| 477 | spinlock_lock(&printflock); |
- | |
| 478 | - | ||
| 479 | while ((c = fmt[i])) { |
470 | while ((c = fmt[i])) { |
| 480 | /* control character */ |
471 | /* control character */ |
| 481 | if (c == '%' ) { |
472 | if (c == '%' ) { |
| 482 | /* print common characters if any processed */ |
473 | /* print common characters if any processed */ |
| 483 | if (i > j) { |
474 | if (i > j) { |
| Line 710... | Line 701... | ||
| 710 | } |
701 | } |
| 711 | counter += retval; |
702 | counter += retval; |
| 712 | } |
703 | } |
| 713 | 704 | ||
| 714 | out: |
705 | out: |
| 715 | spinlock_unlock(&printflock); |
- | |
| 716 | interrupts_restore(irqpri); |
- | |
| 717 | 706 | ||
| 718 | return counter; |
707 | return counter; |
| 719 | } |
708 | } |
| 720 | 709 | ||
| 721 | /** @} |
710 | /** @} |