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

  1. /*
  2.     sdgettb.c
  3.  
  4.     % sed_GetTB
  5.  
  6.     C-scape 3.2
  7.     Copyright (c) 1988-1989, by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     -----------------
  12.      4/29/89 jdc    added attr support
  13.      5/17/89 jdc    changed len names and fixed total_len += get_len 
  14.      5/23/89 jdc    fixed buf_len-- for terminating NULL
  15.      8/04/89 jdc    added tb->cursor_set check (ted_Follow loop bug)
  16.  
  17.      3/28/90 jmd    ansi-fied
  18.      4/05/90 jdc    fixed hardline bug
  19.     12/13/90 jdc/jra    ADDED: buf_len check and decrement
  20. */
  21.  
  22. #include "sed.h"
  23. #include "tbpriv.h"
  24. #include "teddecl.h"
  25.  
  26. unsigned int _sed_gettb(sed_type sed, char *buf, unsigned buf_len, int mode, byte *attr)
  27. /*
  28.     mode == TED_HARD or TED_SOFT
  29. */
  30. {
  31.     unsigned int total_len, line_len, get_len, attr_len, col, off;
  32.     int ref, hard;
  33.     long cursor;
  34.     bblock_type b;
  35.  
  36.     ref = ted_GetRefresh(sed);
  37.  
  38.     if (!sed_GetTextbuf(sed)->cursor_set) {
  39.         total_len = 0;
  40.         goto QUIT;
  41.     }
  42.     ted_SetRefresh(sed, TED_NOREFRESH);
  43.  
  44.     cursor = ted_GetCursor(sed);
  45.     col = tb_GetCursor(sed_GetTextbuf(sed));
  46.  
  47.     /*     move through textbuf by lines, 
  48.         add '\n''s if wrapped and mode == TED_HARD
  49.     */
  50.  
  51.     for (total_len = 0, b = sed_GetTextbuf(sed)->bbc->b; 
  52.         (line_len = ted_GetLineLen(sed)) > 0; 
  53.         col = 0) {
  54.  
  55.         hard = ted_IsHardLine(sed);
  56.         line_len -= col;
  57.         off = b->off + col;
  58.         while (off >= b->len) {
  59.             off -= b->len;
  60.             b = b->next;
  61.         }
  62.         /*     move through line by blocks, 
  63.             check for attr changes if attr != NULL
  64.         */
  65.  
  66.         for (get_len = line_len; 
  67.             line_len > 0; 
  68.             line_len -= get_len, col += get_len) {
  69.  
  70.             if (attr != NULL && (attr_len = b->len - off) <= get_len) {
  71.                 get_len = attr_len;
  72.             }
  73.             if (get_len > buf_len) {
  74.                 get_len = buf_len;
  75.             }
  76.             if (attr != NULL) {
  77.                 *attr = b->attr;
  78.             }
  79.             total_len += ted_GetString(sed, buf, get_len);
  80.             cursor += (long)get_len;
  81.             buf_len -= get_len;
  82.             buf += get_len;
  83.             off += get_len;
  84.             if (!ted_GotoCursor(sed, cursor)        /* end of textbuf */
  85.                 || buf_len <= 0) {                     /* end of buf */
  86.                 goto QUIT;
  87.             }
  88.             while (off >= b->len) {
  89.                 if (attr != NULL && b->next->attr != b->attr) {
  90.                     goto QUIT;                    /* attr change */
  91.                 }
  92.                 off -= b->len;
  93.                 b = b->next;
  94.             }
  95.         }
  96.         /* jra ADDED: buf_len check and decrement */
  97.         /* to avoid buffer overrun */
  98.         if (mode == TED_HARD && !hard && buf_len > 0) {
  99.             *buf++ = '\n';
  100.             total_len++;
  101.             buf_len--;
  102.         }
  103.     }
  104. QUIT:
  105.     *buf = '\0';
  106.  
  107.     ted_SetRefresh(sed, ref);
  108.     return(total_len);
  109. }
  110.