X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=form%2Ffrm_def.c;h=e6897514ffddfe9cd24e9ed37f4668764d0c67e3;hp=9b537bfa9043f300a089f7dc240b0c5d5d6b3ac2;hb=7a6bbc8cf41c5186d46accc3d08622dc86526b34;hpb=3a9b6a3bf0269231bef7de74757a910dedd04e0c diff --git a/form/frm_def.c b/form/frm_def.c index 9b537bfa..e6897514 100644 --- a/form/frm_def.c +++ b/form/frm_def.c @@ -1,56 +1,67 @@ -/*-----------------------------------------------------------------------------+ -| 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-2007,2008 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_def.c,v 1.4 1997/05/01 16:47:54 juergen Exp $") +MODULE_ID("$Id: frm_def.c,v 1.23 2008/08/04 00:07:55 tom Exp $") /* this can't be readonly */ -static FORM default_form = { - 0, /* status */ - 0, /* rows */ - 0, /* cols */ - 0, /* currow */ - 0, /* curcol */ - 0, /* toprow */ - 0, /* begincol */ - -1, /* maxfield */ - -1, /* maxpage */ - -1, /* curpage */ - ALL_FORM_OPTS, /* opts */ - (WINDOW *)0, /* win */ - (WINDOW *)0, /* sub */ - (WINDOW *)0, /* w */ - (FIELD **)0, /* field */ - (FIELD *)0, /* current */ - (_PAGE *)0, /* page */ - (char *)0, /* usrptr */ - NULL, /* forminit */ - NULL, /* formterm */ - NULL, /* fieldinit */ - NULL /* fieldterm */ +static FORM default_form = +{ + 0, /* status */ + 0, /* rows */ + 0, /* cols */ + 0, /* currow */ + 0, /* curcol */ + 0, /* toprow */ + 0, /* begincol */ + -1, /* maxfield */ + -1, /* maxpage */ + -1, /* curpage */ + ALL_FORM_OPTS, /* opts */ + (WINDOW *)0, /* win */ + (WINDOW *)0, /* sub */ + (WINDOW *)0, /* w */ + (FIELD **)0, /* field */ + (FIELD *)0, /* current */ + (_PAGE *) 0, /* page */ + (char *)0, /* usrptr */ + NULL, /* forminit */ + NULL, /* formterm */ + NULL, /* fieldinit */ + NULL /* fieldterm */ }; -FORM *_nc_Default_Form = &default_form; +NCURSES_EXPORT_VAR(FORM *) _nc_Default_Form = &default_form; /*--------------------------------------------------------------------------- | Facility : libnform @@ -64,39 +75,40 @@ FORM *_nc_Default_Form = &default_form; | | Return Values : New head of sorted fieldlist +--------------------------------------------------------------------------*/ -static FIELD *Insert_Field_By_Position(FIELD *newfield, FIELD *head) +static FIELD * +Insert_Field_By_Position(FIELD *newfield, FIELD *head) { FIELD *current, *newhead; - + assert(newfield); if (!head) - { /* empty list is trivial */ + { /* empty list is trivial */ newhead = newfield->snext = newfield->sprev = newfield; } else { newhead = current = head; - while((current->frow < newfield->frow) || - ((current->frow==newfield->frow) && - (current->fcol < newfield->fcol)) ) + while ((current->frow < newfield->frow) || + ((current->frow == newfield->frow) && + (current->fcol < newfield->fcol))) { current = current->snext; - if (current==head) - { /* We cycled through. Reset head to indicate that */ + if (current == head) + { /* We cycled through. Reset head to indicate that */ head = (FIELD *)0; break; } } - /* we leave the loop with current pointing to the field after newfield*/ - newfield->snext = current; - newfield->sprev = current->sprev; + /* we leave the loop with current pointing to the field after newfield */ + newfield->snext = current; + newfield->sprev = current->sprev; newfield->snext->sprev = newfield; newfield->sprev->snext = newfield; - if (current==head) + if (current == head) newhead = newfield; } - return(newhead); + return (newhead); } /*--------------------------------------------------------------------------- @@ -107,25 +119,27 @@ static FIELD *Insert_Field_By_Position(FIELD *newfield, FIELD *head) | | Return Values : - +--------------------------------------------------------------------------*/ -static void Disconnect_Fields( FORM * form ) +static void +Disconnect_Fields(FORM *form) { - FIELD **fields; - - assert(form && form->field); - - for(fields=form->field;*fields;fields++) + if (form->field) { - if (form == (*fields)->form) - (*fields)->form = (FORM *)0; + FIELD **fields; + + for (fields = form->field; *fields; fields++) + { + if (form == (*fields)->form) + (*fields)->form = (FORM *)0; + } + + form->rows = form->cols = 0; + form->maxfield = form->maxpage = -1; + form->field = (FIELD **)0; + if (form->page) + free(form->page); + form->page = (_PAGE *) 0; } - - form->rows = form->cols = 0; - form->maxfield = form->maxpage = -1; - form->field = (FIELD **)0; - if (form->page) - free(form->page); - form->page = (_PAGE *)0; -} +} /*--------------------------------------------------------------------------- | Facility : libnform @@ -138,85 +152,98 @@ static void Disconnect_Fields( FORM * form ) | E_BAD_ARGUMENT - Invalid form pointer or field array | E_SYSTEM_ERROR - not enough memory +--------------------------------------------------------------------------*/ -static int Connect_Fields(FORM * form, FIELD ** fields) +static int +Connect_Fields(FORM *form, FIELD **fields) { int field_cnt, j; int page_nr; int maximum_row_in_field, maximum_col_in_field; _PAGE *pg; - + + T((T_CALLED("Connect_Fields(%p,%p)"), form, fields)); + assert(form); - form->field = fields; + form->field = fields; form->maxfield = 0; - form->maxpage = 0; + form->maxpage = 0; if (!fields) RETURN(E_OK); - + page_nr = 0; /* store formpointer in fields and count pages */ - for(field_cnt=0;fields[field_cnt];field_cnt++) + for (field_cnt = 0; fields[field_cnt]; field_cnt++) { - if (fields[field_cnt]->form) + if (fields[field_cnt]->form) RETURN(E_CONNECTED); - if ( field_cnt==0 || - (fields[field_cnt]->status & _NEWPAGE)) + if (field_cnt == 0 || + (fields[field_cnt]->status & _NEWPAGE)) page_nr++; fields[field_cnt]->form = form; - } - if (field_cnt==0) + } + if (field_cnt == 0 || (short)field_cnt < 0) RETURN(E_BAD_ARGUMENT); - + /* allocate page structures */ - if ( (pg = (_PAGE *)malloc(page_nr * sizeof(_PAGE))) != (_PAGE *)0 ) + if ((pg = typeMalloc(_PAGE, page_nr)) != (_PAGE *) 0) { + T((T_CREATE("_PAGE %p"), pg)); form->page = pg; } else RETURN(E_SYSTEM_ERROR); - + /* Cycle through fields and calculate page boundaries as well as size of the form */ - for(j=0;jpmin = j; else { if (fields[j]->status & _NEWPAGE) { - pg->pmax = j-1; + pg->pmax = j - 1; pg++; pg->pmin = j; } } - + maximum_row_in_field = fields[j]->frow + fields[j]->rows; maximum_col_in_field = fields[j]->fcol + fields[j]->cols; - - if (form->rows < maximum_row_in_field) + + if (form->rows < maximum_row_in_field) form->rows = maximum_row_in_field; - if (form->cols < maximum_col_in_field) + if (form->cols < maximum_col_in_field) form->cols = maximum_col_in_field; } - - pg->pmax = field_cnt-1; + + pg->pmax = field_cnt - 1; form->maxfield = field_cnt; - form->maxpage = page_nr; - + form->maxpage = page_nr; + /* Sort fields on form pages */ - for(page_nr = 0;page_nr < form->maxpage; page_nr++) + for (page_nr = 0; page_nr < form->maxpage; page_nr++) { FIELD *fld = (FIELD *)0; - for(j = form->page[page_nr].pmin;j <= form->page[page_nr].pmax;j++) + + for (j = form->page[page_nr].pmin; j <= form->page[page_nr].pmax; j++) { fields[j]->index = j; - fields[j]->page = page_nr; - fld = Insert_Field_By_Position(fields[j],fld); + fields[j]->page = page_nr; + fld = Insert_Field_By_Position(fields[j], fld); + } + if (fld) + { + form->page[page_nr].smin = fld->index; + form->page[page_nr].smax = fld->sprev->index; + } + else + { + form->page[page_nr].smin = 0; + form->page[page_nr].smax = 0; } - form->page[page_nr].smin = fld->index; - form->page[page_nr].smax = fld->sprev->index; } RETURN(E_OK); } @@ -229,45 +256,57 @@ static int Connect_Fields(FORM * form, FIELD ** fields) | If there are fields, position to first active field. | | Return Values : E_OK - success -| any other - error occured +| E_BAD_ARGUMENT - Invalid form pointer or field array +| E_CONNECTED - a field is already connected +| E_SYSTEM_ERROR - not enough memory +--------------------------------------------------------------------------*/ -INLINE static int Associate_Fields(FORM *form, FIELD **fields) +NCURSES_INLINE static int +Associate_Fields(FORM *form, FIELD **fields) { - int res = Connect_Fields(form,fields); + int res = Connect_Fields(form, fields); + if (res == E_OK) { - if (form->maxpage>0) + if (form->maxpage > 0) { form->curpage = 0; - form_driver(form,FIRST_ACTIVE_MAGIC); + form_driver(form, FIRST_ACTIVE_MAGIC); } else { form->curpage = -1; form->current = (FIELD *)0; - } + } } - return(res); + return (res); } - + /*--------------------------------------------------------------------------- | Facility : libnform | Function : FORM *new_form( FIELD **fields ) | | Description : Create new form with given array of fields. | -| Return Values : Pointer to form. NULL if error occured. +| Return Values : Pointer to form. NULL if error occurred. +! Set errno: +| E_OK - success +| E_BAD_ARGUMENT - Invalid form pointer or field array +| E_CONNECTED - a field is already connected +| E_SYSTEM_ERROR - not enough memory +--------------------------------------------------------------------------*/ -FORM *new_form(FIELD ** fields) -{ +NCURSES_EXPORT(FORM *) +new_form(FIELD **fields) +{ int err = E_SYSTEM_ERROR; - FORM *form = (FORM *)malloc(sizeof(FORM)); - + FORM *form = typeMalloc(FORM, 1); + + T((T_CALLED("new_form(%p)"), fields)); if (form) { + T((T_CREATE("form %p"), form)); *form = *_nc_Default_Form; - if ((err=Associate_Fields(form,fields))!=E_OK) + if ((err = Associate_Fields(form, fields)) != E_OK) { free_form(form); form = (FORM *)0; @@ -276,8 +315,8 @@ FORM *new_form(FIELD ** fields) if (!form) SET_ERROR(err); - - return(form); + + returnForm(form); } /*--------------------------------------------------------------------------- @@ -290,19 +329,22 @@ FORM *new_form(FIELD ** fields) | E_BAD_ARGUMENT - invalid form pointer | E_POSTED - form is posted +--------------------------------------------------------------------------*/ -int free_form(FORM * form) +NCURSES_EXPORT(int) +free_form(FORM *form) { - if ( !form ) + T((T_CALLED("free_form(%p)"), form)); + + if (!form) RETURN(E_BAD_ARGUMENT); - if ( form->status & _POSTED) + if (form->status & _POSTED) RETURN(E_POSTED); - - Disconnect_Fields( form ); - if (form->page) + + Disconnect_Fields(form); + if (form->page) free(form->page); free(form); - + RETURN(E_OK); } @@ -312,30 +354,35 @@ int free_form(FORM * form) | | Description : Set a new association of an array of fields to a form | -| Return Values : E_OK - no error -| E_BAD_ARGUMENT - invalid form pointer -| E_POSTED - form is posted +| Return Values : E_OK - no error +| E_BAD_ARGUMENT - Invalid form pointer or field array +| E_CONNECTED - a field is already connected +| E_POSTED - form is posted +| E_SYSTEM_ERROR - not enough memory +--------------------------------------------------------------------------*/ -int set_form_fields(FORM * form, FIELD ** fields) +NCURSES_EXPORT(int) +set_form_fields(FORM *form, FIELD **fields) { FIELD **old; int res; - - if ( !form ) + + T((T_CALLED("set_form_fields(%p,%p)"), form, fields)); + + if (!form) RETURN(E_BAD_ARGUMENT); - if ( form->status & _POSTED ) + if (form->status & _POSTED) RETURN(E_POSTED); - + old = form->field; - Disconnect_Fields( form ); - - if( (res = Associate_Fields( form, fields )) != E_OK ) - Connect_Fields( form, old ); - + Disconnect_Fields(form); + + if ((res = Associate_Fields(form, fields)) != E_OK) + Connect_Fields(form, old); + RETURN(res); } - + /*--------------------------------------------------------------------------- | Facility : libnform | Function : FIELD **form_fields( const FORM *form ) @@ -344,9 +391,11 @@ int set_form_fields(FORM * form, FIELD ** fields) | | Return Values : Pointer to field array +--------------------------------------------------------------------------*/ -FIELD **form_fields(const FORM * form) +NCURSES_EXPORT(FIELD **) +form_fields(const FORM *form) { - return (Normalize_Form( form )->field); + T((T_CALLED("form_field(%p)"), form)); + returnFieldPtr(Normalize_Form(form)->field); } /*--------------------------------------------------------------------------- @@ -357,35 +406,12 @@ FIELD **form_fields(const FORM * form) | | Return Values : Number of fields, -1 if none are defined +--------------------------------------------------------------------------*/ -int field_count(const FORM * form) +NCURSES_EXPORT(int) +field_count(const FORM *form) { - return (Normalize_Form( form )->maxfield); -} + T((T_CALLED("field_count(%p)"), form)); -/*--------------------------------------------------------------------------- -| Facility : libnform -| Function : int scale_form( const FORM *form, int *rows, int *cols ) -| -| Description : Retrieve size of form -| -| Return Values : E_OK - no error -| E_BAD_ARGUMENT - invalid form pointer -| E_NOT_CONNECTED - no fields connected to form -+--------------------------------------------------------------------------*/ -int scale_form(const FORM * form, int * rows, int * cols) -{ - if ( !form ) - RETURN(E_BAD_ARGUMENT); - - if ( !(form->field) ) - RETURN(E_NOT_CONNECTED); - - if (rows) - *rows = form->rows; - if (cols) - *cols = form->cols; - - RETURN(E_OK); + returnCode(Normalize_Form(form)->maxfield); } /* frm_def.c ends here */