1 /*
2 * @ : Copyright (c) 2021 Phytium Information Technology, Inc.
3 *
4 * SPDX-License-Identifier: Apache-2.0.
5 *
6 * @Date: 2021-04-07 09:53:07
7 * @LastEditTime: 2021-05-26 15:20:14
8 * @Description: This files is for printf function
9 *
10 * @Modify History:
11 * Ver Who Date Changes
12 * ----- ------ -------- --------------------------------------
13 */
14
15 #include "ft_printf.h"
16 #include "stdio.h"
17 #include "ft_aarch32_asm.h"
18
19 static char print_buffer[PRINTF_BUFFER_LENGTH];
20
21 extern void outbyte(char byte);
22
23 vsprintf_p Vsprintf_pFun = (vsprintf_p)vsprintf;
24
Ft_vsprintfRegister(vsprintf_p f)25 void Ft_vsprintfRegister(vsprintf_p f)
26 {
27 Vsprintf_pFun = f;
28 }
29
Ft_printf(const char * fmt,...)30 void Ft_printf(const char *fmt, ...)
31 {
32 va_list args;
33 size_t i;
34 size_t length;
35 #ifdef NEED_CLOSE_ISR
36 IRQ_DISABLE();
37 #endif
38 va_start(args, fmt);
39
40 length = Vsprintf_pFun(print_buffer, fmt, args);
41 va_end(args);
42 for (i = 0; i < length; i++)
43 {
44 outbyte(print_buffer[i]);
45 }
46
47 #ifdef NEED_CLOSE_ISR
48 IRQ_ENABLE();
49 #endif
50 }
51
Ft_itoa(int num,char * str,int radix)52 char *Ft_itoa(int num, char *str, int radix)
53 {
54 char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
55 unsigned unum;
56 int i = 0;
57 int j;
58 int k;
59 char temp;
60
61 if (radix == 10 && num < 0)
62 {
63 unum = (unsigned)-num;
64 str[i++] = '-';
65 }
66 else
67 {
68 unum = (unsigned)num;
69 }
70
71 do
72 {
73 str[i++] = index[unum % (unsigned)radix];
74 unum /= radix;
75 } while (unum);
76
77 str[i] = '\0';
78
79 if (str[0] == '-')
80 {
81 k = 1;
82 }
83 else
84 {
85 k = 0;
86 }
87
88 for (j = k; j <= (i - 1) / 2; j++)
89 {
90 temp = str[j];
91 str[j] = str[i - 1 + k - j];
92 str[i - 1 + k - j] = temp;
93 }
94
95 return str;
96 }
97