00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifdef WIN32
00028 #include <conio.h>
00029 #include <stdio.h>
00030 #include <windows.h>
00031 #include <winbase.h>
00032 #include <winuser.h>
00033 #endif
00034 #include "../../basext.h"
00035
00046 besSUB_SHUTDOWN
00047 return 0;
00048 besEND
00049
00050 besSUB_START
00051 return COMMAND_ERROR_SUCCESS;
00052 besEND
00053
00054 static HANDLE GetConsoleHandle(){
00055 HANDLE hConsole;
00056
00057 hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
00058 if( hConsole == NULL ){
00059 AllocConsole();
00060 hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
00061 }
00062 return hConsole;
00063 }
00064
00065 #define GET_CONSOLE_HANDLE hConsole = GetConsoleHandle();\
00066 if( hConsole == NULL )return 0;
00067
00076 besFUNCTION(gotoxy)
00077 #ifdef WIN32
00078 COORD lp;
00079 long x,y;
00080 HANDLE hConsole;
00081 int iError;
00082
00083 if( besARGNR < 2 )return COMMAND_ERROR_FEW_ARGS;
00084
00085 iError = besGETARGS "ii",&x,&y besGETARGE
00086 lp.X = (short)x; lp.Y = (short)y;
00087 if( iError )return iError;
00088 GET_CONSOLE_HANDLE
00089 SetConsoleCursorPosition(hConsole,lp);
00090 #else
00091 return COMMAND_ERROR_NOTIMP;
00092 #endif
00093 besEND
00094
00102 besFUNCTION(sbkbhit)
00103 #ifdef WIN32
00104 besALLOC_RETURN_LONG;
00105 LONGVALUE(besRETURNVALUE) = _kbhit() ? -1 : 0 ;
00106 #else
00107 return COMMAND_ERROR_NOTIMP;
00108 #endif
00109 besEND
00110
00119 besFUNCTION(sbgetch)
00120 #ifdef WIN32
00121 besALLOC_RETURN_LONG;
00122 LONGVALUE(besRETURNVALUE) = _getch();
00123 #else
00124 return COMMAND_ERROR_NOTIMP;
00125 #endif
00126 besEND
00127
00136 besFUNCTION(sbgetche)
00137 #ifdef WIN32
00138 besALLOC_RETURN_LONG;
00139 LONGVALUE(besRETURNVALUE) = _getche();
00140 #else
00141 return COMMAND_ERROR_NOTIMP;
00142 #endif
00143 besEND
00144
00153 besFUNCTION(sbdetach)
00154 #ifdef WIN32
00155 FreeConsole();
00156 #else
00157 return COMMAND_ERROR_NOTIMP;
00158 #endif
00159 besEND
00160
00167 besFUNCTION(sbgettitle)
00168 #ifdef WIN32
00169 char szB[256];
00170 long i;
00171
00172 i = GetConsoleTitle(szB,256);
00173 if( i > 0 ){
00174 besALLOC_RETURN_STRING(i);
00175 memcpy(STRINGVALUE(besRETURNVALUE),szB,i);
00176 }else
00177 besRETURNVALUE = NULL;
00178 #else
00179 return COMMAND_ERROR_NOTIMP;
00180 #endif
00181 besEND
00182
00189 besFUNCTION(sbsettitle)
00190 #ifdef WIN32
00191 char *pszT;
00192 int iError;
00193
00194 if( besARGNR < 1 )return COMMAND_ERROR_FEW_ARGS;
00195
00196 iError = besGETARGS "z",&pszT besGETARGE
00197 if( iError )return iError;
00198 SetConsoleTitle(pszT);
00199 besFREE(pszT);
00200 #else
00201 return COMMAND_ERROR_NOTIMP;
00202 #endif
00203 besEND
00204
00205 #ifdef WIN32
00206 static int SetConBreak(int i){
00207 HANDLE hConsole;
00208 DWORD Mode;
00209
00210 GET_CONSOLE_HANDLE
00211 if( GetConsoleMode(hConsole,&Mode) ){
00212 if( i ){
00213 Mode |= ENABLE_PROCESSED_INPUT;
00214 SetConsoleCtrlHandler(NULL,TRUE);
00215 }
00216 else{
00217 Mode &= ~ ENABLE_PROCESSED_INPUT;
00218 SetConsoleCtrlHandler(NULL,FALSE);
00219 }
00220 SetConsoleMode(hConsole,Mode);
00221 }
00222 return 0;
00223 }
00224 #endif
00225
00233 besFUNCTION(sbnobreak)
00234 #ifdef WIN32
00235 SetConBreak(1);
00236 #else
00237 return COMMAND_ERROR_NOTIMP;
00238 #endif
00239 besEND
00240
00249 besFUNCTION(sbbreak)
00250 #ifdef WIN32
00251 SetConBreak(0);
00252 #else
00253 return COMMAND_ERROR_NOTIMP;
00254 #endif
00255 besEND
00256
00257 static int GetCSBI(PCONSOLE_SCREEN_BUFFER_INFO q){
00258 HANDLE hConsole;
00259
00260 GET_CONSOLE_HANDLE
00261 GetConsoleScreenBufferInfo(hConsole,q);
00262 return 0;
00263 }
00264
00265 #define GET_CSBI(PAR) \
00266 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;\
00267 GetCSBI(&ConsoleScreenBufferInfo);\
00268 besALLOC_RETURN_LONG;\
00269 LONGVALUE(besRETURNVALUE) = ConsoleScreenBufferInfo.PAR;
00270
00281 besFUNCTION(sbsizx)
00282 #ifdef WIN32
00283 GET_CSBI(dwSize.X)
00284 #else
00285 return COMMAND_ERROR_NOTIMP;
00286 #endif
00287 besEND
00288
00299 besFUNCTION(sbsizy)
00300 #ifdef WIN32
00301 GET_CSBI(dwSize.Y)
00302 #else
00303 return COMMAND_ERROR_NOTIMP;
00304 #endif
00305 besEND
00306
00314 besFUNCTION(sbcurx)
00315 #ifdef WIN32
00316 GET_CSBI(dwCursorPosition.X)
00317 #else
00318 return COMMAND_ERROR_NOTIMP;
00319 #endif
00320 besEND
00321
00329 besFUNCTION(sbcury)
00330 #ifdef WIN32
00331 GET_CSBI(dwCursorPosition.Y)
00332 #else
00333 return COMMAND_ERROR_NOTIMP;
00334 #endif
00335 besEND
00336
00345 besFUNCTION(sbscrx)
00346 #ifdef WIN32
00347 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
00348 GetCSBI(&ConsoleScreenBufferInfo);
00349 besALLOC_RETURN_LONG;
00350 LONGVALUE(besRETURNVALUE) = ConsoleScreenBufferInfo.srWindow.Right -
00351 ConsoleScreenBufferInfo.srWindow.Left + 1 ;
00352 #else
00353 return COMMAND_ERROR_NOTIMP;
00354 #endif
00355 besEND
00356
00365 besFUNCTION(sbscry)
00366 #ifdef WIN32
00367 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
00368 GetCSBI(&ConsoleScreenBufferInfo);
00369 besALLOC_RETURN_LONG;
00370 LONGVALUE(besRETURNVALUE) = ConsoleScreenBufferInfo.srWindow.Bottom -
00371 ConsoleScreenBufferInfo.srWindow.Top + 1;
00372 #else
00373 return COMMAND_ERROR_NOTIMP;
00374 #endif
00375 besEND
00376
00385 besFUNCTION(sbmaxx)
00386 #ifdef WIN32
00387 HANDLE hConsole;
00388 COORD crd;
00389
00390 GET_CONSOLE_HANDLE
00391 crd = GetLargestConsoleWindowSize(hConsole);
00392
00393 besALLOC_RETURN_LONG;
00394 LONGVALUE(besRETURNVALUE) = crd.X;
00395 #else
00396 return COMMAND_ERROR_NOTIMP;
00397 #endif
00398 besEND
00399
00408 besFUNCTION(sbmaxy)
00409 #ifdef WIN32
00410 HANDLE hConsole;
00411 COORD crd;
00412
00413 GET_CONSOLE_HANDLE
00414 crd = GetLargestConsoleWindowSize(hConsole);
00415
00416 besALLOC_RETURN_LONG;
00417 LONGVALUE(besRETURNVALUE) = crd.Y;
00418 #else
00419 return COMMAND_ERROR_NOTIMP;
00420 #endif
00421 besEND
00422
00430 besFUNCTION(sbsetcw)
00431 #ifdef WIN32
00432 HANDLE hConsole;
00433 int iError;
00434 long x,y,yb;
00435 SMALL_RECT sr;
00436 COORD crd;
00437
00438 if( besARGNR < 3 )return COMMAND_ERROR_FEW_ARGS;
00439
00440 iError = besGETARGS "iii",&x,&y,&yb besGETARGE
00441 if( iError )return iError;
00442 crd.X = (short)x;
00443 crd.Y = (short)yb;
00444
00445 GET_CONSOLE_HANDLE
00446 SetConsoleScreenBufferSize(hConsole,crd);
00447
00448 sr.Left = 0;
00449 sr.Top = 0;
00450 sr.Right = (short)x;
00451 sr.Bottom = (short)yb;
00452 SetConsoleWindowInfo(hConsole,1,&sr);
00453 #else
00454 return COMMAND_ERROR_NOTIMP;
00455 #endif
00456 besEND
00457
00466 besFUNCTION(sbsetcur)
00467 #ifdef WIN32
00468 HANDLE hConsole;
00469 int iError;
00470 long size;
00471 CONSOLE_CURSOR_INFO cci;
00472
00473 if( besARGNR < 1 )return COMMAND_ERROR_FEW_ARGS;
00474
00475 iError = besGETARGS "i",&size besGETARGE
00476 if( iError )return iError;
00477 cci.dwSize = size;
00478 cci.bVisible = size ? 1 :0;
00479 GET_CONSOLE_HANDLE
00480 SetConsoleCursorInfo(hConsole,&cci);
00481 #else
00482 return COMMAND_ERROR_NOTIMP;
00483 #endif
00484 besEND
00528 besFUNCTION(sbsetcol)
00529 #ifdef WIN32
00530 HANDLE hConsole;
00531 int iError;
00532 long color;
00533
00534 if( besARGNR < 1 )return COMMAND_ERROR_FEW_ARGS;
00535
00536 iError = besGETARGS "i",&color besGETARGE
00537 if( iError )return iError;
00538 GET_CONSOLE_HANDLE
00539 SetConsoleTextAttribute(hConsole,(WORD)color);
00540 #else
00541 return COMMAND_ERROR_NOTIMP;
00542 #endif
00543 besEND
00544
00545 #define PERR(X,Y) if( !X )return 0
00546 static int cls( HANDLE hConsole ){
00547 COORD coordScreen = { 0, 0 };
00548
00549 BOOL bSuccess;
00550 DWORD cCharsWritten;
00551 CONSOLE_SCREEN_BUFFER_INFO csbi;
00552 DWORD dwConSize;
00553
00554
00555
00556
00557 bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );
00558 PERR( bSuccess, "GetConsoleScreenBufferInfo" );
00559 dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
00560
00561
00562
00563 bSuccess = FillConsoleOutputCharacter( hConsole, (TCHAR) ' ',
00564 dwConSize, coordScreen, &cCharsWritten );
00565 PERR( bSuccess, "FillConsoleOutputCharacter" );
00566
00567
00568
00569 bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );
00570 PERR( bSuccess, "ConsoleScreenBufferInfo" );
00571
00572
00573
00574 bSuccess = FillConsoleOutputAttribute( hConsole, csbi.wAttributes,
00575 dwConSize, coordScreen, &cCharsWritten );
00576 PERR( bSuccess, "FillConsoleOutputAttribute" );
00577
00578
00579
00580 bSuccess = SetConsoleCursorPosition( hConsole, coordScreen );
00581 PERR( bSuccess, "SetConsoleCursorPosition" );
00582 return 0;
00583 }
00584
00592 besFUNCTION(sbcls)
00593 #ifdef WIN32
00594 HANDLE hConsole;
00595
00596 GET_CONSOLE_HANDLE
00597 return cls(hConsole);
00598 #else
00599 return COMMAND_ERROR_NOTIMP;
00600 #endif
00601 besEND
00602
00603
00604
00605 besVERSION_NEGOTIATE
00606
00607 return (int)INTERFACE_VERSION;
00608
00609 besEND
00610
00611 besSUB_FINISH
00612
00613 besEND
00614
00615 SLFST CIO_SLFST[] ={
00616
00617 { "shutmodu" , shutmodu },
00618 { "bootmodu" , bootmodu },
00619 { "gotoxy" , gotoxy },
00620 { "sbkbhit" , sbkbhit },
00621 { "sbgetch" , sbgetch },
00622 { "sbgetche" , sbgetche },
00623 { "sbdetach" , sbdetach },
00624 { "sbgettitle" , sbgettitle },
00625 { "sbsettitle" , sbsettitle },
00626 { "sbnobreak" , sbnobreak },
00627 { "sbbreak" , sbbreak },
00628 { "sbsizx" , sbsizx },
00629 { "sbsizy" , sbsizy },
00630 { "sbcurx" , sbcurx },
00631 { "sbcury" , sbcury },
00632 { "sbscrx" , sbscrx },
00633 { "sbscry" , sbscry },
00634 { "sbmaxx" , sbmaxx },
00635 { "sbmaxy" , sbmaxy },
00636 { "sbsetcw" , sbsetcw },
00637 { "sbsetcur" , sbsetcur },
00638 { "sbsetcol" , sbsetcol },
00639 { "sbcls" , sbcls },
00640 { "versmodu" , versmodu },
00641 { "finimodu" , finimodu },
00642 { NULL , NULL }
00643 };