|
|
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.