Sun Jun 2 22:28:43 1996 Miles Bader <miles@gnu.ai.mit.edu>
authorMiles Bader <miles@gnu.org>
Sun, 7 Jul 1996 16:54:03 +0000 (16:54 +0000)
committerMiles Bader <miles@gnu.org>
Sun, 7 Jul 1996 16:54:03 +0000 (16:54 +0000)
* linewrap.c (lwupdate): Update D->point_offs when done.
Use memmove instead of memcpy where overlap is possible (not
  necessary using current implementation of memcpy, but...).
(__line_wrap_update): Don't update D->point_offs (lwupdate does it).

Fri May 31 11:48:46 1996  Miles Bader  <miles@gnu.ai.mit.edu>

* linewrap.c (lwupdate): New function, mostly was __line_wrap_update.
Use POINT_COL field instead of POINT.
(__line_wrap_output): Use lwupdate.
(__line_wrap_update): New function.
(ensure_unwrapped, ensure_wrapped): New functions.
(line_wrap_set_lmargin, line_wrap_set_rmargin,
line_wrap_set_wmargin, line_wrap_point): Use __line_wrap_update.

* linewrap.h (struct line_wrap_data): Rename POINT field to POINT_COL.
Add POINT_OFFS field.
(__line_wrap_update): New decl.
(line_wrap_set_lmargin, line_wrap_set_rmargin,
line_wrap_set_wmargin, line_wrap_point): Use __line_wrap_update.

ChangeLog
stdio/linewrap.h

index 168cd67..20c366e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+Sun Jun  2 22:28:43 1996  Miles Bader  <miles@gnu.ai.mit.edu>
+
+       * linewrap.c (lwupdate): Update D->point_offs when done.
+       Use memmove instead of memcpy where overlap is possible (not
+       necessary using current implementation of memcpy, but...).
+       (__line_wrap_update): Don't update D->point_offs (lwupdate does it).
+
+Fri May 31 11:48:46 1996  Miles Bader  <miles@gnu.ai.mit.edu>
+
+       * linewrap.c (lwupdate): New function, mostly was __line_wrap_update.
+       Use POINT_COL field instead of POINT.
+       (__line_wrap_output): Use lwupdate.
+       (__line_wrap_update): New function.
+       (ensure_unwrapped, ensure_wrapped): New functions.
+       (line_wrap_set_lmargin, line_wrap_set_rmargin,
+       line_wrap_set_wmargin, line_wrap_point): Use __line_wrap_update.
+
+       * linewrap.h (struct line_wrap_data): Rename POINT field to POINT_COL.
+       Add POINT_OFFS field.
+       (__line_wrap_update): New decl.
+       (line_wrap_set_lmargin, line_wrap_set_rmargin,
+       line_wrap_set_wmargin, line_wrap_point): Use __line_wrap_update.
+
 Fri Jul  5 17:34:47 1996  Miles Bader  <miles@gnu.ai.mit.edu>
 
        * login/logout.c (logout): Do nothing if getutline_r returns ESRCH.
index 7ba337f..c569238 100644 (file)
@@ -35,7 +35,12 @@ struct line_wrap_data
   {
     size_t lmargin, rmargin;   /* Left and right margins.  */
     size_t wmargin;            /* Margin to wrap to, or -1 to truncate.  */
-    size_t point;              /* Current column of last chars flushed.  */
+
+    /* Point in stdio buffer to which we've processed for wrapping, but
+       not output.  */
+    size_t point_offs;
+    /* Output column at POINT_OFFS.  */
+    size_t point_col;
 
     /* Original cookie and hooks from the stream.  */
     void *cookie;
@@ -85,11 +90,18 @@ extern size_t line_wrap_set_wmargin (FILE *stream, size_t wmargin);
    the current output point.  */
 extern size_t line_wrap_point (FILE *stream); 
 
-
 #ifdef __OPTIMIZE__
 
 extern void __line_wrap_output (FILE *, int); /* private */
 
+/* If STREAM is not line-wrapped, return 0.  Otherwise all pending text
+   buffered text in STREAM so that the POINT_OFFS field refers to the last
+   position in the stdio buffer, and return the line wrap state object for
+   STREAM.  Since all text has been processed, this means that (1) the
+   POINT_COL field refers to the column at which any new text would be added,
+   and (2) any changes to the margin parameters will only affect new text.  */
+extern struct line_wrap_data *__line_wrap_update (FILE *stream); /* private */
+
 /* Returns true if STREAM is line wrapped.  */
 extern inline int
 line_wrapped (FILE *stream)
@@ -111,15 +123,15 @@ line_wrap_lmargin (FILE *stream)
 extern inline size_t
 line_wrap_set_lmargin (FILE *stream, size_t lmargin)
 {
-  if (! line_wrapped (stream))
-    return -1;
-  else
+  struct line_wrap_data *d = __line_wrap_update (stream);
+  if (d)
     {
-      struct line_wrap_data *d = stream->__cookie;
       size_t old = d->lmargin;
       d->lmargin = lmargin;
       return old;
     }
+  else
+    return -1;
 }
 
 /* If STREAM is not line-wrapped return -1, else return its left margin.  */
@@ -136,15 +148,15 @@ line_wrap_rmargin (FILE *stream)
 extern inline size_t
 line_wrap_set_rmargin (FILE *stream, size_t rmargin)
 {
-  if (! line_wrapped (stream))
-    return -1;
-  else
+  struct line_wrap_data *d = __line_wrap_update (stream);
+  if (d)
     {
-      struct line_wrap_data *d = stream->__cookie;
       size_t old = d->rmargin;
       d->rmargin = rmargin;
       return old;
     }
+  else
+    return -1;
 }
 
 /* If STREAM is not line-wrapped return -1, else return its wrap margin.  */
@@ -161,15 +173,15 @@ line_wrap_wmargin (FILE *stream)
 extern inline size_t
 line_wrap_set_wmargin (FILE *stream, size_t wmargin)
 {
-  if (! line_wrapped (stream))
-    return -1;
-  else
+  struct line_wrap_data *d = __line_wrap_update (stream);
+  if (d)
     {
-      struct line_wrap_data *d = stream->__cookie;
       size_t old = d->wmargin;
       d->wmargin = wmargin;
       return old;
     }
+  else
+    return -1;
 }
 
 /* If STREAM is not line-wrapped return -1, else return the column number of
@@ -177,9 +189,8 @@ line_wrap_set_wmargin (FILE *stream, size_t wmargin)
 extern inline size_t
 line_wrap_point (FILE *stream)
 {
-  if (! line_wrapped (stream))
-    return -1;
-  return ((struct line_wrap_data *)stream->__cookie)->point;
+  struct line_wrap_data *d = __line_wrap_update (stream);
+  return d ? d->point_col : -1;
 }
 
 #endif /* Optimizing.  */