home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / mmm_pkg.zip / mmm_os2.cpp < prev    next >
C/C++ Source or Header  |  1996-12-05  |  9KB  |  298 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<108;j++) keys[i][j]='.';
  117.     }
  118. //&>>&0 0 0 17
  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.   Command(code + (mmm_f_Shift<<8) +(mmm_f_Alt<<9)+(mmm_f_Ctrl<<10)+(mmm_f_Caps<<11) );
  154. }
  155. //&>>&0 0 0 0
  156.  
  157. //&<<&Keyboard Layouts    
  158.  
  159. char *mcode=mmm_KBD.keys[0],*acode=mmm_KBD.keys[2];
  160.  
  161. volatile int   mmm_f_Caps=0;
  162. volatile int   mmm_f_FixShift=0,mmm_f_FixAlt=0;
  163. volatile int   mmm_f_Shift=0,mmm_f_Alt=0,mmm_f_Ctrl=0;
  164. //&>>&3 0 3 0
  165.  
  166. void Beep(){ DosBeep(1760,50); }
  167.  
  168. //&<<&void __EXIT();
  169. /*
  170.    EXECUTER_FILENAME=
  171.  
  172.    e:
  173.    cd \amstex
  174.    commands
  175.    %comspec
  176.    c:
  177.    cd \
  178.    i:\astr\mmm.bat -1 e:\mmm.dir -2 e:\amstex\astex.tex
  179. */
  180.  
  181. //&<<&void PutCurDir(FILE *f){   // prints current drive & directory into FILE *f
  182. void PutCurDir(FILE *f){
  183.   char *cd=getcurdir();                        // current disk
  184.   int lcd=strlen(cd);
  185.   if(lcd>3 && cd[lcd-1]=='\\') cd[--lcd]=0;
  186.   unsigned int drv=SaveGetDrive(); // 1='A'
  187.   fprintf(f,"%c:\ncd %s\n",drv+'a'-1,cd);
  188.   delete cd;
  189. }
  190. //&>>&5 0 5 A
  191.  
  192. void __EXIT(){
  193. //&<<&    #ifdef _ENABLE_LOGGING_
  194.   #ifdef _ENABLE_LOGGING_
  195.       DoLog("void __EXIT(){ \n");
  196.   #endif
  197. //&>>&2 0 2 7
  198.     char *s;
  199.     FILE *fRunScript,*filelist;
  200.  
  201.     s=MFileName(EXECUTER_FILENAME);
  202.     fRunScript=fopen(s,"w"); MemTest(fRunScript!=0);
  203.     delete s;
  204.  
  205.     fputs("@echo off\n",fRunScript);
  206.     PutCurDir(fRunScript);
  207.     while(mmm_LineClipboard && mmm_LineClipboard->prev)
  208.         mmm_LineClipboard=mmm_LineClipboard->prev;
  209.     while(mmm_LineClipboard && mmm_LineClipboard->next){
  210.         mmm_LineClipboard->Write(fRunScript,FILE_ASCII);
  211.         mmm_LineClipboard=mmm_LineClipboard->next;
  212.         }
  213.     PutCurDir(fRunScript);
  214.     fclose(fRunScript);
  215.  
  216.     s=MFileName("__mmm__.mmm");
  217.     filelist=fopen(s,"w"); MemTest(filelist!=0);
  218.     delete s;
  219.     PerformExitingFromFiles(filelist);
  220.     fclose(filelist);
  221.  
  222. //&<<&    #ifdef _ENABLE_LOGGING_
  223.   #ifdef _ENABLE_LOGGING_
  224.       DoLog("    } exit(-1)...\n");
  225.   #endif
  226. //&>>&0 0 0 0
  227.     execl(MFileName(EXECUTER_FILENAME),0);
  228.     exit(-1);
  229. }
  230. ///// mmm_os2.err mmm_os2.err mmm_os2.err mmm_os2.err mmm_os2.err
  231. //&>>&1C 0 13 0
  232. void MMMlib_Console    (int ccode){};
  233.  
  234. //&<<&void File::MkWild();
  235. void File::MkWild(){
  236.     char str[0x120];
  237.     char *pcFileName;
  238. //&<<&    CreateDirectoriesList
  239.     {
  240.     FILEFINDBUF  ff_buff;              /* «»αÑñѽѡ« ó bsedos.h */
  241.     ULONG handle=0xffff;            /* cΓáαΓ ß φΓ«ú« º¡áτÑ¡¿∩ */
  242.     ULONG count=1;
  243.     APIRET rc;
  244.  
  245.     rc=DosFindFirst( "*.*",&handle,
  246.                FILE_DIRECTORY ,
  247.                &ff_buff,sizeof(ff_buff),&count,FIL_STANDARD);
  248.     while(rc==0){
  249.         pcFileName=ff_buff.achName+6;
  250.         pcFileName[0x60]=0;
  251.         if( *(ff_buff.achName+1) & 0x10  &&  strcmp(pcFileName,".")){
  252.             sprintf(str,"%s\\%s",pcFileName,buf);
  253.             NewLine(str)->LinkBefore(pos);
  254.             }
  255.         rc=DosFindNext( handle,&ff_buff,sizeof(ff_buff),&count);
  256.         }
  257.     DosFindClose( handle );
  258.     }
  259. //&>>&D 0 D 2B
  260. //&<<&    Create FileList
  261.     NewLine("->")->LinkBefore(pos);
  262.  
  263.     FILEFINDBUF  ff_buff;              /* «»αÑñѽѡ« ó bsedos.h */
  264.     ULONG handle=0xffff;            /* cΓáαΓ ß φΓ«ú« º¡áτÑ¡¿∩ */
  265.     ULONG count=1;
  266.     APIRET rc;
  267.  
  268.     handle=0xffff;
  269.     rc=DosFindFirst( buf ,&handle,
  270.                FILE_DIRECTORY | FILE_ARCHIVED ,
  271.                &ff_buff,sizeof(ff_buff),&count,FIL_STANDARD);
  272.     while(rc==0){
  273.         if( (*(ff_buff.achName+1) & 0x10 ) == 0 )
  274.             {
  275.             pcFileName=ff_buff.achName+6;
  276.             pcFileName[0x60]=0;
  277.             sprintf(str,"%-35s%10ld   %c%c%c%c",
  278.                 pcFileName, ff_buff.cbFileAlloc,
  279.                 *(ff_buff.achName+1)& 1   ? 'r' : '.',
  280.                 *(ff_buff.achName+1)& 2   ? 'h' : '.',
  281.                 *(ff_buff.achName+1)& 4   ? 's' : '.',
  282.                 *(ff_buff.achName+1)&0x20 ? 'a' : '.');
  283.             NewLine(str)->LinkBefore(pos);
  284.             }
  285.         rc=DosFindNext( handle,&ff_buff,sizeof(ff_buff),&count);
  286.         }
  287.     DosFindClose( handle );
  288.     NewLine("")->LinkBefore(pos);
  289. //&>>&1C 0 17 1A
  290.   while(pos->prev) pos=pos->prev;
  291. }
  292.  
  293. /////// os2api\findnext.cpp
  294.  
  295. //&>>&4 0 4 14
  296. ///// mmm_os2.err mmm_os2.err mmm_os2.err mmm_os2.err mmm_os2.err
  297. //&>>&1A 0 1A 11
  298.