//----------------------------------------------------------------------------// // GNU GPL OS/K // // // // Desc: Terminal-related functions // // // // // // Copyright © 2018-2019 The OS/K Team // // // // This file is part of OS/K. // // // // OS/K is free software: you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // // the Free Software Foundation, either version 3 of the License, or // // any later version. // // // // OS/K is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY//without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // // GNU General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with OS/K. If not, see . // //----------------------------------------------------------------------------// #include extern void VGA_Init(void); extern Terminal_t VGA_Terminal; // // Initializes standard output // void InitTerms(void) { KalAssert(!StdOut && !StdDbg); VGA_Init(); StdDbg = &VGA_Terminal; StdOut = &VGA_Terminal; ClearTerm(StdOut); } // // Fills terminal with spaces // error_t ClearTerm(Terminal_t *term) { error_t retcode; if (term == NULL) return EINVAL; KalAssert(term->initDone == INITOK); AcquireLock(&term->lock); retcode = term->clear(term); ReleaseLock(&term->lock); return retcode; } // // Changes the color code // error_t ChTermColor(Terminal_t *term, TermColor_t fgColor, TermColor_t bgColor) { if (fgColor > KTERM_COLOR_WHITE || bgColor > KTERM_COLOR_WHITE) return EINVAL; if (term == NULL) return EINVAL; AcquireLock(&term->lock); term->fgColor = fgColor; term->bgColor = bgColor; ReleaseLock(&term->lock); return EOK; } // // Writes a single character on the terminal (UNLOCKED version) // error_t PutOnTermUnlocked(Terminal_t *term, char ch) { uint i; size_t prevY; error_t rc = EOK; if (ch == '\r') { term->currentX = 0; return EOK; } // Line feed first takes us to the very end of the line // Later in this function we actually do the line feed else if (ch == '\n') { term->currentX = term->width - 1; } // Tabulations account for "term->tabSize" spaces else if (ch == '\t') { prevY = term->currentX; for (i = 0; i < term->tabSize; i++) { // Make sure tabulations can't spread over two lines if (term->currentX == prevY) { rc = term->putchar(term, ' '); if (rc) return rc; } } } else rc = term->putchar(term, ch); // Did we reach the end of line? if (!rc && ++term->currentX == term->width) { term->currentX = 0; // Did we reach the buffer's end? if (++term->currentY == term->height) { term->currentY = 0; } } return rc; } // // Writes a single character on the terminal (LOCKED version) // error_t PutOnTerm(Terminal_t *term, char ch) { error_t rc; if (term == NULL) return EINVAL; KalAssert(term->initDone == INITOK); AcquireLock(&term->lock); rc = PutOnTermUnlocked(term, ch); ReleaseLock(&term->lock); return rc; } // // Prints string on terminal (UNLOCKED version) // error_t PrintOnTermUnlocked(Terminal_t *term, const char *str) { error_t rc = EOK; while (*str && rc == EOK) { rc = PutOnTermUnlocked(term, *str++); } return rc; } // // Prints string on terminal (LOCKED version) // error_t PrintOnTerm(Terminal_t *term, const char *str) { error_t rc = EOK; if (term == NULL) return EINVAL; KalAssert(term->initDone == INITOK); AcquireLock(&term->lock); rc = PrintOnTermUnlocked(term, str); ReleaseLock(&term->lock); return rc; } // // Prints formatted string on standard output // Prints at most KLOG_MAX_BUFSIZE characters // error_t KernLog(const char *fmt, ...) { va_list ap; char logbuf[KLOG_MAX_BUFSIZE]; va_start(ap, fmt); vsnprintf(logbuf, KLOG_MAX_BUFSIZE, fmt, ap); va_end(ap); return PrintOnTerm(StdOut, logbuf); } #ifndef _NO_DEBUG // // Prints formatted string on debug output // Prints at most KLOG_MAX_BUFSIZE characters // error_t DebugLog(const char *fmt, ...) { va_list ap; char logbuf[KLOG_MAX_BUFSIZE]; va_start(ap, fmt); vsnprintf(logbuf, KLOG_MAX_BUFSIZE, fmt, ap); va_end(ap); return PrintOnTerm(StdDbg, logbuf); } #endif