#include "io.h" #include "../cstr/cstr.h" #include "../aec/aec.h" #include "../sys/types.h" void __wstdn(const char *buf, u64 n) { write(STDOUT_FD, buf, n); } void wstd(const char *buf) { __wstdn(buf, cstr_length(buf)); } unsigned long rstd(char *buf, unsigned long count) { return read(STDIN_FD, buf, count); } void wf(unsigned int fd, char *buf) { write(fd, buf, cstr_length(buf)); } void putchar(const char c) { __wstdn(&c, 1); } void wstdf__(const char *buf, const void **args) { wff__(STDOUT_FD, buf, args); } void wff__(unsigned int fd, const char *buf, const void **args) { const char *start = buf; char stoi_buf[32] = ""; int i; for (; *buf; ++buf) { if (*buf == '%') { if (buf - start > 0) write(fd, start, buf - start); ++buf; switch (*buf) { case '%': __wstdn("%", 1); break; case 's': write(fd, ((const char **)args)[0], cstr_length(((const char**)args)[0])); ++args; break; case 'i': for (i = 0; i < 32; ++i) stoi_buf[i] = 0; i64_to_cstr(((u64 *)args)[0], stoi_buf, 32); write(fd, stoi_buf, cstr_length(stoi_buf)); ++args; break; case 'u': for (i = 0; i < 32; ++i) stoi_buf[i] = 0; u64_to_cstr(((u64 *)args)[0], stoi_buf, 32); write(fd, stoi_buf, cstr_length(stoi_buf)); ++args; break; case 'S': sgr(((const char **)args)[0]); ++args; break; case 'F': foreground(((const char **)args)[0]); ++args; break; case 'B': background(((const char **)args)[0]); ++args; break; } start = buf + 1; } } if (buf - start > 0) write(fd, start, buf - start); } char __buf[BUFSIZ] = { 0 }; int get_next_line_from_fd(unsigned int fd, char *linebuf) { u64 size = 0; char *line = __buf; while (*line && *line != '\n') line++; if (!*line) { size = cstr_length(__buf); i64 s = read(fd, __buf + size, BUFSIZ - size - 1); if (s == 0 && size == 0) { return -1; } else if (s == 0) { for (int i = 0; i < size; ++i) linebuf[i] = __buf[i]; __buf[0] = 0; return size; } __buf[s] = 0; while (*line && *line != '\n') line++; if (!*line) { return -2; } } *line = 0; ++line; size = cstr_length(__buf); for (int i = 0; __buf[i]; ++i) linebuf[i] = __buf[i]; linebuf[size] = 0; int i = 0; for (; *line; ++i) { __buf[i] = *line; ++line; } __buf[i] = 0; return size; } #ifdef IO_LIB_UNIT_TEST int main() { wstdf("%s %S%F%s%S\n", "hallo", SGR_UNDERLINE, COLOR_RED, "welt", SGR_RESET); } #endif