home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / TBSTR.C < prev    next >
C/C++ Source or Header  |  1990-12-15  |  5KB  |  207 lines

  1. /*
  2.     tbstr.c
  3.  
  4.     % textbuffer string manipulation functions, keep track of menu->vheight
  5.  
  6.     C-scape 3.2
  7.     Copyright (c) 1988 by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     -----------------
  12.      6/08/88 jdc    created
  13.      8/21/88 jmd    preened and poked
  14.                     removed ret from deleterow
  15.     10/10/88 jdc    cleaned up tb_strcpy
  16.     12/02/88 jdc    preened and poked
  17.      5/23/89 jdc    made tb_setcursor menu_setcursor
  18.      5/24/89 jdc    fixed multiple line menu_strdel bug
  19.      7/15/89 ted    changed 'bbc_Attr == NULL' to '!bbc_Attr()'. (It's boolean).
  20.      8/04/89 jdc    played with tb->set_cursor
  21.  
  22.      3/28/90 jmd    ansi-fied
  23.     12/15/90 jdc    added TB_COLORNNL support
  24. */
  25.  
  26. #include "menu.h"
  27.  
  28. int menu_strcpy(menu_type dmenu, int drow, int dcol, tb_type stb, int srow, int scol, long len, int mode)
  29. /* 
  30.     takes DISPLAYED (expanded) position.
  31.     if mode == TB_ALL then copy all of source (stb) to destination (dtb) 
  32. */
  33. {
  34.     tb_type dtb;
  35.     bbpeek_struct bp;
  36.     int dlen;
  37.  
  38.     dtb = menu_GetTextbuf(dmenu);
  39.  
  40.     if (!tb_FindPosition(stb, srow, scol)) {
  41.         return(FALSE);
  42.     }
  43.     if (mode == TB_ALL) {
  44.  
  45.         /* don't include last '\n' */
  46.         len = stb->size - stb->cursor - 1;
  47.     }
  48.     bp.b = stb->bbc->b;
  49.     bp.off = bp.b->off + tb_GetCursor(stb);
  50.     bp.len = len;
  51.     while ((dlen = bbpeek(&bp)) > 0) {
  52.  
  53.         if (!menu_putTB(dmenu, drow, dcol, bp.p, 0x00, dlen, bp.b->attr, 0, TB_COLORNNL)) {
  54.             return(FALSE);
  55.         }
  56.         drow = tb_GetRow(dtb);
  57.         dcol = tb_GetCol(dtb);
  58.         bp.off += dlen;
  59.         bp.len -= (long)dlen;
  60.     }
  61.     return(TRUE);
  62. }
  63.  
  64. long menu_strdel(menu_type menu, unsigned int row, unsigned int col, long len)
  65. /* 
  66.     takes DISPLAYED (expanded) position.
  67. */
  68. {
  69.     tb_type tb;
  70.     long count, cursor;
  71.     int dlen, llen, nline, oldrow;
  72.  
  73.     tb = menu_GetTextbuf(menu);
  74.     if (row <= 0) {
  75.         nline = FALSE;
  76.         row = 0;
  77.     }
  78.     else {
  79.         tb_FindLine(tb, row - 1);
  80.         nline = tb->nend;
  81.     }
  82.     tb_FindPosition(tb, row, col);
  83.     if ((oldrow = tb_GetRow(tb)) < row) {
  84.         return(0L);
  85.     }
  86.     cursor = tb->cursor;
  87.     for (col = tb_GetCursor(tb), count = 0L; len > 0L && tb_FindLine(tb, row) == TRUE;) {
  88.  
  89.         if (col > tb->len) {
  90.             row++;
  91.              if (!tb_FindLine(tb, row)) {
  92.                 break;
  93.             }
  94.             col = tb_GetCursor(tb);
  95.         }
  96.         llen = tb->len - col;
  97.         dlen = (len < (long)llen) ? (int)len : llen;
  98.     
  99.         /* can't delete last '\n' */
  100.         if (tb->size - tb->offset <= (long)(col + dlen)) {
  101.             if (col != 0 || !nline) {
  102.                 dlen = tb->len - col - 1;
  103.             }
  104.         }
  105.         if (dlen == 0) { 
  106.             break;
  107.         }
  108.         tb->size -= bbc_Del(tb->bbc, (long)col, (long)dlen);
  109.         count += dlen;
  110.         len -= dlen;
  111.         if (!tb->nend) {
  112.             /* word wrapping */
  113.             if (tb->size < 200) {
  114.                 /* small enough to recount */
  115.                 menu_SetDirty(menu, TRUE);
  116.             }
  117.             else {
  118.                 /* guess ! */
  119.                 menu->rowcount = (int)(tb->size / (long)tb->width);
  120.             }
  121.         }
  122.         else if (dlen == llen) {
  123.             /* adjust menu->rowcount directly */
  124.             menu->rowcount--;
  125.         }
  126.         if (tb->offset >= tb->size) {
  127.             if (tb_GetRow(tb) == -1L) {
  128.                 tb->offset = tb->size;
  129.             }
  130.             else {
  131.                 tb->offset = tb->size - (tb->bbc->b->len - tb->bbc->b->off);
  132.             }
  133.         }
  134.     }
  135.     tb_FindLine(menu_GetTextbuf(menu), (oldrow <= 1) ? 0 : oldrow - 1);
  136.     tb->cursor = cursor;
  137.     menu_setcursor(menu);
  138.  
  139.     return(count);
  140. }
  141.  
  142. int tb_strlen(tb_type tb, unsigned int row, unsigned int col, unsigned int width, int *newline)
  143. /* 
  144.     returns char width for displayed width, doesn't include '\n'.
  145.     *newline == 1 if it hits a '\n', else *newline == 0
  146. */    
  147. {
  148.     bbpeek_struct bp;
  149.     int len, i, dlen, done;
  150.  
  151.     if (!tb_FindPosition(tb, row, col)) {
  152.         return(0);
  153.     }
  154.     bp.b = tb->bbc->b;
  155.     bp.off = bp.b->off + tb_GetCursor(tb);
  156.     bp.len = tb->len;
  157.  
  158.     for (width += col, len = 0, *newline = 0, done = FALSE; !done;) {
  159.  
  160.         for (dlen = bbpeek(&bp), i = 0; i < dlen; i++, len++) {
  161.  
  162.             if (col >= width) {
  163.                 done = TRUE;
  164.                 break;
  165.             }
  166.             if (bp.p[i] == '\n') {
  167.                 *newline = 1;
  168.                 done = TRUE;
  169.                 break;
  170.             }
  171.             col += tb_translate(tb, col, bp.p + i);
  172.         }
  173.         bp.off += i;
  174.     }
  175.     return(len);
  176. }
  177.  
  178. int tb_strattr(tb_type tb, unsigned int row, unsigned int col, long len, byte attr)
  179. /* 
  180.     takes DISPLAYED (expanded) position.
  181. */
  182. {
  183.     if (!tb_FindPosition(tb, row, col) ||
  184.         !bbc_Attr(tb->bbc, tb->cursor - tb->offset, attr, len)) {
  185.  
  186.         return(FALSE);
  187.     }
  188.     return(TRUE);
  189. }
  190.  
  191. int menu_DelRowTB(menu_type menu, int row, int col)
  192. /* 
  193.     takes DISPLAYED (expanded) position.
  194. */
  195. {
  196.     tb_type tb;
  197.  
  198.     tb = menu_GetTextbuf(menu);
  199.  
  200.     if (!tb_FindPosition(tb, row, col) 
  201.         || menu_strdel(menu, row, col, (long)(tb->len - tb_GetCursor(tb))) == 0L)  {
  202.  
  203.         return(FALSE);
  204.     }
  205.     return(TRUE);
  206. }
  207.