mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-23 09:15:36 +00:00
Split terminal implementation into multiple files
The terminal has a lot of bits that may be worth reusing outside the single implementation. Those bits are now located at 'include/terminal' in the gems repository.
This commit is contained in:
100
gems/include/terminal/read_buffer.h
Normal file
100
gems/include/terminal/read_buffer.h
Normal file
@ -0,0 +1,100 @@
|
||||
/*
|
||||
* \brief Buffer for storing decoded characters
|
||||
* \author Norman Feske
|
||||
* \date 2011-06-06
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2011-2012 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU General Public License version 2.
|
||||
*/
|
||||
|
||||
#ifndef _TERMINAL__READ_BUFFER_H_
|
||||
#define _TERMINAL__READ_BUFFER_H_
|
||||
|
||||
#include <os/ring_buffer.h>
|
||||
#include <base/signal.h>
|
||||
|
||||
|
||||
namespace Terminal {
|
||||
|
||||
class Read_buffer;
|
||||
|
||||
enum { READ_BUFFER_SIZE = 4096 };
|
||||
}
|
||||
|
||||
|
||||
class Terminal::Read_buffer : public Ring_buffer<unsigned char, READ_BUFFER_SIZE>
|
||||
{
|
||||
private:
|
||||
|
||||
Genode::Signal_context_capability _sigh_cap;
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Register signal handler for read-avail signals
|
||||
*/
|
||||
void sigh(Genode::Signal_context_capability cap)
|
||||
{
|
||||
_sigh_cap = cap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add element into read buffer and emit signal
|
||||
*/
|
||||
void add(unsigned char c)
|
||||
{
|
||||
Ring_buffer<unsigned char, READ_BUFFER_SIZE>::add(c);
|
||||
|
||||
if (_sigh_cap.valid())
|
||||
Genode::Signal_transmitter(_sigh_cap).submit();
|
||||
}
|
||||
|
||||
void add(char const *str)
|
||||
{
|
||||
while (*str)
|
||||
add(*str++);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
enum { READ_BUFFER_SIZE = 4096 };
|
||||
|
||||
class Read_buffer : public Ring_buffer<unsigned char, READ_BUFFER_SIZE>
|
||||
{
|
||||
private:
|
||||
|
||||
Genode::Signal_context_capability _sigh_cap;
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Register signal handler for read-avail signals
|
||||
*/
|
||||
void sigh(Genode::Signal_context_capability cap)
|
||||
{
|
||||
_sigh_cap = cap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add element into read buffer and emit signal
|
||||
*/
|
||||
void add(unsigned char c)
|
||||
{
|
||||
Ring_buffer<unsigned char, READ_BUFFER_SIZE>::add(c);
|
||||
|
||||
if (_sigh_cap.valid())
|
||||
Genode::Signal_transmitter(_sigh_cap).submit();
|
||||
}
|
||||
|
||||
void add(char const *str)
|
||||
{
|
||||
while (*str)
|
||||
add(*str++);
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* _TERMINAL__READ_BUFFER_H_ */
|
Reference in New Issue
Block a user