os-k/kaleid/kernel/io/term.c

155 lines
4.2 KiB
C
Raw Normal View History

2019-02-06 14:07:38 +01:00
//----------------------------------------------------------------------------//
// GNU GPL OS/K //
// //
2019-02-16 23:36:33 +01:00
// Desc: Terminal-related functions //
2019-02-06 14:07:38 +01:00
// //
2019-02-16 23:36:33 +01:00
// //
// 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 <https://www.gnu.org/licenses/>. //
2019-02-06 14:07:38 +01:00
//----------------------------------------------------------------------------//
2019-02-16 23:36:33 +01:00
#include <kernel/term.h>
2019-02-06 14:07:38 +01:00
extern void VGA_Init(void);
extern Terminal_t VGA_Terminal;
//
2019-03-18 17:25:44 +01:00
// Initializes standard output
2019-02-06 14:07:38 +01:00
//
void InitTerms(void)
{
KalAssert(!GetStdOut() && !GetStdDbg());
2019-02-06 14:07:38 +01:00
VGA_Init();
SetStdDbg(&VGA_Terminal);
SetStdOut(&VGA_Terminal);
ClearTerm(GetStdOut());
}
//
2019-03-18 17:25:44 +01:00
// Fills terminal with spaces
2019-02-06 14:07:38 +01:00
//
error_t ClearTerm(Terminal_t *term)
{
error_t retcode;
if (term == NULL) return EINVAL;
KalAssert(term->initDone == INITOK);
AquireLock(&term->lock);
retcode = term->ClearTermUnlocked(term);
ReleaseLock(&term->lock);
return retcode;
}
//
2019-03-18 17:25:44 +01:00
// Changes the color code
2019-02-06 14:07:38 +01:00
//
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;
AquireLock(&term->lock);
term->fgColor = fgColor;
term->bgColor = bgColor;
ReleaseLock(&term->lock);
return EOK;
}
//
2019-03-18 17:25:44 +01:00
// Writes a single character on the terminal
2019-02-06 14:07:38 +01:00
//
error_t PutOnTerm(Terminal_t *term, char ch)
{
error_t retcode;
if (term == NULL) return EINVAL;
KalAssert(term->initDone == INITOK);
AquireLock(&term->lock);
retcode = term->PutOnTermUnlocked(term, ch);
ReleaseLock(&term->lock);
return retcode;
}
//
2019-03-18 17:25:44 +01:00
// Prints string on terminal
2019-02-06 14:07:38 +01:00
//
error_t PrintOnTerm(Terminal_t *term, const char *str)
{
error_t retcode = EOK;
if (term == NULL) return EINVAL;
KalAssert(term->initDone == INITOK);
AquireLock(&term->lock);
while (*str && retcode == EOK) {
retcode = term->PutOnTermUnlocked(term, *str++);
}
ReleaseLock(&term->lock);
return retcode;
}
2019-03-18 14:21:00 +01:00
//
2019-03-18 17:25:44 +01:00
// Prints formatted string on standard output
2019-03-18 14:21:00 +01:00
// 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);
2019-03-18 17:25:44 +01:00
return PrintOnTerm(GetStdOut(), logbuf);
2019-03-18 14:21:00 +01:00
}
#ifndef _NO_DEBUG
//
2019-03-18 17:25:44 +01:00
// Prints formatted string on debug output
2019-03-18 14:21:00 +01:00
// 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);
2019-03-18 17:25:44 +01:00
return PrintOnTerm(GetStdDbg(), logbuf);
2019-03-18 14:21:00 +01:00
}
#endif