diff --git a/kernel/linebuffer.cpp b/kernel/linebuffer.cpp index 7feffaec..c51e0204 100644 --- a/kernel/linebuffer.cpp +++ b/kernel/linebuffer.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2012, 2013. + Copyright(C) Jonas 'Sortie' Termansen 2012, 2013, 2014. This file is part of Sortix. @@ -22,109 +22,117 @@ *******************************************************************************/ +#include +#include #include #include #include "linebuffer.h" -namespace Sortix +namespace Sortix { + +static size_t OffsetIndex(size_t offset, size_t index, size_t length) { - static size_t OffsetIndex(size_t offset, size_t index, size_t length) - { - // TODO: Possible overflow here. - return (offset + index) % length; - } - - LineBuffer::LineBuffer() - { - buffer = NULL; - bufferlength = 0; - bufferoffset = 0; - buffercommitted = 0; - bufferfrozen = 0; - bufferused = 0; - } - - LineBuffer::~LineBuffer() - { - delete[] buffer; - } - - bool LineBuffer::Push(uint32_t unicode) - { - // Check if we need to allocate or resize the circular queue. - if ( bufferused == bufferlength ) - { - size_t newbufferlength = (bufferlength) ? bufferlength * 2 : 32UL; - uint32_t* newbuffer = new uint32_t[newbufferlength]; - if ( !newbuffer ) { return false; } - size_t elemsize = sizeof(*buffer); - size_t leadingavai = bufferlength-bufferoffset; - size_t leading = (leadingavai < bufferused) ? leadingavai : bufferused; - size_t trailing = bufferused - leading; - memcpy(newbuffer, buffer + bufferoffset, leading * elemsize); - memcpy(newbuffer + leading, buffer, trailing * elemsize); - delete[] buffer; - buffer = newbuffer; - bufferlength = newbufferlength; - bufferoffset = 0; - } - - size_t index = OffsetIndex(bufferoffset, bufferused++, bufferlength); - buffer[index] = unicode; - return true; - } - - uint32_t LineBuffer::Pop() - { - if ( !CanPop() ) { return 0; } - uint32_t result = Peek(); - bufferoffset = (bufferoffset+1) % bufferlength; - buffercommitted--; - bufferfrozen--; - bufferused--; - return result; - } - - uint32_t LineBuffer::Peek() const - { - if ( !CanPop() ) { return 0; } - size_t index = OffsetIndex(bufferoffset, 0, bufferlength); - return buffer[index]; - } - - uint32_t LineBuffer::Backspace() - { - if ( !CanBackspace() ) { return 0; } - size_t index = OffsetIndex(bufferoffset, --bufferused, bufferlength); - return buffer[index]; - } - - uint32_t LineBuffer::WouldBackspace() const - { - if ( !CanBackspace() ) { return 0; } - size_t index = OffsetIndex(bufferoffset, bufferused-1, bufferlength); - return buffer[index]; - } - - void LineBuffer::Commit() - { - buffercommitted = bufferfrozen = bufferused; - } - - void LineBuffer::Freeze() - { - bufferfrozen = bufferused; - } - - bool LineBuffer::CanPop() const - { - return buffercommitted; - } - - bool LineBuffer::CanBackspace() const - { - return bufferused - bufferfrozen; - } + // TODO: Possible overflow here. + return (offset + index) % length; } + +LineBuffer::LineBuffer() +{ + buffer = NULL; + bufferlength = 0; + bufferoffset = 0; + buffercommitted = 0; + bufferfrozen = 0; + bufferused = 0; +} + +LineBuffer::~LineBuffer() +{ + delete[] buffer; +} + +bool LineBuffer::Push(uint32_t unicode) +{ + // Check if we need to allocate or resize the circular queue. + if ( bufferused == bufferlength ) + { + size_t newbufferlength = (bufferlength) ? bufferlength * 2 : 32UL; + uint32_t* newbuffer = new uint32_t[newbufferlength]; + if ( !newbuffer ) + return false; + size_t elemsize = sizeof(*buffer); + size_t leadingavai = bufferlength-bufferoffset; + size_t leading = (leadingavai < bufferused) ? leadingavai : bufferused; + size_t trailing = bufferused - leading; + memcpy(newbuffer, buffer + bufferoffset, leading * elemsize); + memcpy(newbuffer + leading, buffer, trailing * elemsize); + delete[] buffer; + buffer = newbuffer; + bufferlength = newbufferlength; + bufferoffset = 0; + } + + size_t index = OffsetIndex(bufferoffset, bufferused++, bufferlength); + buffer[index] = unicode; + return true; +} + +uint32_t LineBuffer::Pop() +{ + if ( !CanPop() ) + return 0; + uint32_t result = Peek(); + bufferoffset = (bufferoffset+1) % bufferlength; + buffercommitted--; + bufferfrozen--; + bufferused--; + return result; +} + +uint32_t LineBuffer::Peek() const +{ + if ( !CanPop() ) + return 0; + size_t index = OffsetIndex(bufferoffset, 0, bufferlength); + return buffer[index]; +} + +uint32_t LineBuffer::Backspace() +{ + if ( !CanBackspace() ) + return 0; + size_t index = OffsetIndex(bufferoffset, --bufferused, bufferlength); + return buffer[index]; +} + +uint32_t LineBuffer::WouldBackspace() const +{ + if ( !CanBackspace() ) + return 0; + size_t index = OffsetIndex(bufferoffset, bufferused-1, bufferlength); + return buffer[index]; +} + +void LineBuffer::Commit() +{ + buffercommitted = bufferfrozen = bufferused; +} + +void LineBuffer::Freeze() +{ + bufferfrozen = bufferused; +} + +bool LineBuffer::CanPop() const +{ + return buffercommitted; +} + +bool LineBuffer::CanBackspace() const +{ + return bufferused - bufferfrozen; +} + +} // namespace Sortix diff --git a/kernel/linebuffer.h b/kernel/linebuffer.h index 815ff5b1..95ff1223 100644 --- a/kernel/linebuffer.h +++ b/kernel/linebuffer.h @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2012, 2013. + Copyright(C) Jonas 'Sortie' Termansen 2012, 2013, 2014. This file is part of Sortix. @@ -25,34 +25,38 @@ #ifndef SORTIX_LINEBUFFER_H #define SORTIX_LINEBUFFER_H -namespace Sortix +#include +#include + +namespace Sortix { + +class LineBuffer { - class LineBuffer - { - public: - LineBuffer(); - ~LineBuffer(); +public: + LineBuffer(); + ~LineBuffer(); - public: - bool Push(uint32_t unicode); - uint32_t Pop(); - uint32_t Peek() const; - uint32_t Backspace(); - uint32_t WouldBackspace() const; - void Commit(); - void Freeze(); - bool CanPop() const; - bool CanBackspace() const; +public: + bool Push(uint32_t unicode); + uint32_t Pop(); + uint32_t Peek() const; + uint32_t Backspace(); + uint32_t WouldBackspace() const; + void Commit(); + void Freeze(); + bool CanPop() const; + bool CanBackspace() const; - private: - uint32_t* buffer; - size_t bufferlength; - size_t bufferoffset; - size_t buffercommitted; - size_t bufferfrozen; - size_t bufferused; +private: + uint32_t* buffer; + size_t bufferlength; + size_t bufferoffset; + size_t buffercommitted; + size_t bufferfrozen; + size_t bufferused; - }; -} +}; + +} // namespace Sortix #endif