X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=form%2Ffrm_def.c;h=fd7b56a421c5f017c6330ea549135aa8a94da785;hp=d654b0b9f5c26fe367f09c1f676438103f0ca828;hb=8d8a3537cd58af7879c6e1921235daeed2b74926;hpb=55ccd2b959766810cf7db8d1c4462f338ce0afc8 diff --git a/form/frm_def.c b/form/frm_def.c index d654b0b9..fd7b56a4 100644 --- a/form/frm_def.c +++ b/form/frm_def.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2003,2004 Free Software Foundation, Inc. * + * Copyright (c) 1998-2010,2012 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 * @@ -32,7 +32,7 @@ #include "form.priv.h" -MODULE_ID("$Id: frm_def.c,v 1.17 2004/12/25 22:26:01 tom Exp $") +MODULE_ID("$Id: frm_def.c,v 1.26 2012/03/11 00:37:16 tom Exp $") /* this can't be readonly */ static FORM default_form = @@ -160,7 +160,7 @@ Connect_Fields(FORM *form, FIELD **fields) int maximum_row_in_field, maximum_col_in_field; _PAGE *pg; - T((T_CALLED("Connect_Fields(%p,%p)"), form, fields)); + T((T_CALLED("Connect_Fields(%p,%p)"), (void *)form, (void *)fields)); assert(form); @@ -182,12 +182,13 @@ Connect_Fields(FORM *form, FIELD **fields) 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"), (void *)pg)); form->page = pg; } else @@ -198,14 +199,14 @@ Connect_Fields(FORM *form, FIELD **fields) for (j = 0; j < field_cnt; j++) { if (j == 0) - pg->pmin = j; + pg->pmin = (short) j; else { if (fields[j]->status & _NEWPAGE) { - pg->pmax = j - 1; + pg->pmax = (short) (j - 1); pg++; - pg->pmin = j; + pg->pmin = (short) j; } } @@ -213,14 +214,14 @@ Connect_Fields(FORM *form, FIELD **fields) maximum_col_in_field = fields[j]->fcol + fields[j]->cols; if (form->rows < maximum_row_in_field) - form->rows = maximum_row_in_field; + form->rows = (short) maximum_row_in_field; if (form->cols < maximum_col_in_field) - form->cols = maximum_col_in_field; + form->cols = (short) maximum_col_in_field; } - pg->pmax = field_cnt - 1; - form->maxfield = field_cnt; - form->maxpage = page_nr; + pg->pmax = (short) (field_cnt - 1); + form->maxfield = (short) field_cnt; + form->maxpage = (short) page_nr; /* Sort fields on form pages */ for (page_nr = 0; page_nr < form->maxpage; page_nr++) @@ -229,12 +230,20 @@ Connect_Fields(FORM *form, FIELD **fields) for (j = form->page[page_nr].pmin; j <= form->page[page_nr].pmax; j++) { - fields[j]->index = j; - fields[j]->page = page_nr; + fields[j]->index = (short) j; + fields[j]->page = (short) page_nr; fld = Insert_Field_By_Position(fields[j], fld); } - form->page[page_nr].smin = fld->index; - form->page[page_nr].smax = fld->sprev->index; + 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; + } } RETURN(E_OK); } @@ -247,9 +256,11 @@ Connect_Fields(FORM *form, FIELD **fields) | If there are fields, position to first active field. | | Return Values : E_OK - success -| any other - error occurred +| 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 +NCURSES_INLINE static int Associate_Fields(FORM *form, FIELD **fields) { int res = Connect_Fields(form, fields); @@ -272,27 +283,43 @@ Associate_Fields(FORM *form, FIELD **fields) /*--------------------------------------------------------------------------- | Facility : libnform -| Function : FORM *new_form( FIELD **fields ) +| Function : FORM *new_form_sp(SCREEN* sp, FIELD** fields ) | | Description : Create new form with given array of fields. | | 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 +--------------------------------------------------------------------------*/ NCURSES_EXPORT(FORM *) -new_form(FIELD **fields) +NCURSES_SP_NAME(new_form) (NCURSES_SP_DCLx FIELD **fields) { int err = E_SYSTEM_ERROR; + FORM *form = (FORM *)0; - FORM *form = (FORM *)malloc(sizeof(FORM)); + T((T_CALLED("new_form(%p,%p)"), (void *)SP_PARM, (void *)fields)); - T((T_CALLED("new_form(%p)"), fields)); - if (form) + if (IsValidScreen(SP_PARM)) { - *form = *_nc_Default_Form; - if ((err = Associate_Fields(form, fields)) != E_OK) + form = typeMalloc(FORM, 1); + + if (form) { - free_form(form); - form = (FORM *)0; + T((T_CREATE("form %p"), (void *)form)); + *form = *_nc_Default_Form; + /* This ensures win and sub are always non-null, + so we can derive always the SCREEN that this form is + running on. */ + form->win = StdScreen(SP_PARM); + form->sub = StdScreen(SP_PARM); + if ((err = Associate_Fields(form, fields)) != E_OK) + { + free_form(form); + form = (FORM *)0; + } } } @@ -302,6 +329,27 @@ new_form(FIELD **fields) returnForm(form); } +/*--------------------------------------------------------------------------- +| 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 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 ++--------------------------------------------------------------------------*/ +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(FORM *) +new_form(FIELD **fields) +{ + return NCURSES_SP_NAME(new_form) (CURRENT_SCREEN, fields); +} +#endif + /*--------------------------------------------------------------------------- | Facility : libnform | Function : int free_form( FORM *form ) @@ -315,7 +363,7 @@ new_form(FIELD **fields) NCURSES_EXPORT(int) free_form(FORM *form) { - T((T_CALLED("free_form(%p)"), form)); + T((T_CALLED("free_form(%p)"), (void *)form)); if (!form) RETURN(E_BAD_ARGUMENT); @@ -337,9 +385,11 @@ 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 +--------------------------------------------------------------------------*/ NCURSES_EXPORT(int) set_form_fields(FORM *form, FIELD **fields) @@ -347,7 +397,7 @@ set_form_fields(FORM *form, FIELD **fields) FIELD **old; int res; - T((T_CALLED("set_form_fields(%p,%p)"), form, fields)); + T((T_CALLED("set_form_fields(%p,%p)"), (void *)form, (void *)fields)); if (!form) RETURN(E_BAD_ARGUMENT); @@ -375,7 +425,7 @@ set_form_fields(FORM *form, FIELD **fields) NCURSES_EXPORT(FIELD **) form_fields(const FORM *form) { - T((T_CALLED("form_field(%p)"), form)); + T((T_CALLED("form_field(%p)"), (const void *)form)); returnFieldPtr(Normalize_Form(form)->field); } @@ -390,7 +440,7 @@ form_fields(const FORM *form) NCURSES_EXPORT(int) field_count(const FORM *form) { - T((T_CALLED("field_count(%p)"), form)); + T((T_CALLED("field_count(%p)"), (const void *)form)); returnCode(Normalize_Form(form)->maxfield); }