|
|
1.1 ! root 1: #include <pads.pri> ! 2: SRCFILE("pad.c") ! 3: #include <ctype.h> ! 4: ! 5: void Pad::makecurrent() { termop(P_MAKECURRENT); } ! 6: void Pad::clear() { termop(P_CLEAR); } ! 7: ! 8: void Pad::alarm(short n) ! 9: { ! 10: R->pktstart(P_ALARM); ! 11: R->sendobj( _object ); ! 12: R->sendshort( n ); ! 13: R->pktend(); ! 14: } ! 15: ! 16: Pad::~Pad() { trace("%d.~Pad()", this); VOK; termop(P_DELETE); } ! 17: int Pad::ok() { return this!=0; } ! 18: int Line::ok() { return this!=0; } ! 19: ! 20: Attrib Implicits(PadRcv *obj) /* can't inline - C++ bug */ ! 21: { ! 22: Attrib accum = 0; ! 23: PadRcv padrcv; ! 24: ! 25: if( !obj ) return 0; ! 26: if( &obj->kbd != &padrcv.kbd ) accum |= ACCEPT_KBD; // warning ! 27: if( &obj->userclose != &padrcv.userclose ) accum |= USERCLOSE; // warning ! 28: trace( "Implicits(%d,0x%X)", obj, accum ); ! 29: return accum; ! 30: } ! 31: ! 32: Pad::Pad(PadRcv *o) ! 33: { ! 34: trace( "%d.Pad(%d)", this, o ); VOK; ! 35: if( o && !o->isvalid() ) ! 36: PadsWarn( "Pad::Pad: object is not a PadRcv" ); ! 37: _name = "<name>"; ! 38: _banner = "<banner>"; ! 39: _object = o; ! 40: _attributes = 0; ! 41: R->pktstart( P_PADDEF ); ! 42: R->sendobj( _object ); ! 43: R->pktend(); ! 44: options( Implicits(_object) ); ! 45: } ! 46: ! 47: void Pad::nameorbanner(Protocol p, PRINTF_ARGS) ! 48: { ! 49: char *t, **_born = (p==P_BANNER ? &_banner : &_name); ! 50: trace( "%d.nameorbanner(0x%X,%s) %s", this, p, fmt, *_born ); VOK; ! 51: t = sf( PRINTF_COPY ); ! 52: if( strcmp( t, *_born ) ){ ! 53: R->pktstart( p ); ! 54: R->sendobj( _object ); ! 55: R->sendstring( *_born = t ); ! 56: R->pktend(); ! 57: } ! 58: } ! 59: ! 60: void Pad::banner(PRINTF_ARGS) { nameorbanner(P_BANNER, PRINTF_COPY); } ! 61: ! 62: void Pad::name(PRINTF_ARGS) { nameorbanner(P_NAME, PRINTF_COPY); } ! 63: ! 64: void Pad::tabs(short n) ! 65: { ! 66: short lo = 1, hi = 127; ! 67: ! 68: trace( "%d.tabs(%d)", this, n ); VOK; ! 69: if( n<lo || n>hi ) ! 70: PadsWarn( "tabs(%d) should be >=%d and <=%d", n, lo, hi ); ! 71: else { ! 72: R->pktstart( P_TABS ); ! 73: R->sendobj( _object ); ! 74: R->sendshort( n ); ! 75: R->pktend(); ! 76: } ! 77: } ! 78: ! 79: void Pad::removeline(long k) ! 80: { ! 81: trace( "%d.removeline(%d)", this, n ); VOK; ! 82: R->pktstart( P_REMOVELINE ); ! 83: R->sendobj( _object ); ! 84: R->sendlong( k ); ! 85: R->pktend(); ! 86: } ! 87: ! 88: void Pad::createline(long lo, long hi) ! 89: { ! 90: trace( "%d.createline(%d,%d)", this, lo, hi ); VOK; ! 91: if( lo>hi ) return; ! 92: R->pktstart( P_CREATELINE ); ! 93: R->sendobj( _object ); ! 94: R->sendlong( lo ); ! 95: R->sendlong( hi ); ! 96: R->pktend(); ! 97: } ! 98: ! 99: void Pad::createline(long k) ! 100: { ! 101: createline(k, k); ! 102: } ! 103: ! 104: void Pad::menu(Index ix) ! 105: { ! 106: trace( "%d.menu(0x%X)", this, ix.sht() ); VOK; ! 107: IF_LIVE( !_object ) return; ! 108: R->pktstart( P_CARTE ); ! 109: R->sendobj( _object ); ! 110: R->sendshort( ix.sht() ); ! 111: R->pktend(); ! 112: } ! 113: ! 114: void Pad::menu(Menu &m) ! 115: { ! 116: trace( "%d.menu(%d)", this, &m ); VOK; ! 117: IF_LIVE( !&m ) return; ! 118: menu(m.index()); ! 119: } ! 120: ! 121: void Pad::options(Attrib on, Attrib off) ! 122: { ! 123: trace( "%d.options(0x%X,0x%X)", this, on, off ); VOK; ! 124: _attributes |= on; ! 125: _attributes &= ~off; ! 126: R->pktstart( P_ATTRIBUTE ); ! 127: R->sendobj( _object ); ! 128: R->sendshort( _attributes ); ! 129: R->pktend(); ! 130: } ! 131: ! 132: void Pad::lines(long l) ! 133: { ! 134: trace( "%d.lines(%d)", this, l ); VOK; ! 135: IF_LIVE( l<0 ) return; ! 136: R->pktstart( P_LINES ); ! 137: R->sendobj( _object ); ! 138: R->sendlong( _lines = l ); ! 139: R->pktend(); ! 140: } ! 141: ! 142: void Pad::termop(Protocol p) ! 143: { ! 144: trace( "%d.termop(%d)", this, p ); VOK; ! 145: R->pktstart( p ); ! 146: R->sendobj( _object ); ! 147: R->pktend(); ! 148: } ! 149: ! 150: void Pad::insert(long k, PRINTF_ARGS) ! 151: { insert(k, (Attrib)0, (PadRcv*)0, *(Menu*)0, PRINTF_COPY); } ! 152: ! 153: void Pad::insert(long k, Attrib a, PRINTF_ARGS) ! 154: { insert(k, a, (PadRcv*)0, *(Menu*)0, PRINTF_COPY); } ! 155: ! 156: void Pad::insert(long k, Attrib a, PadRcv *o, Menu &m, PRINTF_ARGS) ! 157: { insert(k, a, o, &m ? m.index() : ZIndex, PRINTF_COPY); } ! 158: ! 159: void Pad::insert(long k, Attrib a, PadRcv *o, Index ix, PRINTF_ARGS) ! 160: { ! 161: Line l; ! 162: char t[1024]; ! 163: ! 164: trace( "%d.insert(%d,0x%X,%d,0x%X,%s)", this, k, a, o, ix.sht(), fmt ); VOK; ! 165: sprintf( l.text = t, PRINTF_COPY ); ! 166: l.key = k ? k : UniqueKey(); ! 167: if( !o ) a &= ~ACCEPT_KBD; ! 168: l.attributes = a; ! 169: l.object = o; ! 170: l.carte = o ? ix : ZIndex; ! 171: insert(l); ! 172: } ! 173: ! 174: static Line prev; /* = { 0, 0, 0, 0, {0,0} } - cfront bug */ ! 175: void Pad::insert(Line &l) ! 176: { ! 177: char buf[256]; ! 178: register char *from; ! 179: register int to; ! 180: static Pad *prevpad; ! 181: ! 182: trace("%d.insert(%d,%s,%d,%X)",this,l.key,l.text,l.object,l.attributes);VOK; ! 183: if( l.object && !l.object->isvalid() ) ! 184: PadsWarn("Pad::insert: object is not a PadRcv"); ! 185: if( _lines>0 && (l.key<1 || l.key>_lines) ){ ! 186: PadsWarn("Pad::insert: key out of range: %d %s", l.key, l.text); ! 187: return; ! 188: } ! 189: if( l.attributes&FLUSHLINE || l.key==prev.key ) ! 190: R->writesize = 0; ! 191: for( from = l.text, to = 0; *from && to<250; ++from ) ! 192: buf[to++] = isprint(*from) || *from=='\t' ? *from : ' '; ! 193: buf[to] = '\0'; ! 194: if( this == prevpad ! 195: && l.key == prev.key+1 ! 196: && l.carte.sht() == prev.carte.sht() ! 197: && l.attributes == prev.attributes ){ ! 198: trace( "P_NEXTLINE %d", l.key ); ! 199: R->pktstart( P_NEXTLINE ); ! 200: R->sendobj( l.object ); ! 201: } else { ! 202: R->pktstart( P_LINE ); ! 203: R->sendobj( _object ); ! 204: R->sendobj( l.object ); ! 205: R->sendlong( l.key ); ! 206: R->sendshort( l.carte.sht() ); ! 207: R->sendshort( l.attributes ); ! 208: } ! 209: R->sendstring( buf ); ! 210: R->pktend(); ! 211: prev = l; ! 212: prevpad = this; ! 213: } ! 214: ! 215: Line::Line() ! 216: { ! 217: trace( "%d.Line()", this ); VOK; ! 218: object = 0; ! 219: text = ""; ! 220: key = 0; ! 221: attributes = 0; ! 222: carte = 0; ! 223: } ! 224: ! 225: long UniqueKey() { static long u; return u += 1024; } ! 226: ! 227: void Pad::error( PRINTF_ARGS ) ! 228: { ! 229: trace( "%d.error(%s)", this, fmt ); VOK; ! 230: if( errorkey ) removeline( errorkey ); ! 231: errorkey = 0; ! 232: if( !fmt || !*fmt ) return; ! 233: insert(errorkey = UniqueKey(), SELECTLINE, PRINTF_COPY); ! 234: } ! 235: ! 236: void Pad::makegap(long k, long gap) ! 237: { ! 238: trace( "%d.makegap(%d,%d)", this, k, gap ); VOK; ! 239: R->pktstart( P_MAKEGAP ); ! 240: R->sendobj( _object ); ! 241: R->sendlong( k ); ! 242: R->sendlong( gap ); ! 243: R->pktend(); ! 244: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.