ttyld.hh
//*************************************************************************
// MODULE : LnDrv.hh - Line Discipline Driver for terminal devices *
// AUTHOR : Ron Chernich *
// PURPOSE: This class used by RCOS processes which open a terminal *
// device in buffered mode [Bach, ch 10 - see CPP file]. Unix *
// does this in the kernel through numerous lists - being able *
// to do this with a class really simplifies matters. *
// HISTORY: *
// 20-APR-93 First version *
// 29-OCT-93 User break char changed to Control+C *
// 20-APR-94 Memory leak through Cblock destructor fixed *
//*************************************************************************
#ifndef _RCOS_LNDRV_
#include "rcos.hh"
#include "dbllist.hh"
#include "tty.hh"
#define CBLOCK_LEN 8 // input block segment length
#define BREAK_CHAR 3 // break detect on Ctrl+C
/////////////
// Like Unix, we hold edited input in Cblocks - but we have a reliable (?)
// double linked list class to base this structure on. First, the struct..
//
typedef struct cblock {
INT16 nStart, nEnd;
char cBuf[CBLOCK_LEN];
} CBLOCK, *PCBLOCK;
//
// now define the class based on DblList to provide functionality..
//
class Cblock : private DblList {
public:
Cblock (void) { }
~Cblock (void) { DblDrop(); }
void CbDrop (void) { DblDelete(); }
PCBLOCK CbHead (void) { return (PCBLOCK)DblGetHead(); }
PCBLOCK CbTail (void) { return (PCBLOCK)DblGetTail(); }
PCBLOCK CbNext (void) { return (PCBLOCK)DblGetNext(); }
PCBLOCK CbNew (void);
};
///////////////////
// This class processes user input commands from a terminal running
// in full duplex mode. It performs simple input editing by destructive
// backspace, echoing the user's input and passing on the owner processes
// output. Edited input is held in a chain of CBLOCK structs (like Unix)
// from which delimited blocks can be retrieved to satisfy data requests.
//
// This (initial) version performs line (CR delimited) buffering only
// and does not expand TAB characters.
//
class LnDrv : public port {
Cblock Cblk;
UINT16 uPid, uTerm; // who makes 'em and who eats 'em
INT16 nBlkReq, nChReq; // outstanding request counts.
char cDelim; // Data block delimiter char
BOOL bBreakOn; // control break detection
void LnReq (void); // process User Process request
void LnEdit (char); // process data from terminal
public:
LnDrv (UINT16, UINT16, Knl*); // constructor
~LnDrv (); // destructor
void RxPort (PMSG); // Receive port body for virtual
};
#define _RCOS_LNDRV_
#endif
/********************************** eof **********************************/