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.
|
This file is part of Sortix.
|
||||||
|
|
||||||
|
@ -22,109 +22,117 @@
|
||||||
|
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <sortix/kernel/kernel.h>
|
#include <sortix/kernel/kernel.h>
|
||||||
|
|
||||||
#include "linebuffer.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;
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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.
|
This file is part of Sortix.
|
||||||
|
|
||||||
|
@ -25,34 +25,38 @@
|
||||||
#ifndef SORTIX_LINEBUFFER_H
|
#ifndef SORTIX_LINEBUFFER_H
|
||||||
#define SORTIX_LINEBUFFER_H
|
#define SORTIX_LINEBUFFER_H
|
||||||
|
|
||||||
namespace Sortix
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
namespace Sortix {
|
||||||
|
|
||||||
|
class LineBuffer
|
||||||
{
|
{
|
||||||
class LineBuffer
|
public:
|
||||||
{
|
LineBuffer();
|
||||||
public:
|
~LineBuffer();
|
||||||
LineBuffer();
|
|
||||||
~LineBuffer();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool Push(uint32_t unicode);
|
bool Push(uint32_t unicode);
|
||||||
uint32_t Pop();
|
uint32_t Pop();
|
||||||
uint32_t Peek() const;
|
uint32_t Peek() const;
|
||||||
uint32_t Backspace();
|
uint32_t Backspace();
|
||||||
uint32_t WouldBackspace() const;
|
uint32_t WouldBackspace() const;
|
||||||
void Commit();
|
void Commit();
|
||||||
void Freeze();
|
void Freeze();
|
||||||
bool CanPop() const;
|
bool CanPop() const;
|
||||||
bool CanBackspace() const;
|
bool CanBackspace() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint32_t* buffer;
|
uint32_t* buffer;
|
||||||
size_t bufferlength;
|
size_t bufferlength;
|
||||||
size_t bufferoffset;
|
size_t bufferoffset;
|
||||||
size_t buffercommitted;
|
size_t buffercommitted;
|
||||||
size_t bufferfrozen;
|
size_t bufferfrozen;
|
||||||
size_t bufferused;
|
size_t bufferused;
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
} // namespace Sortix
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue