Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/libform Fixed wrapping of multiline fields.
details: https://anonhg.NetBSD.org/src/rev/1d957a83cc8d
branches: trunk
changeset: 509987:1d957a83cc8d
user: blymn <blymn%NetBSD.org@localhost>
date: Wed May 16 11:51:16 2001 +0000
description:
Fixed wrapping of multiline fields.
diffstat:
lib/libform/driver.c | 8 +++-
lib/libform/form.c | 6 ++-
lib/libform/internals.c | 96 ++++++++++++++++++++++++++++++++++++++++--------
3 files changed, 91 insertions(+), 19 deletions(-)
diffs (216 lines):
diff -r 7d2b2913bb54 -r 1d957a83cc8d lib/libform/driver.c
--- a/lib/libform/driver.c Wed May 16 11:13:20 2001 +0000
+++ b/lib/libform/driver.c Wed May 16 11:51:16 2001 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: driver.c,v 1.8 2001/05/11 14:04:48 blymn Exp $ */
+/* $NetBSD: driver.c,v 1.9 2001/05/16 11:51:16 blymn Exp $ */
/*-
* Copyright (c) 1998-1999 Brett Lymn
@@ -168,6 +168,12 @@
* return the status.
*/
return status;
+ else if (status == E_NO_ROOM)
+ /* we will get this if the line
+ * wrapping fails. Deny the
+ * request.
+ */
+ return E_REQUEST_DENIED;
}
while (status != E_OK);
update_field = (status == E_OK);
diff -r 7d2b2913bb54 -r 1d957a83cc8d lib/libform/form.c
--- a/lib/libform/form.c Wed May 16 11:13:20 2001 +0000
+++ b/lib/libform/form.c Wed May 16 11:51:16 2001 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: form.c,v 1.7 2001/05/11 14:04:48 blymn Exp $ */
+/* $NetBSD: form.c,v 1.8 2001/05/16 11:51:16 blymn Exp $ */
/*-
* Copyright (c) 1998-1999 Brett Lymn
@@ -593,6 +593,10 @@
if ((cur->opts & O_PUBLIC) == O_PUBLIC) {
row += cur->cursor_ypos;
col += cur->cursor_xpos;
+ if (cur->cursor_xpos >= cur->cols) {
+ col = cur->form_col;
+ row++;
+ }
}
#ifdef DEBUG
diff -r 7d2b2913bb54 -r 1d957a83cc8d lib/libform/internals.c
--- a/lib/libform/internals.c Wed May 16 11:13:20 2001 +0000
+++ b/lib/libform/internals.c Wed May 16 11:51:16 2001 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: internals.c,v 1.15 2001/05/11 14:04:48 blymn Exp $ */
+/* $NetBSD: internals.c,v 1.16 2001/05/16 11:51:16 blymn Exp $ */
/*-
* Copyright (c) 1998-1999 Brett Lymn
@@ -285,10 +285,11 @@
* will return E_REQUEST_DENIED.
*/
int
-_formi_wrap_field(FIELD *field, unsigned int pos)
+_formi_wrap_field(FIELD *field, unsigned int loc)
{
char *str;
- int width, row;
+ int width, row, start_row;
+ unsigned int pos;
str = field->buffers[0].string;
@@ -319,17 +320,25 @@
return E_OK;
}
}
+
+ start_row = find_cur_line(field, loc);
- for (row = 0; row < field->row_count; row++) {
+ /* if we are not at the top of the field then back up one
+ * row because we may be able to merge the current row into
+ * the one above.
+ */
+ if (start_row > 0)
+ start_row--;
+
+ for (row = start_row; row < field->row_count; row++) {
AGAIN:
pos = field->lines[row].end;
- if (field->lines[row].length <= width) {
+ if (field->lines[row].length < width) {
/* line may be too short, try joining some lines */
- if (((((int) field->row_count) - 1) == row) ||
- (field->lines[row].length == width)) {
- /* if line is just right or this is the last
- * row then don't wrap
+ if ((((int) field->row_count) - 1) == row) {
+ /* if this is the last row then don't
+ * wrap
*/
continue;
}
@@ -361,12 +370,30 @@
if ((!isblank(str[pos])) &&
((field->opts & O_WRAP) == O_WRAP)) {
- pos = find_sow(str, (unsigned int) pos);
- if ((pos == 0) || (!isblank(str[pos - 1]))) {
- return E_REQUEST_DENIED;
+ if (!isblank(str[pos - 1]))
+ pos = find_sow(str,
+ (unsigned int) pos);
+ /*
+ * If we cannot split the line then return
+ * NO_ROOM so the driver can tell that it
+ * should not autoskip (if that is enabled)
+ */
+ if ((pos == 0) || (!isblank(str[pos - 1]))
+ || ((pos <= field->lines[row].start)
+ && (field->buffers[0].length
+ >= (width - 1
+ + field->lines[row].start)))) {
+ return E_NO_ROOM;
}
}
+ /* if we are at the end of the string and it has
+ * a trailing blank, don't wrap the blank.
+ */
+ if ((pos == field->buffers[0].length - 1) &&
+ (isblank(str[pos])))
+ continue;
+
if (split_line(field, pos) != E_OK) {
return E_REQUEST_DENIED;
}
@@ -757,8 +784,9 @@
slen = 0;
start = 0;
- for (row = 0; row < cur->row_count; row++) {
- wmove(form->scrwin, (int) (cur->form_row + row),
+ for (row = cur->start_line; row < cur->row_count; row++) {
+ wmove(form->scrwin,
+ (int) (cur->form_row + row - cur->start_line),
(int) cur->form_col);
start = cur->lines[row].start;
slen = cur->lines[row].length;
@@ -879,7 +907,15 @@
for (i = 0; i < post; i++)
waddch(form->scrwin, cur->pad);
}
-
+
+ for (row = cur->row_count - cur->start_line; row < cur->rows; row++) {
+ wmove(form->scrwin, (int) (cur->form_row + row),
+ (int) cur->form_col);
+ for (i = 0; i < cur->cols; i++) {
+ waddch(form->scrwin, cur->pad);
+ }
+ }
+
return;
}
@@ -1013,6 +1049,7 @@
&field->buffers[0].string[pos],
field->buffers[0].length - pos);
field->buffers[0].length--;
+ bump_lines(field, (int) pos, -1);
} else {
field->buf0_status = TRUE;
if ((field->rows + field->nrows) == 1) {
@@ -1025,20 +1062,45 @@
field->cursor_xpos = field->cols;
}
} else {
- field->cursor_ypos = find_cur_line(field, pos)
- - field->start_line;
+ new_size = find_cur_line(field, pos);
+ if (new_size >= field->rows) {
+ field->cursor_ypos = field->rows - 1;
+ field->start_line = field->row_count
+ - field->cursor_ypos - 1;
+ } else
+ field->cursor_ypos = new_size;
+
field->cursor_xpos = pos
- field->lines[field->cursor_ypos
+ field->start_line].start + 1;
+
+ /*
+ * Annoying corner case - if we are right in
+ * the bottom right corner of the field we
+ * need to scroll the field one line so the
+ * cursor is positioned correctly in the
+ * field.
+ */
+ if ((field->cursor_xpos >= field->cols) &&
+ (field->cursor_ypos == (field->rows - 1))) {
+ field->cursor_ypos--;
+ field->start_line++;
+ }
}
}
#ifdef DEBUG
+ assert((field->cursor_xpos < 400000)
+ && (field->cursor_ypos < 400000)
+ && (field->start_line < 400000));
+
fprintf(dbg,
"add_char exit: xpos=%d, start=%d, length=%d(%d), allocated=%d\n",
field->cursor_xpos, field->start_char,
field->buffers[0].length, strlen(field->buffers[0].string),
field->buffers[0].allocated);
+ fprintf(dbg, "add_char exit: ypos=%d, start_line=%d\n",
+ field->cursor_ypos, field->start_line);
fprintf(dbg,"add_char exit: %s\n", field->buffers[0].string);
fprintf(dbg, "add_char exit: buf0_status=%d\n", field->buf0_status);
fprintf(dbg, "add_char exit: status = %s\n",
Home |
Main Index |
Thread Index |
Old Index