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

  1. /**********************************************
  2. *   Linux CPP file for MMMX Editor            *
  3. *   Contains Linux  specific functions        *
  4. *    ( Tested on i386 RedHat Linux 3.0+ )     *
  5. ***********************************************/
  6.  
  7. #include "mmm_lnx.h"
  8.  
  9. int con_fd;       //// console descriptor, common for mmm_Screen, mmm_KBD
  10.  
  11. const  INTENSCOL=1;
  12. const VOIDCOL=21;
  13. extern int ed_gflag;
  14. #define ED_G_KEYB  0x02
  15.  
  16. //&<<&int nonprintable(int c) {
  17. int nonprintable(int c) {
  18.    return(c=='\033' || c=='\n' || c=='\r' || c=='\t');
  19. }
  20. //&>>&3 0 3 1
  21. //&<<&void mmm_Screen::setatr(int atr) {
  22. void mmm_Screen::setatr(int atr) {
  23.    char buf[30];
  24.    write(con_fd,buf,sprintf(buf,"%d;%d;%dm",(atr&7)+30,((atr&0x70)>>4)+40,(atr&0x8)?INTENSCOL:VOIDCOL));
  25.    curatr=atr;
  26. }
  27. //&>>&0 0 0 F
  28. //&<<&void mmm_Screen::Line(char *str,int len,int x,int y) {
  29. void mmm_Screen::Line(char *str,int len,int x,int y) {
  30.    static char buf[0x100];
  31.    static int p;
  32.    int i,atr;
  33.    if(x<0) {len+=x;str-=x*2;x=0;}
  34.    if(y<0 || y>=HEIGHT || x>=WIDTH || len<=0) return;
  35.    p=0;
  36.    SetCursor(x,y,70);
  37. #ifdef BAD_LAST_SCREEN_POSITION
  38.    if(y==HEIGHT-1 && x+len==WIDTH) len--;
  39. #endif
  40.    if(x+len>=WIDTH) len=WIDTH-x;
  41.    for(i=0;i<len;i++) {
  42.       v_screen[y*WIDTH*2+(x+i)*2]=str[i*2];
  43.       v_screen[y*WIDTH*2+(x+i)*2+1]=str[i*2+1];
  44.       atr=str[i*2+1];
  45.       if(nonprintable(str[i*2])) atr=(atr&0xf0)|9;
  46.       if(atr!=curatr) {
  47.          if(p) {write(con_fd,buf,p);p=0;}
  48.          setatr(atr);
  49.       }
  50.       if(!nonprintable(str[i*2])) buf[p++]=str[i*2];
  51.       else buf[p++]=str[i*2]+0100;
  52.    }
  53.    if(p) write(con_fd,buf,p);
  54. }
  55. //&>>&E 0 E 8
  56.  
  57. //&<<&mmm_Screen::mmm_Screen(){
  58. mmm_Screen::mmm_Screen(){
  59.    struct winsize s;
  60.    int r;
  61.    int i,j;
  62.    need=1;
  63.    con_fd=open("/dev/tty",O_RDWR);
  64.    if(con_fd<=0) {printf("mmm_Screen::mmm_Screen: Error opening console\n");exit(1);}
  65.    r=ioctl(con_fd,TIOCGWINSZ,(long)&s);
  66.    WIDTH=s.ws_col;
  67.    HEIGHT=s.ws_row;
  68.    v_screen=new char [WIDTH*HEIGHT*2];
  69.    for(j=0;j<HEIGHT;j++)
  70.       for(i=0;i<WIDTH;i++) {
  71.          v_screen[j*WIDTH*2+i*2]=' ';
  72.          v_screen[j*WIDTH*2+i*2+1]=7;
  73.       }
  74.    }
  75. //&>>&E 0 E B
  76. //&<<&mmm_Screen::~mmm_Screen(){
  77. mmm_Screen::~mmm_Screen(){
  78. //&<<&#ifdef _ENABLE_LOGGING_
  79. #ifdef _ENABLE_LOGGING_
  80.    DoLog("mmm_Screen::~mmm_Screen()  {\n");
  81.  
  82.    DoLog("    DrawLine("",HEIGHT-1 {\n");
  83.    DrawLine("",HEIGHT-1,Editor.TextAttr,WIDTH-3);
  84.    DoLog("        }\n");
  85.  
  86.    DoLog("    SetCursor {\n");
  87.    SetCursor(0,HEIGHT-1,Editor.TextAttr);
  88.    DoLog("        }\n");
  89.  
  90.    DoLog("    close(con_fd);  {\n");
  91.    close(con_fd);
  92.    DoLog("        }\n");
  93.  
  94.    DoLog("    }\n");
  95. //&>>&1 0 1 21
  96. //&<<&#else
  97. #else
  98.    DrawLine("",HEIGHT-1,Editor.TextAttr,WIDTH-3);
  99.    SetCursor(0,HEIGHT-1,Editor.TextAttr);
  100.    close(con_fd);
  101. //&>>&3 0 3 1
  102. #endif
  103.  
  104.    }
  105. //&>>&1 0 1 17
  106. //&<<&void mmm_Screen::SetCursor(int x,int y,int attr) {
  107. void mmm_Screen::SetCursor(int x,int y,int attr) {
  108.    char buf[0x20];
  109.    write(con_fd,buf,sprintf(buf,"%d;%dH",y+1,x+1));
  110. }
  111. //&>>&0 0 0 F
  112. void mmm_Screen::ClrCursor(){}
  113. //&<<&void DrawLine(char *Str, int PosY, char Attr,int slen){
  114. void DrawLine(char *Str, int PosY, char Attr,int slen){
  115.    static char *PRTLINE=0;
  116.    if(!PRTLINE)PRTLINE=new char[mmm_screen.GetW()*2+1];
  117.    for(int i=0 ; i<mmm_screen.GetW(); i++) {
  118.       PRTLINE[i*2]=*Str==0?' ':(char)*Str;
  119.       PRTLINE[i*2+1]=(char)Attr;
  120.       if(*Str) ++Str;
  121.       }
  122.    mmm_screen.Line( PRTLINE, mmm_screen.GetW() , 0, PosY);
  123. }
  124. //&>>&8 0 8 27
  125. void SetTitle(char *,char *){}
  126.  
  127. //&<<&void SegmentViolationHandler(int a) {
  128. void SegmentViolationHandler(int a) {
  129.    int r;
  130.    puts("Now In SegmentViolationHandler(...)\n");
  131.    r=ioctl(con_fd,KDSKBMODE,mmm_KBD.om);
  132.    if(r<0) puts("ioctl failed\n");
  133.    r=tcsetattr(con_fd,TCSANOW,&(mmm_KBD.t1));
  134.    if(r<0) puts("tcsetattr failed\n");
  135.    _exit(1);
  136. }
  137. //&>>&5 0 5 27
  138. //&<<&mmm_KeyBoard::mmm_KeyBoard(){
  139. //&<<&void falarm(int a) {
  140. void falarm(int a) {
  141.    signal(SIGALRM,falarm);
  142.    alarm(1);
  143. }
  144. //&>>&4 0 4 0
  145. mmm_KeyBoard::mmm_KeyBoard(){
  146.    struct termios t2;
  147.    int r;
  148.    r=tcgetattr(con_fd,&t1);
  149.    if(r<0) {printf("E3 %d\n",r);exit(1);}
  150.    r=tcgetattr(con_fd,&t2);
  151.    if(r<0) {printf("E4 %d\n",r);exit(1);}
  152.    t2.c_iflag=0;
  153.    t2.c_lflag&=~(ECHO|ICANON|ISIG);
  154.    t2.c_cc[VMIN]=1;
  155.    t2.c_cc[VTIME]=0x10;
  156.    r=tcsetattr(con_fd,TCSANOW,&t2);
  157.    if(r<0) {printf("E5 %d\n",r);exit(1);}
  158.    r=ioctl(con_fd,KDGKBMODE,&om);
  159.    if(r<0) {printf("E1 %d\n",r);}
  160.    r=ioctl(con_fd,KDSKBMODE,K_RAW);
  161.    if(r<0) {printf("E2 %d\n",r);}
  162.   /////////// ed_keyget=mykeyget;
  163.    signal(SIGALRM,falarm);
  164.    alarm(1);
  165.    signal(SIGSEGV,SegmentViolationHandler);
  166.    signal(SIGKILL ,SegmentViolationHandler );
  167.    signal(SIGQUIT ,SegmentViolationHandler );
  168.    signal(SIGTERM ,SegmentViolationHandler );
  169.    InitKeyboardLayout();
  170.    AltCase=InitDefaultAltCase();
  171. }
  172. //&>>&19 0 17 7
  173. //&<<&mmm_KeyBoard::~mmm_KeyBoard(){
  174. mmm_KeyBoard::~mmm_KeyBoard(){
  175. //&<<&   #ifdef _ENABLE_LOGGING_
  176.    #ifdef _ENABLE_LOGGING_
  177.        DoLog("mmm_KeyBoard::~mmm_KeyBoard() {\n");
  178.    #endif
  179. //&>>&1 0 1 29
  180.    int r;
  181.    r=ioctl(con_fd,KDSKBMODE,om);
  182.    r=tcsetattr(con_fd,TCSANOW,&t1);
  183.    if(r<0) {printf("E6 %d\n",r);}
  184. //&<<&   #ifdef _ENABLE_LOGGING_
  185.    #ifdef _ENABLE_LOGGING_
  186.        DoLog("    }\n");
  187.    #endif
  188. //&>>&1 0 1 7
  189. }
  190. //&>>&1 0 1 1B
  191. //&<<&void mmm_KeyBoard::InitKeyboardLayout();
  192. void mmm_KeyBoard::InitKeyboardLayout(){
  193.     int i,j;
  194.     for(i=0;i<4;i++) for(j=0;j<108;j++) keys[i][j]='.';
  195.     }
  196. //&>>&0 0 0 17
  197. //&<<&char *mmm_KeyBoard::InitDefaultAltCase(){
  198. char *mmm_KeyBoard::InitDefaultAltCase(){
  199.   char *AltCase=new char[256];
  200.   for(int i=0;i<256;i++){
  201.     AltCase[i]=
  202.       i>='A' && i<='Z' ? i+('a'-'A') :
  203.       i>='a' && i<='z' ? i-('a'-'A') :
  204. //      i>='Ç' && i<='Å' ? i+('á'-'Ç') :
  205. //      i>='É' && i<='ƒ' ? i+('α'-'É') :
  206. //      i>='á' && i<='»' ? i-('á'-'Ç') :
  207. //      i>='α' && i<='∩' ? i-('α'-'É') :
  208.       i;
  209.   }
  210.   return AltCase;
  211. }
  212. //&>>&0 0 0 12
  213. //&<<&void mmm_KeyBoard::SetACode(int n){ 
  214. void mmm_KeyBoard::SetACode(int n){
  215. //&<<&    #ifdef _ENABLE_LOGGING_
  216.     #ifdef _ENABLE_LOGGING_
  217.         DoLog("mmm_KeyBoard::SetACode(%d) {\n",n);
  218.     #endif
  219. //&>>&1 0 1 1B
  220.     acode=mmm_KBD.keys[n];
  221. //&<<&    #ifdef _ENABLE_LOGGING_
  222.     #ifdef _ENABLE_LOGGING_
  223.         DoLog("    }\n");
  224.     #endif
  225. //&>>&1 0 1 4
  226.     }
  227. //&>>&2 0 2 11
  228. //&<<&void mmm_KeyBoard::ChangeConsole(int num)
  229. void mmm_KeyBoard::ChangeConsole(int num)
  230. {
  231.    int r;
  232.    r=ioctl(con_fd,VT_ACTIVATE,num+1);
  233.    if(r<0) {Beep();}
  234. }
  235. //&>>&0 0 0 11
  236. //&<<&mmm_KeyBoard::GetScan() {
  237. mmm_KeyBoard::GetScan() {
  238.    unsigned char c;
  239.    int cd=0;
  240.    ioctl(con_fd,TIOCINQ,&cd);
  241.    if(cd==0) View();   // Redraw screen only if system KB-buffer is empty
  242.    read(con_fd,&c,1);  // get next scancode from console
  243.    return c;
  244. }
  245. //&>>&0 0 0 C
  246. //&<<&void MkScan(int scancode);             
  247.  
  248. int cvE0(int sc){
  249.   switch(sc){
  250.     case 0x1C: return 0x61;     // R-[Enter]
  251.     case 0x1D: return 0x62;     // R-CTRL
  252.     case 0x35: return 0x63;     // [/]
  253.     case 0x37: return 0x64;     // CTRL-Printmmm_Screen
  254.     case 0x38: return 0x65;     // R-ALT
  255.     case 0x46: return 0x66;     // PAUSE
  256.     case 0x47: return 0x67;     // [HOME]
  257.     case 0x48: return 0x68;     // [Up]
  258.     case 0x49: return 0x69;     // [PgUp]
  259.     case 0x4B: return 0x6A;     // [Left]
  260.     case 0x4D: return 0x6B;     // [Right]
  261.     case 0x4F: return 0x6C;     // [End]
  262.     case 0x50: return 0x6D;     // [Down]
  263.     case 0x51: return 0x6E;     // [PgDn]
  264.     case 0x52: return 0x6F;     // [Ins]
  265.     case 0x53: return 0x70;     // [Del]
  266.   }
  267.   return 0;
  268. }
  269.  
  270. void setfix(){
  271.   mmm_f_FixShift^=mmm_f_Shift;
  272.   mmm_f_FixAlt^=mmm_f_Alt;
  273. }
  274.  
  275. void MkScan(int code){
  276.   assert(cur!=0);
  277.   if(code==0xE0){ mmm_f_E0=1; return; }
  278.   if(mmm_f_E0){
  279.     mmm_f_E0=0;
  280.     code=cvE0(code&0x7f)|(code&0x80);
  281.   }
  282.  
  283.   switch(code){
  284.   case 0x2A: mmm_f_LeftShift=mmm_f_Shift=1; return;
  285.   case 0x1D: mmm_f_LeftCtrl=mmm_f_Ctrl=1; return;
  286.   case 0x38: mmm_f_LeftAlt=mmm_f_Alt=1; return;
  287.   case 0x36: mmm_f_RightShift=mmm_f_Shift=1; return;
  288.   case 0x62: mmm_f_RightCtrl=mmm_f_Ctrl=1; return;
  289.   case 0x65: mmm_f_RightAlt=mmm_f_Alt=1; return;
  290.   case 0x3A: if(mmm_f_Caps==0) setfix(); mmm_f_Caps=1; return;
  291.  
  292.   case 0xAA: mmm_f_LeftShift=0; mmm_f_Shift=mmm_f_RightShift; return;
  293.   case 0x9D: mmm_f_LeftCtrl=0; mmm_f_Ctrl=mmm_f_RightCtrl; return;
  294.   case 0xB8: mmm_f_LeftAlt=0; mmm_f_Alt=mmm_f_RightAlt; return;
  295.   case 0xB6: mmm_f_RightShift=0; mmm_f_Shift=mmm_f_LeftShift; return;
  296.   case 0xE2: mmm_f_RightCtrl=0; mmm_f_Ctrl=mmm_f_LeftCtrl; return;
  297.   case 0xE5: mmm_f_RightAlt=0; mmm_f_Alt=mmm_f_LeftAlt; return;
  298.   case 0xBA: mmm_f_Caps=0; return;
  299.   }
  300.   Command(code + (mmm_f_Shift<<8) +(mmm_f_Alt<<9)+(mmm_f_Ctrl<<10)+(mmm_f_Caps<<11) );
  301. }
  302. //&>>&35 0 17 44
  303.  
  304. //&<<&Keyboard Layouts 
  305.  
  306. char *mcode=mmm_KBD.keys[0],*acode=mmm_KBD.keys[2];
  307.  
  308. volatile int   mmm_f_E0=0;
  309. volatile int   mmm_f_LeftShift=0,mmm_f_RightShift=0;
  310. volatile int   mmm_f_LeftCtrl=0,mmm_f_RightCtrl=0;
  311. volatile int   mmm_f_LeftAlt=0,mmm_f_RightAlt=0;
  312. volatile int   mmm_f_Caps=0;
  313. volatile int   mmm_f_FixShift=0,mmm_f_FixAlt=0;
  314. volatile int   mmm_f_Shift=0,mmm_f_Alt=0,mmm_f_Ctrl=0;
  315. //&>>&3 0 3 0
  316.  
  317. void Beep(){ printf("%c",7); fflush(stdout); }
  318.  
  319. //&<<&void __EXIT();
  320. /*
  321.    EXECUTER_FILENAME=
  322.  
  323.    e:
  324.    cd \amstex
  325.    commands
  326.    %comspec
  327.    c:
  328.    cd \
  329.    i:\astr\mmm.bat -1 e:\mmm.dir -2 e:\amstex\astex.tex
  330. */
  331.  
  332. //&<<&void PutCurDir(FILE *f){   // prints current drive & directory into FILE *f
  333. void PutCurDir(FILE *f){
  334.   char *cd=getcurdir();                        // current disk
  335.   int lcd=strlen(cd);
  336.   if(lcd>3 && cd[lcd-1]=='/') cd[--lcd]=0;
  337.   fprintf(f,"cd %s\n",cd);
  338.   delete cd;
  339. }
  340. //&>>&4 0 4 1
  341.  
  342. void __EXIT(){
  343. //&<<&    #ifdef _ENABLE_LOGGING_
  344.   #ifdef _ENABLE_LOGGING_
  345.       DoLog("void __EXIT(){ \n");
  346.   #endif
  347. //&>>&1 0 1 6
  348.     char *s;
  349.     FILE *fRunScript,*filelist;
  350.  
  351.     s=MFileName(EXECUTER_FILENAME);
  352.     fRunScript=fopen(s,"w"); MemTest(fRunScript!=0);
  353.     delete s;
  354.  
  355.     PutCurDir(fRunScript);
  356.     while(mmm_LineClipboard && mmm_LineClipboard->prev)
  357.         mmm_LineClipboard=mmm_LineClipboard->prev;
  358.     while(mmm_LineClipboard && mmm_LineClipboard->next){
  359.         mmm_LineClipboard->Write(fRunScript,FILE_ASCII);
  360.         mmm_LineClipboard=mmm_LineClipboard->next;
  361.         }
  362.     PutCurDir(fRunScript);
  363.     fclose(fRunScript);
  364.  
  365.     s=MFileName("__mmm__.mmm");
  366.     filelist=fopen(s,"w"); MemTest(filelist!=0);
  367.     delete s;
  368.     PerformExitingFromFiles(filelist);
  369.     fclose(filelist);
  370.  
  371.     chmod(MFileName(EXECUTER_FILENAME), 0755 );
  372. //&<<&    #ifdef _ENABLE_LOGGING_
  373.   #ifdef _ENABLE_LOGGING_
  374.       DoLog("    } exit(-1)...\n");
  375.   #endif
  376. //&>>&1 0 1 6
  377.     system(MFileName(EXECUTER_FILENAME));
  378.     exit(-1);
  379. }
  380. ///// mmm_os2.err mmm_os2.err mmm_os2.err mmm_os2.err mmm_os2.err
  381. //&>>&1E 0 F 0
  382. //&<<&void MMMlib_Console    (int ccode)
  383. void MMMlib_Console    (int ccode) {   // digits '1', '2', .. are fixed now!!!!!!!
  384.     int ca;
  385.     ca=( ccode & 0x0f ) - 2;  /* 0x702->0 , 0x703->1 .... */
  386.     if(ca>0 && ca<10) mmm_KBD.ChangeConsole(ca);
  387.     }
  388. //&>>&3 0 3 1D
  389.  
  390. //&<<&void File::MkWild();
  391. void File::MkWild(){
  392.   char str[0x100];
  393.   DIR *cdir;
  394.   struct dirent *dp;
  395.   struct stat fI;
  396. //&<<&  cdir=opendir("."); /////////read directories
  397.   cdir=opendir(".");
  398.   if(cdir==NULL){ NewLine("here must be directory\nbut sorry....")->LinkBefore(pos); }
  399.   dp=readdir(cdir);
  400.   while(dp!=0){
  401.     stat(dp->d_name,&fI);
  402.     if( (fI.st_mode&S_IFDIR) && strcmp(dp->d_name,".") ) {
  403.         sprintf(str,"%s/%s",dp->d_name,buf);
  404.         NewLine(str)->LinkBefore(pos);
  405.         }
  406.     dp=readdir(cdir);
  407.     }
  408. //&>>&0 0 0 0
  409. //&<<&  cdir=opendir("."); ///////// read files
  410.   cdir=opendir(".");
  411.   if(cdir==NULL){ NewLine("here must be directory\nbut sorry....")->LinkBefore(pos); }
  412.   dp=readdir(cdir);
  413.   while(dp!=0){
  414.     stat(dp->d_name,&fI);
  415.     if(!(fI.st_mode & S_IFDIR)){
  416.         sprintf(str,"%-25s %8ld <%2d> %02d:%02d:%02d",dp->d_name,
  417.                  fI.st_size, fI.st_nlink,
  418.                  (fI.st_mtime>>11)&15, (fI.st_mtime>>5)&63,  (fI.st_mtime&31)*2 );
  419.         NewLine(str)->LinkBefore(pos);
  420.         }
  421.     dp=readdir(cdir);
  422.     }
  423. //&>>&D 0 D C
  424.   while(pos->prev) pos=pos->prev;
  425. }
  426. //&>>&6 0 6 7
  427.  
  428. //&>>&24 0 17 E
  429.