|
|
1.1 root 1: #line 1 "CON_IN.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include "sbbs.h"
6:
7: #define LAST_STAT_LINE 16
8:
9: #ifdef __WIN32__
10:
11: #include <windows.h>
12:
13: uint lkbrd(int mode)
14: {
15: uint c;
16:
17: if(mode)
18: return(kbhit());
19: c=getch();
20: if(!c)
21: c=(getch()<<8);
22: return(c);
23: }
24:
25: int lclaes(void)
26: {
27: return(0);
28: }
29:
30: #elif defined(__OS2__)
31:
32: void fixkbdmode(void)
33: {
34: KBDINFO kbd;
35:
36: /* Disable Ctrl-C/Ctrl-P processing by OS/2 */
37: KbdGetStatus(&kbd,0);
38: if(kbd.fsMask&KEYBOARD_ASCII_MODE) {
39: kbd.fsMask|=KEYBOARD_BINARY_MODE;
40: kbd.fsMask&=~KEYBOARD_ASCII_MODE;
41: KbdSetStatus(&kbd,0); }
42: }
43:
44: uint lkbrd(int leave)
45: {
46: KBDKEYINFO key;
47:
48: if(leave)
49: KbdPeek(&key,0);
50: else
51: KbdCharIn(&key,IO_NOWAIT,0);
52: if(!(key.fbStatus&KBDTRF_FINAL_CHAR_IN))
53: return(0);
54: if(!(key.fbStatus&0x02) || key.chScan==0xE0)
55: return(key.chChar);
56: return(key.chScan<<8);
57: }
58:
59: #endif
60:
61: /****************************************************************************/
62: /* Returns character if a key has been hit locally or remotely and responds */
63: /* to local ctrl/function keys. Does not print character. */
64: /* Called from functions getkey, msgabort and main_sec */
65: /****************************************************************************/
66: char inkey(int mode)
67: {
68: static inside;
69: uchar str[512],*scrnbuf,x,y,c,atr,*gurubuf,ch=0,*helpbuf;
70: int file,con=console;
71: uint i,j;
72: long l,length;
73:
74: if(!(node_misc&NM_NO_LKBRD) && (lkbrd(1) || sys_status&SS_FINPUT)) {
75: if(sys_status&SS_FINPUT) {
76: if(lkbrd(1)==0xff00) {
77: close(inputfile);
78: sys_status^=SS_FINPUT;
79: return(0); }
80: if(read(inputfile,&c,1)!=1) {
81: close(inputfile);
82: sys_status^=SS_FINPUT;
83: return(0); }
84: if(c) /* Regular character */
85: i=c;
86: else { /* Scan code */
87: if(read(inputfile,&c,1)!=1) {
88: close(inputfile);
89: sys_status^=SS_FINPUT;
90: return(0); }
91: i=c<<8; } }
92: else
93: i=lkbrd(0);
94: if(sys_status&SS_LCHAT && curatr!=color[clr_chatlocal])
95: attr(color[clr_chatlocal]);
96: if(i&0xff)
97: ch=i&0xff;
98: else { /* Alt or Function key hit */
99: i>>=8;
100: /* F1 - F10 Shift-F1 - Alt-F10 F11 - Alt-F12 */
101: if((i>=0x3b &&i<=0x44) || (i>=0x54 &&i<=0x71) || (i>=0x85 &&i<=0x8c)) {
102: if(sys_status&SS_FINPUT)
103: return(0); /* MACROS */
104: sprintf(str,"%s%sF%d.MAC",text_dir
105: ,i<0x45 || (i>=0x85 && i<=0x86) ? nulstr
106: :i<0x5e || (i>=0x87 && i<=0x88) ? "SHFT-"
107: :i<0x68 || (i>=0x89 && i<=0x8a) ? "CTRL-" : "ALT-"
108: ,i<0x45 ? i-0x3a : i<0x5e ? i-0x53 : i<0x68 ? i-0x5d
109: :i<0x72 ? i-0x67 : i<0x87 ? i-0x7a : i<0x89 ? i-0x7c
110: :i<0x8b ? i-0x7e : i-0x80);
111: if((inputfile=nopen(str,O_RDONLY))!=-1)
112: sys_status|=SS_FINPUT;
113: return(0); }
114: if(i>=0x78 && i<=0x81) { /* Alt-# Quick Validation */
115: if(!(sys_status&SS_USERON) /* can't quick-validate if not */
116: || !useron.number
117: || !(sys_misc&SM_QVALKEYS)) { /* or not valid user number */
118: beep(100,500); /* online yet */
119: nosound();
120: return(0); }
121: if((node_misc&NM_SYSPW || SYSOP) && !chksyspass(1))
122: return(0);
123: beep(1000,100);
124: beep(1500,100);
125: nosound();
126: if(i==0x81)
127: i=0;
128: else
129: i-=0x77;
130: useron.level=val_level[i];
131: useron.flags1=val_flags1[i];
132: useron.flags2=val_flags2[i];
133: useron.flags3=val_flags3[i];
134: useron.flags4=val_flags4[i];
135: useron.exempt=val_exempt[i];
136: useron.rest=val_rest[i];
137: now=time(NULL);
138: if(useron.expire<now && val_expire[i])
139: useron.expire=now+((long)val_expire[i]*24L*60L*60L);
140: else
141: useron.expire+=((long)val_expire[i]*24L*60L*60L);
142: putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,str,10));
143: putuserrec(useron.number,U_FLAGS1,8,ultoa(useron.flags1,str,16));
144: putuserrec(useron.number,U_FLAGS2,8,ultoa(useron.flags2,str,16));
145: putuserrec(useron.number,U_FLAGS3,8,ultoa(useron.flags3,str,16));
146: putuserrec(useron.number,U_FLAGS4,8,ultoa(useron.flags4,str,16));
147: putuserrec(useron.number,U_EXEMPT,8
148: ,ultoa(useron.exempt,str,16));
149: putuserrec(useron.number,U_REST,8
150: ,ultoa(useron.rest,str,16));
151: putuserrec(useron.number,U_EXPIRE,8
152: ,ultoa(useron.expire,str,16));
153: useron.cdt=adjustuserrec(useron.number,U_CDT,10,val_cdt[i]);
154: statusline();
155: return(0); }
156: switch(i) {
157: case 0x16: /* Alt-U - Runs Uedit local only with user online */
158: sprintf(str,"%.*s",lbuflen,lbuf);
159: waitforsysop(1);
160: if((scrnbuf=MALLOC((node_scrnlen*80L)*2L))==NULL) {
161: errormsg(WHERE,ERR_ALLOC,nulstr,(node_scrnlen*80L)*2L);
162: return(CR); }
163: gettext(1,1,80,node_scrnlen-1,scrnbuf);
164: x=lclwx();
165: y=lclwy();
166: console&=~(CON_R_ECHO|CON_R_INPUT);
167: i=(sys_status&SS_TMPSYSOP);
168: if(!SYSOP) sys_status|=SS_TMPSYSOP;
169: useredit(0,1);
170: if(!i) sys_status&=~SS_TMPSYSOP;
171: lputc(FF);
172: puttext(1,1,80,node_scrnlen-1,scrnbuf);
173: FREE(scrnbuf);
174: lclxy(x,y);
175: statusline();
176: if(online==ON_REMOTE)
177: rioctl(IOFI); /* flush input buffer */
178: console=con;
179: waitforsysop(0);
180: strcpy(lbuf,str);
181: lbuflen=strlen(lbuf);
182: return(0);
183: case 0x1f: /* Alt-S - Toggles Spinning Cursor */
184: useron.misc^=SPIN;
185: return(0);
186: case 0x12: /* Alt-E - Toggle Remote echo and input */
187: if(online!=ON_REMOTE) return(0);
188: if(console&CON_R_ECHO) {
189: beep(500,50);
190: beep(1000,50);
191: nosound();
192: waitforsysop(1);
193: console&=~(CON_R_ECHO|CON_R_INPUT);
194: j=bstrlen(text[Wait]);
195: for(i=0;i<j;i++)
196: bputs("\b \b"); }
197: else {
198: beep(1000,50);
199: beep(500,50);
200: nosound();
201: j=bstrlen(text[Wait]);
202: for(i=0;i<j;i++)
203: outchar(SP);
204: console|=(CON_R_ECHO|CON_R_INPUT);
205: rioctl(IOFI); /* flush input buffer */
206: waitforsysop(0); }
207: return(0);
208: case 0x10: /* Alt-Q - Toggles remote input */
209: if(online!=ON_REMOTE)
210: return(0);
211: console^=CON_R_INPUT;
212: if(console&CON_R_INPUT) {
213: beep(1000,50);
214: beep(500,50);
215: nosound();
216: rioctl(IOSM|PAUSE|ABORT); }
217: else {
218: beep(500,50);
219: beep(1000,50);
220: nosound();
221: rioctl(IOCM|PAUSE|ABORT); }
222: rioctl(IOFI); /* flush input buffer */
223: return(0);
224: case 0x19: /* Alt-P - Turns off sysop page */
225: nosound();
226: sys_status&=~SS_SYSPAGE;
227: return(0);
228: case 0x23: /* Alt-H - Hangs up on user */
229: hangup();
230: return(0);
231: case 0x1e: /* Alt-A - Alert Sysop when User's done */
232: sys_status^=SS_SYSALERT;
233: statusline();
234: return(0);
235: case 0x82: /* Alt-- - Sub Time (5 min) */
236: starttime-=300;
237: return(0);
238: case 0x83: /* Alt-+ - Add time (5 min)*/
239: starttime+=300;
240: return(0);
241: case 0x14: /* Alt-T - Temp SysOp */
242: if(!(sys_status&SS_TMPSYSOP) && node_misc&NM_SYSPW
243: && !chksyspass(1))
244: return(0);
245: if(sys_misc&SM_L_SYSOP)
246: sys_status^=SS_TMPSYSOP;
247: statusline();
248: return(0);
249: case 0x2c: /* Alt-Z - Menu of local keys */
250: if((scrnbuf=MALLOC((node_scrnlen*80L)*2L))==NULL) {
251: errormsg(WHERE,ERR_ALLOC,nulstr,(node_scrnlen*80L)*2L);
252: return(CR); }
253: gettext(1,1,80,node_scrnlen,scrnbuf);
254: sprintf(str,"%sSBBSHELP.DAB",exec_dir);
255: if((file=nopen(str,O_RDONLY))==-1)
256: lputs("\7Can't open SBBSHELP");
257: else {
258: length=filelength(file);
259: if((helpbuf=MALLOC(length))==NULL)
260: lputs("\7Can't allocate for SBBSHELP");
261: else {
262: read(file,helpbuf,length);
263: close(file);
264: puttext(13,1,66,24,helpbuf);
265: FREE(helpbuf); } }
266: while(!lkbrd(1)) mswait(1);
267: if(lkbrd(1)==0x2c00) /* suck up the alt-z */
268: lkbrd(0);
269: puttext(1,1,80,node_scrnlen,scrnbuf);
270: FREE(scrnbuf);
271: return(0);
272: case 0x2e: /* Alt-C - Sysop Chat */
273: if(sys_status&SS_LCHAT) {
274: sys_status^=SS_LCHAT;
275: return(CR); }
276: else {
277: sys_status|=SS_LCHAT;
278: SAVELINE;
279: localchat();
280: return(0); }
281: case 0x2d: /* Alt-X exit after logoff */
282: getnodedat(node_num,&thisnode,1);
283: thisnode.misc^=NODE_DOWN;
284: putnodedat(node_num,thisnode);
285: statusline();
286: return(0);
287: case 0x47: /* Home - Same as Ctrl-B */
288: return(2); /* ctrl-b beginning of line */
289: case 0x8d: /* Ctrl-Up Arrow - decrement statusline */
290: if(statline) {
291: statline--;
292: statusline(); }
293: return(0);
294: case 0x77: /* Ctrl-Home up - top of status line info */
295: statline=1;
296: statusline();
297: return(0);
298: case 0x4b: /* Left Arrow - same as ctrl-] */
299: return(0x1d);
300: case 0x4d: /* Right Arrow - same as ctrl-f */
301: return(6);
302: case 0x48: /* Up arrow - same as ctrl-^ */
303: return(0x1e);
304: case 0x50: /* Down arrow - same as Ctrl-J */
305: return(LF);
306: case 0x4f: /* End - same as Ctrl-E */
307: return(5); /* ctrl-e - end of line */
308: case 0x91: /* Ctrl-Dn Arrow - increment statusline */
309: if(statline<LAST_STAT_LINE) {
310: statline++;
311: statusline(); }
312: return(0);
313: case 0x75: /* Ctrl-End - end of status line info */
314: statline=LAST_STAT_LINE;
315: statusline();
316: return(0);
317: case 0x52: /* Insert */
318: return(0x1f); /* ctrl-minus - insert mode */
319: case 0x53: /* Delete */
320: return(0x7f); /* ctrl-bkspc - del cur char */
321: case 0x26: /* Alt-L - Capture to cap_fname */
322: if(lclaes())
323: return(0);
324: if(sys_status&SS_CAP) {
325: sys_status^=SS_CAP;
326: fclose(capfile);
327: #ifdef __MSDOS__
328: freedosmem=farcoreleft(); /* fclose frees memory */
329: #endif
330: statusline();
331: return(0); }
332: x=lclwx();
333: y=lclwy();
334: atr=lclatr(LIGHTGRAY<<4);
335: STATUSLINE;
336: lclxy(1,node_scrnlen);
337: lputs(" Filename: ");
338: lputc(CLREOL);
339: console&=~(CON_R_INPUT|CON_R_ECHO);
340: getstr(cap_fname,40,K_UPPER|K_EDIT);
341: TEXTWINDOW;
342: lclxy(x,y);
343: lclatr(atr);
344: console=con;
345: if(cap_fname[0] &&
346: (capfile=fopen(cap_fname,"a"))==NULL)
347: bprintf("Couldn't open %s.\r\n",cap_fname);
348: else if(cap_fname[0]) {
349: #ifdef __MSDOS__
350: freedosmem=farcoreleft(); /* fnopen allocates memory */
351: #endif
352: sys_status|=SS_CAP; }
353: statusline();
354: return(0);
355: case 0x17: /* Alt-I - Interrupt node now */
356: getnodedat(node_num,&thisnode,1);
357: thisnode.misc^=NODE_INTR;
358: putnodedat(node_num,thisnode);
359: return(0);
360: case 0x13: /* Alt-R - Rerun node when caller hangs up */
361: getnodedat(node_num,&thisnode,1);
362: thisnode.misc^=NODE_RRUN;
363: putnodedat(node_num,thisnode);
364: statusline();
365: return(0);
366: case 0x31: /* Alt-N - Lock this node */
367: getnodedat(node_num,&thisnode,1);
368: thisnode.misc^=NODE_LOCK;
369: putnodedat(node_num,thisnode);
370: statusline();
371: return(0);
372: case 0x22: /* Alt-G - Guru Chat */
373: if(sys_status&SS_GURUCHAT) {
374: sys_status&=~SS_GURUCHAT;
375: return(CR); }
376: if(!total_gurus)
377: break;
378: for(i=0;i<total_gurus;i++)
379: if(chk_ar(guru[i]->ar,useron))
380: break;
381: if(i>=total_gurus)
382: i=0;
383: sprintf(str,"%s%s.DAT",ctrl_dir,guru[i]->code);
384: if((file=nopen(str,O_RDONLY))==-1) {
385: errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
386: return(0); }
387: if((gurubuf=MALLOC(filelength(file)+1L))==NULL) {
388: close(file);
389: errormsg(WHERE,ERR_ALLOC,str,filelength(file)+1L);
390: return(0); }
391: read(file,gurubuf,filelength(file));
392: gurubuf[filelength(file)]=0;
393: close(file);
394: localguru(gurubuf,i);
395: FREE(gurubuf);
396: return(CR);
397: case 0x20: /* Alt-D - Shell to DOS */
398: sprintf(str,"%.*s",lbuflen,lbuf);
399: waitforsysop(1);
400: if((scrnbuf=MALLOC((node_scrnlen*80L)*2L))==NULL) {
401: errormsg(WHERE,ERR_ALLOC,nulstr,(node_scrnlen*80L)*2L);
402: return(CR); }
403: gettext(1,1,80,node_scrnlen,scrnbuf);
404: lclatr(LIGHTGRAY);
405: x=lclwx();
406: y=lclwy();
407: lclini(node_scrnlen);
408: lputc(FF);
409: if(!(node_misc&NM_SYSPW) || chksyspass(1))
410: external(comspec,0);
411: lclini(node_scrnlen-1);
412: puttext(1,1,80,node_scrnlen,scrnbuf);
413: FREE(scrnbuf);
414: lclxy(x,y);
415: if(online==ON_REMOTE)
416: rioctl(IOFI); /* flush input buffer */
417: waitforsysop(0);
418: strcpy(lbuf,str);
419: lbuflen=strlen(lbuf);
420: timeout=time(NULL);
421: return(0);
422: case 0x49: /* PgUp - local ASCII upload */
423: if(sys_status&SS_FINPUT || lclaes() || inside)
424: return(0);
425: inside=1;
426: x=lclwx();
427: y=lclwy();
428: atr=lclatr(LIGHTGRAY<<4);
429: STATUSLINE;
430: lclxy(1,node_scrnlen);
431: lputs(" Filename: ");
432: lputc(CLREOL);
433: console&=~(CON_R_INPUT|CON_R_ECHO);
434: getstr(str,60,K_UPPER);
435: if(str[0] && (inputfile=nopen(str,O_RDONLY))!=-1)
436: sys_status|=SS_FINPUT;
437: statusline();
438: lclxy(x,y);
439: lclatr(atr);
440: console=con;
441: inside=0;
442: return(0);
443: case 0xff: /* ctrl-break - bail immediately */
444: lputs("\r\nTerminate BBS (y/N) ? ");
445: while((i=lkbrd(0))==0);
446: if(toupper(i&0xff)=='Y') { /* Ctrl-brk yes/no */
447: lputs("Yes\r\n");
448: bail(0); }
449: lputs("No\r\n");
450: sys_status|=SS_ABORT;
451: return(0); }
452: return(0); } }
453:
454: if(!ch && console&CON_R_INPUT && rioctl(RXBC)) {
455: if(sys_status&SS_LCHAT && curatr!=color[clr_chatremote])
456: attr(color[clr_chatremote]);
457: ch=incom();
458: if(node_misc&NM_7BITONLY
459: && (!(sys_status&SS_USERON) || useron.misc&NO_EXASCII))
460: ch&=0x7f; }
461: if(ch)
462: timeout=time(NULL);
463: if(ch==3) { /* Ctrl-C Abort */
464: sys_status|=SS_ABORT;
465: if(mode&K_SPIN) /* back space once if on spinning cursor */
466: bputs("\b \b");
467: return(0); }
468: if(ch==26 && action!=NODE_PCHT) { /* Ctrl-Z toggle raw input mode */
469: if(mode&K_SPIN)
470: bputs("\b ");
471: SAVELINE;
472: attr(LIGHTGRAY);
473: CRLF;
474: bputs(text[RawMsgInputModeIsNow]);
475: if(console&CON_RAW_IN)
476: bputs(text[OFF]);
477: else
478: bputs(text[ON]);
479: console^=CON_RAW_IN;
480: CRLF;
481: CRLF;
482: RESTORELINE;
483: lncntr=0;
484: if(action!=NODE_MAIN && action!=NODE_XFER)
485: return(26);
486: return(0); }
1.1.1.2 ! root 487: if(console&CON_RAW_IN) { /* ignore ctrl-key commands if in raw mode */
! 488: if(!ch && (!(mode&K_GETSTR) || mode&K_LOWPRIO || node_misc&NM_LOWPRIO))
! 489: mswait(0);
1.1 root 490: return(ch);
1.1.1.2 ! root 491: }
1.1 root 492: if(ch<SP) { /* Control chars */
493: if(ch==LF) /* ignore LF's in not in raw mode */
494: return(0);
495: if(ch==15) { /* Ctrl-O toggles pause temporarily */
496: useron.misc^=UPAUSE;
497: return(0); }
498: if(ch==0x10) { /* Ctrl-P Private node-node comm */
499: if(!(sys_status&SS_USERON))
500: return(0); /* keep from being recursive */
501: if(mode&K_SPIN)
502: bputs("\b ");
503: if(sys_status&SS_SPLITP) {
504: if((scrnbuf=MALLOC((24L*80L)*2L))==NULL) {
505: errormsg(WHERE,ERR_ALLOC,nulstr,(24L*80L)*2L);
506: return(CR); }
507: gettext(1,1,80,24,scrnbuf);
508: x=lclwx();
509: y=lclwy();
510: CLS; }
511: else {
512: SAVELINE;
513: attr(LIGHTGRAY);
514: CRLF; }
515: nodesync(); /* read any waiting messages */
516: nodemsg(); /* send a message */
517: SYNC;
518: if(sys_status&SS_SPLITP) {
519: lncntr=0;
520: CLS;
521: for(i=0;i<((24*80)-1)*2;i+=2) {
522: if(scrnbuf[i+1]!=curatr)
523: attr(scrnbuf[i+1]);
524: outchar(scrnbuf[i]); }
525: FREE(scrnbuf);
526: GOTOXY(x,y); }
527: else {
528: CRLF;
529: RESTORELINE; }
530: lncntr=0;
531: return(0); }
532:
533: if(ch==21) { /* Ctrl-U Users online */
534: if(!(sys_status&SS_USERON))
535: return(0);
536: if(mode&K_SPIN)
537: bputs("\b ");
538: if(sys_status&SS_SPLITP) {
539: if((scrnbuf=MALLOC((24L*80L)*2L))==NULL) {
540: errormsg(WHERE,ERR_ALLOC,nulstr,(24L*80L)*2L);
541: return(CR); }
542: gettext(1,1,80,24,scrnbuf);
543: x=lclwx();
544: y=lclwy();
545: CLS; }
546: else {
547: SAVELINE;
548: attr(LIGHTGRAY);
549: CRLF; }
550: whos_online(1); /* list users */
551: ASYNC;
552: if(sys_status&SS_SPLITP) {
553: CRLF;
554: nodesync();
555: pause();
556: CLS;
557: for(i=0;i<((24*80)-1)*2;i+=2) {
558: if(scrnbuf[i+1]!=curatr)
559: attr(scrnbuf[i+1]);
560: outchar(scrnbuf[i]); }
561: FREE(scrnbuf);
562: GOTOXY(x,y); }
563: else {
564: CRLF;
565: RESTORELINE; }
566: lncntr=0;
567: return(0); }
568: if(ch==20 && !(sys_status&SS_SPLITP)) { /* Ctrl-T Time information */
569: if(!(sys_status&SS_USERON))
570: return(0);
571: if(mode&K_SPIN)
572: bputs("\b ");
573: SAVELINE;
574: attr(LIGHTGRAY);
575: now=time(NULL);
576: bprintf(text[TiLogon],timestr(&logontime));
577: bprintf(text[TiNow],timestr(&now));
578: bprintf(text[TiTimeon]
579: ,sectostr(now-logontime,tmp));
580: bprintf(text[TiTimeLeft]
581: ,sectostr(timeleft,tmp));
582: SYNC;
583: RESTORELINE;
584: lncntr=0;
585: return(0); }
586: if(ch==11 && !(sys_status&SS_SPLITP)) { /* Ctrl-k Control key menu */
587: if(!(sys_status&SS_USERON))
588: return(0);
589: if(mode&K_SPIN)
590: bputs("\b ");
591: SAVELINE;
592: attr(LIGHTGRAY);
593: lncntr=0;
594: bputs(text[ControlKeyMenu]);
595: ASYNC;
596: RESTORELINE;
597: lncntr=0;
598: return(0); }
599:
600: if(ch==ESC && console&CON_R_INPUT) {
601: for(i=0;i<20 && !rioctl(RXBC);i++)
602: mswait(1);
603: if(i==20)
604: return(ESC);
605: ch=incom();
606: if(ch!='[') {
607: ungetkey(ESC);
608: ungetkey(ch);
609: return(0); }
610: i=j=0;
611: autoterm|=ANSI; /* <ESC>[x means they have ANSI */
612: if(!(useron.misc&ANSI) && useron.misc&AUTOTERM && sys_status&SS_USERON
613: && useron.number) {
614: useron.misc|=ANSI;
615: putuserrec(useron.number,U_MISC,8,ultoa(useron.misc,str,16)); }
616: while(i<10 && j<30) { /* up to 3 seconds */
617: if(rioctl(RXBC)) {
618: ch=incom();
619: if(ch!=';' && !isdigit(ch) && ch!='R') { /* other ANSI */
620: switch(ch) {
621: case 'A':
622: return(0x1e); /* ctrl-^ (up arrow) */
623: case 'B':
624: return(LF); /* ctrl-j (dn arrow) */
625: case 'C':
626: return(0x6); /* ctrl-f (rt arrow) */
627: case 'D':
628: return(0x1d); /* ctrl-] (lf arrow) */
629: case 'H':
630: return(0x2); /* ctrl-b (beg line) */
631: case 'K':
632: return(0x5); /* ctrl-e (end line) */
633: }
634: ungetkey(ESC);
635: ungetkey('[');
636: for(j=0;j<i;j++)
637: ungetkey(str[j]);
638: ungetkey(ch);
639: return(0); }
640: if(ch=='R') { /* cursor position report */
641: if(i && !(useron.rows)) { /* auto-detect rows */
642: str[i]=0;
643: rows=atoi(str);
644: if(rows<5 || rows>99) rows=24; }
645: return(0); }
646: str[i++]=ch; }
647: else {
648: mswait(100);
649: j++; } }
650:
651: ungetkey(ESC); /* should only get here if time-out */
652: ungetkey('[');
653: for(j=0;j<i;j++)
654: ungetkey(str[j]);
655: return(0); }
656:
657: } /* end of control chars */
658:
659: if(!ch && (!(mode&K_GETSTR) || mode&K_LOWPRIO || node_misc&NM_LOWPRIO))
660: mswait(0);
661: return(ch);
662: }
663:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.