]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - form/frm_def.c
ncurses 6.1 - patch 20190330
[ncurses.git] / form / frm_def.c
index d654b0b9f5c26fe367f09c1f676438103f0ca828..fd7b56a421c5f017c6330ea549135aa8a94da785 100644 (file)
@@ -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            *
  *                                                                          *
  * 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"
 
 
 #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 =
 
 /* 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;
 
   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);
 
 
   assert(form);
 
@@ -182,12 +182,13 @@ Connect_Fields(FORM *form, FIELD **fields)
        page_nr++;
       fields[field_cnt]->form = form;
     }
        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 */
     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
       form->page = pg;
     }
   else
@@ -198,14 +199,14 @@ Connect_Fields(FORM *form, FIELD **fields)
   for (j = 0; j < field_cnt; j++)
     {
       if (j == 0)
   for (j = 0; j < field_cnt; j++)
     {
       if (j == 0)
-       pg->pmin = j;
+       pg->pmin = (short) j;
       else
        {
          if (fields[j]->status & _NEWPAGE)
            {
       else
        {
          if (fields[j]->status & _NEWPAGE)
            {
-             pg->pmax = j - 1;
+             pg->pmax = (short) (j - 1);
              pg++;
              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)
       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)
       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++)
 
   /* 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++)
        {
 
       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);
        }
          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);
 }
     }
   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
 |                    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);
 Associate_Fields(FORM *form, FIELD **fields)
 {
   int res = Connect_Fields(form, fields);
@@ -272,27 +283,43 @@ Associate_Fields(FORM *form, FIELD **fields)
 
 /*---------------------------------------------------------------------------
 |   Facility      :  libnform  
 
 /*---------------------------------------------------------------------------
 |   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.
 |   
 |   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 *)
 +--------------------------------------------------------------------------*/
 NCURSES_EXPORT(FORM *)
-new_form(FIELD **fields)
+NCURSES_SP_NAME(new_form) (NCURSES_SP_DCLx FIELD **fields)
 {
   int err = E_SYSTEM_ERROR;
 {
   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);
 }
 
   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 )
 /*---------------------------------------------------------------------------
 |   Facility      :  libnform  
 |   Function      :  int free_form( FORM *form )
@@ -315,7 +363,7 @@ new_form(FIELD **fields)
 NCURSES_EXPORT(int)
 free_form(FORM *form)
 {
 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);
 
   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
 |
 |   
 |   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)
 +--------------------------------------------------------------------------*/
 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;
 
   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);
 
   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)
 {
 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);
 }
 
   returnFieldPtr(Normalize_Form(form)->field);
 }
 
@@ -390,7 +440,7 @@ form_fields(const FORM *form)
 NCURSES_EXPORT(int)
 field_count(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);
 }
 
   returnCode(Normalize_Form(form)->maxfield);
 }