home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0600 / CCE_0636.ZIP / CCE_0636 / CURSES / CRSSRC12.ZOO / src / addbytes.c next >
C/C++ Source or Header  |  1991-09-27  |  3KB  |  120 lines

  1. /*
  2.  * Copyright (c) 1987 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that the above copyright notice and this paragraph are
  7.  * duplicated in all such forms and that any documentation,
  8.  * advertising materials, and other materials related to such
  9.  * distribution and use acknowledge that the software was developed
  10.  * by the University of California, Berkeley.  The name of the
  11.  * University may not be used to endorse or promote products derived
  12.  * from this software without specific prior written permission.
  13.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  14.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  15.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16.  */
  17.  
  18. #ifndef lint
  19. static char sccsid[] = "@(#)addbytes.c    5.3 (Berkeley) 6/30/88";
  20. #endif /* not lint */
  21.  
  22. # include    "curses.ext"
  23.  
  24. /*
  25.  *    This routine adds the character to the current position
  26.  *
  27.  */
  28. int waddbytes(win, bytes, count)
  29. reg WINDOW    *win;
  30. reg char    *bytes;
  31. reg int        count;
  32. {
  33. #define    SYNCH_OUT()    {win->_cury = y; win->_curx = x;}
  34. #define    SYNCH_IN()    {y = win->_cury; x = win->_curx;}
  35.     reg int        x, y;
  36.     reg int        newx;
  37.  
  38.     SYNCH_IN();
  39. # ifdef FULLDEBUG
  40.     fprintf(outf, "ADDBYTES('%c') at (%d, %d)\n", c, y, x);
  41. # endif
  42.     while (count--) {
  43.         register int c;
  44.         static char blanks[] = "        ";
  45.  
  46.         c = *bytes++;
  47.         switch (c) {
  48.           case '\t':
  49.             SYNCH_OUT();
  50.             if (waddbytes(win, blanks, 8-(x%8)) == ERR) {
  51.             return ERR;
  52.             }
  53.             SYNCH_IN();
  54.             break;
  55.  
  56.           default:
  57. # ifdef FULLDEBUG
  58.             fprintf(outf, "ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
  59. # endif
  60.             if (win->_flags & _STANDOUT)
  61.                 c |= _STANDOUT;
  62.             {
  63. # ifdef    FULLDEBUG
  64.                 fprintf(outf, "ADDBYTES(%0.2o, %d, %d)\n", win, y, x);
  65. # endif
  66.                 if (win->_y[y][x] != c) {
  67.                     newx = x + win->_ch_off;
  68.                     if (win->_firstch[y] == _NOCHANGE) {
  69.                         win->_firstch[y] =
  70.                                 win->_lastch[y] = newx;
  71.                     } else if (newx < win->_firstch[y])
  72.                         win->_firstch[y] = newx;
  73.                     else if (newx > win->_lastch[y])
  74.                         win->_lastch[y] = newx;
  75. # ifdef FULLDEBUG
  76.                     fprintf(outf, "ADDBYTES: change gives f/l: %d/%d [%d/%d]\n",
  77.                         win->_firstch[y], win->_lastch[y],
  78.                         win->_firstch[y] - win->_ch_off,
  79.                         win->_lastch[y] - win->_ch_off);
  80. # endif
  81.                 }
  82.             }
  83.             win->_y[y][x++] = c;
  84.             if (x >= win->_maxx) {
  85.                 x = 0;
  86.     newline:
  87.                 if (++y >= win->_maxy)
  88.                     if (win->_scroll) {
  89.                         SYNCH_OUT();
  90.                         scroll(win);
  91.                         SYNCH_IN();
  92.                         --y;
  93.                     }
  94.                     else
  95.                         return ERR;
  96.             }
  97. # ifdef FULLDEBUG
  98.             fprintf(outf, "ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
  99. # endif
  100.             break;
  101.           case '\n':
  102.             SYNCH_OUT();
  103.             wclrtoeol(win);
  104.             SYNCH_IN();
  105.             if (!NONL)
  106.                 x = 0;
  107.             goto newline;
  108.           case '\r':
  109.             x = 0;
  110.             break;
  111.           case '\b':
  112.             if (--x < 0)
  113.                 x = 0;
  114.             break;
  115.         }
  116.     }
  117.     SYNCH_OUT();
  118.     return OK;
  119. }
  120.