home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 283_01 / es.c < prev    next >
C/C++ Source or Header  |  1988-05-05  |  15KB  |  603 lines

  1.  
  2.  
  3. /* es.c -- display/edit program screens, save as compilable C source text
  4. **         d.c.oshel, 4/21/88
  5. */
  6.  
  7. #include "ciao.h"
  8. #include "keys.h"
  9. #include <dos.h>
  10. #include <signal.h>
  11.  
  12.  
  13. static int screen_number = 0;
  14. static char far *video_RAM;
  15. static char *sname;
  16.  
  17. /* control-c mesmerizer */
  18. static jmp_buf isis;
  19. void iris( void )
  20. {
  21.     longjmp(isis,-1);
  22. }
  23.  
  24.  
  25. extern unsigned read_keyboard( void (*fn) (void) );  /* Assembler! */
  26.  
  27. /*
  28. unsigned read_keyboard( void (*fn) (void) );
  29. {
  30.     union REGS rx;
  31.     while (!kbhit())
  32.         (*fn)();
  33.     rx.h.ah = 0;
  34.     int86(22,&rx,&rx); *//* damn int86 does NOT ignore Control-C! *//*
  35.     if (rx.h.al)
  36.         rx.h.ah = 0;
  37.     return (rx.x.ax);
  38. }
  39. */
  40.  
  41. int dialogue( void )
  42. {
  43.      char far *p;
  44.      union REGS x;
  45.      int c;
  46.  
  47.      p = savescreen( &x );
  48.  
  49.      defcursor();
  50.      wputs("^2");
  51.      windowbox( 21,1,59,8  );
  52.      fullscreen();
  53.      gotoxy(23,0);
  54.      wprintf("^0╡^1 %s ^0╞^2",sname);
  55.      setwindow( 21,1,59,8 );
  56.      gotoxy( 0,1 );
  57.      wputs("       ^1R^2eset screen\n");
  58.      wputs("       ^1B^2lank screen (absolute!)\n");
  59.      wputs("       ^1C^2 text file, save screen to\n");
  60.      wputs("       ^1I^2mage  file, save screen to\n");
  61.      wputs("       ^1N^2ext screen, quit editing\n\n");
  62.      wputs("       Please select: ");
  63.      flush_keys();
  64.      c = keyin( screenwait );
  65.  
  66.      restorescreen(p,&x);
  67.      return (c);
  68. }
  69.  
  70. static char namebuffer[80];
  71.  
  72. int ask( void )
  73. {
  74.      char far *p;
  75.      union REGS x;
  76.      int c;
  77.      char buffer[80];
  78.  
  79.      p = savescreen( &x );
  80.      defcursor();
  81.      wputs("^2");
  82.      windowbox( 21,12,59,14  );
  83.      sprintf(buffer,"^0  Save %s? ^1Y^0/N  \b\b\b\b\b",namebuffer);
  84.      c = ((59-21) - (strlen(buffer) - 11))/2;
  85.      if (c < 1) c = 1;
  86.      gotoxy( c,1 );
  87.      wputs(buffer);
  88.      bopbleet();
  89.      flush_keys();
  90.      do
  91.      {
  92.         c = keyin( screenwait );
  93.         c = isascii(c)? toupper(c) : c;
  94.         if (c == CR) c = 'Y';
  95.      }
  96.      while ( c != 'Y' && c != 'N' );
  97.  
  98.      restorescreen(p,&x);
  99.      return ( c == 'Y' );
  100. }
  101.  
  102.  
  103. int ask2( void )
  104. {
  105.      char far *p;
  106.      union REGS x;
  107.      int c;
  108.      char buffer[80];
  109.  
  110.      p = savescreen( &x );
  111.      defcursor();
  112.      wputs("^2");
  113.      windowbox( 21,12,59,14  );
  114.      sprintf(buffer,"^0  Save %s? ^1Y^0/N  \b\b\b\b\b",sname);
  115.      c = ((59-21) - (strlen(buffer) - 11))/2;
  116.      if (c < 1) c = 1;
  117.      gotoxy( c,1 );
  118.      wputs(buffer);
  119.      bopbleet();
  120.      flush_keys();
  121.      do
  122.      {
  123.         c = keyin( screenwait );
  124.         c = isascii(c)? toupper(c) : c;
  125.         if (c == CR) c = 'Y';
  126.      }
  127.      while ( c != 'Y' && c != 'N' );
  128.  
  129.      restorescreen(p,&x);
  130.      return ( c == 'Y' );
  131. }
  132.  
  133.  
  134. void report( void )
  135. {
  136.      char far *p;
  137.      union REGS xr;
  138.      int x,y,x1,x2,y1,y2;
  139.  
  140.      x = col;
  141.      y = row;
  142.      p = savescreen(&xr);
  143.      wputs("^3");
  144.      rptchar('\xfb',1);
  145.      hidecursor();
  146.      x1 = 1;  
  147.      y1 = 1; 
  148.      if ( ((y >= 0) && (y <= 4)) && ((x >=  0) && (x <= 22)) )
  149.      {
  150.          x1 = 58;
  151.      }
  152.      x2 = x1 + 20;
  153.      y2 = y1 + 2;
  154.      windowbox( x1,y1,x2,y2  );
  155.      gotoxy (1,1);
  156.      wprintf("^1 Column %2d, Row %2d ^0", x,y );
  157.      flush_keys();
  158.      keyin( screenwait );
  159.      restorescreen(p,&xr);
  160. }
  161.  
  162. void readscreen( void )
  163. {
  164.      FILE *fp;
  165.      register int i;
  166.      union REGS x;
  167.  
  168.      x.h.ah = 0x0F;
  169.      int86( 0x10, &x, &x );
  170.  
  171.      /* do we have mono adapter or cga/ega? */
  172.  
  173.      video_RAM = (x.h.al == 7)? ((char far *)( 0xB0000000L )) :
  174.                                 ((char far *)( 0xB8000000L ));
  175.  
  176.      if ((fp=fopen(sname,"rb")) == NULL) {
  177.           gotoxy(0,0);
  178.           rptchar(' ',2000);
  179.           windowbox( 0,0,79,24 );
  180.           fullscreen();
  181.      }
  182.      else
  183.      {
  184.           for ( i = 0; i < 4000; i++ )
  185.           {
  186.               video_RAM[i] = fgetc(fp);
  187.               if (feof(fp))
  188.               {
  189.                  video_RAM[i] = 7;
  190.               }
  191.               if (ferror(fp))
  192.               {
  193.                  gotoxy(0,24);
  194.                  printf("READSCREEN COULD NOT READ \"%s\"\n",sname);
  195.                  thurb();
  196.                  exit(1);
  197.               }
  198.           }
  199.           fclose(fp);
  200.      }
  201. }
  202.  
  203.  
  204. void title( void )
  205. {
  206.      char far *p;
  207.      union REGS x;
  208.  
  209.      p = savescreen( &x );
  210.      hidecursor();
  211.      windowbox( 21,1,59,8  );
  212.      fullscreen();
  213.      gotoxy(23,0);
  214.      wprintf("^0╡^1 %s ^0╞",strupr(sname));
  215.      setwindow( 21,1,59,8 );
  216.      gotoxy( 0,7 );
  217.      wputs("^2 Screens-to-C v.1.1, by David C. Oshel ^0\n");
  218.      wputs("       ^1MicroConsulting Services^0\n");
  219.      wputs("           ^11219 Harding Ave.^0\n");
  220.      wputs("           ^1Ames, Iowa 50010^0\n");
  221.      wputs("            ^1(515) 232-8679^0\n\n");
  222.      wputs("  Press ^1any key^0 to begin, ^1Esc^0 to quit^0");
  223.      flush_keys();
  224.      keyin( screenwait );
  225.  
  226.      restorescreen(p,&x);
  227. }
  228.  
  229.  
  230. void doit( void )
  231. {
  232.      void saveit( void );
  233.      void saveit0( void );
  234.      char far *p;
  235.      union REGS x;
  236.      unsigned int c,d;
  237.  
  238.      col = 39;
  239.      row = 12;
  240.      setcursize(0,rasterl);
  241.      wputs("^0");
  242.      p = savescreen(&x);
  243.      while (1)
  244.      {
  245.            gotoxy(col,row);
  246.            c = read_keyboard( screenwait );
  247.  
  248.            switch (c)
  249.            {
  250.            case ESC:
  251.                 d = dialogue();
  252.                 switch (d)
  253.                 {
  254.                 case 'b':
  255.                 case 'B':
  256.                      restorescreen(p,&x);
  257.                      gotoxy(0,0);
  258.                      rptchar(' ',2000);
  259.                      windowbox( 0,0,79,24 );
  260.                      fullscreen();
  261.                      col = 39;
  262.                      row = 12;
  263.                      setcursize(0,rasterl);
  264.                      wputs("^0");
  265.                      p = savescreen(&x);
  266.                      bopbleet();
  267.                      break;
  268.                 case 'r':
  269.                 case 'R':
  270.                      restorescreen(p,&x);
  271.                      p = savescreen(&x);
  272.                      bopbleet();
  273.                      break;
  274.                 case 'c':
  275.                 case 'C':
  276.                      saveit();
  277.                 case 'i':
  278.                 case 'I':
  279.                      saveit0();
  280.                 case 'n':
  281.                 case 'N':
  282.                 case 'q':
  283.                 case 'Q':
  284.                 case 'x':
  285.                 case 'X':
  286.                      _ffree(p);
  287.                      defcursor();
  288.                      goto zoo;
  289.                      break;
  290.                 default:
  291.                      break;
  292.                 }
  293.                 break;
  294.            case F1:
  295.                 wputs("^1");
  296.                 break;
  297.            case F2:
  298.                 wputs("^2");
  299.                 break;
  300.            case F3:
  301.                 wputs("^3");
  302.                 break;
  303.            case F4:
  304.                 wputs("^4");
  305.                 break;
  306.            case F5:
  307.                 wputs("^5");
  308.                 break;
  309.            case F6:
  310.                 wputs("^6");
  311.                 break;
  312.            case F7:
  313.                 wputs("^7");
  314.                 break;
  315.            case F8:
  316.                 wputs("^8");
  317.                 break;
  318.            case F9:
  319.                 wputs("^9");
  320.                 break;
  321.            case F10:
  322.                 wputs("^0");
  323.                 break;
  324.            case Alt_F1:
  325.                 rptchar('╔',1);
  326.                 ++col;
  327.                 if ( col > 79 ) col = 0;
  328.                 break;
  329.            case Alt_F2:
  330.                 rptchar('╗',1);
  331.                 ++row;
  332.                 if ( row > 24 ) row = 0;
  333.                 break;
  334.            case Alt_F3:
  335.                 rptchar('═',1);
  336.                 --col;
  337.                 if ( col < 0 ) col = 79;
  338.                 break;
  339.            case Alt_F4:
  340.                 rptchar('═',1);
  341.                 ++col;
  342.                 if ( col > 79 ) col = 0;
  343.                 break;
  344.            case Alt_F5:
  345.                 rptchar('║',1);
  346.                 --row;
  347.                 if ( row < 0 ) row = 24;
  348.