diff --git a/programs/develop/ktcc/trunk/lib/libshell/Makefile b/programs/develop/ktcc/trunk/lib/libshell/Makefile index 54d6dedbf..b487cf99e 100644 --- a/programs/develop/ktcc/trunk/lib/libshell/Makefile +++ b/programs/develop/ktcc/trunk/lib/libshell/Makefile @@ -1,6 +1,8 @@ CC = kos32-tcc AR = ar -CFLAGS = -c -I../../libc.obj/include +CFLAGS = -c -I$(LIBC_INCLUDE) + +LIBC_INCLUDE = ../../libc.obj/include LIB = libshell.a @@ -14,7 +16,8 @@ OBJS = \ shell_init.o \ shell_gets.o \ shell_printf.o \ - shell_putc.o + shell_putc.o \ + shell_write_string.o $(LIB): $(OBJS) $(AR) -crs $@ $(OBJS) @@ -23,4 +26,16 @@ $(LIB): $(OBJS) $(CC) $(CFLAGS) -o $@ $< clean: - rm -rf $(OBJS) $(LIB) \ No newline at end of file + rm -rf $(OBJS) $(LIB) + + +shell_cls.o: shell_cls.c $(LIBC_INCLUDE)/shell_api.h $(LIBC_INCLUDE)/sys/ksys.h +shell_get_pid.o: shell_get_pid.c $(LIBC_INCLUDE)/shell_api.h $(LIBC_INCLUDE)/string.h +shell_getc.o: shell_getc.c $(LIBC_INCLUDE)/shell_api.h +shell_gets.o: shell_gets.c $(LIBC_INCLUDE)/shell_api.h $(LIBC_INCLUDE)/string.h +shell_init.o: shell_init.c $(LIBC_INCLUDE)/shell_api.h $(LIBC_INCLUDE)/sys/ksys.h $(LIBC_INCLUDE)/string.h $(LIBC_INCLUDE)/stdio.h $(LIBC_INCLUDE)/stdlib.h +shell_ping.o: shell_ping.c $(LIBC_INCLUDE)/shell_api.h $(LIBC_INCLUDE)/sys/ksys.h +shell_printf.o: shell_printf.c $(LIBC_INCLUDE)/shell_api.h $(LIBC_INCLUDE)/stdio.h +shell_putc.o: shell_putc.c $(LIBC_INCLUDE)/shell_api.h +shell_puts.o: shell_puts.c $(LIBC_INCLUDE)/shell_api.h $(LIBC_INCLUDE)/string.h +shell_write_string.o: shell_write_string.c $(LIBC_INCLUDE)/shell_api.h $(LIBC_INCLUDE)/string.h diff --git a/programs/develop/ktcc/trunk/lib/libshell/shell_cls.c b/programs/develop/ktcc/trunk/lib/libshell/shell_cls.c index e85af9b77..deded9a3a 100644 --- a/programs/develop/ktcc/trunk/lib/libshell/shell_cls.c +++ b/programs/develop/ktcc/trunk/lib/libshell/shell_cls.c @@ -3,6 +3,9 @@ void shell_cls() { __shell_init(); - *__shell_shm = SHELL_CLS; + if(__shell_is_init == __SHELL_INIT_OK) + { + *__shell_shm = SHELL_CLS; __SHELL_WAIT(); + } } \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/lib/libshell/shell_exit.c b/programs/develop/ktcc/trunk/lib/libshell/shell_exit.c index 1c34e9f65..840d674b4 100644 --- a/programs/develop/ktcc/trunk/lib/libshell/shell_exit.c +++ b/programs/develop/ktcc/trunk/lib/libshell/shell_exit.c @@ -3,7 +3,7 @@ void shell_exit() { - if(__shell_is_init){ + if (__shell_is_init == __SHELL_INIT_OK) { *__shell_shm = SHELL_EXIT; __SHELL_WAIT(); _ksys_shm_close(__shell_shm_name); diff --git a/programs/develop/ktcc/trunk/lib/libshell/shell_get_pid.c b/programs/develop/ktcc/trunk/lib/libshell/shell_get_pid.c index d54cba03e..733c3647f 100644 --- a/programs/develop/ktcc/trunk/lib/libshell/shell_get_pid.c +++ b/programs/develop/ktcc/trunk/lib/libshell/shell_get_pid.c @@ -4,9 +4,14 @@ unsigned shell_get_pid() { unsigned pid; + __shell_init(); - *__shell_shm = SHELL_PID; - __SHELL_WAIT(); - memcpy(&pid, __shell_shm+1, sizeof(unsigned)); + if (__shell_is_init == __SHELL_INIT_OK) + { + *__shell_shm = SHELL_PID; + __SHELL_WAIT(); + memcpy(&pid, __shell_shm + 1, sizeof(unsigned)); + } + return pid; } \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/lib/libshell/shell_getc.c b/programs/develop/ktcc/trunk/lib/libshell/shell_getc.c index 84c9efd1c..c619deee5 100644 --- a/programs/develop/ktcc/trunk/lib/libshell/shell_getc.c +++ b/programs/develop/ktcc/trunk/lib/libshell/shell_getc.c @@ -1,9 +1,16 @@ -#include "shell_api.h" +#include char shell_getc() { __shell_init(); - *__shell_shm = SHELL_GETC; - __SHELL_WAIT(); - return *(__shell_shm+1); + + if (__shell_is_init == __SHELL_INIT_OK) { + *__shell_shm = SHELL_GETC; + __SHELL_WAIT(); + + return *(__shell_shm + 1); + } + else { + return 0; + } } \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/lib/libshell/shell_gets.c b/programs/develop/ktcc/trunk/lib/libshell/shell_gets.c index 41ff708fa..c3df2037b 100644 --- a/programs/develop/ktcc/trunk/lib/libshell/shell_gets.c +++ b/programs/develop/ktcc/trunk/lib/libshell/shell_gets.c @@ -4,7 +4,11 @@ void shell_gets(char *str, int n) { __shell_init(); - *__shell_shm = SHELL_GETS; + + if (__shell_is_init == __SHELL_INIT_OK) { + *__shell_shm = SHELL_GETS; __SHELL_WAIT(); + strncpy(str, __shell_shm+1, n); + } } diff --git a/programs/develop/ktcc/trunk/lib/libshell/shell_init.c b/programs/develop/ktcc/trunk/lib/libshell/shell_init.c index c98ffe3d5..7dae4a043 100644 --- a/programs/develop/ktcc/trunk/lib/libshell/shell_init.c +++ b/programs/develop/ktcc/trunk/lib/libshell/shell_init.c @@ -5,40 +5,57 @@ #include char app_name[13]; -char __shell_shm_name[32]; -char*__shell_shm=NULL; -int __shell_is_init=0; +char __shell_shm_name[32]; +char *__shell_shm = NULL; +enum __SHELL_INIT_STATE __shell_is_init = __SHELL_NOT_LOADED; int __shell_shm_init() { - __shell_is_init=1; - ksys_thread_t *proc_info = (ksys_thread_t*)malloc(sizeof(ksys_thread_t)); - if(proc_info == NULL){ - return -1; - } + __shell_is_init = __SHELL_LOADING; + ksys_thread_t proc_info; unsigned PID; - _ksys_thread_info(proc_info, -1); - PID = proc_info->pid; - strncpy(app_name, proc_info->name, 12); - free(proc_info); + _ksys_thread_info(&proc_info, -1); + PID = proc_info.pid; + strncpy(app_name, (&proc_info)->name, 12); itoa(PID, __shell_shm_name); strcat(__shell_shm_name, "-SHELL"); - return _ksys_shm_open(__shell_shm_name, KSYS_SHM_OPEN_ALWAYS | KSYS_SHM_WRITE, SHELL_SHM_MAX, &__shell_shm); + return _ksys_shm_open(__shell_shm_name, KSYS_SHM_OPEN_ALWAYS | KSYS_SHM_WRITE, SHELL_SHM_MAX, &__shell_shm); } void __shell_init() { - if(!__shell_is_init){ - if(__shell_shm_init()){ - debug_printf("%s: shell problems detected!\n", app_name); - _ksys_exit(); + switch (__shell_is_init) { + case __SHELL_NOT_LOADED: + if (__shell_shm_init()) { + debug_printf("%s: shell problems detected!\n", app_name); + goto __shell_init_err; } - if(!shell_ping()){ - debug_printf("%s: no shell found!\n", app_name); - _ksys_exit(); + if (!shell_ping()) { + goto __shell_init_err; } + + __shell_is_init = __SHELL_INIT_OK; // The shell is being pinged, so it's working. + break; + case __SHELL_LOADING: + while (__shell_is_init == __SHELL_LOADING) { + _ksys_thread_yield(); + } + case __SHELL_INIT_OK: + if (!shell_ping()) { + goto __shell_init_err; + } + break; + default: + break; } + + return; + +__shell_init_err: + __shell_is_init = __SHELL_INIT_FAILED; + shell_exit(); + return; } diff --git a/programs/develop/ktcc/trunk/lib/libshell/shell_ping.c b/programs/develop/ktcc/trunk/lib/libshell/shell_ping.c index 87c1169fe..d3bd99a49 100644 --- a/programs/develop/ktcc/trunk/lib/libshell/shell_ping.c +++ b/programs/develop/ktcc/trunk/lib/libshell/shell_ping.c @@ -1,13 +1,24 @@ #include #include +#include + +#define SHELL_PING_TIMEOUT 10 // 0.1 sec +#define SHELL_PING_MIN_DELAY 1 int shell_ping() { - __shell_init(); *__shell_shm = SHELL_PING; - _ksys_delay(10); - if(*__shell_shm==SHELL_OK){ - return 1; + + _ksys_thread_yield(); // hope shell is fast enough + + size_t i = 0; + while (*__shell_shm != SHELL_OK){ + if (i > (SHELL_PING_TIMEOUT / SHELL_PING_MIN_DELAY)) { + return 0; + } + i++; + _ksys_delay(SHELL_PING_MIN_DELAY); } - return 0; -} \ No newline at end of file + + return 1; +} diff --git a/programs/develop/ktcc/trunk/lib/libshell/shell_printf.c b/programs/develop/ktcc/trunk/lib/libshell/shell_printf.c index c61628e47..7ec82bdd2 100644 --- a/programs/develop/ktcc/trunk/lib/libshell/shell_printf.c +++ b/programs/develop/ktcc/trunk/lib/libshell/shell_printf.c @@ -1,12 +1,12 @@ #include #include -void shell_printf(const char *format,...) +void shell_printf(const char *format, ...) { va_list ap; - va_start (ap, format); - *__shell_shm=SHELL_PUTS; - vsnprintf(__shell_shm+1, SHELL_SHM_MAX, format, ap); + va_start(ap, format); + vsnprintf(__shell_shm + 1, SHELL_SHM_MAX, format, ap); + *__shell_shm = SHELL_PUTS; va_end(ap); __SHELL_WAIT(); } diff --git a/programs/develop/ktcc/trunk/lib/libshell/shell_putc.c b/programs/develop/ktcc/trunk/lib/libshell/shell_putc.c index fa4d7b928..1d451a174 100644 --- a/programs/develop/ktcc/trunk/lib/libshell/shell_putc.c +++ b/programs/develop/ktcc/trunk/lib/libshell/shell_putc.c @@ -3,7 +3,11 @@ void shell_putc(char c) { __shell_init(); - *__shell_shm = SHELL_PUTC; - *(__shell_shm+1) = c; - __SHELL_WAIT(); + + if (__shell_is_init == __SHELL_INIT_OK) + { + *(__shell_shm + 1) = c; + *__shell_shm = SHELL_PUTC; + __SHELL_WAIT(); + } } \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/lib/libshell/shell_puts.c b/programs/develop/ktcc/trunk/lib/libshell/shell_puts.c index 58ddf8734..75d040b86 100644 --- a/programs/develop/ktcc/trunk/lib/libshell/shell_puts.c +++ b/programs/develop/ktcc/trunk/lib/libshell/shell_puts.c @@ -3,8 +3,5 @@ void shell_puts(const char *str) { - __shell_init(); - *__shell_shm = SHELL_PUTS; - strcpy(__shell_shm+1, str); - __SHELL_WAIT(); + shell_write_string(str, strlen(str)); } \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/lib/libshell/shell_write_string.c b/programs/develop/ktcc/trunk/lib/libshell/shell_write_string.c new file mode 100644 index 000000000..aec2a1161 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/libshell/shell_write_string.c @@ -0,0 +1,22 @@ +#include +#include + +void shell_write_string(const char *s, size_t len) +{ + __shell_init(); + if (__shell_is_init == __SHELL_INIT_OK) + { + if (len > SHELL_SHM_MAX - 1) + { + shell_write_string(s, SHELL_SHM_MAX - 1); // Outputs as much as it can. + shell_write_string(s + (SHELL_SHM_MAX - 1), len - (SHELL_SHM_MAX - 1)); // Outputs the rest. + } + else + { + memset(__shell_shm, 0, SHELL_SHM_MAX); // without int shell show \t, \n, lose chars and other trash + memcpy(__shell_shm + 1, s, len); + *__shell_shm = SHELL_PUTS; + __SHELL_WAIT(); + } + } +} diff --git a/programs/develop/ktcc/trunk/libc.obj/.gitignore b/programs/develop/ktcc/trunk/libc.obj/.gitignore new file mode 100644 index 000000000..851415c44 --- /dev/null +++ b/programs/develop/ktcc/trunk/libc.obj/.gitignore @@ -0,0 +1,8 @@ +.vscode/* +.tup/* + +*.o +*.kex +*.obj +*.a +*.tmp diff --git a/programs/develop/ktcc/trunk/libc.obj/include/shell_api.h b/programs/develop/ktcc/trunk/libc.obj/include/shell_api.h index bd7c144e6..5add2f28a 100644 --- a/programs/develop/ktcc/trunk/libc.obj/include/shell_api.h +++ b/programs/develop/ktcc/trunk/libc.obj/include/shell_api.h @@ -3,6 +3,12 @@ #include +#ifdef _BUILD_LIBC +#define __EXTERN +#else +#define __EXTERN extern +#endif + #define SHELL_OK 0 #define SHELL_EXIT 1 #define SHELL_PUTC 2 @@ -15,25 +21,35 @@ #define SHELL_SHM_MAX 1024 * 16 -extern char __shell_shm_name[32]; -extern char* __shell_shm; -extern int __shell_is_init; -extern void __shell_init(); +enum __SHELL_INIT_STATE { + __SHELL_NOT_LOADED = 0, // not try init shell before + __SHELL_LOADING = 1, // in progress + __SHELL_INIT_OK = 2, // ok + __SHELL_INIT_FAILED = 3 // fail init shell +}; -#define __SHELL_WAIT() \ - while (*__shell_shm) \ - _ksys_delay(5) +__EXTERN char __shell_shm_name[32]; +__EXTERN char* __shell_shm; +__EXTERN enum __SHELL_INIT_STATE __shell_is_init; +__EXTERN void __shell_init(); -extern int shell_ping(); -extern unsigned shell_get_pid(); -extern void shell_exit(); +#define __SHELL_WAIT() \ + while (*__shell_shm) { \ + _ksys_thread_yield(); \ + } -extern char shell_getc(); -extern void shell_gets(char* str, int n); +__EXTERN int shell_ping(); +__EXTERN unsigned shell_get_pid(); +__EXTERN void shell_exit(); -extern void shell_putc(char c); -extern void shell_puts(const char* str); -extern void shell_printf(const char* format, ...); +__EXTERN char shell_getc(); +__EXTERN void shell_gets(char* str, int n); -extern void shell_cls(); +__EXTERN void shell_putc(char c); +__EXTERN void shell_puts(const char* str); +__EXTERN void shell_printf(const char* format, ...); + +__EXTERN void shell_write_string(const char* s, size_t len); + +__EXTERN void shell_cls(); #endif diff --git a/programs/develop/ktcc/trunk/libc.obj/source/libc.c b/programs/develop/ktcc/trunk/libc.obj/source/libc.c index 5f1123eca..b69a083e7 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/libc.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/libc.c @@ -13,6 +13,7 @@ #include "sys/seekdir.c" #include "sys/socket.c" #include "sys/telldir.c" +#include "sys/conio.c" #include "stdio/clearerr.c" #include "stdio/conio.c" @@ -120,6 +121,18 @@ #include "misc/basename.c" #include "misc/dirname.c" +#include "../../lib/libshell/shell_cls.c" +#include "../../lib/libshell/shell_exit.c" +#include "../../lib/libshell/shell_get_pid.c" +#include "../../lib/libshell/shell_getc.c" +#include "../../lib/libshell/shell_gets.c" +#include "../../lib/libshell/shell_init.c" +#include "../../lib/libshell/shell_ping.c" +#include "../../lib/libshell/shell_printf.c" +#include "../../lib/libshell/shell_putc.c" +#include "../../lib/libshell/shell_puts.c" +#include "../../lib/libshell/shell_write_string.c" + ksys_dll_t EXPORTS[] = { { "clearerr", &clearerr }, { "debug_printf", &debug_printf }, diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdio/conio.c b/programs/develop/ktcc/trunk/libc.obj/source/stdio/conio.c index 0aa095481..8a07abce6 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/stdio/conio.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdio/conio.c @@ -73,3 +73,5 @@ int con_init(void) return con_init_opt(-1, -1, -1, -1, __con_caption); } + + diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdio/fread.c b/programs/develop/ktcc/trunk/libc.obj/source/stdio/fread.c index 0aec53d77..c256a3892 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/stdio/fread.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdio/fread.c @@ -1,6 +1,6 @@ #include #include -#include "conio.h" +#include "../sys/_conio.h" #include "sys/ksys.h" size_t fread(void *restrict ptr, size_t size, size_t nmemb, FILE *restrict stream) { @@ -19,8 +19,7 @@ size_t fread(void *restrict ptr, size_t size, size_t nmemb, FILE *restrict strea } if(stream==stdin){ - con_init(); - con_gets((char*)ptr, bytes_count+1); + console_gets((char*)ptr, bytes_count+1); return nmemb; } diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdio/fwrite.c b/programs/develop/ktcc/trunk/libc.obj/source/stdio/fwrite.c index c2e095223..a02773ab8 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/stdio/fwrite.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdio/fwrite.c @@ -1,45 +1,46 @@ #include -#include "conio.h" +#include "../sys/_conio.h" #include #include +#include -size_t fwrite(const void *restrict ptr, size_t size, size_t nmemb, FILE *restrict stream) { - unsigned bytes_written = 0; - unsigned bytes_count = size * nmemb; - - if(!stream){ - errno = EBADF; - return 0; - } - - if(size<=0 || nmemb<=0){ - errno = EINVAL; - stream->error=errno; - return 0; - } - - if(stream==stdout){ - con_init(); - con_write_string((char*)ptr, bytes_count); - return nmemb; - } - - if(stream==stderr){ - for (size_t i = 0; i < bytes_count; i++) { - char c = *(char*)(ptr+i); - _ksys_debug_putc(c); - } - return nmemb; - } - - if(stream->mode != _FILEMODE_R){ - unsigned status = _ksys_file_write_file(stream->name, stream->position, bytes_count, ptr, &bytes_written); - if (status != KSYS_FS_ERR_SUCCESS) { - errno = EIO; - stream->error = errno; - return 0; - } - stream->position+=bytes_written; - } - return bytes_written/size; +size_t fwrite(const void* restrict ptr, size_t size, size_t nmemb, FILE* restrict stream) +{ + unsigned bytes_written = 0; + unsigned bytes_count = size * nmemb; + + if (!stream) { + errno = EBADF; + return 0; + } + + if (size <= 0 || nmemb <= 0) { + errno = EINVAL; + stream->error = errno; + return 0; + } + + if (stream == stdout) { + console_write((char*)ptr, size); + return nmemb; + } + + if (stream == stderr) { + for (size_t i = 0; i < bytes_count; i++) { + char c = *(char*)(ptr + i); + _ksys_debug_putc(c); + } + return nmemb; + } + + if (stream->mode != _FILEMODE_R) { + unsigned status = _ksys_file_write_file(stream->name, stream->position, bytes_count, ptr, &bytes_written); + if (status != KSYS_FS_ERR_SUCCESS) { + errno = EIO; + stream->error = errno; + return 0; + } + stream->position += bytes_written; + } + return bytes_written / size; } diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdio/getchar.c b/programs/develop/ktcc/trunk/libc.obj/source/stdio/getchar.c index 6bfb06526..befead27b 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/stdio/getchar.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdio/getchar.c @@ -1,10 +1,10 @@ #include -#include +#include "../sys/_conio.h" int getchar(void) { - con_init(); + char c = 0; - con_gets(&c, 2); + console_gets(&c, 2); if (c == 0) { c = EOF; } diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdio/gets.c b/programs/develop/ktcc/trunk/libc.obj/source/stdio/gets.c index 95edf7c05..d45d86576 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/stdio/gets.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdio/gets.c @@ -4,17 +4,16 @@ #include #include -char *gets(char* str) +char* gets(char* str) { - con_init(); - if(con_gets(str, STDIO_MAX_MEM)==NULL){ + if (console_gets(str, STDIO_MAX_MEM) == NULL) { errno = EIO; return NULL; } - + int str_len = strlen(str); - if(str[str_len-1]=='\n'){ - str[str_len-1]='\0'; + if (str[str_len - 1] == '\n') { + str[str_len - 1] = '\0'; } return str; } diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdio/printf.c b/programs/develop/ktcc/trunk/libc.obj/source/stdio/printf.c index eac279440..2ce4fc6c0 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/stdio/printf.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdio/printf.c @@ -4,11 +4,13 @@ #include #include -//#include "format_print.h" +// #include "format_print.h" -int printf(const char *format, ...) +int printf(const char* format, ...) { - va_list arg; - va_start(arg, format); - return vprintf(format, arg); + va_list arg; + va_start(arg, format); + int ret = vprintf(format, arg); + va_end(arg); + return ret; } diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdio/puts.c b/programs/develop/ktcc/trunk/libc.obj/source/stdio/puts.c index b3cb0d449..ad38549f3 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/stdio/puts.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdio/puts.c @@ -2,13 +2,12 @@ #include #include -#include "conio.h" -#include "sys/ksys.h" +#include "../sys/_conio.h" +#include int puts(const char *str) { - con_init(); - con_write_asciiz(str); - con_write_asciiz("\n"); - return strlen(str); -} \ No newline at end of file + size_t len = strlen(str); + console_write(str, len); + return len; +} diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdio/vprintf.c b/programs/develop/ktcc/trunk/libc.obj/source/stdio/vprintf.c index 4607bb9f1..7f59f020c 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/stdio/vprintf.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdio/vprintf.c @@ -4,7 +4,7 @@ #include #include -#include "conio.h" +#include "../sys/_conio.h" #include #include #include @@ -22,9 +22,9 @@ int vprintf(const char* format, va_list arg) errno = ENOMEM; return errno; } - con_init(); + len = vsnprintf(s, STDIO_MAX_MEM, format, arg); - con_write_string(s, len); + console_write(s, len); free(s); return (len); } diff --git a/programs/develop/ktcc/trunk/libc.obj/source/stdlib/exit.c b/programs/develop/ktcc/trunk/libc.obj/source/stdlib/exit.c index 1e3bebdc0..cdd14868a 100644 --- a/programs/develop/ktcc/trunk/libc.obj/source/stdlib/exit.c +++ b/programs/develop/ktcc/trunk/libc.obj/source/stdlib/exit.c @@ -1,12 +1,10 @@ /* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ -#include -#include +#include "../sys/_conio.h" void exit(int status) { - if (__con_is_load) { - con_exit(status); - } + console_exit(); + _ksys_exit(); } diff --git a/programs/develop/ktcc/trunk/libc.obj/source/sys/_conio.h b/programs/develop/ktcc/trunk/libc.obj/source/sys/_conio.h new file mode 100644 index 000000000..e4c4e47d4 --- /dev/null +++ b/programs/develop/ktcc/trunk/libc.obj/source/sys/_conio.h @@ -0,0 +1,10 @@ +#ifndef __LIBC_SYS_CONIO_H_ +#define __LIBC_SYS_CONIO_H + +char* console_gets(char* buff, size_t len); + +void console_write(const char* ptr, size_t len); + +void console_exit(); + +#endif // __LIBC_SYS_CONIO_H diff --git a/programs/develop/ktcc/trunk/libc.obj/source/sys/conio.c b/programs/develop/ktcc/trunk/libc.obj/source/sys/conio.c new file mode 100644 index 000000000..f95ab13e8 --- /dev/null +++ b/programs/develop/ktcc/trunk/libc.obj/source/sys/conio.c @@ -0,0 +1,42 @@ +#include +#include +#include "_conio.h" + +char* console_gets(char* buff, size_t len) +{ + char* ret = buff; + + if (__shell_is_init < __SHELL_INIT_FAILED) { + shell_gets(buff, len); + } + if (__shell_is_init == __SHELL_INIT_FAILED) { + con_init(); + ret = con_gets(buff, len); + } + + return ret; +} + +void console_write(const char* ptr, size_t len) +{ + if (__shell_is_init < __SHELL_INIT_FAILED) { + shell_write_string(ptr, len); + } + if (__shell_is_init == __SHELL_INIT_FAILED) { + con_init(); + con_write_string((char*)ptr, len); + } +} + +void console_exit() +{ + if (__shell_is_init < __SHELL_INIT_FAILED) { + shell_exit(); + } + if (__shell_is_init == __SHELL_INIT_FAILED) { + + if (__con_is_load) { + con_exit(0); + } + } +}