X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=form%2Ffrm_data.c;h=787a17919f04c3c3fdfedadea93596c3846f487b;hp=1fd794156e207961f2cd48a2396ba7120cfad03c;hb=5a9c046f10f72b47ad32801a8e54fe3d05aa8051;hpb=3a9b6a3bf0269231bef7de74757a910dedd04e0c diff --git a/form/frm_data.c b/form/frm_data.c index 1fd79415..787a1791 100644 --- a/form/frm_data.c +++ b/form/frm_data.c @@ -1,43 +1,56 @@ -/*-----------------------------------------------------------------------------+ -| The ncurses form library is Copyright (C) 1995-1997 | -| by Juergen Pfeifer | -| All Rights Reserved. | -| | -| Permission to use, copy, modify, and distribute this software and its | -| documentation for any purpose and without fee is hereby granted, provided | -| that the above copyright notice appear in all copies and that both that | -| copyright notice and this permission notice appear in supporting | -| documentation, and that the name of the above listed copyright holder(s) not | -| be used in advertising or publicity pertaining to distribution of the | -| software without specific, written prior permission. | -| | -| THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD TO | -| THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT- | -| NESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR | -| ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RE- | -| SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, | -| NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH | -| THE USE OR PERFORMANCE OF THIS SOFTWARE. | -+-----------------------------------------------------------------------------*/ +/**************************************************************************** + * 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 * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ #include "form.priv.h" -MODULE_ID("$Id: frm_data.c,v 1.3 1997/05/01 16:47:54 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 +--------------------------------------------------------------------------*/ -bool data_behind(const FORM *form) +NCURSES_EXPORT(bool) +data_behind(const FORM *form) { bool result = FALSE; + T((T_CALLED("data_behind(%p)"), form)); + if (form && (form->status & _POSTED) && form->current) { FIELD *field; @@ -45,42 +58,69 @@ bool 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) @@ -91,31 +131,22 @@ static char * After_Last_Non_Pad_Position(char *buffer, int len, int pad) | Return Values : TRUE - there are off-screen data ahead | FALSE - there are no off-screen data ahead +--------------------------------------------------------------------------*/ -bool data_ahead(const FORM *form) +NCURSES_EXPORT(bool) +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; @@ -124,15 +155,12 @@ bool 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; @@ -146,12 +174,9 @@ bool 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; @@ -159,13 +184,10 @@ bool 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 */