mirror of
https://gitlab.com/sortix/sortix.git
synced 2023-02-13 20:55:38 -05:00
Update kernel/linebuffer.{cpp,h} to current coding conventions.
This commit is contained in:
parent
bb3b6b0260
commit
3fa5fff3f5
2 changed files with 137 additions and 125 deletions
|
@ -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 <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <sortix/kernel/kernel.h>
|
||||
|
||||
#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
|
||||
|
|
|
@ -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 <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
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
|
||||
|
|
Loading…
Add table
Reference in a new issue