home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / xmmx.zip / source / mmm_lnx.cpp < prev    next >
C/C++ Source or Header  |  1996-12-23  |  12KB  |  431 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<128;j++) keys[i][j]='.';
  195.     }
  196. //&>>&2 0 2 22
  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;
  205.   }
  206.   return AltCase;
  207. }
  208. //&>>&6 0 6 15
  209. //&<<&void mmm_KeyBoard::SetACode(int n){ 
  210. void mmm_KeyBoard::SetACode(int n){
  211. //&<<&    #ifdef _ENABLE_LOGGING_
  212.     #ifdef _ENABLE_LOGGING_
  213.         DoLog("mmm_KeyBoard::SetACode(%d) {\n",n);
  214.     #endif
  215. //&>>&1 0 1 1B
  216.     acode=mmm_KBD.keys[n];
  217. //&<<&    #ifdef _ENABLE_LOGGING_
  218.     #ifdef _ENABLE_LOGGING_
  219.         DoLog("    }\n");
  220.     #endif
  221. //&>>&1 0 1 4
  222.     }
  223. //&>>&2 0 2 11
  224. //&<<&void mmm_KeyBoard::ChangeConsole(int num)
  225. void mmm_KeyBoard::ChangeConsole(int num)
  226. {
  227.    int r;
  228.    r=ioctl(con_fd,VT_ACTIVATE,num+1);
  229.    if(r<0) {Beep();}
  230. }
  231. //&>>&0 0 0 11
  232. //&<<&mmm_KeyBoard::GetScan() {
  233. mmm_KeyBoard::GetScan() {
  234.    unsigned char c;
  235.    int cd=0;
  236.    ioctl(con_fd,TIOCINQ,&cd);
  237.    if(cd==0) View();   // Redraw screen only if system KB-buffer is empty
  238.    read(con_fd,&c,1);  // get next scancode from console
  239.    return c;
  240. }
  241. //&>>&0 0 0 C
  242. //&<<&void MkScan(int scancode);             
  243.  
  244. int cvE0(int sc){
  245.   switch(sc){
  246.     case 0x1C: return 0x61;     // R-[Enter]
  247.     case 0x1D: return 0x62;     // R-CTRL
  248.     case 0x35: return 0x63;     // [/]
  249.     case 0x37: return 0x64;     // CTRL-Printmmm_Screen
  250.     case 0x38: return 0x65;     // R-ALT
  251.     case 0x46: return 0x66;     // PAUSE
  252.     case 0x47: return 0x67;     // [HOME]
  253.     case 0x48: return 0x68;     // [Up]
  254.     case 0x49: return 0x69;     // [PgUp]
  255.     case 0x4B: return 0x6A;     // [Left]
  256.     case 0x4D: return 0x6B;     // [Right]
  257.     case 0x4F: return 0x6C;     // [End]
  258.     case 0x50: return 0x6D;     // [Down]
  259.     case 0x51: return 0x6E;     // [PgDn]
  260.     case 0x52: return 0x6F;     // [Ins]
  261.     case 0x53: return 0x70;     // [Del]
  262.   }
  263.   return 0;
  264. }
  265.  
  266. void setfix(){
  267.   mmm_f_FixShift^=mmm_f_Shift;
  268.   mmm_f_FixAlt^=mmm_f_Alt;
  269. }
  270.  
  271. void MkScan(int code){
  272.   assert(cur!=0);
  273.   if(code==0xE0){ mmm_f_E0=1; return; }
  274.   if(mmm_f_E0){
  275.     mmm_f_E0=0;
  276.     code=cvE0(code&0x7f)|(code&0x80);
  277.   }
  278.  
  279.   switch(code){
  280.   case 0x2A: mmm_f_LeftShift=mmm_f_Shift=1; return;
  281.   case 0x1D: mmm_f_LeftCtrl=mmm_f_Ctrl=1; return;
  282.   case 0x38: mmm_f_LeftAlt=mmm_f_Alt=1; return;
  283.   case 0x36: mmm_f_RightShift=mmm_f_Shift=1; return;
  284.   case 0x62: mmm_f_RightCtrl=mmm_f_Ctrl=1; return;
  285.   case 0x65: mmm_f_RightAlt=mmm_f_Alt=1; return;
  286.   case 0x3A: if(mmm_f_Caps==0) setfix(); mmm_f_Caps=1; return;
  287.  
  288.   case 0xAA: mmm_f_LeftShift=0; mmm_f_Shift=mmm_f_RightShift; return;
  289.   case 0x9D: mmm_f_LeftCtrl=0; mmm_f_Ctrl=mmm_f_RightCtrl; return;
  290.   case 0xB8: mmm_f_LeftAlt=0; mmm_f_Alt=mmm_f_RightAlt; return;
  291.   case 0xB6: mmm_f_RightShift=0; mmm_f_Shift=mmm_f_LeftShift; return;
  292.   case 0xE2: mmm_f_RightCtrl=0; mmm_f_Ctrl=mmm_f_LeftCtrl; return;
  293.   case 0xE5: mmm_f_RightAlt=0; mmm_f_Alt=mmm_f_LeftAlt; return;
  294.   case 0xBA: mmm_f_Caps=0; return;
  295.   }
  296.  
  297.   code |= (mmm_f_Shift <<0x8);
  298.   code |= (mmm_f_Alt   <<0x9);
  299.   code |= (mmm_f_Ctrl  <<0xa);
  300.   code |= (mmm_f_Caps  <<0xb);
  301.   if(code==0x701) MMMlib_ABORT(0x701);
  302.   Command(code);
  303. }
  304. //&>>&37 0 11 16
  305.  
  306. //&<<&Keyboard Layouts 
  307.  
  308. char *mcode=mmm_KBD.keys[0],*acode=mmm_KBD.keys[2];
  309.  
  310. volatile int   mmm_f_E0=0;
  311. volatile int   mmm_f_LeftShift=0,mmm_f_RightShift=0;
  312. volatile int   mmm_f_LeftCtrl=0,mmm_f_RightCtrl=0;
  313. volatile int   mmm_f_LeftAlt=0,mmm_f_RightAlt=0;
  314. volatile int   mmm_f_Caps=0;
  315. volatile int   mmm_f_FixShift=0,mmm_f_FixAlt=0;
  316. volatile int   mmm_f_Shift=0,mmm_f_Alt=0,mmm_f_Ctrl=0;
  317. //&>>&3 0 3 0
  318.  
  319. void Beep(){ printf("%c",7); fflush(stdout); }
  320.  
  321. //&<<&void __EXIT();
  322. /*
  323.    EXECUTER_FILENAME=
  324.  
  325.    e:
  326.    cd \amstex
  327.    commands
  328.    %comspec
  329.    c:
  330.    cd \
  331.    i:\astr\mmm.bat -1 e:\mmm.dir -2 e:\amstex\astex.tex
  332. */
  333.  
  334. //&<<&void PutCurDir(FILE *f){   // prints current drive & directory into FILE *f
  335. void PutCurDir(FILE *f){
  336.   char *cd=getcurdir();                        // current disk
  337.   int lcd=strlen(cd);
  338.   if(lcd>3 && cd[lcd-1]=='/') cd[--lcd]=0;
  339.   fprintf(f,"cd %s\n",cd);
  340.   delete cd;
  341. }
  342. //&>>&4 0 4 1
  343.  
  344. void __EXIT(){
  345. //&<<&    #ifdef _ENABLE_LOGGING_
  346.   #ifdef _ENABLE_LOGGING_
  347.       DoLog("void __EXIT(){ \n");
  348.   #endif
  349. //&>>&1 0 1 6
  350.     char *s;
  351.     FILE *fRunScript,*filelist;
  352.  
  353.     s=MFileName(EXECUTER_FILENAME);
  354.     fRunScript=fopen(s,"w"); MemTest(fRunScript!=0);
  355.     delete s;
  356.  
  357.     PutCurDir(fRunScript);
  358.     while(mmm_LineClipboard && mmm_LineClipboard->prev)
  359.         mmm_LineClipboard=mmm_LineClipboard->prev;
  360.     while(mmm_LineClipboard && mmm_LineClipboard->next){
  361.         mmm_LineClipboard->Write(fRunScript,FILE_ASCII);
  362.         mmm_LineClipboard=mmm_LineClipboard->next;
  363.         }
  364.     PutCurDir(fRunScript);
  365.     fclose(fRunScript);
  366.  
  367.     s=MFileName("__mmm__.mmm");
  368.     filelist=fopen(s,"w"); MemTest(filelist!=0);
  369.     delete s;
  370.     PerformExitingFromFiles(filelist);
  371.     fclose(filelist);
  372.  
  373.     chmod(MFileName(EXECUTER_FILENAME), 0755 );
  374. //&<<&    #ifdef _ENABLE_LOGGING_
  375.   #ifdef _ENABLE_LOGGING_
  376.       DoLog("    } exit(-1)...\n");
  377.   #endif
  378. //&>>&1 0 1 6
  379.     system(MFileName(EXECUTER_FILENAME));
  380.     exit(-1);
  381. }
  382. ///// mmm_os2.err mmm_os2.err mmm_os2.err mmm_os2.err mmm_os2.err
  383. //&>>&1E 0 F 0
  384. //&<<&void MMMlib_Console    (int ccode)
  385. void MMMlib_Console    (int ccode) {   // digits '1', '2', .. are fixed now!!!!!!!
  386.     int ca;
  387.     ca=( ccode & 0x0f ) - 2;  /* 0x702->0 , 0x703->1 .... */
  388.     if(ca>0 && ca<10) mmm_KBD.ChangeConsole(ca);
  389.     }
  390. //&>>&3 0 3 1D
  391.  
  392. //&<<&void File::MkWild();
  393. void File::MkWild(){
  394.   char str[0x100];
  395.   DIR *cdir;
  396.   struct dirent *dp;
  397.   struct stat fI;
  398. //&<<&  cdir=opendir("."); /////////read directories
  399.   cdir=opendir(".");
  400.   if(cdir==NULL){ NewLine("here must be directory\nbut sorry....")->LinkBefore(pos); }
  401.   dp=readdir(cdir);
  402.   while(dp!=0){
  403.     stat(dp->d_name,&fI);
  404.     if( (fI.st_mode&S_IFDIR) && strcmp(dp->d_name,".") ) {
  405.         sprintf(str,"%s/%s",dp->d_name,buf);
  406.         NewLine(str)->LinkBefore(pos);
  407.         }
  408.     dp=readdir(cdir);
  409.     }
  410. //&>>&0 0 0 0
  411. //&<<&  cdir=opendir("."); ///////// read files
  412.   cdir=opendir(".");
  413.   if(cdir==NULL){ NewLine("here must be directory\nbut sorry....")->LinkBefore(pos); }
  414.   dp=readdir(cdir);
  415.   while(dp!=0){
  416.     stat(dp->d_name,&fI);
  417.     if(!(fI.st_mode & S_IFDIR)){
  418.         sprintf(str,"%-25s %8ld <%2d> %02d:%02d:%02d",dp->d_name,
  419.                  fI.st_size, fI.st_nlink,
  420.                  (fI.st_mtime>>11)&15, (fI.st_mtime>>5)&63,  (fI.st_mtime&31)*2 );
  421.         NewLine(str)->LinkBefore(pos);
  422.         }
  423.     dp=readdir(cdir);
  424.     }
  425. //&>>&D 0 D C
  426.   while(pos->prev) pos=pos->prev;
  427. }
  428. //&>>&6 0 6 7
  429.  
  430. //&>>&22 0 C 9
  431.