home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / mmm_pkg.zip / mmm_w95.cpp < prev    next >
C/C++ Source or Header  |  1996-12-05  |  9KB  |  345 lines

  1. /**********************************************
  2. *   WIN95 CPP file for MMMX Editor            *
  3. *   Contains WIN95 specific functions         *
  4. *     ( NT is untested )                      *
  5. ***********************************************/
  6.  
  7. #include "mmm_w95.h"
  8. #include <io.h>
  9. #include <time.h>
  10.  
  11. static HANDLE _confh,_coninpfh;
  12.  
  13.  
  14. //&<<&void _dos_setdrive(unsigned int n,unsigned int *t);
  15. void _dos_setdrive(unsigned int n,unsigned int *t){
  16.   _chdrive(n);
  17. }
  18. //&>>&0 0 0 0
  19. //&<<&void _dos_getdrive(unsigned int *res);
  20. void _dos_getdrive(unsigned int *res){
  21.   *res=_getdrive();
  22. }
  23. //&>>&0 0 0 0
  24.  
  25. //&<<&mmm_Screen::mmm_Screen();
  26. mmm_Screen::mmm_Screen(){
  27.   HEIGHT=45;
  28.   Size.X=100;
  29.  
  30. #if 1
  31.   scr=new CHAR_INFO[Size.X];
  32.   strs=new char*[HEIGHT];
  33.   lens=new int[HEIGHT];
  34. #else
  35.   scr=new char[Size.X];
  36. #endif
  37.  
  38.   attrs=new WORD[HEIGHT];
  39.   for(int i=0;i<HEIGHT;i++){ attrs[i]=0; strs[i]=0; lens[i]=0; }
  40.  
  41.   Rect.Left=0;
  42.   Rect.Right=Size.X-1;
  43.   Rect.Bottom=HEIGHT-1;
  44.   Zero.X=Zero.Y=0;
  45.  
  46.   Init();
  47. }
  48. void mmm_Screen::Init(){
  49.   _confh=GetStdHandle(STD_OUTPUT_HANDLE);
  50.   _coninpfh=GetStdHandle(STD_INPUT_HANDLE);
  51.   Size.Y=HEIGHT;
  52.   SetConsoleScreenBufferSize(_confh,Size);
  53.   Size.Y=1;
  54.   CONSOLE_CURSOR_INFO p;
  55.   GetConsoleCursorInfo(_confh,&p);
  56.   p.bVisible=0;
  57.   SetConsoleCursorInfo(_confh,&p);
  58. }
  59. //&>>&17 0 16 16
  60. //&<<&mmm_Screen::~mmm_Screen();
  61. mmm_Screen::~mmm_Screen(){
  62.    delete scr;
  63. }
  64. //&>>&0 0 0 17
  65. //&<<&void mmm_Screen::ClrCursor();
  66. void mmm_Screen::ClrCursor(){
  67.   DWORD tmp;
  68.   WriteConsoleOutputAttribute(_confh,&CCurAttr,1,OldCur,&tmp);
  69. }
  70. //&>>&1 0 1 10
  71. //&<<&void mmm_Screen::SetCursor(int x,int y,WORD attr);
  72. void mmm_Screen::SetCursor(int x,int y,WORD attr){
  73.   OldCur.X=x; OldCur.Y=y;
  74.   CCurAttr=attrs[OldCur.Y];
  75.   if(OldCur.X<lens[OldCur.Y] && byte(strs[OldCur.Y][OldCur.X])>=0xC0){ attr^=0x40; CCurAttr^=0x40; }
  76.   DWORD tmp;
  77.   WriteConsoleOutputAttribute(_confh,&attr,1,OldCur,&tmp);
  78. }
  79. //&>>&0 0 0 13
  80. //&<<&void DrawLine(char *Str, int PosY, char Attr,int slen);
  81. void DrawLine(char *Str, int PosY, char Attr,int slen){
  82.   mmm_screen.DrawLine(Str,PosY,Attr,slen);
  83. }
  84.  
  85. char const *const RUS_ALIAS=
  86. "ABWGDEVZIJKLMNOPRSTUFHC^[]?YX\\@Qabwgdevzijklmnoprstufhc~{}_yx|`q";
  87.  
  88. void mmm_Screen::DrawLine(char *Str, int PosY, char Attr,int slen){
  89. #if 0
  90.   char *t=scr;
  91.   for(int i=0;i<Size.X && *Str;i++){
  92.     *t++=*Str++;
  93.   }
  94.   for(;i<Size.X;i++) *t++=' ';
  95.   Zero.Y=PosY;
  96.   DWORD nc;
  97.   WriteConsoleOutputCharacter(_confh,scr,Size.X,Zero,&nc);
  98.   if(attrs[PosY]!=Attr){
  99.     attrs[PosY]=Attr;
  100.     FillConsoleOutputAttribute(_confh,Attr,Size.X,Zero,&nc);
  101.   }
  102.   mmm_KBD.GetEvent(0);
  103. #else
  104.   attrs[PosY]=Attr;
  105.   CHAR_INFO *t=scr;
  106.   strs[PosY]=Str;
  107.   for(int i=0;i<Size.X && *Str;i++){
  108.     char c=*Str++;
  109.     if(byte(c)>=0xC0){
  110.       t->Char.AsciiChar=RUS_ALIAS[byte(c)-0xC0];
  111.       t->Attributes=Attr^0x40;
  112.  }else{
  113.       t->Char.AsciiChar=c;
  114.       t->Attributes=Attr;
  115.     }
  116.     t++;
  117.   }
  118.   lens[PosY]=i;
  119.   for(;i<Size.X;i++){
  120.     t->Char.AsciiChar=' ';
  121.     t->Attributes=Attr;
  122.     t++;
  123.   }
  124.   Rect.Top=Rect.Bottom=PosY;
  125.   WriteConsoleOutput(_confh,scr,Size,Zero,&Rect);
  126. #endif
  127. }
  128. //&>>&15 0 14 9
  129. //&<<&void SetTitle(char *,char *name){
  130. void SetTitle(char *,char *name){
  131.   char tt[512];
  132.   strcpy(tt,"MMM95 - ");
  133.   strcat(tt,name);
  134.   SetConsoleTitle(tt);
  135. }
  136. //&>>&0 0 0 0
  137.  
  138. //&<<&KeyRes &mmm_KeyBoard::GetScan();
  139. KeyRes &mmm_KeyBoard::GetScan(){
  140.   if(bch==ech){ View(); GetEvent(1); }
  141.   KeyRes &k=buf[bch++];
  142.   bch&=0xff;
  143.   return k;
  144. }
  145.  
  146. void mmm_KeyBoard::GetEvent(int f){
  147.   INPUT_RECORD t;
  148.   DWORD l;
  149.   for(;;){
  150.     GetNumberOfConsoleInputEvents(_coninpfh,&l);
  151. //    PeekConsoleInput(_coninpfh,&t,1,&l);
  152.     if(l==0 && (f==0 || bch!=ech)) return;
  153.     ReadConsoleInput(_coninpfh,&t,1,&l);
  154.     if(l==0 || t.EventType!=KEY_EVENT) continue;
  155.     KEY_EVENT_RECORD &k=t.Event.KeyEvent;
  156.     if(((ech+1)&0xff)==bch) return;
  157.     KeyRes &kr=buf[ech++]; ech&=0xff;
  158.     kr.keydown=k.bKeyDown;
  159.     kr.scode=k.wVirtualScanCode;
  160.     kr.ctrl=k.dwControlKeyState;
  161.   }
  162. }
  163. //&>>&7 0 7 11
  164. //&<<&void MkScan(int scancode);
  165.  
  166. int cvE0(int sc){
  167.   switch(sc){
  168.     case 0x1C: return 0x61;     // R-[Enter]
  169.     case 0x1D: return 0x62;     // R-CTRL
  170.     case 0x35: return 0x63;     // [/]
  171.     case 0x37: return 0x64;     // CTRL-PrintScreen
  172.     case 0x38: return 0x65;     // R-ALT
  173.     case 0x46: return 0x66;     // PAUSE
  174.     case 0x47: return 0x67;     // [HOME]
  175.     case 0x48: return 0x68;     // [Up]
  176.     case 0x49: return 0x69;     // [PgUp]
  177.     case 0x4B: return 0x6A;     // [Left]
  178.     case 0x4D: return 0x6B;     // [Right]
  179.     case 0x4F: return 0x6C;     // [End]
  180.     case 0x50: return 0x6D;     // [Down]
  181.     case 0x51: return 0x6E;     // [PgDn]
  182.     case 0x52: return 0x6F;     // [Ins]
  183.     case 0x53: return 0x70;     // [Del]
  184.   }
  185.   return 0;
  186. }
  187.  
  188. void setfix(){
  189.   mmm_f_FixShift^=mmm_f_Shift;
  190.   mmm_f_FixAlt^=mmm_f_Alt;
  191. }
  192.  
  193. void MkScan(KeyRes &kres){
  194.   assert(cur!=0);
  195.   int code=kres.scode;
  196.   if(kres.ctrl&ENHANCED_KEY) code=cvE0(code);
  197.   if(code==0x3A){
  198.     if(kres.keydown){
  199.       if(mmm_f_Caps==0) setfix(); mmm_f_Caps=1;
  200.     }else mmm_f_Caps=0;
  201.     return;
  202.   }
  203.  
  204.   mmm_f_Ctrl=kres.ctrl&(RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED) ? 1 : 0;
  205.   mmm_f_Alt=kres.ctrl&(RIGHT_ALT_PRESSED|LEFT_ALT_PRESSED) ? 1 : 0;
  206.   mmm_f_Shift=kres.ctrl&(SHIFT_PRESSED) ? 1 : 0;
  207.   int fsh=mmm_f_FixShift^mmm_f_Shift;
  208.   int fal=mmm_f_FixAlt^mmm_f_Alt;
  209.  
  210.   if(kres.keydown==0) return;
  211.   Command(code + (mmm_f_Shift<<8) +(mmm_f_Alt<<9)+(mmm_f_Ctrl<<10)+(mmm_f_Caps<<11) );
  212. }
  213. //&>>&2B 0 17 16
  214.  
  215. //&<<&mmm_KeyBoard::mmm_KeyBoard()
  216. mmm_KeyBoard::mmm_KeyBoard(){
  217.     buf=new KeyRes[0x100];
  218.     InitKeyboardLayout();
  219.     AltCase=InitDefaultAltCase();
  220.     }
  221. //&>>&2 0 2 8
  222. //&<<&void mmm_KeyBoard::InitKeyBoardLayout();
  223. void mmm_KeyBoard::InitKeyboardLayout(){
  224.     int i,j;
  225.     for(i=0;i<4;i++) for(j=0;j<108;j++) keys[i][j]='.';
  226.     }
  227. //&>>&0 0 0 17
  228. //&<<&char *mmm_KeyBoard::InitDefaultAltCase(){
  229. char *mmm_KeyBoard::InitDefaultAltCase(){
  230.   char *AltCase=new char[256];
  231.   for(int i=0;i<256;i++){
  232.     AltCase[i]=
  233.       i>=byte('A') && i<=byte('Z') ? i+('a'-'A') :
  234.       i>=byte('a') && i<=byte('z') ? i-('a'-'A') :
  235. //      i>=byte('└') && i<=byte('▀') ? i+('α'-'└') :
  236. //      i>=byte('α') && i<=byte(' ') ? i-('α'-'└') :
  237.       i;
  238.   }
  239.   return AltCase;
  240. }
  241. //&>>&0 0 0 12
  242. //&<<&void mmm_KeyBoard::SetACode(int n){ 
  243. void mmm_KeyBoard::SetACode(int n){
  244.     acode=mmm_KBD.keys[n];
  245.     }
  246. //&>>&1 0 1 11
  247. //&<<&KeyBoard Layouts 
  248.  
  249. char *mcode=mmm_KBD.keys[0],*acode=mmm_KBD.keys[2];
  250.  
  251. volatile int   mmm_mmm_f_E0=0;
  252. volatile int   mmm_f_LeftShift=0,mmm_f_RightShift=0;
  253. volatile int   mmm_f_LeftCtrl=0,mmm_f_RightCtrl=0;
  254. volatile int   mmm_f_LeftAlt=0,mmm_f_RightAlt=0;
  255. volatile int   mmm_f_Caps=0;
  256. volatile int   mmm_f_FixShift=0,mmm_f_FixAlt=0;
  257. volatile int   mmm_f_Shift=0,mmm_f_Alt=0,mmm_f_Ctrl=0;
  258. //&>>&3 0 3 1B
  259.  
  260. //&<<&void __EXIT();
  261. /*
  262.    EXECUTER_FILENAME=
  263.  
  264.    commands
  265. */
  266.  
  267. void __EXIT(){
  268.   int n=1;
  269.  
  270.   char *s=MFileName(EXECUTER_FILENAME);
  271.   FILE *f=fopen(s,"w"); MemTest(f!=0);
  272.   fputs("@echo off\ncls\n",f);
  273.  
  274.   while(mmm_LineClipboard && mmm_LineClipboard->prev)
  275.       mmm_LineClipboard=mmm_LineClipboard->prev;
  276.   Line *mmm_LineClipboard0=mmm_LineClipboard;
  277.   while(mmm_LineClipboard && mmm_LineClipboard->next){
  278.     mmm_LineClipboard->Write(f,FILE_ASCII);
  279.     mmm_LineClipboard=mmm_LineClipboard->next;
  280.   }
  281.   mmm_LineClipboard=mmm_LineClipboard0;
  282.  
  283.   fclose(f);
  284.   FreeConsole();
  285.   system(s);
  286.   delete s;
  287.   AllocConsole();
  288.   mmm_screen.Init();
  289.   Redr();
  290. }
  291. //&>>&1E 0 1C 6
  292. void MMMlib_Console    (int ccode){};
  293. void Beep(){} // cputs("\007"); }
  294.  
  295. //&<<&void File::MkWild();
  296. void File::MkWild(){
  297.   flg=FILE_LIST;
  298.  
  299.   _finddata_t ff;
  300.   char str[512];
  301.  
  302.   long id=_findfirst("*.*",&ff);
  303.   if(id!=-1){
  304.     do{
  305.       for(char *s=ff.name;*s;s++) if(*s==' ') break;
  306.       if(ff.attrib&0x10){
  307.         if(strcmp(ff.name,".")){
  308.           sprintf(str,*s ? "\"%s/%s\"" : "%s/%s",ff.name,buf);
  309.           NewLine(str)->LinkBefore(pos);
  310.         }
  311.       }
  312.     }while(_findnext(id,&ff)==0);
  313.   }
  314.   _findclose(id);
  315.  
  316.   id=_findfirst(buf,&ff);
  317.   if(id!=-1){
  318.     do{
  319.       for(char *s=ff.name;*s;s++) if(*s==' ') break;
  320.       if(!(ff.attrib&0x10)){
  321.         memset(str,' ',32);
  322.         sprintf(str,*s ? "\"%s\"" : "%s", ff.name);
  323.         int l=strlen(str);
  324.         if(l<32){ str[l]=' '; l=32; }
  325.         sprintf(str+l,"%10ld %s %c%c%c%c",
  326.                 ff.size,
  327.                 ctime(&(ff.time_write)),
  328.                 ff.attrib&1 ? 'r' : '.',
  329.                 ff.attrib&2 ? 'h' : '.',
  330.                 ff.attrib&4 ? 's' : '.',
  331.                 ff.attrib&32 ? 'a' : '.');
  332.         char &u=str[strlen(str)-6];
  333.         if(u=='\n') u=' ';
  334.         NewLine(str)->LinkBefore(pos);
  335.       }
  336.     }while(_findnext(id,&ff)==0);
  337.   }
  338.   _findclose(id);
  339.  
  340.   while(pos->prev) pos=pos->prev;
  341. }
  342. //&>>&0 0 0 6
  343. //      f:\pub\*.*
  344. //&>>&12 0 12 E
  345.