X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=form%2Ffrm_data.c;h=787a17919f04c3c3fdfedadea93596c3846f487b;hp=1026cf4ffeabace26e19d7d267827c75475ade86;hb=d736364fc09f481a38861dcb44b43d15b94af528;hpb=46722468f47c2b77b3987729b4bcf2321cccfd01 diff --git a/form/frm_data.c b/form/frm_data.c index 1026cf4f..787a1791 100644 --- a/form/frm_data.c +++ b/form/frm_data.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998,2000 Free Software Foundation, Inc. * + * Copyright (c) 1998-2004,2005 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -28,28 +28,29 @@ /**************************************************************************** * Author: Juergen Pfeifer, 1995,1997 * - * Contact: http://www.familiepfeifer.de/Contact.aspx?Lang=en * ****************************************************************************/ #include "form.priv.h" -MODULE_ID("$Id: frm_data.c,v 1.8 2002/07/06 15:33:27 juergen Exp $") +MODULE_ID("$Id: frm_data.c,v 1.14 2005/11/26 15:34:01 tom Exp $") /*--------------------------------------------------------------------------- | Facility : libnform | Function : bool data_behind(const FORM *form) | | Description : Check for off-screen data behind. This is nearly trivial -| becose the begin of a field is fixed. +| because the beginning of a field is fixed. | | Return Values : TRUE - there are off-screen data behind | FALSE - there are no off-screen data behind +--------------------------------------------------------------------------*/ NCURSES_EXPORT(bool) -data_behind (const FORM *form) +data_behind(const FORM *form) { bool result = FALSE; + T((T_CALLED("data_behind(%p)"), form)); + if (form && (form->status & _POSTED) && form->current) { FIELD *field; @@ -57,42 +58,69 @@ data_behind (const FORM *form) field = form->current; if (!Single_Line_Field(field)) { - result = (form->toprow==0) ? FALSE : TRUE; + result = (form->toprow == 0) ? FALSE : TRUE; } else { - result = (form->begincol==0) ? FALSE : TRUE; + result = (form->begincol == 0) ? FALSE : TRUE; } } - return(result); + returnBool(result); } /*--------------------------------------------------------------------------- | Facility : libnform -| Function : static char * After_Last_Non_Pad_Position( -| char *buffer, +| Function : static char * Only_Padding( +| WINDOW *w, | int len, | int pad) | -| Description : Find the last position in the buffer that doesn't +| Description : Test if 'length' cells starting at the current position | contain a padding character. | -| Return Values : The pointer to this position +| Return Values : true if only padding cells are found +--------------------------------------------------------------------------*/ -INLINE -static char * After_Last_Non_Pad_Position(char *buffer, int len, int pad) +NCURSES_INLINE static bool +Only_Padding(WINDOW *w, int len, int pad) { - char *end = buffer + len; - - assert(buffer && len>=0); - while ( (buffer < end) && (*(end-1)==pad) ) - end--; + bool result = TRUE; + int y, x, j; + FIELD_CELL cell; - return end; + getyx(w, y, x); + for (j = 0; j < len; ++j) + { + if (wmove(w, y, x + j) != ERR) + { +#if USE_WIDEC_SUPPORT + if (win_wch(w, &cell) != ERR) + { + if ((chtype)CharOf(cell) != ChCharOf(pad) + || cell.chars[1] != 0) + { + result = FALSE; + break; + } + } +#else + cell = winch(w); + if (ChCharOf(cell) != ChCharOf(pad)) + { + result = FALSE; + break; + } +#endif + } + else + { + /* if an error, return true: no non-padding text found */ + break; + } + } + /* no need to reset the cursor position; caller does this */ + return result; } -#define SMALL_BUFFER_SIZE (80) - /*--------------------------------------------------------------------------- | Facility : libnform | Function : bool data_ahead(const FORM *form) @@ -104,31 +132,21 @@ static char * After_Last_Non_Pad_Position(char *buffer, int len, int pad) | FALSE - there are no off-screen data ahead +--------------------------------------------------------------------------*/ NCURSES_EXPORT(bool) -data_ahead (const FORM *form) +data_ahead(const FORM *form) { bool result = FALSE; + T((T_CALLED("data_ahead(%p)"), form)); + if (form && (form->status & _POSTED) && form->current) { - static char buffer[SMALL_BUFFER_SIZE + 1]; FIELD *field; - bool large_buffer; bool cursor_moved = FALSE; - char *bp; - char *found_content; int pos; field = form->current; assert(form->w); - large_buffer = (field->cols > SMALL_BUFFER_SIZE); - if (large_buffer) - bp = (char *)malloc((size_t)(field->cols) + 1); - else - bp = buffer; - - assert(bp); - if (Single_Line_Field(field)) { int check_len; @@ -137,15 +155,12 @@ data_ahead (const FORM *form) while (pos < field->dcols) { check_len = field->dcols - pos; - if ( check_len >= field->cols ) + if (check_len >= field->cols) check_len = field->cols; cursor_moved = TRUE; - wmove(form->w,0,pos); - winnstr(form->w,bp,check_len); - found_content = - After_Last_Non_Pad_Position(bp,check_len,field->pad); - if (found_content==bp) - pos += field->cols; + wmove(form->w, 0, pos); + if (Only_Padding(form->w, check_len, field->pad)) + pos += field->cols; else { result = TRUE; @@ -159,12 +174,9 @@ data_ahead (const FORM *form) while (pos < field->drows) { cursor_moved = TRUE; - wmove(form->w,pos,0); + wmove(form->w, pos, 0); pos++; - winnstr(form->w,bp,field->cols); - found_content = - After_Last_Non_Pad_Position(bp,field->cols,field->pad); - if (found_content!=bp) + if (!Only_Padding(form->w, field->cols, field->pad)) { result = TRUE; break; @@ -172,13 +184,10 @@ data_ahead (const FORM *form) } } - if (large_buffer) - free(bp); - if (cursor_moved) - wmove(form->w,form->currow,form->curcol); + wmove(form->w, form->currow, form->curcol); } - return(result); + returnBool(result); } /* frm_data.c ends here */