- while ( (c=*(buf++)) ) {
- if (c != '%') {
- rdl->write_char(rdl, c);
- continue;
- }
- c = *(buf++);
- if (c != 'u') {
- rdl->write_char(rdl, '%');
- rdl->write_char(rdl, c);
- continue;
- }
- /* val is never more than 255 */
- while (div) {
- c = (char)(val / div);
- if (c || started) {
- rdl->write_char(rdl, (char)(c+'0'));
- started = 1;
- }
- val %= div;
- div /= 10;
+ s = rdl->pager_buf;
+ if (s == NULL)
+ return 0;
+
+ rdline_printf(rdl, vt100_home);
+ rdline_printf(rdl, vt100_clear_right);
+
+ s += rdl->pager_off;
+
+ /* we know that s is 0-terminated */
+ displen = strnchr(s, '\n', &lines);
+ rdl->pager_lines = lines;
+
+ /* we can display all the data */
+ if (displen == -1) {
+ write(rdl->fd_out, s, rdl->pager_len);
+ free(rdl->pager_buf);
+ rdl->pager_buf = NULL;
+ return 0;
+ }
+
+ displen = displen + 1; /* include \n */
+ write(rdl->fd_out, s, displen);
+ rdl->pager_off += displen;
+ rdl->pager_len -= displen;
+
+ rdline_printf(rdl, "--- press a key to continue ---");
+ return -1;
+}
+
+/* push data in pager */
+ssize_t
+rdline_asyncpager_write(struct rdline *rdl, void *buf, size_t len)
+{
+ char *s = buf;
+
+ /* display as many lines as we can */
+ if (rdl->pager_lines < RDLINE_MAX_LINES) {
+ int lines = RDLINE_MAX_LINES - rdl->pager_lines;
+ int displen;
+
+ /* we know that s is 0-terminated */
+ displen = strnchr(s, '\n', &lines);
+ rdl->pager_lines += lines;
+
+ /* we can display all the data */
+ if (displen == -1) {
+ write(rdl->fd_out, s, len);
+ return 0;