home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / TEDSTRIP.C < prev    next >
C/C++ Source or Header  |  1990-10-29  |  3KB  |  123 lines

  1. /*
  2.     tedstrip.c
  3.     
  4.     % ted_StripWhiteSpace (fresh and nasty)
  5.  
  6.     C-scape 3.2
  7.     Copyright (c) 1989 by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     -----------------
  12.      1/21/89 jdc    preened
  13.  
  14.      3/20/90 jmd    fixed conversion of bitfield to long
  15.      3/28/90 jmd    ansi-fied
  16.      4/16/90 jdc    got rid of conversion warning
  17.     10/28/90 jdc    fixed boolean/int ret conflict
  18. */
  19.  
  20. #include "ted.h"
  21.  
  22. boolean ted_StripWhiteSpace(sed_type sed)
  23. /*
  24.     strips all trailing-one-color white space from a sed's textbuffer
  25.     returns: TRUE or FALSE
  26. */
  27. {
  28.     int ref, i, row, crow, ccol, len, space;
  29.     int dlen, delrow;
  30.     boolean hit = FALSE;
  31.     byte attr;
  32.     tb_type tb;
  33.     bbpeek_struct bp;
  34.  
  35.     /* strip the children */
  36.     for (i = 0; i < sed_GetFieldCount(sed); i++) {
  37.         if (obj_Who(sed_GetFieldBob(sed, i), ID_SEDWIN)) {
  38.  
  39.             ted_StripWhiteSpace(sed_GetFieldBob(sed, i));
  40.         }
  41.     }
  42.  
  43.     ted_GetPosition(sed, &crow, &ccol);
  44.     ref = ted_GetRefresh(sed);
  45.     ted_SetRefresh(sed, TED_NOREFRESH);
  46.  
  47.     ted_GoBottom(sed);
  48.     ted_GoHome(sed);
  49.     tb = sed_GetTextbuf(sed);
  50.  
  51.     for (row = tb_GetRow(tb), delrow = TRUE, attr = tb->bbc->b->attr;
  52.     row >= 0; row--) {
  53.  
  54.         ted_GotoPosition(sed, row, 0);
  55.         if (!tb->nend) {
  56.             continue;
  57.         }
  58.         bp.b = tb->bbc->b;
  59.         bp.len = tb->len;
  60.         bp.off = bp.b->off;
  61.  
  62.         for (space = 0, i = 0, len = 0; bp.len > 0;) {
  63.  
  64.             for (dlen = bbpeek(&bp); dlen > 0;
  65.             dlen--, bp.off++, bp.len--, bp.p++) {
  66.     
  67.                 switch (*bp.p) {
  68.  
  69.                 case '\n':
  70.                     if (bp.b->attr != attr
  71.                     || (bp.off == 0 && bp.b->prev != NULL && bp.b->attr != bp.b->prev->attr)) {
  72.                         delrow = FALSE;
  73.                         space = i;
  74.                         attr = bp.b->attr;
  75.                         dlen = 0;
  76.                     }
  77.                     break;
  78.  
  79.                 case '\t':
  80.                 case ' ':
  81.                 case '\r':
  82.                     if (bp.b->attr != attr) {
  83.                         space = i;
  84.                         len = (int)bp.len - (tb->nend ? 1 : 0);
  85.                         delrow = FALSE;
  86.                         attr = (dlen == 1) ? bp.b->next->attr : bp.b->attr;
  87.                     }
  88.                     if (*bp.p == '\t') {
  89.                         i += tb->tab_size - (i % tb->tab_size) - 1;
  90.                     }
  91.                     i++;
  92.                     break;
  93.  
  94.                 default:
  95.                     i++;
  96.                     space = i;
  97.                     len = 0;
  98.                     delrow = FALSE;
  99.                     attr = (dlen == 1) ? bp.b->next->attr : bp.b->attr;
  100.                     break;
  101.                 }
  102.             }
  103.         }
  104.         if (delrow) {
  105.             ted_DeleteString(sed, row, 0, tb->len);
  106.             hit = TRUE;
  107.         }        
  108.         else if (space < tb->exp_len - 1) {
  109.             ted_DeleteString(sed, row, space, len);
  110.             hit = TRUE;
  111.         }
  112.     }
  113.     if (hit) {
  114.         menu_SetDirty(sed_GetMenu(sed), TRUE);
  115.     }
  116.  
  117.     ted_GotoPosition(sed, crow, ccol);
  118.     ted_SetRefresh(sed, ref);
  119.  
  120.     return(hit);
  121. }
  122.  
  123.