]>
wirehaze git hosting - ppos.git/blob - ppos/lib/libc.c
1 // PingPongOS - PingPong Operating System
2 // Prof. Carlos A. Maziero, DINF UFPR
3 // Versão 2.0 -- Junho de 2025
5 // ATENÇÃO: ESTE ARQUIVO NÃO DEVE SER ALTERADO;
6 // ALTERAÇÕES SERÃO DESCARTADAS NA CORREÇÃO.
8 // Funções básicas da biblioteca C, que devem ser definidas aqui
9 // para nos liberar da GLibC.
11 #include "hardware/serial.h"
15 // macros do compilador para funções variádicas (usadas no printk)
16 #define va_list __builtin_va_list
17 #define va_start __builtin_va_start
18 #define va_end __builtin_va_end
19 #define va_arg __builtin_va_arg
21 // estado interno do gerador de números pseudo-aleatórios
22 // https://en.wikipedia.org/wiki/Linear_congruential_generator
23 static unsigned int rand_number
= 0;
25 //----------------------------------------------------------------------
27 void randseed(unsigned long seed
)
32 //----------------------------------------------------------------------
34 unsigned long randnum(void)
36 // rand_number = (1103515245L * rand_number + 12345) % (1 << 30);
37 rand_number
= (1664525L * rand_number
+ 1013904223L) % (1L << 31);
41 //----------------------------------------------------------------------
51 //----------------------------------------------------------------------
53 int mem_copy(const char *orig
, char *dest
, int size
)
55 if (!orig
|| !dest
|| size
<= 0)
58 for (int i
= 0; i
< size
; i
++)
64 //----------------------------------------------------------------------
71 //----------------------------------------------------------------------
73 void putst(const char *s
)
85 //----------------------------------------------------------------------
87 // adaptado de from: https://operating-system-in-1000-lines.vercel.app/en/
88 void printk(const char *fmt
, ...)
91 //bool fill_zeros = false;
92 //bool signal_space = false;
100 // find a % mark, process it
106 // space for signal (% )
113 // left alignment (%-)
121 // fill with zeros (%0)
128 // width modifier (%NN)
130 while (*fmt
&& *fmt
>= '1' && *fmt
<= '9')
132 width
= 10 * width
+ (*fmt
- '0');
139 // "%%" or '%' at the end of the format string
148 int c
= va_arg(vargs
, int);
156 const char *s
= va_arg(vargs
, const char *);
163 // decrement width according to string size
171 // print whitespaces before
179 // print string chars
186 // print whitespaces after
197 // %d %i: integer, printed in decimal
203 int value
= va_arg(vargs
, int);
207 // treat negative number
216 // calculate number of digits to print
218 while (value
/ divisor
> 9)
224 // print whitespaces before
232 // print number signal
236 // print number digits
239 putch('0' + value
/ divisor
);
244 // print whitespaces after
255 // %p: long, printed in hexadecimal
259 unsigned long value
= va_arg(vargs
, unsigned long);
264 for (int i
= 15; i
>= 0; i
--)
266 nibble
= (value
>> (i
* 4)) & 0xf;
267 putch("0123456789abcdef"[nibble
]);
283 // not a placeholder, just print it
289 // take the next char in format
296 //----------------------------------------------------------------------