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

  1. /**********************************************
  2. *   OS/2 CPP file for MMMX Editor             *
  3. *   Contains OS/2 WARP specific functions     *
  4. *    ( tested on Warp, Warp connect )         *
  5. ***********************************************/
  6.  
  7. #include "mmm_os2.h"
  8.  
  9. extern unsigned _stklen=8192;
  10. int MonoAttrs[NAttr]={7,0x70,1,0x70,0x17,0x6f,0x11,0x70};
  11.  
  12. //&<<&mmm_Screen::mmm_Screen();
  13. mmm_Screen::mmm_Screen(){
  14.     VIOMODEINFO modedata;
  15.  
  16.     saveVideoConfig.cb = sizeof(saveVideoConfig);
  17.     VioGetMode( &saveVideoConfig, 0 );
  18.     if(! (saveVideoConfig.fbType & 0x01 )) Editor.attrs=MonoAttrs;
  19.  
  20.     modedata.cb=sizeof(modedata);
  21.     if(Editor.attrs==MonoAttrs)
  22.         modedata.fbType = 0x00;
  23.     else
  24.         modedata.fbType = 0x01;
  25.     modedata.color = 4;
  26.     modedata.col = 80;
  27.     modedata.row = 30;
  28.     modedata.hres = 640;
  29.     modedata.vres = 480;
  30.     VioSetMode( &modedata, 0 ) ;
  31.     modedata.cb=sizeof(modedata);
  32.     VioGetMode( &modedata, 0 );
  33.  
  34.     WIDTH=modedata.col;
  35.     HEIGHT=modedata.row;
  36.  
  37. //&<<&    Change Cursor Type     //// comment is set
  38. #if 0
  39.          typedef struct _VIOCURSORINFO {  /* vioci */
  40.            USHORT   yStart;               /*cursor start line */
  41.            USHORT   cEnd;                 /* cursor end line */
  42.            USHORT   cx;                   /* cursor width */
  43.            USHORT   attr;                 /* -1=hidden cursor, any other=normal
  44.                                                 cursor */
  45.          } VIOCURSORINFO;
  46.  PVIOCURSORINFO   CursorData;    /* Cursor characteristics */
  47.  
  48.  VioSetCurType(CursorData, 0 );
  49. #endif
  50. //&>>&2 0 2 2C
  51. }
  52. //&>>&0 0 0 16
  53. //&<<&mmm_Screen::~mmm_Screen();
  54. mmm_Screen::~mmm_Screen(){
  55.    saveVideoConfig.cb = sizeof(saveVideoConfig);
  56.    VioSetMode( &saveVideoConfig, 0 );
  57. }
  58. //&>>&0 0 0 17
  59. void mmm_Screen::ClrCursor(){}
  60. //&<<&void mmm_Screen::SetCursor(int x,int y,int attr);
  61. void mmm_Screen::SetCursor(int x,int y,int attr){
  62.     VioSetCurPos(y,x,0);
  63. }
  64. //&>>&0 0 0 F
  65. //&<<&void DrawLine(char *Str, int PosY, char Attr,int slen);
  66. void DrawLine(char *Str, int PosY, char Attr,int slen){
  67.    static char *PRTLINE=0;
  68.    if(!PRTLINE)PRTLINE=new char[mmm_screen.GetW()+1];
  69.    for(int i=0 ; i<mmm_screen.GetW(); i++) {
  70.       PRTLINE[i]=(char)*Str;
  71.       if(*Str) ++Str;
  72.       }
  73.    VioWrtCharStrAtt( PRTLINE, mmm_screen.GetW() , PosY, 0 , &Attr, 0);
  74. }
  75. //&>>&7 0 7 28
  76. void SetTitle(char *,char *){}
  77.  
  78. //&<<&void ProcessShiftsStatus(USHORT stat);
  79. //&<<&inline void setfix(){
  80. inline void setfix(){
  81.   mmm_f_FixShift^=mmm_f_Shift;
  82.   mmm_f_FixAlt^=mmm_f_Alt;
  83. }
  84. //&>>&2 0 2 E
  85. void ProcessShiftsStatus(USHORT stat){
  86.     static USHORT oldstat;
  87.     if( (stat & 0x4000) )
  88.         { setfix(); mmm_f_Caps=1; }        /// CAPS pressed
  89.     else mmm_f_Caps=0;
  90.  
  91.     if( stat & 0x3   ) mmm_f_Shift=1; else mmm_f_Shift=0; /// Shift pressed
  92.     if( stat & 0x500 ) mmm_f_Ctrl=1; else mmm_f_Ctrl=0; /// Ctrl pressed
  93.     if( stat & 0xA00 ) mmm_f_Alt=1; else mmm_f_Alt=0; /// Ctrl pressed
  94.     if(oldstat!=stat) Redr();
  95.     oldstat=stat;
  96. }
  97. //&>>&0 0 0 34
  98.  
  99. //&<<&mmm_KeyBoard::mmm_KeyBoard();
  100. mmm_KeyBoard::mmm_KeyBoard(){
  101. ////    SaveKBD.cb = sizeof(KBDINFO);
  102. ////    if(KbdGetStatus( &SaveKBD, 0)){printf("KbdGetStatus error"); exit(0);}
  103.     InitKeyboardLayout();
  104.     AltCase=InitDefaultAltCase();
  105.     }
  106. //&>>&2 0 2 2F
  107. //&<<&mmm_KeyBoard::~mmm_KeyBoard();
  108. mmm_KeyBoard::~mmm_KeyBoard(){
  109. ////    SaveKBD.cb = sizeof(KBDINFO);
  110. ////    if(KbdSetStatus( &SaveKBD, 0)){printf("KbdSetStatus error"); exit(0);}
  111. }
  112. //&>>&2 0 2 2F
  113. //&<<&void mmm_KeyBoard::InitKeyboardLayout();
  114. void mmm_KeyBoard::InitKeyboardLayout(){
  115.     int i,j;
  116.     for(i=0;i<4;i++) for(j=0;j<128;j++) keys[i][j]='.';
  117.     }
  118. //&>>&2 0 2 22
  119. //&<<&char *mmm_KeyBoard::InitDefaultAltCase(){
  120. char *mmm_KeyBoard::InitDefaultAltCase(){
  121.   char *AltCase=new char[256];
  122.   for(int i=0;i<256;i++){
  123.     AltCase[i]=
  124.       i>='A' && i<='Z' ? i+('a'-'A') :
  125.       i>='a' && i<='z' ? i-('a'-'A') :
  126. //      i>='Ç' && i<='Å' ? i+('á'-'Ç') :
  127. //      i>='É' && i<='ƒ' ? i+('α'-'É') :
  128. //      i>='á' && i<='»' ? i-('á'-'Ç') :
  129. //      i>='α' && i<='∩' ? i-('α'-'É') :
  130.       i;
  131.   }
  132.   return AltCase;
  133. }
  134. //&>>&0 0 0 12
  135. //&<<&void mmm_KeyBoard::SetACode(int n){ 
  136. void mmm_KeyBoard::SetACode(int n){
  137.     acode=mmm_KBD.keys[n];
  138.     }
  139. //&>>&1 0 1 11
  140. //&<<&int mmm_KeyBoard::GetScan();
  141. int mmm_KeyBoard::GetScan(){
  142.     View();
  143.     if( retcode=KbdCharIn ( &keydata, IO_WAIT , 0 ) )
  144.         {puts("KbdCharIn error!\n");exit(-1);}
  145.     ProcessShiftsStatus( keydata.fsState );
  146.     return keydata.chScan;
  147.     }
  148. //&>>&3 0 3 F
  149. //&<<&void MkScan(int code);             
  150.  
  151. void MkScan(int code){
  152.   mmm_KBD.LastScanCode=code;
  153.  
  154.   code |= (mmm_f_Shift <<0x8);
  155.   code |= (mmm_f_Alt   <<0x9);
  156.   code |= (mmm_f_Ctrl  <<0xa);
  157.   code |= (mmm_f_Caps  <<0xb);
  158.   if(code==0x701) MMMlib_ABORT(0x701);
  159.   Command(code);
  160.   }
  161. //&>>&A 0 A 2
  162.  
  163. //&<<&Keyboard Layouts    
  164.  
  165. char *mcode=mmm_KBD.keys[0],*acode=mmm_KBD.keys[2];
  166.  
  167. volatile int   mmm_f_Caps=0;
  168. volatile int   mmm_f_FixShift=0,mmm_f_FixAlt=0;
  169. volatile int   mmm_f_Shift=0,mmm_f_Alt=0,mmm_f_Ctrl=0;
  170. //&>>&3 0 3 0
  171.  
  172. void Beep(){ DosBeep(1760,50); }
  173.  
  174. //&<<&void __EXIT();
  175. /*
  176.    EXECUTER_FILENAME=
  177.  
  178.    e:
  179.    cd \amstex
  180.    commands
  181.    %comspec
  182.    c:
  183.    cd \
  184.    i:\astr\mmm.bat -1 e:\mmm.dir -2 e:\amstex\astex.tex
  185. */
  186.  
  187. //&<<&void PutCurDir(FILE *f){   // prints current drive & directory into FILE *f
  188. void PutCurDir(FILE *f){
  189.   char *cd=getcurdir();                        // current disk
  190.   int lcd=strlen(cd);
  191.   if(lcd>3 && cd[lcd-1]=='\\') cd[--lcd]=0;
  192.   unsigned int drv=SaveGetDrive(); // 1='A'
  193.   fprintf(f,"%c:\ncd %s\n",drv+'a'-1,cd);
  194.   delete cd;
  195. }
  196. //&>>&5 0 5 A
  197.  
  198. void __EXIT(){
  199. //&<<&    #ifdef _ENABLE_LOGGING_
  200.   #ifdef _ENABLE_LOGGING_
  201.       DoLog("void __EXIT(){ \n");
  202.   #endif
  203. //&>>&2 0 2 7
  204.     char *s;
  205.     FILE *fRunScript,*filelist;
  206.  
  207.     s=MFileName(EXECUTER_FILENAME);
  208.     fRunScript=fopen(s,"w"); MemTest(fRunScript!=0);
  209.     delete s;
  210.  
  211.     fputs("@echo off\n",fRunScript);
  212.     PutCurDir(fRunScript);
  213.     while(mmm_LineClipboard && mmm_LineClipboard->prev)
  214.         mmm_LineClipboard=mmm_LineClipboard->prev;
  215.     while(mmm_LineClipboard && mmm_LineClipboard->next){
  216.         mmm_LineClipboard->Write(fRunScript,FILE_ASCII);
  217.         mmm_LineClipboard=mmm_LineClipboard->next;
  218.         }
  219.     PutCurDir(fRunScript);
  220.     fclose(fRunScript);
  221.  
  222.     s=MFileName("__mmm__.mmm");
  223.     filelist=fopen(s,"w"); MemTest(filelist!=0);
  224.     delete s;
  225.     PerformExitingFromFiles(filelist);
  226.     fclose(filelist);
  227.  
  228. //&<<&    #ifdef _ENABLE_LOGGING_
  229.   #ifdef _ENABLE_LOGGING_
  230.       DoLog("    } exit(-1)...\n");
  231.   #endif
  232. //&>>&0 0 0 0
  233.     execl(MFileName(EXECUTER_FILENAME),0);
  234.     exit(-1);
  235. }
  236. ///// mmm_os2.err mmm_os2.err mmm_os2.err mmm_os2.err mmm_os2.err
  237. //&>>&1C 0 13 0
  238. void MMMlib_Console    (int ccode){};
  239.  
  240. //&<<&void File::MkWild();
  241. void File::MkWild(){
  242.     char str[0x120];
  243.     char *pcFileName;
  244. //&<<&    CreateDirectoriesList
  245.     {
  246.     FILEFINDBUF  ff_buff;              /* «»αÑñѽѡ« ó bsedos.h */
  247.     ULONG handle=0xffff;            /* cΓáαΓ ß φΓ«ú« º¡áτÑ¡¿∩ */
  248.     ULONG count=1;
  249.     APIRET rc;
  250.  
  251.     rc=DosFindFirst( "*.*",&handle,
  252.                FILE_DIRECTORY ,
  253.                &ff_buff,sizeof(ff_buff),&count,FIL_STANDARD);
  254.     while(rc==0){
  255.         pcFileName=ff_buff.achName+6;
  256.         pcFileName[0x60]=0;
  257.         if( *(ff_buff.achName+1) & 0x10  &&  strcmp(pcFileName,".")){
  258.             sprintf(str,"%s\\%s",pcFileName,buf);
  259.             NewLine(str)->LinkBefore(pos);
  260.             }
  261.         rc=DosFindNext( handle,&ff_buff,sizeof(ff_buff),&count);
  262.         }
  263.     DosFindClose( handle );
  264.     }
  265. //&>>&D 0 D 2B
  266. //&<<&    Create FileList
  267.     NewLine("->")->LinkBefore(pos);
  268.  
  269.     FILEFINDBUF  ff_buff;              /* «»αÑñѽѡ« ó bsedos.h */
  270.     ULONG handle=0xffff;            /* cΓáαΓ ß φΓ«ú« º¡áτÑ¡¿∩ */
  271.     ULONG count=1;
  272.     APIRET rc;
  273.  
  274.     handle=0xffff;
  275.     rc=DosFindFirst( buf ,&handle,
  276.                FILE_DIRECTORY | FILE_ARCHIVED ,
  277.                &ff_buff,sizeof(ff_buff),&count,FIL_STANDARD);
  278.     while(rc==0){
  279.         if( (*(ff_buff.achName+1) & 0x10 ) == 0 )
  280.             {
  281.             pcFileName=ff_buff.achName+6;
  282.             pcFileName[0x60]=0;
  283.             sprintf(str,"%-35s%10ld   %c%c%c%c",
  284.                 pcFileName, ff_buff.cbFileAlloc,
  285.                 *(ff_buff.achName+1)& 1   ? 'r' : '.',
  286.                 *(ff_buff.achName+1)& 2   ? 'h' : '.',
  287.                 *(ff_buff.achName+1)& 4   ? 's' : '.',
  288.                 *(ff_buff.achName+1)&0x20 ? 'a' : '.');
  289.             NewLine(str)->LinkBefore(pos);
  290.             }
  291.         rc=DosFindNext( handle,&ff_buff,sizeof(ff_buff),&count);
  292.         }
  293.     DosFindClose( handle );
  294.     NewLine("")->LinkBefore(pos);
  295. //&>>&1C 0 17 1A
  296.   while(pos->prev) pos=pos->prev;
  297. }
  298.  
  299. /////// os2api\findnext.cpp
  300.  
  301. //&>>&4 0 4 14
  302. ///// mmm_os2.err mmm_os2.err mmm_os2.err mmm_os2.err mmm_os2.err
  303. //&>>&1A 0 1A 8
  304.