- safe_write(err, "remote: ", 8);
- safe_write(err, buf+1, len);
+ buf[pf] = ' ';
+ do {
+ char *b = buf;
+ int brk = 0;
+
+ /*
+ * If the last buffer didn't end with a line
+ * break then we should not print a prefix
+ * this time around.
+ */
+ if (skip_pf) {
+ b += pf+1;
+ } else {
+ len += pf+1;
+ brk += pf+1;
+ }
+
+ /* Look for a line break. */
+ for (;;) {
+ brk++;
+ if (brk > len) {
+ brk = 0;
+ break;
+ }
+ if (b[brk-1] == '\n' ||
+ b[brk-1] == '\r')
+ break;
+ }
+
+ /*
+ * Let's insert a suffix to clear the end
+ * of the screen line if a line break was
+ * found. Also, if we don't skip the
+ * prefix, then a non-empty string must be
+ * present too.
+ */
+ if (brk > (skip_pf ? 0 : (pf+1 + 1))) {
+ char save[FIX_SIZE];
+ memcpy(save, b + brk, sf);
+ b[brk + sf - 1] = b[brk - 1];
+ memcpy(b + brk - 1, suffix, sf);
+ safe_write(err, b, brk + sf);
+ memcpy(b + brk, save, sf);
+ len -= brk;
+ } else {
+ int l = brk ? brk : len;
+ safe_write(err, b, l);
+ len -= l;
+ }
+
+ skip_pf = !brk;
+ memmove(buf + pf+1, b + brk, len);
+ } while (len);