1

add overloads for bse::string

This commit is contained in:
2022-07-24 00:08:22 +02:00
parent 4aa6d089ca
commit 520445b66e
10 changed files with 84 additions and 48 deletions

View File

@ -95,7 +95,7 @@ void CGA::show(unsigned int x, unsigned int y, char character, unsigned char att
* n Laenger der Zeichenkette * * n Laenger der Zeichenkette *
* attrib Attributbyte fuer alle Zeichen der Zeichenkette * * attrib Attributbyte fuer alle Zeichen der Zeichenkette *
*****************************************************************************/ *****************************************************************************/
void CGA::print(char* string, unsigned int n, unsigned char attrib) { void CGA::print(const char* string, unsigned int n, unsigned char attrib) {
/* Hier muess Code eingefuegt werden */ /* Hier muess Code eingefuegt werden */
@ -142,6 +142,10 @@ void CGA::print(char* string, unsigned int n, unsigned char attrib) {
setpos(cursor_x, cursor_y); setpos(cursor_x, cursor_y);
} }
void CGA::print(const bse::string& string, unsigned int n, unsigned char attrib) {
print((const char*)string, n, attrib);
}
/***************************************************************************** /*****************************************************************************
* Methode: CGA::scrollup * * Methode: CGA::scrollup *
*---------------------------------------------------------------------------* *---------------------------------------------------------------------------*

View File

@ -16,6 +16,7 @@
#include "kernel/IOport.h" #include "kernel/IOport.h"
#include "user/lib/Array.h" #include "user/lib/Array.h"
#include "user/lib/String.h"
class CGA { class CGA {
private: private:
@ -61,19 +62,19 @@ public:
COLUMNS = 80 }; COLUMNS = 80 };
// Easier access to memory (also easier copying of lines/pages etc) // Easier access to memory (also easier copying of lines/pages etc)
typedef struct { struct cga_char_t {
char cga_char; char cga_char;
unsigned char cga_attribute; unsigned char cga_attribute;
} cga_char_t; };
typedef struct { struct cga_line_t {
// Can use these arrays since they don't have memory overhead (except for the methods that are elsewhere) // Can use these arrays since they don't have memory overhead (except for the methods that are elsewhere)
bse::array<cga_char_t, COLUMNS> cga_line; bse::array<cga_char_t, COLUMNS> cga_line;
} cga_line_t; };
typedef struct { struct cga_page_t {
bse::array<cga_line_t, ROWS> cga_page; bse::array<cga_line_t, ROWS> cga_page;
} cga_page_t; };
// Setzen des Cursors in Spalte x und Zeile y. // Setzen des Cursors in Spalte x und Zeile y.
void setpos(unsigned int x, unsigned int y); void setpos(unsigned int x, unsigned int y);
@ -85,7 +86,8 @@ public:
static void show(unsigned int x, unsigned int y, char character, unsigned char attrib = STD_ATTR); static void show(unsigned int x, unsigned int y, char character, unsigned char attrib = STD_ATTR);
// Anzeige mehrerer Zeichen ab der aktuellen Cursorposition // Anzeige mehrerer Zeichen ab der aktuellen Cursorposition
virtual void print(char* string, unsigned int n, unsigned char attrib = STD_ATTR); void print(const char* string, unsigned int n, unsigned char attrib = STD_ATTR);
void print(const bse::string& string, unsigned int n, unsigned char attrib = STD_ATTR);
// Verschiebt den Bildschirminhalt um eine Zeile nach oben. // Verschiebt den Bildschirminhalt um eine Zeile nach oben.
// Neue Zeile am unteren Bildrand mit Leerzeichen fuellen // Neue Zeile am unteren Bildrand mit Leerzeichen fuellen

View File

@ -24,7 +24,7 @@
* verwendet werden, um eine Ausgabe zu erzwingen. * * verwendet werden, um eine Ausgabe zu erzwingen. *
*****************************************************************************/ *****************************************************************************/
void CGA_Stream::flush() { void CGA_Stream::flush() {
print(buffer, pos, attribute(color_bg, color_fg, blink)); print(&buffer, pos, attribute(color_bg, color_fg, blink));
// Flushing resets attributes // Flushing resets attributes
blink = false; blink = false;

View File

@ -23,6 +23,7 @@
#define __OutStream_include__ #define __OutStream_include__
#include "lib/StringBuffer.h" #include "lib/StringBuffer.h"
#include "user/lib/String.h"
// Some basic width formatting // Some basic width formatting
class fillw { class fillw {
@ -82,14 +83,21 @@ public:
// Darstellung einer nullterminierten Zeichenkette // Darstellung einer nullterminierten Zeichenkette
template<typename T> template<typename T>
friend T& operator<<(T& os, char* string) { friend T& operator<<(T& os, const char* string) {
const char* pos = string;
char* pos = string;
while (*pos) { while (*pos) {
os.put(*pos); os.put(*pos);
pos++; pos++;
} }
os.fill_finalize(); // NOTE: I added this
os.fill_finalize();
return os;
}
// Can not use this exclusively for strings as these are heap allocated
template<typename T>
friend T& operator<<(T& os, const bse::string& string) {
os << (const char*)string;
return os; return os;
} }

View File

@ -31,7 +31,7 @@
void StringBuffer::put(char c) { void StringBuffer::put(char c) {
buffer[pos] = c; buffer[pos] = c;
pos++; pos++;
if (pos == sizeof(buffer)) { if (pos == buffer.size()) {
flush(); flush();
} }
} }

View File

@ -18,8 +18,9 @@
#ifndef __StringBuffer_include__ #ifndef __StringBuffer_include__
#define __StringBuffer_include__ #define __StringBuffer_include__
class StringBuffer { #include "user/lib/Array.h"
class StringBuffer {
private: private:
StringBuffer(const StringBuffer& copy); // Verhindere Kopieren StringBuffer(const StringBuffer& copy); // Verhindere Kopieren
@ -30,13 +31,12 @@ private:
// werden und kann dann auch public werden. // werden und kann dann auch public werden.
protected: protected:
char buffer[80]; bse::array<char, 80> buffer;
int pos; int pos;
// StringBuffer: Im Konstruktor wird der Puffer als leer markiert. // StringBuffer: Im Konstruktor wird der Puffer als leer markiert.
StringBuffer() : pos(0) {} StringBuffer() : pos(0) {}
// NOTE: I changed this
// Fuegt ein Zeichen in den Puffer ein. Wenn der Puffer // Fuegt ein Zeichen in den Puffer ein. Wenn der Puffer
virtual void put(char c); virtual void put(char c);

View File

@ -1,5 +1,4 @@
#include "user/devices/SerialOut.h" #include "user/devices/SerialOut.h"
#include "kernel/Globals.h"
int SerialOut::init() const { int SerialOut::init() const {
// NOTE: I could add different ports for every register but this was easier as it's that way on OSDev // NOTE: I could add different ports for every register but this was easier as it's that way on OSDev
@ -37,15 +36,19 @@ char SerialOut::read() {
return com1.inb(); return com1.inb();
} }
void SerialOut::write(char a) { void SerialOut::write(const char a) {
while (is_transmit_empty() == 0) {} while (is_transmit_empty() == 0) {}
com1.outb(a); com1.outb(a);
} }
void SerialOut::write(char* a) { void SerialOut::write(const char* a) {
char* current = a; const char* current = a;
do { do {
this->write(*current); this->write(*current);
current = current + 1; current = current + 1;
} while (*current != '\0'); } while (*current != '\0');
} }
void SerialOut::write(const bse::string& a) {
write((const char*)a);
}

View File

@ -1,8 +1,8 @@
#ifndef __SerialOut_Include_H_ #ifndef __SerialOut_Include_H_
#define __SerialOut_Include_H_ #define __SerialOut_Include_H_
#include "kernel/interrupts/ISR.h"
#include "kernel/IOport.h" #include "kernel/IOport.h"
#include "user/lib/String.h"
// NOTE: I took this code from https://wiki.osdev.org/Serial_Ports // NOTE: I took this code from https://wiki.osdev.org/Serial_Ports
@ -24,7 +24,8 @@ public:
char read(); char read();
void write(char a); void write(char a);
void write(char* a); void write(const char* a);
void write(const bse::string& a);
}; };
#endif #endif

View File

@ -4,20 +4,19 @@
SpinLock Logger::sem; SpinLock Logger::sem;
bool Logger::kout_enabled = true; bool Logger::kout_enabled = true;
bool Logger::serial_enabled = true; bool Logger::serial_enabled = true;
// const Semaphore Logger::sem = Semaphore(1);
Logger::LogLevel Logger::level = Logger::ERROR; Logger::LogLevel Logger::level = Logger::ERROR;
constexpr char* ansi_red = "\033[1;31m"; constexpr const char* ansi_red = "\033[1;31m";
constexpr char* ansi_green = "\033[1;32m"; constexpr const char* ansi_green = "\033[1;32m";
constexpr char* ansi_yellow = "\033[1;33m"; constexpr const char* ansi_yellow = "\033[1;33m";
constexpr char* ansi_blue = "\033[1;34m"; constexpr const char* ansi_blue = "\033[1;34m";
constexpr char* ansi_magenta = "\033[1;35m"; constexpr const char* ansi_magenta = "\033[1;35m";
constexpr char* ansi_cyan = "\033[1;36m"; constexpr const char* ansi_cyan = "\033[1;36m";
constexpr char* ansi_white = "\033[1;37m"; constexpr const char* ansi_white = "\033[1;37m";
constexpr char* ansi_default = "\033[0;39m "; constexpr const char* ansi_default = "\033[0;39m ";
void Logger::log(char* message, CGA::color col) const { void Logger::log(const char* message, CGA::color col) const {
if (Logger::kout_enabled) { if (Logger::kout_enabled) {
CGA::color old_col = kout.color_fg; CGA::color old_col = kout.color_fg;
kout << fgc(col) kout << fgc(col)
@ -55,16 +54,16 @@ void Logger::flush() {
switch (this->current_message_level) { switch (this->current_message_level) {
case Logger::TRACE: case Logger::TRACE:
this->trace(this->buffer); this->trace(&buffer);
break; break;
case Logger::DEBUG: case Logger::DEBUG:
this->debug(this->buffer); this->debug(&buffer);
break; break;
case Logger::ERROR: case Logger::ERROR:
this->error(this->buffer); this->error(&buffer);
break; break;
case Logger::INFO: case Logger::INFO:
this->info(this->buffer); this->info(&buffer);
break; break;
} }
@ -73,29 +72,41 @@ void Logger::flush() {
Logger::unlock(); Logger::unlock();
} }
void Logger::trace(char* message) const { void Logger::trace(const char* message) const {
if (Logger::level <= Logger::TRACE) { if (Logger::level <= Logger::TRACE) {
this->log(message, CGA::WHITE); this->log(message, CGA::WHITE);
} }
} }
void Logger::trace(const bse::string& message) const {
trace((const char*)message);
}
void Logger::debug(char* message) const { void Logger::debug(const char* message) const {
if (Logger::level <= Logger::DEBUG) { if (Logger::level <= Logger::DEBUG) {
this->log(message, CGA::LIGHT_MAGENTA); this->log(message, CGA::LIGHT_MAGENTA);
} }
} }
void Logger::debug(const bse::string& message) const {
debug((const char*)message);
}
void Logger::error(char* message) const { void Logger::error(const char* message) const {
if (Logger::level <= Logger::ERROR) { if (Logger::level <= Logger::ERROR) {
this->log(message, CGA::LIGHT_RED); this->log(message, CGA::LIGHT_RED);
} }
} }
void Logger::error(const bse::string& message) const {
error((const char*)message);
}
void Logger::info(char* message) const { void Logger::info(const char* message) const {
if (Logger::level <= Logger::INFO) { if (Logger::level <= Logger::INFO) {
this->log(message, CGA::LIGHT_BLUE); this->log(message, CGA::LIGHT_BLUE);
} }
} }
void Logger::info(const bse::string& message) const {
info((const char*)message);
}
// Manipulatoren // Manipulatoren
Logger& TRACE(Logger& log) { Logger& TRACE(Logger& log) {

View File

@ -4,6 +4,7 @@
#include "devices/CGA.h" #include "devices/CGA.h"
#include "lib/OutStream.h" #include "lib/OutStream.h"
#include "lib/SpinLock.h" #include "lib/SpinLock.h"
#include "user/lib/String.h"
class Logger : public OutStream { class Logger : public OutStream {
public: public:
@ -20,12 +21,14 @@ private:
static bool kout_enabled; static bool kout_enabled;
static bool serial_enabled; static bool serial_enabled;
void log(char* message, CGA::color col) const; void log(const char* message, CGA::color col) const;
friend class NamedLogger; // Allow NamedLogger to lock/unlock friend class NamedLogger; // Allow NamedLogger to lock/unlock
static SpinLock sem; static SpinLock sem;
static void lock() { Logger::sem.acquire(); } static void lock() { Logger::sem.acquire(); }
static void unlock() { Logger::sem.release(); } static void unlock() { Logger::sem.release(); }
// static void lock() {}
// static void unlock() {}
public: public:
enum LogLevel { enum LogLevel {
@ -39,10 +42,14 @@ public:
void flush() override; void flush() override;
void trace(char* message) const; void trace(const char* message) const;
void debug(char* message) const; void trace(const bse::string& message) const;
void error(char* message) const; void debug(const char* message) const;
void info(char* message) const; void debug(const bse::string& message) const;
void error(const char* message) const;
void error(const bse::string& message) const;
void info(const char* message) const;
void info(const bse::string& message) const;
// TODO: Make level change accessible over menu // TODO: Make level change accessible over menu
static void set_level(LogLevel level) { static void set_level(LogLevel level) {
@ -84,10 +91,10 @@ Logger& INFO(Logger& log);
class NamedLogger { class NamedLogger {
private: private:
char* name; const char* name;
public: public:
NamedLogger(char* name) : name(name) {} NamedLogger(const char* name) : name(name) {}
Logger& trace() { Logger& trace() {
Logger::lock(); Logger::lock();