|
|
1.1 root 1: /* js_conio.c */
2:
3: /* Synchronet "conio" (console IO) object */
4:
5: /* $Id: js_conio.c,v 1.11 2009/08/14 07:45:40 rswindell Exp $ */
6:
7: /****************************************************************************
8: * @format.tab-size 4 (Plain Text/Source Code File Header) *
9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
10: * *
11: * Copyright 2009 Rob Swindell - http://www.synchro.net/copyright.html *
12: * *
13: * This program is free software; you can redistribute it and/or *
14: * modify it under the terms of the GNU General Public License *
15: * as published by the Free Software Foundation; either version 2 *
16: * of the License, or (at your option) any later version. *
17: * See the GNU General Public License for more details: gpl.txt or *
18: * http://www.fsf.org/copyleft/gpl.html *
19: * *
20: * Anonymous FTP access to the most recent released source is available at *
21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
22: * *
23: * Anonymous CVS access to the development source and modification history *
24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
26: * (just hit return, no password is necessary) *
27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
28: * *
29: * For Synchronet coding style and modification guidelines, see *
30: * http://www.synchro.net/source.html *
31: * *
32: * You are encouraged to submit any modifications (preferably in Unix diff *
33: * format) via e-mail to [email protected] *
34: * *
35: * Note: If this box doesn't appear square, then you need to fix your tabs. *
36: ****************************************************************************/
37:
38: #ifndef JAVASCRIPT
39: #define JAVASCRIPT
40: #endif
41:
42: #include "sbbs.h"
43: #include "ciolib.h"
44: #include "js_request.h"
45:
46: /* Properties */
47: enum {
48: PROP_WSCROLL
49: ,PROP_DIRECTVIDEO
50: ,PROP_HOLD_UPDATE
51: ,PROP_PUTTEXT_CAN_MOVE
52: ,PROP_MODE /* read-only */
53: ,PROP_MOUSE /* read-only */
54: ,PROP_ESCDELAY
55: ,PROP_TEXTATTR
56: ,PROP_KBHIT
57: ,PROP_WHEREX
58: ,PROP_WHEREY
59: ,PROP_TEXTMODE
60: ,PROP_WINLEFT
61: ,PROP_WINTOP
62: ,PROP_WINRIGHT
63: ,PROP_WINBOTTOM
64: ,PROP_SCREENWIDTH
65: ,PROP_SCREENHEIGHT
66: ,PROP_NORMATTR
67: ,PROP_TEXTBACKGROUND
68: ,PROP_TEXTCOLOR
69: ,PROP_CLIPBOARD
70: ,PROP_HIGHVIDEO
71: ,PROP_LOWVIDEO
72: };
73:
74: static JSBool js_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
75: {
76: jsint tiny;
77: jsrefcount rc;
78:
79: tiny = JSVAL_TO_INT(id);
80:
81: rc=JS_SUSPENDREQUEST(cx);
82: switch(tiny) {
83: case PROP_WSCROLL:
84: *vp=BOOLEAN_TO_JSVAL(_wscroll);
85: break;
86: case PROP_DIRECTVIDEO:
87: *vp=BOOLEAN_TO_JSVAL(directvideo);
88: break;
89: case PROP_HOLD_UPDATE:
90: *vp=BOOLEAN_TO_JSVAL(hold_update);
91: break;
92: case PROP_PUTTEXT_CAN_MOVE:
93: *vp=BOOLEAN_TO_JSVAL(puttext_can_move);
94: break;
95: case PROP_MODE:
96: *vp=INT_TO_JSVAL(cio_api.mode);
97: break;
98: case PROP_MOUSE:
99: *vp=BOOLEAN_TO_JSVAL(cio_api.mouse);
100: break;
101: case PROP_ESCDELAY:
102: *vp=INT_TO_JSVAL(cio_api.ESCDELAY?*cio_api.ESCDELAY:0);
103: break;
104: case PROP_TEXTATTR:
105: *vp=INT_TO_JSVAL(cio_textinfo.attribute);
106: break;
107: case PROP_KBHIT:
108: *vp=BOOLEAN_TO_JSVAL(kbhit());
109: break;
110: case PROP_WHEREX:
111: *vp=INT_TO_JSVAL(cio_textinfo.curx);
112: break;
113: case PROP_WHEREY:
114: *vp=INT_TO_JSVAL(cio_textinfo.cury);
115: break;
116: case PROP_TEXTMODE:
117: *vp=INT_TO_JSVAL(cio_textinfo.currmode);
118: break;
119: case PROP_WINLEFT:
120: *vp=INT_TO_JSVAL(cio_textinfo.winleft);
121: break;
122: case PROP_WINTOP:
123: *vp=INT_TO_JSVAL(cio_textinfo.wintop);
124: break;
125: case PROP_WINRIGHT:
126: *vp=INT_TO_JSVAL(cio_textinfo.winright);
127: break;
128: case PROP_WINBOTTOM:
129: *vp=INT_TO_JSVAL(cio_textinfo.winbottom);
130: break;
131: case PROP_SCREENWIDTH:
132: *vp=INT_TO_JSVAL(cio_textinfo.screenwidth);
133: break;
134: case PROP_SCREENHEIGHT:
135: *vp=INT_TO_JSVAL(cio_textinfo.screenheight);
136: break;
137: case PROP_NORMATTR:
138: *vp=INT_TO_JSVAL(cio_textinfo.normattr);
139: break;
140: case PROP_TEXTBACKGROUND:
141: *vp=INT_TO_JSVAL((cio_textinfo.attribute & 0x70)>>4);
142: break;
143: case PROP_TEXTCOLOR:
144: *vp=INT_TO_JSVAL(cio_textinfo.attribute & 0xf);
145: break;
146: case PROP_CLIPBOARD:
147: *vp=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,getcliptext()));
148: break;
149: case PROP_HIGHVIDEO:
150: *vp=BOOLEAN_TO_JSVAL(cio_textinfo.attribute & 0x8);
151: break;
152: case PROP_LOWVIDEO:
153: *vp=BOOLEAN_TO_JSVAL(!(cio_textinfo.attribute & 0x8));
154: break;
155: }
156: JS_RESUMEREQUEST(cx, rc);
157:
158: return(JS_TRUE);
159: }
160:
161: static JSBool js_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
162: {
163: jsint tiny;
164: int32 i=0;
165: JSBool b;
166: jsrefcount rc;
167:
168: tiny = JSVAL_TO_INT(id);
169:
170: switch(tiny) {
171: case PROP_WSCROLL:
172: JS_ValueToBoolean(cx, *vp, &_wscroll);
173: break;
174: case PROP_DIRECTVIDEO:
175: JS_ValueToBoolean(cx, *vp, &directvideo);
176: break;
177: case PROP_HOLD_UPDATE:
178: JS_ValueToBoolean(cx, *vp, &hold_update);
179: break;
180: case PROP_PUTTEXT_CAN_MOVE:
181: JS_ValueToBoolean(cx, *vp, &puttext_can_move);
182: break;
183: case PROP_ESCDELAY:
184: if(cio_api.ESCDELAY)
185: JS_ValueToInt32(cx, *vp, (int32*)cio_api.ESCDELAY);
186: break;
187: case PROP_TEXTATTR:
188: JS_ValueToInt32(cx, *vp, &i);
189: rc=JS_SUSPENDREQUEST(cx);
190: textattr(i);
191: JS_RESUMEREQUEST(cx, rc);
192: break;
193: case PROP_WHEREX:
194: JS_ValueToInt32(cx, *vp, &i);
195: rc=JS_SUSPENDREQUEST(cx);
196: gotoxy(i, cio_textinfo.cury);
197: JS_RESUMEREQUEST(cx, rc);
198: break;
199: case PROP_WHEREY:
200: JS_ValueToInt32(cx, *vp, &i);
201: rc=JS_SUSPENDREQUEST(cx);
202: gotoxy(cio_textinfo.curx, i);
203: JS_RESUMEREQUEST(cx, rc);
204: break;
205: case PROP_TEXTMODE:
206: JS_ValueToInt32(cx, *vp, &i);
207: rc=JS_SUSPENDREQUEST(cx);
208: textmode(i);
209: JS_RESUMEREQUEST(cx, rc);
210: break;
211: case PROP_TEXTBACKGROUND:
212: JS_ValueToInt32(cx, *vp, &i);
213: rc=JS_SUSPENDREQUEST(cx);
214: textbackground(i);
215: JS_RESUMEREQUEST(cx, rc);
216: break;
217: case PROP_TEXTCOLOR:
218: JS_ValueToInt32(cx, *vp, &i);
219: rc=JS_SUSPENDREQUEST(cx);
220: textcolor(i);
221: JS_RESUMEREQUEST(cx, rc);
222: break;
223: case PROP_CLIPBOARD:
224: {
225: size_t len;
226: char *bytes;
227:
228: bytes=js_ValueToStringBytes(cx, *vp, &len);
229: rc=JS_SUSPENDREQUEST(cx);
230: copytext(bytes, len+1);
231: JS_RESUMEREQUEST(cx, rc);
232: }
233: break;
234: case PROP_HIGHVIDEO:
235: JS_ValueToBoolean(cx, *vp, &b);
236: rc=JS_SUSPENDREQUEST(cx);
237: if(b)
238: highvideo();
239: else
240: lowvideo();
241: JS_RESUMEREQUEST(cx, rc);
242: break;
243: case PROP_LOWVIDEO:
244: JS_ValueToBoolean(cx, *vp, &b);
245: rc=JS_SUSPENDREQUEST(cx);
246: if(b)
247: lowvideo();
248: else
249: highvideo();
250: JS_RESUMEREQUEST(cx, rc);
251: break;
252: }
253:
254: return(JS_TRUE);
255: }
256:
257: static jsSyncPropertySpec js_properties[] = {
258: /* name, tinyid, flags, ver */
259:
260: { "wscroll", PROP_WSCROLL, JSPROP_ENUMERATE, 315 },
261: { "directvideo", PROP_DIRECTVIDEO, JSPROP_ENUMERATE, 315 },
262: { "hold_update", PROP_HOLD_UPDATE, JSPROP_ENUMERATE, 315 },
263: { "puttext_can_move", PROP_PUTTEXT_CAN_MOVE, JSPROP_ENUMERATE, 315 },
264: { "mode", PROP_MODE, JSPROP_ENUMERATE|JSPROP_READONLY, 315 },
265: { "mouse", PROP_MOUSE, JSPROP_ENUMERATE|JSPROP_READONLY, 315 },
266: { "ESCDELAY", PROP_ESCDELAY, JSPROP_ENUMERATE, 315 },
267: { "textattr", PROP_TEXTATTR, JSPROP_ENUMERATE, 315 },
268: { "kbhit", PROP_KBHIT, JSPROP_ENUMERATE|JSPROP_READONLY, 315 },
269: { "wherex", PROP_WHEREX, JSPROP_ENUMERATE, 315 },
270: { "wherey", PROP_WHEREY, JSPROP_ENUMERATE, 315 },
271: { "textmode", PROP_TEXTMODE, JSPROP_ENUMERATE, 315 },
272: { "winleft", PROP_WINLEFT, JSPROP_ENUMERATE|JSPROP_READONLY, 315 },
273: { "wintop", PROP_WINTOP, JSPROP_ENUMERATE|JSPROP_READONLY, 315 },
274: { "winright", PROP_WINRIGHT, JSPROP_ENUMERATE|JSPROP_READONLY, 315 },
275: { "winbottom", PROP_WINBOTTOM, JSPROP_ENUMERATE|JSPROP_READONLY, 315 },
276: { "screenwidth", PROP_SCREENWIDTH, JSPROP_ENUMERATE|JSPROP_READONLY, 315 },
277: { "screenheight", PROP_SCREENHEIGHT, JSPROP_ENUMERATE|JSPROP_READONLY, 315 },
278: { "normattr", PROP_NORMATTR, JSPROP_ENUMERATE|JSPROP_READONLY, 315 },
279: { "textbackground", PROP_TEXTBACKGROUND, JSPROP_ENUMERATE, 315 },
280: { "textcolor", PROP_TEXTCOLOR, JSPROP_ENUMERATE, 315 },
281: { "clipboard", PROP_CLIPBOARD, JSPROP_ENUMERATE, 315 },
282: { "lowvideo", PROP_LOWVIDEO, JSPROP_ENUMERATE, 315 },
283: { "highvideo", PROP_HIGHVIDEO, JSPROP_ENUMERATE, 315 },
284: {0}
285: };
286:
287: /* Methods */
288:
289: static JSBool
290: js_conio_init(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
291: {
292: int ciolib_mode=CIOLIB_MODE_AUTO;
293: char* mode;
294: jsrefcount rc;
295:
296: *rval = JSVAL_FALSE;
297:
298: if(argc>0 && (mode=js_ValueToStringBytes(cx, argv[0], NULL))!=NULL) {
299: if(!stricmp(mode,"STDIO"))
300: ciolib_mode=-1;
301: else if(!stricmp(mode,"AUTO"))
302: ciolib_mode=CIOLIB_MODE_AUTO;
303: else if(!stricmp(mode,"X"))
304: ciolib_mode=CIOLIB_MODE_X;
305: else if(!stricmp(mode,"ANSI"))
306: ciolib_mode=CIOLIB_MODE_ANSI;
307: else if(!stricmp(mode,"CONIO"))
308: ciolib_mode=CIOLIB_MODE_CONIO;
309: }
310:
311: rc=JS_SUSPENDREQUEST(cx);
312: if(initciolib(ciolib_mode)) {
313: JS_RESUMEREQUEST(cx, rc);
314: return(JS_TRUE);
315: }
316:
317: *rval = JSVAL_TRUE;
318: JS_RESUMEREQUEST(cx, rc);
319: return(JS_TRUE);
320: }
321:
322: static JSBool
323: js_conio_suspend(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
324: {
325: jsrefcount rc;
326:
327: rc=JS_SUSPENDREQUEST(cx);
328: suspendciolib();
329: *rval = JSVAL_TRUE;
330: JS_RESUMEREQUEST(cx, rc);
331: return(JS_TRUE);
332: }
333:
334: static JSBool
335: js_conio_clreol(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
336: {
337: jsrefcount rc;
338:
339: rc=JS_SUSPENDREQUEST(cx);
340: clreol();
341: *rval = JSVAL_TRUE;
342: JS_RESUMEREQUEST(cx, rc);
343: return(JS_TRUE);
344: }
345:
346: static JSBool
347: js_conio_clrscr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
348: {
349: jsrefcount rc;
350:
351: rc=JS_SUSPENDREQUEST(cx);
352: clrscr();
353: *rval = JSVAL_TRUE;
354: JS_RESUMEREQUEST(cx, rc);
355: return(JS_TRUE);
356: }
357:
358: static JSBool
359: js_conio_wscroll(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
360: {
361: jsrefcount rc;
362:
363: rc=JS_SUSPENDREQUEST(cx);
364: wscroll();
365: *rval = JSVAL_TRUE;
366: JS_RESUMEREQUEST(cx, rc);
367: return(JS_TRUE);
368: }
369:
370: static JSBool
371: js_conio_delline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
372: {
373: jsrefcount rc;
374:
375: rc=JS_SUSPENDREQUEST(cx);
376: delline();
377: *rval = JSVAL_TRUE;
378: JS_RESUMEREQUEST(cx, rc);
379: return(JS_TRUE);
380: }
381:
382: static JSBool
383: js_conio_insline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
384: {
385: jsrefcount rc;
386:
387: rc=JS_SUSPENDREQUEST(cx);
388: insline();
389: *rval = JSVAL_TRUE;
390: JS_RESUMEREQUEST(cx, rc);
391: return(JS_TRUE);
392: }
393:
394: static JSBool
395: js_conio_normvideo(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
396: {
397: jsrefcount rc;
398:
399: rc=JS_SUSPENDREQUEST(cx);
400: normvideo();
401: *rval = JSVAL_TRUE;
402: JS_RESUMEREQUEST(cx, rc);
403: return(JS_TRUE);
404: }
405:
406: static JSBool
407: js_conio_getch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
408: {
409: jsrefcount rc;
410:
411: rc=JS_SUSPENDREQUEST(cx);
412: *rval = INT_TO_JSVAL(getch());
413: JS_RESUMEREQUEST(cx, rc);
414: return(JS_TRUE);
415: }
416:
417: static JSBool
418: js_conio_getche(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
419: {
420: jsrefcount rc;
421:
422: rc=JS_SUSPENDREQUEST(cx);
423: *rval = INT_TO_JSVAL(getche());
424: JS_RESUMEREQUEST(cx, rc);
425: return(JS_TRUE);
426: }
427:
428: static JSBool
429: js_conio_beep(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
430: {
431: jsrefcount rc;
432:
433: rc=JS_SUSPENDREQUEST(cx);
434: *rval = INT_TO_JSVAL(beep());
435: JS_RESUMEREQUEST(cx, rc);
436: return(JS_TRUE);
437: }
438:
439: static JSBool
440: js_conio_getfont(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
441: {
442: jsrefcount rc;
443:
444: rc=JS_SUSPENDREQUEST(cx);
445: *rval = INT_TO_JSVAL(getfont());
446: JS_RESUMEREQUEST(cx, rc);
447: return(JS_TRUE);
448: }
449:
450: static JSBool
451: js_conio_hidemouse(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
452: {
453: jsrefcount rc;
454:
455: rc=JS_SUSPENDREQUEST(cx);
456: *rval = INT_TO_JSVAL(hidemouse());
457: JS_RESUMEREQUEST(cx, rc);
458: return(JS_TRUE);
459: }
460:
461: static JSBool
462: js_conio_showmouse(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
463: {
464: jsrefcount rc;
465:
466: rc=JS_SUSPENDREQUEST(cx);
467: *rval = INT_TO_JSVAL(showmouse());
468: JS_RESUMEREQUEST(cx, rc);
469: return(JS_TRUE);
470: }
471:
472: static JSBool
473: js_conio_setcursortype(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
474: {
475: int32 type;
476: jsrefcount rc;
477:
478: if(argc==1 && JSVAL_IS_NUMBER(argv[0]) && JS_ValueToInt32(cx,argv[0],&type)) {
479: rc=JS_SUSPENDREQUEST(cx);
480: _setcursortype(type);
481: *rval = JSVAL_TRUE;
482: JS_RESUMEREQUEST(cx, rc);
483: return(JS_TRUE);
484: }
485:
486: return(JS_FALSE);
487: }
488:
489: static JSBool
490: js_conio_gotoxy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
491: {
492: int32 x,y;
493: jsrefcount rc;
494:
495: if(argc==2 && JSVAL_IS_NUMBER(argv[0]) && JS_ValueToInt32(cx,argv[0],&x)
496: && JSVAL_IS_NUMBER(argv[1]) && JS_ValueToInt32(cx,argv[1],&y)) {
497: rc=JS_SUSPENDREQUEST(cx);
498: gotoxy(x,y);
499: *rval = JSVAL_TRUE;
500: JS_RESUMEREQUEST(cx, rc);
501: return(JS_TRUE);
502: }
503:
504: return(JS_FALSE);
505: }
506:
507: static JSBool
508: js_conio_putch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
509: {
510: int32 ch;
511: jsrefcount rc;
512:
513: if(argc==1 && JSVAL_IS_NUMBER(argv[0]) && JS_ValueToInt32(cx,argv[0],&ch)) {
514: rc=JS_SUSPENDREQUEST(cx);
515: *rval=INT_TO_JSVAL(putch(ch));
516: JS_RESUMEREQUEST(cx, rc);
517: return(JS_TRUE);
518: }
519:
520: return(JS_FALSE);
521: }
522:
523: static JSBool
524: js_conio_ungetch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
525: {
526: int32 ch;
527: jsrefcount rc;
528:
529: if(argc==1 && JSVAL_IS_NUMBER(argv[0]) && JS_ValueToInt32(cx,argv[0],&ch)) {
530: rc=JS_SUSPENDREQUEST(cx);
531: *rval=INT_TO_JSVAL(ungetch(ch));
532: JS_RESUMEREQUEST(cx, rc);
533: return(JS_TRUE);
534: }
535:
536: return(JS_FALSE);
537: }
538:
539: static JSBool
540: js_conio_loadfont(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
541: {
542: char * str;
543: jsrefcount rc;
544:
545: if(argc==1 && (str=js_ValueToStringBytes(cx,argv[0],NULL))!=NULL) {
546: rc=JS_SUSPENDREQUEST(cx);
547: *rval=INT_TO_JSVAL(loadfont(str));
548: JS_RESUMEREQUEST(cx, rc);
549: return(JS_TRUE);
550: }
551:
552: return(JS_FALSE);
553: }
554:
555: static JSBool
556: js_conio_settitle(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
557: {
558: char * str;
559: jsrefcount rc;
560:
561: if(argc==1 && (str=js_ValueToStringBytes(cx,argv[0],NULL))!=NULL) {
562: rc=JS_SUSPENDREQUEST(cx);
563: settitle(str);
564: JS_RESUMEREQUEST(cx, rc);
565: *rval=JSVAL_TRUE;
566: return(JS_TRUE);
567: }
568:
569: return(JS_FALSE);
570: }
571:
572: static JSBool
573: js_conio_setname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
574: {
575: char * str;
576: jsrefcount rc;
577:
578: if(argc==1 && (str=js_ValueToStringBytes(cx,argv[0],NULL))!=NULL) {
579: rc=JS_SUSPENDREQUEST(cx);
580: setname(str);
581: JS_RESUMEREQUEST(cx, rc);
582: *rval=JSVAL_TRUE;
583: return(JS_TRUE);
584: }
585:
586: return(JS_FALSE);
587: }
588:
589: static JSBool
590: js_conio_cputs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
591: {
592: char * str;
593: jsrefcount rc;
594:
595: if(argc==1 && (str=js_ValueToStringBytes(cx,argv[0],NULL))!=NULL) {
596: rc=JS_SUSPENDREQUEST(cx);
597: *rval=INT_TO_JSVAL(cputs(str));
598: JS_RESUMEREQUEST(cx, rc);
599: return(JS_TRUE);
600: }
601:
602: return(JS_FALSE);
603: }
604:
605: static JSBool
606: js_conio_setfont(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
607: {
608: int32 font;
609: int force=JS_FALSE;
610: int32 fnum=0;
611: jsrefcount rc;
612: uintN arg=0;
613:
614: if(argc > 2)
615: return(JS_FALSE);
616:
617: if(argc > 0 && JSVAL_IS_NUMBER(argv[arg]) && JS_ValueToInt32(cx,argv[arg],&font)) {
618: for(arg=1; arg<argc; arg++) {
619: if(JSVAL_IS_NUMBER(argv[arg])) {
620: if(!JS_ValueToInt32(cx,argv[arg],&fnum))
621: return(JS_FALSE);
622: }
623: else if(JSVAL_IS_BOOLEAN(argv[arg])) {
624: if(!JS_ValueToBoolean(cx, argv[1], &force))
625: return(JS_FALSE);
626: }
627: else
628: return(JS_FALSE);
629: }
630: rc=JS_SUSPENDREQUEST(cx);
631: *rval=INT_TO_JSVAL(setfont(font, force,fnum));
632: JS_RESUMEREQUEST(cx, rc);
633: return(JS_TRUE);
634: }
635:
636: return(JS_FALSE);
637: }
638:
639: static JSBool
640: js_conio_getpass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
641: {
642: char * str;
643: char * pwd;
644: jsrefcount rc;
645:
646: if(argc==1 && (str=js_ValueToStringBytes(cx,argv[0],NULL))!=NULL) {
647: rc=JS_SUSPENDREQUEST(cx);
648: pwd=getpass(str);
649: JS_RESUMEREQUEST(cx, rc);
650: *rval=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,pwd));
651: return(JS_TRUE);
652: }
653:
654: return(JS_FALSE);
655: }
656:
657: static JSBool
658: js_conio_window(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
659: {
660: int32 left=1;
661: int32 top=1;
662: int32 right=cio_textinfo.screenwidth;
663: int32 bottom=cio_textinfo.screenheight;
664: jsrefcount rc;
665:
666: if(argc > 4)
667: return(JS_FALSE);
668:
669: if(argc > 0) {
670: if(!JSVAL_IS_NUMBER(argv[0]))
671: return(JS_FALSE);
672: if(!JS_ValueToInt32(cx, argv[0], &left))
673: return(JS_FALSE);
674: }
675: if(argc > 1) {
676: if(!JSVAL_IS_NUMBER(argv[1]))
677: return(JS_FALSE);
678: if(!JS_ValueToInt32(cx, argv[1], &top))
679: return(JS_FALSE);
680: }
681: if(argc > 2) {
682: if(!JSVAL_IS_NUMBER(argv[2]))
683: return(JS_FALSE);
684: if(!JS_ValueToInt32(cx, argv[2], &right))
685: return(JS_FALSE);
686: }
687: if(argc > 3) {
688: if(!JSVAL_IS_NUMBER(argv[3]))
689: return(JS_FALSE);
690: if(!JS_ValueToInt32(cx, argv[3], &bottom))
691: return(JS_FALSE);
692: }
693:
694: rc=JS_SUSPENDREQUEST(cx);
695: window(left, top, right, bottom);
696: JS_RESUMEREQUEST(cx, rc);
697: if(cio_textinfo.winleft == left
698: && cio_textinfo.winright==right
699: && cio_textinfo.wintop==top
700: && cio_textinfo.winbottom==bottom) {
701: *rval=JSVAL_TRUE;
702: }
703: else {
704: *rval=JSVAL_FALSE;
705: }
706: return(JS_TRUE);
707: }
708:
709: static JSBool
710: js_conio_cgets(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
711: {
712: char buf[258];
713: int32 maxlen=255;
714: char *ret;
715: jsrefcount rc;
716:
717: if(argc > 1)
718: return(JS_FALSE);
719: if(argc > 0) {
720: if(!JSVAL_IS_NUMBER(argv[0]))
721: return(JS_FALSE);
722: if(!JS_ValueToInt32(cx, argv[0], &maxlen))
723: return(JS_FALSE);
724: if(maxlen > 255)
725: return(JS_FALSE);
726: }
727: buf[0]=(char)maxlen;
728: rc=JS_SUSPENDREQUEST(cx);
729: ret=cgets(buf);
730: JS_RESUMEREQUEST(cx, rc);
731: if(ret==NULL)
732: *rval=JSVAL_NULL;
733: else {
734: buf[257]=0;
735: *rval=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,ret));
736: }
737:
738: return(JS_TRUE);
739: }
740:
741: /* TODO: cprintf() not really needed since we have cputs() and format() */
742: #if 0
743: static JSBool
744: js_conio_cprintf(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
745: {
746: }
747: #endif
748:
749: /* TODO: cscanf()... this would be rather insane actually... */
750: #if 0
751: static JSBool
752: js_conio_cscanf(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
753: {
754: }
755: #endif
756:
757: static JSBool
758: js_conio_movetext(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
759: {
760: int i;
761: int32 args[6];
762: jsrefcount rc;
763:
764: if(argc != 6)
765: return(JS_FALSE);
766: for(i=0; i<6; i++) {
767: if(!JSVAL_IS_NUMBER(argv[i]))
768: return(JS_FALSE);
769: if(!JS_ValueToInt32(cx, argv[i], &args[i]))
770: return(JS_FALSE);
771: }
772: rc=JS_SUSPENDREQUEST(cx);
773: *rval=BOOLEAN_TO_JSVAL(movetext(args[0], args[1], args[2], args[3], args[4], args[5]));
774: JS_RESUMEREQUEST(cx, rc);
775: return(JS_TRUE);
776: }
777:
778: static JSBool
779: js_conio_puttext(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
780: {
781: int32 args[4];
782: unsigned char *buffer;
783: jsuint i;
784: int32 j;
785: jsuint size;
786: jsval val;
787: JSObject *array;
788: jsrefcount rc;
789:
790: /* default values: */
791: args[0]=1;
792: args[1]=1;
793: args[2]=cio_textinfo.screenwidth;
794: args[3]=cio_textinfo.screenheight;
795:
796: if(argc != 5)
797: return(JS_FALSE);
798: for(i=0; i<4; i++) {
799: if(!JSVAL_IS_NUMBER(argv[i]))
800: return(JS_FALSE);
801: if(!JS_ValueToInt32(cx, argv[i], &args[i]))
802: return(JS_FALSE);
803: }
804: if(args[0] < 1 || args[1] < 1 || args[2] < 1 || args[3] < 1
805: || args[0] > args[2] || args[1] > args[3]
806: || args[2] > cio_textinfo.screenwidth || args[3] > cio_textinfo.screenheight) {
807: *rval=JSVAL_FALSE;
808: return(JS_TRUE);
809: }
810:
811: if(!JSVAL_IS_OBJECT(argv[4]))
812: return(JS_FALSE);
813: array=JSVAL_TO_OBJECT(argv[4]);
814: if(!JS_GetArrayLength(cx, array, &size))
815: return(JS_FALSE);
816:
817: buffer=(unsigned char *)malloc(size);
818: if(buffer==NULL)
819: return(JS_FALSE);
820: for(i=0; i<size; i++) {
821: if(!JS_GetElement(cx, array, i, &val)) {
822: free(buffer);
823: return(JS_FALSE);
824: }
825: if(!JSVAL_IS_NUMBER(val)) {
826: free(buffer);
827: return(JS_FALSE);
828: }
829: if(!JS_ValueToInt32(cx, val, &j)) {
830: free(buffer);
831: return(JS_FALSE);
832: }
833: buffer[i]=(unsigned char)j;
834: }
835:
836: rc=JS_SUSPENDREQUEST(cx);
837: *rval=BOOLEAN_TO_JSVAL(puttext(args[0], args[1], args[2], args[3], buffer));
838: free(buffer);
839: JS_RESUMEREQUEST(cx, rc);
840: return(JS_TRUE);
841: }
842:
843: static JSBool
844: js_conio_gettext(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
845: {
846: int32 args[4];
847: unsigned char *result;
848: int i;
849: int size;
850: JSObject *array;
851: jsval val;
852: jsrefcount rc;
853:
854: /* default values: */
855: args[0]=1;
856: args[1]=1;
857: args[2]=cio_textinfo.screenwidth;
858: args[3]=cio_textinfo.screenheight;
859:
860: if(argc > 4)
861: return(JS_FALSE);
862: for(i=0; i<(int)argc; i++) {
863: if(!JSVAL_IS_NUMBER(argv[i]))
864: return(JS_FALSE);
865: if(!JS_ValueToInt32(cx, argv[i], &args[i]))
866: return(JS_FALSE);
867: }
868: if(args[0] < 1 || args[1] < 1 || args[2] < 1 || args[3] < 1
869: || args[0] > args[2] || args[1] > args[3]
870: || args[2] > cio_textinfo.screenwidth || args[3] > cio_textinfo.screenheight) {
871: *rval=JSVAL_FALSE;
872: return(JS_TRUE);
873: }
874: size=(args[2]-args[0]+1)*(args[3]-args[1]+1)*2;
875: result=(unsigned char *)malloc(size);
876: if(result==NULL)
877: return(JS_FALSE);
878:
879: rc=JS_SUSPENDREQUEST(cx);
880:
881: if(gettext(args[0], args[1], args[2], args[3], result)) {
882: JS_RESUMEREQUEST(cx, rc);
883: array=JS_NewArrayObject(cx, 0, NULL);
884: for(i=0; i<size; i++) {
885: JS_NewNumberValue(cx, result[i], &val);
886: if(!JS_SetElement(cx, array, i, &val)) {
887: free(result);
888: return(JS_FALSE);
889: }
890: }
891: *rval=OBJECT_TO_JSVAL(array);
892: }
893: else {
894: JS_RESUMEREQUEST(cx, rc);
895: *rval=JSVAL_NULL;
896: }
897: free(result);
898: return(JS_TRUE);
899: }
900:
901: /* TODO: seticon() */
902: #if 0
903: static JSBool
904: js_conio_seticon(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
905: {
906: }
907: #endif
908:
909: /* TODO: getmouse() */
910: #if 0
911: static JSBool
912: js_conio_getmouse(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
913: {
914: }
915: #endif
916:
917: /* TODO: ungetmouse() */
918: #if 0
919: static JSBool
920: js_conio_ungetmouse(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
921: {
922: }
923: #endif
924:
925: static jsSyncMethodSpec js_functions[] = {
926: {"init", js_conio_init, 1
927: ,JSTYPE_VOID,JSDOCSTR("args")
928: ,JSDOCSTR("desc"),315
929: },
930: {"suspend", js_conio_suspend, 0
931: ,JSTYPE_VOID,JSDOCSTR("args")
932: ,JSDOCSTR("desc"),315
933: },
934: {"clreol", js_conio_clreol, 0
935: ,JSTYPE_VOID,JSDOCSTR("args")
936: ,JSDOCSTR("desc"),315
937: },
938: {"clrscr", js_conio_clrscr, 0
939: ,JSTYPE_VOID,JSDOCSTR("args")
940: ,JSDOCSTR("desc"),315
941: },
942: {"wscroll", js_conio_wscroll, 0
943: ,JSTYPE_VOID,JSDOCSTR("args")
944: ,JSDOCSTR("desc"),315
945: },
946: {"delline", js_conio_delline, 0
947: ,JSTYPE_VOID,JSDOCSTR("args")
948: ,JSDOCSTR("desc"),315
949: },
950: {"insline", js_conio_insline, 0
951: ,JSTYPE_VOID,JSDOCSTR("args")
952: ,JSDOCSTR("desc"),315
953: },
954: {"normvideo", js_conio_normvideo, 0
955: ,JSTYPE_VOID,JSDOCSTR("args")
956: ,JSDOCSTR("desc"),315
957: },
958: {"getch", js_conio_getch, 0
959: ,JSTYPE_VOID,JSDOCSTR("args")
960: ,JSDOCSTR("desc"),315
961: },
962: {"getche", js_conio_getche, 0
963: ,JSTYPE_VOID,JSDOCSTR("args")
964: ,JSDOCSTR("desc"),315
965: },
966: {"beep", js_conio_beep, 0
967: ,JSTYPE_VOID,JSDOCSTR("args")
968: ,JSDOCSTR("desc"),315
969: },
970: {"getfont", js_conio_getfont, 0
971: ,JSTYPE_VOID,JSDOCSTR("args")
972: ,JSDOCSTR("desc"),315
973: },
974: {"hidemouse", js_conio_hidemouse, 0
975: ,JSTYPE_VOID,JSDOCSTR("args")
976: ,JSDOCSTR("desc"),315
977: },
978: {"showmouse", js_conio_showmouse, 0
979: ,JSTYPE_VOID,JSDOCSTR("args")
980: ,JSDOCSTR("desc"),315
981: },
982: {"setcursortype", js_conio_setcursortype, 1
983: ,JSTYPE_VOID,JSDOCSTR("args")
984: ,JSDOCSTR("desc"),315
985: },
986: {"gotoxy", js_conio_gotoxy, 2
987: ,JSTYPE_VOID,JSDOCSTR("args")
988: ,JSDOCSTR("desc"),315
989: },
990: {"putch", js_conio_putch, 1
991: ,JSTYPE_VOID,JSDOCSTR("args")
992: ,JSDOCSTR("desc"),315
993: },
994: {"ungetch", js_conio_ungetch, 1
995: ,JSTYPE_VOID,JSDOCSTR("args")
996: ,JSDOCSTR("desc"),315
997: },
998: {"loadfont", js_conio_loadfont, 1
999: ,JSTYPE_VOID,JSDOCSTR("args")
1000: ,JSDOCSTR("desc"),315
1001: },
1002: {"settitle", js_conio_settitle, 1
1003: ,JSTYPE_VOID,JSDOCSTR("args")
1004: ,JSDOCSTR("desc"),315
1005: },
1006: {"setname", js_conio_setname, 1
1007: ,JSTYPE_VOID,JSDOCSTR("args")
1008: ,JSDOCSTR("desc"),315
1009: },
1010: {"cputs", js_conio_cputs, 1
1011: ,JSTYPE_VOID,JSDOCSTR("args")
1012: ,JSDOCSTR("desc"),315
1013: },
1014: {"setfont", js_conio_setfont, 2
1015: ,JSTYPE_VOID,JSDOCSTR("args")
1016: ,JSDOCSTR("desc"),315
1017: },
1018: {"getpass", js_conio_getpass, 1
1019: ,JSTYPE_VOID,JSDOCSTR("args")
1020: ,JSDOCSTR("desc"),315
1021: },
1022: {"window", js_conio_window, 4
1023: ,JSTYPE_VOID,JSDOCSTR("args")
1024: ,JSDOCSTR("desc"),315
1025: },
1026: {"cgets", js_conio_cgets, 1
1027: ,JSTYPE_VOID,JSDOCSTR("args")
1028: ,JSDOCSTR("desc"),315
1029: },
1030: {"movetext", js_conio_movetext, 6
1031: ,JSTYPE_VOID,JSDOCSTR("args")
1032: ,JSDOCSTR("desc"),315
1033: },
1034: {"puttext", js_conio_puttext, 5
1035: ,JSTYPE_VOID,JSDOCSTR("args")
1036: ,JSDOCSTR("desc"),315
1037: },
1038: {"gettext", js_conio_gettext, 4
1039: ,JSTYPE_VOID,JSDOCSTR("args")
1040: ,JSDOCSTR("desc"),315
1041: },
1042: {0}
1043: };
1044:
1045: static JSBool js_conio_resolve(JSContext *cx, JSObject *obj, jsval id)
1046: {
1047: char* name=NULL;
1048:
1049: if(id != JSVAL_NULL)
1050: name=JS_GetStringBytes(JSVAL_TO_STRING(id));
1051:
1052: return(js_SyncResolve(cx, obj, name, js_properties, js_functions, NULL, 0));
1053: }
1054:
1055: static JSBool js_conio_enumerate(JSContext *cx, JSObject *obj)
1056: {
1057: return(js_conio_resolve(cx, obj, JSVAL_NULL));
1058: }
1059:
1060: static JSClass js_conio_class = {
1061: "Conio" /* name */
1062: ,0 /* flags */
1063: ,JS_PropertyStub /* addProperty */
1064: ,JS_PropertyStub /* delProperty */
1065: ,js_get /* getProperty */
1066: ,js_set /* setProperty */
1067: ,js_conio_enumerate /* enumerate */
1068: ,js_conio_resolve /* resolve */
1069: ,JS_ConvertStub /* convert */
1070: ,JS_FinalizeStub /* finalize */
1071: };
1072:
1073: JSObject* js_CreateConioObject(JSContext* cx, JSObject* parent)
1074: {
1075: JSObject* obj;
1076:
1077: if((obj = JS_DefineObject(cx, parent, "conio", &js_conio_class, NULL
1078: ,JSPROP_ENUMERATE|JSPROP_READONLY))==NULL)
1079: return(NULL);
1080:
1081: return(obj);
1082: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.