mirror of https://github.com/flysand7/ciabatta.git
basic printf
This commit is contained in:
parent
4c0041414d
commit
4917b05771
1
cia.c
1
cia.c
|
@ -31,6 +31,7 @@
|
||||||
|
|
||||||
// Module stdlib_file
|
// Module stdlib_file
|
||||||
#include "src/stdlib-file/file.c"
|
#include "src/stdlib-file/file.c"
|
||||||
|
#include "src/stdlib-file/fmt.c"
|
||||||
|
|
||||||
// Module stdlib_string
|
// Module stdlib_string
|
||||||
#include "src/stdlib-string/mem.c"
|
#include "src/stdlib-string/mem.c"
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <cia/def.h>
|
#include <cia/def.h>
|
||||||
#include <cia/sync.h>
|
#include <cia/sync.h>
|
||||||
#include <tinyrt.h>
|
#include <tinyrt.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
typedef struct FILE FILE;
|
typedef struct FILE FILE;
|
||||||
struct FILE {
|
struct FILE {
|
||||||
|
@ -23,3 +24,5 @@ int fputc(int c, FILE *file);
|
||||||
size_t fread(void *restrict buf, size_t size, size_t count, FILE *restrict file);
|
size_t fread(void *restrict buf, size_t size, size_t count, FILE *restrict file);
|
||||||
size_t fwrite(void const *restrict buf, size_t size, size_t count, FILE *restrict file);
|
size_t fwrite(void const *restrict buf, size_t size, size_t count, FILE *restrict file);
|
||||||
int fclose(FILE *file);
|
int fclose(FILE *file);
|
||||||
|
|
||||||
|
int printf(char const *restrict fmt, ...);
|
|
@ -0,0 +1,144 @@
|
||||||
|
|
||||||
|
static int print_string(char *str) {
|
||||||
|
int str_len = 0;
|
||||||
|
while(str[str_len] != 0) {
|
||||||
|
str_len += 1;
|
||||||
|
}
|
||||||
|
u64 unused;
|
||||||
|
_RT_Status status = _rt_file_write(&stdout->rt_file, str_len, str, &unused);
|
||||||
|
if(status != _RT_STATUS_OK) {
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
return str_len;
|
||||||
|
}
|
||||||
|
static int print_int(i64 number) {
|
||||||
|
bool negative = (number < 0);
|
||||||
|
if(negative) {
|
||||||
|
number = -number;
|
||||||
|
}
|
||||||
|
char buf[20];
|
||||||
|
buf[sizeof buf - 1] = 0;
|
||||||
|
char *p = buf + sizeof buf - 1;
|
||||||
|
do {
|
||||||
|
*--p = (number%10) + '0';
|
||||||
|
number /= 10;
|
||||||
|
} while(number > 0);
|
||||||
|
if(negative) {
|
||||||
|
*--p = '-';
|
||||||
|
}
|
||||||
|
u64 unused;
|
||||||
|
int buf_len = (int)(&buf[0] + sizeof buf - p);
|
||||||
|
_RT_Status status = _rt_file_write(&stdout->rt_file, buf_len, p, &unused);
|
||||||
|
if(status != _RT_STATUS_OK) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return buf_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int print_uint(u64 number) {
|
||||||
|
char buf[20];
|
||||||
|
buf[sizeof buf - 1] = 0;
|
||||||
|
char *p = buf + sizeof buf - 1;
|
||||||
|
do {
|
||||||
|
*--p = (number%10) + '0';
|
||||||
|
number /= 10;
|
||||||
|
} while(number > 0);
|
||||||
|
u64 unused;
|
||||||
|
int buf_len = (int)(&buf[0] + sizeof buf - p);
|
||||||
|
_RT_Status status = _rt_file_write(&stdout->rt_file, buf_len, p, &unused);
|
||||||
|
if(status != _RT_STATUS_OK) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return buf_len;
|
||||||
|
}
|
||||||
|
static int print_hex(u64 number) {
|
||||||
|
char digits[] = "0123456789abcdef";
|
||||||
|
char buf[20];
|
||||||
|
buf[sizeof buf - 1] = 0;
|
||||||
|
char *p = buf + sizeof buf - 1;
|
||||||
|
for(int i = 0; i < 64; i += 4) {
|
||||||
|
// if(i != 0 && i % 16 == 0) {
|
||||||
|
// *--p = '_';
|
||||||
|
// }
|
||||||
|
u8 bits = (number >> i) & 0x0f;
|
||||||
|
char digit = digits[bits];
|
||||||
|
*--p = digit;
|
||||||
|
}
|
||||||
|
*--p = 'x';
|
||||||
|
*--p = '0';
|
||||||
|
u64 unused;
|
||||||
|
int buf_len = (int)(&buf[0] + sizeof buf - p);
|
||||||
|
_RT_Status status = _rt_file_write(&stdout->rt_file, buf_len, p, &unused);
|
||||||
|
if(status != _RT_STATUS_OK) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return buf_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
int printf(const char *restrict fmt, ...) {
|
||||||
|
i64 ret_printed = 0;
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
i64 buf_start_idx = 0;
|
||||||
|
i64 buf_end_idx = 0;
|
||||||
|
u64 unused;
|
||||||
|
for(i64 i = 0; fmt[i] != 0;) {
|
||||||
|
buf_start_idx = i;
|
||||||
|
buf_end_idx = i;
|
||||||
|
while(fmt[i] != '%' && fmt[i] != 0) {
|
||||||
|
buf_end_idx += 1;
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
i64 buf_size = buf_end_idx - buf_start_idx;
|
||||||
|
if(buf_size != 0) {
|
||||||
|
_RT_Status status = _rt_file_write(
|
||||||
|
&stdout->rt_file
|
||||||
|
, buf_size
|
||||||
|
, (void *)&fmt[buf_start_idx]
|
||||||
|
, &unused
|
||||||
|
);
|
||||||
|
if(status != _RT_STATUS_OK) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ret_printed += buf_size;
|
||||||
|
}
|
||||||
|
if(fmt[i] == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// fmt[i] == '%'
|
||||||
|
i += 1;
|
||||||
|
int arg_chars;
|
||||||
|
if(fmt[i] == 'd') {
|
||||||
|
int arg = va_arg(args, int);
|
||||||
|
arg_chars = print_int((i64)arg);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(fmt[i] == 'u') {
|
||||||
|
unsigned int arg = va_arg(args, unsigned int);
|
||||||
|
arg_chars = print_uint((u64)arg);
|
||||||
|
}
|
||||||
|
else if(fmt[i] == 'p') {
|
||||||
|
void *arg = va_arg(args, void *);
|
||||||
|
arg_chars = print_hex((u64)arg);
|
||||||
|
}
|
||||||
|
else if(fmt[i] == 's') {
|
||||||
|
char *str = va_arg(args, char *);
|
||||||
|
arg_chars = print_string(str);
|
||||||
|
}
|
||||||
|
else if(fmt[i] == 'c') {
|
||||||
|
int ch = va_arg(args, int);
|
||||||
|
_RT_Status status = _rt_file_write(&stdout->rt_file, 1, &ch, &unused);
|
||||||
|
if(status != _RT_STATUS_OK) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
arg_chars = 1;
|
||||||
|
}
|
||||||
|
i += 1;
|
||||||
|
if(arg_chars < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ret_printed += arg_chars;
|
||||||
|
}
|
||||||
|
va_end(args);
|
||||||
|
return ret_printed;
|
||||||
|
}
|
|
@ -3,7 +3,8 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int main(int argc, char **argv, char **envp) {
|
int main(int argc, char **argv, char **envp) {
|
||||||
char string[] = "Hello, world!\n";
|
// char string[] = "Hello, world!\n";
|
||||||
fwrite(string, 1, sizeof string-1, stdout);
|
// fwrite(string, 1, sizeof string-1, stdout);
|
||||||
|
printf("Hello, world! %d\n", 4);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue