From http://www.jwz.org/xscreensaver/xscreensaver-5.30.tar.gz
[xscreensaver] / OSX / iostextclient.m
index 09c6298561b41493cb9faf8f7b5503f80c16510f..f1f3ad7aed9686638388e7171184c8c0d9bd8857 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2012-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -31,6 +31,7 @@ struct text_data {
   char *literal, *url;
 
   int columns;
+  int max_lines;
   char *buf;
   int buf_size;
   char *fp;
@@ -280,7 +281,7 @@ copy_rss_field (const char *s)
     s += 9;
     char *e = strstr (s, "]]");
     if (e) *e = 0;
-    int L = strlen (s);
+    unsigned long L = strlen (s);
     char *s2 = (char *) malloc (L+1);
     memcpy (s2, s, L+1);
     return s2;
@@ -307,10 +308,10 @@ pick_rss_field (const char *a, const char *b, const char *c, const char *d)
   char *b2 = copy_rss_field (b);
   char *c2 = copy_rss_field (c);
   char *d2 = copy_rss_field (d);
-  int al = a2 ? strlen(a2) : 0;
-  int bl = b2 ? strlen(b2) : 0;
-  int cl = c2 ? strlen(c2) : 0;
-  int dl = d2 ? strlen(d2) : 0;
+  unsigned long al = a2 ? strlen(a2) : 0;
+  unsigned long bl = b2 ? strlen(b2) : 0;
+  unsigned long cl = c2 ? strlen(c2) : 0;
+  unsigned long dl = d2 ? strlen(d2) : 0;
   char *ret = 0;
 
   if      (al > bl && al > cl && al > dl) ret = a2;
@@ -392,10 +393,11 @@ strip_rss (char *rss)
 
 
 static void
-wrap_text (char *body, int columns)
+wrap_text (char *body, int columns, int max_lines)
 {
   int col = 0, last_col = 0;
   char *last_space = 0;
+  int lines = 0;
   if (! body) return;
   for (char *p = body; *p; p++) {
     if (*p == '\r' || *p == '\n' || *p == ' ' || *p == '\t') {
@@ -410,6 +412,12 @@ wrap_text (char *body, int columns)
       col = 0;
       last_col = 0;
       last_space = 0;
+      lines++;
+      if (max_lines && lines >= max_lines)
+        {
+          *p = 0;
+          break;
+        }
     } else {
       col++;
     }
@@ -429,7 +437,7 @@ rewrap_text (char *body, int columns)
         *p = ' ';
     }
   }
-  wrap_text (body, columns);
+  wrap_text (body, columns, 0);
 }
 
 
@@ -471,7 +479,7 @@ url_string (const char *url)
 
   // Only search the first 1/2 K of the document while determining type.
 
-  int L = [body length];
+  unsigned long L = [body length];
   if (L > 512) L = 512;
   NSString *head = [[[body substringToIndex: L]
                       stringByTrimmingCharactersInSet:
@@ -544,7 +552,7 @@ textclient_getc (text_data *d)
       abort();
     }
     if (d->columns > 10)
-      wrap_text (d->buf, d->columns);
+      wrap_text (d->buf, d->columns, d->max_lines);
     d->fp = d->buf;
   }
 
@@ -566,9 +574,11 @@ textclient_putc (text_data *d, XKeyEvent *k)
 void
 textclient_reshape (text_data *d,
                     int pix_w, int pix_h,
-                    int char_w, int char_h)
+                    int char_w, int char_h,
+                    int max_lines)
 {
   d->columns = char_w;
+  d->max_lines = max_lines;
   rewrap_text (d->buf, d->columns);
 }