]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - form/frm_driver.c
ncurses 5.9 - patch 20120728
[ncurses.git] / form / frm_driver.c
index f335ed2611c2a7ce8578d37ecc80dfbca1190a0c..6390bdeee37bcd7ef75ba39d3cc5dc8339523e16 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2011,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_driver.c,v 1.99 2011/09/17 22:12:10 tom Exp $")
+MODULE_ID("$Id: frm_driver.c,v 1.102 2012/07/21 23:23:08 tom Exp $")
 
 /*----------------------------------------------------------------------------
   This is the core module of the form library. It contains the majority
@@ -172,7 +172,7 @@ static int FE_Delete_Previous(FORM *);
    instead of a derived window because it contains invisible parts.
    This is true for non-public fields and for scrollable fields. */
 #define Has_Invisible_Parts(field)     \
-  (!((field)->opts & O_PUBLIC)      || \
+  (!((unsigned)(field)->opts & O_PUBLIC) || \
    Is_Scroll_Field(field))
 
 /* Logic to decide whether or not a field needs justification */
@@ -180,7 +180,7 @@ static int FE_Delete_Previous(FORM *);
    (((field)->just != NO_JUSTIFICATION)  && \
     (Single_Line_Field(field))           && \
     (((field)->dcols == (field)->cols)   && \
-    ((field)->opts & O_STATIC))             )
+    ((unsigned)(field)->opts & O_STATIC)))
 
 /* Logic to determine whether or not a dynamic field may still grow */
 #define Growable(field) ((field)->status & _MAY_GROW)
@@ -188,13 +188,13 @@ static int FE_Delete_Previous(FORM *);
 /* Macro to set the attributes for a fields window */
 #define Set_Field_Window_Attributes(field,win) \
 (  wbkgdset((win),(chtype)((field)->pad | (field)->back)), \
-   (void) wattrset((win),(field)->fore) )
+   (void) wattrset((win), (int)(field)->fore) )
 
 /* Logic to decide whether or not a field really appears on the form */
 #define Field_Really_Appears(field)         \
   ((field->form)                          &&\
    (field->form->status & _POSTED)        &&\
-   (field->opts & O_VISIBLE)              &&\
+   ((unsigned)field->opts & O_VISIBLE)    &&\
    (field->page == field->form->curpage))
 
 /* Logic to determine whether or not we are on the first position in the
@@ -601,8 +601,8 @@ Synchronize_Buffer(FORM *form)
 {
   if (form->status & _WINDOW_MODIFIED)
     {
-      form->status &= ~_WINDOW_MODIFIED;
-      form->status |= _FCHECK_REQUIRED;
+      ClrStatus(form, _WINDOW_MODIFIED);
+      SetStatus(form, _FCHECK_REQUIRED);
       Window_To_Buffer(form, form->current);
       wmove(form->w, form->currow, form->curcol);
     }
@@ -653,7 +653,7 @@ Field_Grown(FIELD *field, int amount)
            growth = Minimum(field->maxgrow - field->dcols, growth);
          field->dcols += growth;
          if (field->dcols == field->maxgrow)
-           field->status &= ~_MAY_GROW;
+           ClrStatus(field, _MAY_GROW);
        }
       else
        {
@@ -662,7 +662,7 @@ Field_Grown(FIELD *field, int amount)
            growth = Minimum(field->maxgrow - field->drows, growth);
          field->drows += growth;
          if (field->drows == field->maxgrow)
-           field->status &= ~_MAY_GROW;
+           ClrStatus(field, _MAY_GROW);
        }
       /* drows, dcols changed, so we get really the new buffer length */
       new_buflen = Buffer_Length(field);
@@ -674,7 +674,7 @@ Field_Grown(FIELD *field, int amount)
          field->drows = old_drows;
          if ((single_line_field && (field->dcols != field->maxgrow)) ||
              (!single_line_field && (field->drows != field->maxgrow)))
-           field->status |= _MAY_GROW;
+           SetStatus(field, _MAY_GROW);
        }
       else
        {
@@ -753,7 +753,7 @@ Field_Grown(FIELD *field, int amount)
                   (field->dcols != field->maxgrow)) ||
                  (!single_line_field &&
                   (field->drows != field->maxgrow)))
-               field->status |= _MAY_GROW;
+               SetStatus(field, _MAY_GROW);
              free(newbuf);
            }
        }
@@ -860,7 +860,7 @@ _nc_Refresh_Current_Field(FORM *form)
   field = form->current;
   formwin = Get_Form_Window(form);
 
-  if (field->opts & O_PUBLIC)
+  if ((unsigned)field->opts & O_PUBLIC)
     {
       if (Is_Scroll_Field(field))
        {
@@ -897,19 +897,19 @@ _nc_Refresh_Current_Field(FORM *form)
                  if (form->currow < form->toprow)
                    {
                      form->toprow = form->currow;
-                     field->status |= _NEWTOP;
+                     SetStatus(field, _NEWTOP);
                    }
                  if (form->currow >= row_after_bottom)
                    {
                      form->toprow = form->currow - field->rows + 1;
-                     field->status |= _NEWTOP;
+                     SetStatus(field, _NEWTOP);
                    }
                  if (field->status & _NEWTOP)
                    {
                      /* means we have to copy whole range */
                      first_modified_row = form->toprow;
                      first_unmodified_row = first_modified_row + field->rows;
-                     field->status &= ~_NEWTOP;
+                     ClrStatus(field, _NEWTOP);
                    }
                  else
                    {
@@ -1111,27 +1111,27 @@ Display_Or_Erase_Field(FIELD *field, bool bEraseFlag)
     return E_SYSTEM_ERROR;
   else
     {
-      if (field->opts & O_VISIBLE)
+      if ((unsigned)field->opts & O_VISIBLE)
        {
          Set_Field_Window_Attributes(field, win);
        }
       else
        {
-         (void)wattrset(win, WINDOW_ATTRS(fwin));
+         (void)wattrset(win, (int)WINDOW_ATTRS(fwin));
        }
       werase(win);
     }
 
   if (!bEraseFlag)
     {
-      if (field->opts & O_PUBLIC)
+      if ((unsigned)field->opts & O_PUBLIC)
        {
          if (Justification_Allowed(field))
            Perform_Justification(field, win);
          else
            Buffer_To_Window(field, win);
        }
-      field->status &= ~_NEWTOP;
+      ClrStatus(field, _NEWTOP);
     }
   wsyncup(win);
   delwin(win);
@@ -1170,18 +1170,18 @@ Synchronize_Field(FIELD *field)
          form->currow = form->curcol = form->toprow = form->begincol = 0;
          werase(form->w);
 
-         if ((field->opts & O_PUBLIC) && Justification_Allowed(field))
+         if (((unsigned)field->opts & O_PUBLIC) && Justification_Allowed(field))
            Undo_Justification(field, form->w);
          else
            Buffer_To_Window(field, form->w);
 
-         field->status |= _NEWTOP;
+         SetStatus(field, _NEWTOP);
          res = _nc_Refresh_Current_Field(form);
        }
       else
        res = Display_Field(field);
     }
-  field->status |= _CHANGED;
+  SetStatus(field, _CHANGED);
   return (res);
 }
 
@@ -1256,7 +1256,7 @@ _nc_Synchronize_Attributes(FIELD *field)
          werase(form->w);
          wmove(form->w, form->currow, form->curcol);
 
-         if (field->opts & O_PUBLIC)
+         if ((unsigned)field->opts & O_PUBLIC)
            {
              if (Justification_Allowed(field))
                Undo_Justification(field, form->w);
@@ -1272,7 +1272,7 @@ _nc_Synchronize_Attributes(FIELD *field)
                      field->rows - 1, field->cols - 1, 0);
              wsyncup(formwin);
              Buffer_To_Window(field, form->w);
-             field->status |= _NEWTOP;         /* fake refresh to paint all */
+             SetStatus(field, _NEWTOP);        /* fake refresh to paint all */
              _nc_Refresh_Current_Field(form);
            }
        }
@@ -1328,32 +1328,32 @@ _nc_Synchronize_Options(FIELD *field, Field_Options newopts)
            }
          if (form->curpage == field->page)
            {
-             if (changed_opts & O_VISIBLE)
+             if ((unsigned)changed_opts & O_VISIBLE)
                {
-                 if (newopts & O_VISIBLE)
+                 if ((unsigned)newopts & O_VISIBLE)
                    res = Display_Field(field);
                  else
                    res = Erase_Field(field);
                }
              else
                {
-                 if ((changed_opts & O_PUBLIC) &&
-                     (newopts & O_VISIBLE))
+                 if (((unsigned)changed_opts & O_PUBLIC) &&
+                     ((unsigned)newopts & O_VISIBLE))
                    res = Display_Field(field);
                }
            }
        }
     }
 
-  if (changed_opts & O_STATIC)
+  if ((unsigned)changed_opts & O_STATIC)
     {
       bool single_line_field = Single_Line_Field(field);
       int res2 = E_OK;
 
-      if (newopts & O_STATIC)
+      if ((unsigned)newopts & O_STATIC)
        {
          /* the field becomes now static */
-         field->status &= ~_MAY_GROW;
+         ClrStatus(field, _MAY_GROW);
          /* if actually we have no hidden columns, justification may
             occur again */
          if (single_line_field &&
@@ -1371,7 +1371,7 @@ _nc_Synchronize_Options(FIELD *field, Field_Options newopts)
              (single_line_field && (field->dcols < field->maxgrow)) ||
              (!single_line_field && (field->drows < field->maxgrow)))
            {
-             field->status |= _MAY_GROW;
+             SetStatus(field, _MAY_GROW);
              /* a field with justification now changes its behavior,
                 so we must redisplay it */
              if (single_line_field &&
@@ -1424,18 +1424,18 @@ _nc_Set_Current_Field(FORM *form, FIELD *newfield)
       !(form->status & _POSTED))
     {
       if ((form->w) &&
-         (field->opts & O_VISIBLE) &&
+         ((unsigned)field->opts & O_VISIBLE) &&
          (field->form->curpage == field->page))
        {
          _nc_Refresh_Current_Field(form);
-         if (field->opts & O_PUBLIC)
+         if ((unsigned)field->opts & O_PUBLIC)
            {
              if (field->drows > field->rows)
                {
                  if (form->toprow == 0)
-                   field->status &= ~_NEWTOP;
+                   ClrStatus(field, _NEWTOP);
                  else
-                   field->status |= _NEWTOP;
+                   SetStatus(field, _NEWTOP);
                }
              else
                {
@@ -1469,7 +1469,7 @@ _nc_Set_Current_Field(FORM *form, FIELD *newfield)
        delwin(form->w);
       form->w = new_window;
 
-      form->status &= ~_WINDOW_MODIFIED;
+      ClrStatus(form, _WINDOW_MODIFIED);
       Set_Field_Window_Attributes(field, form->w);
 
       if (Has_Invisible_Parts(field))
@@ -1998,7 +1998,7 @@ Vertical_Scrolling(int (*const fct) (FORM *), FORM *form)
     {
       res = fct(form);
       if (res == E_OK)
-       form->current->status |= _NEWTOP;
+       SetStatus(form, _NEWTOP);
     }
   return (res);
 }
@@ -2430,7 +2430,7 @@ Wrapping_Not_Necessary_Or_Wrapping_Ok(FORM *form)
   int result = E_REQUEST_DENIED;
   bool Last_Row = ((field->drows - 1) == form->currow);
 
-  if ((field->opts & O_WRAP) &&        /* wrapping wanted     */
+  if (((unsigned)field->opts & O_WRAP) &&      /* wrapping wanted     */
       (!Single_Line_Field(field)) &&   /* must be multi-line  */
       (There_Is_No_Room_For_A_Char_In_Line(form)) &&   /* line is full        */
       (!Last_Row || Growable(field)))  /* there are more lines */
@@ -2513,7 +2513,7 @@ Field_Editing(int (*const fct) (FORM *), FORM *form)
      editable fields.
    */
   if ((fct == FE_Delete_Previous) &&
-      (form->opts & O_BS_OVERLOAD) &&
+      ((unsigned)form->opts & O_BS_OVERLOAD) &&
       First_Position_In_Current_Field(form))
     {
       res = Inter_Field_Navigation(FN_Previous_Field, form);
@@ -2522,7 +2522,7 @@ Field_Editing(int (*const fct) (FORM *), FORM *form)
     {
       if (fct == FE_New_Line)
        {
-         if ((form->opts & O_NL_OVERLOAD) &&
+         if (((unsigned)form->opts & O_NL_OVERLOAD) &&
              First_Position_In_Current_Field(form))
            {
              res = Inter_Field_Navigation(FN_Next_Field, form);
@@ -2534,11 +2534,11 @@ Field_Editing(int (*const fct) (FORM *), FORM *form)
       else
        {
          /* From now on, everything must be editable */
-         if (form->current->opts & O_EDIT)
+         if ((unsigned)form->current->opts & O_EDIT)
            {
              res = fct(form);
              if (res == E_OK)
-               form->status |= _WINDOW_MODIFIED;
+               SetStatus(form, _WINDOW_MODIFIED);
            }
        }
     }
@@ -2571,7 +2571,7 @@ FE_New_Line(FORM *form)
       if (Last_Row &&
          (!(Growable(field) && !Single_Line_Field(field))))
        {
-         if (!(form->opts & O_NL_OVERLOAD))
+         if (!((unsigned)form->opts & O_NL_OVERLOAD))
            returnCode(E_REQUEST_DENIED);
          wmove(form->w, form->currow, form->curcol);
          wclrtoeol(form->w);
@@ -2579,7 +2579,7 @@ FE_New_Line(FORM *form)
             handled in the generic routine. The reason is,
             that FN_Next_Field may fail, but the form is
             definitively changed */
-         form->status |= _WINDOW_MODIFIED;
+         SetStatus(form, _WINDOW_MODIFIED);
          returnCode(Inter_Field_Navigation(FN_Next_Field, form));
        }
       else
@@ -2595,7 +2595,7 @@ FE_New_Line(FORM *form)
          wclrtoeol(form->w);
          form->currow++;
          form->curcol = 0;
-         form->status |= _WINDOW_MODIFIED;
+         SetStatus(form, _WINDOW_MODIFIED);
          returnCode(E_OK);
        }
     }
@@ -2605,7 +2605,7 @@ FE_New_Line(FORM *form)
       if (Last_Row &&
          !(Growable(field) && !Single_Line_Field(field)))
        {
-         if (!(form->opts & O_NL_OVERLOAD))
+         if (!((unsigned)form->opts & O_NL_OVERLOAD))
            returnCode(E_REQUEST_DENIED);
          returnCode(Inter_Field_Navigation(FN_Next_Field, form));
        }
@@ -2627,7 +2627,7 @@ FE_New_Line(FORM *form)
          wmove(form->w, form->currow, form->curcol);
          winsertln(form->w);
          myADDNSTR(form->w, bp, (int)(t - bp));
-         form->status |= _WINDOW_MODIFIED;
+         SetStatus(form, _WINDOW_MODIFIED);
          returnCode(E_OK);
        }
     }
@@ -2926,7 +2926,7 @@ static int
 EM_Overlay_Mode(FORM *form)
 {
   T((T_CALLED("EM_Overlay_Mode(%p)"), (void *)form));
-  form->status |= _OVLMODE;
+  SetStatus(form, _OVLMODE);
   returnCode(E_OK);
 }
 
@@ -2942,7 +2942,7 @@ static int
 EM_Insert_Mode(FORM *form)
 {
   T((T_CALLED("EM_Insert_Mode(%p)"), (void *)form));
-  form->status &= ~_OVLMODE;
+  ClrStatus(form, _OVLMODE);
   returnCode(E_OK);
 }
 
@@ -3111,7 +3111,7 @@ Check_Field(FORM *form, FIELDTYPE *typ, FIELD *field, TypeArgument *argp)
 {
   if (typ)
     {
-      if (field->opts & O_NULLOK)
+      if ((unsigned)field->opts & O_NULLOK)
        {
          FIELD_CELL *bp = field->buf;
 
@@ -3168,12 +3168,12 @@ _nc_Internal_Validation(FORM *form)
 
   Synchronize_Buffer(form);
   if ((form->status & _FCHECK_REQUIRED) ||
-      (!(field->opts & O_PASSOK)))
+      (!((unsigned)field->opts & O_PASSOK)))
     {
       if (!Check_Field(form, field->type, field, (TypeArgument *)(field->arg)))
        return FALSE;
-      form->status &= ~_FCHECK_REQUIRED;
-      field->status |= _CHANGED;
+      ClrStatus(form, _FCHECK_REQUIRED);
+      SetStatus(field, _CHANGED);
       Synchronize_Linked_Fields(field);
     }
   return TRUE;
@@ -3273,14 +3273,15 @@ _nc_First_Active_Field(FORM *form)
          do
            {
              field = (field == last_on_page) ? first : field + 1;
-             if (((*field)->opts & O_VISIBLE))
+             if (((unsigned)(*field)->opts & O_VISIBLE))
                break;
            }
          while (proposed != (*field));
 
          proposed = *field;
 
-         if ((proposed == *last_on_page) && !(proposed->opts & O_VISIBLE))
+         if ((proposed == *last_on_page) &&
+             !((unsigned)proposed->opts & O_VISIBLE))
            {
              /* This means, there is also no visible field on the page.
                 So we propose the first one and hope the very best...
@@ -3816,11 +3817,11 @@ _nc_Set_Form_Page(FORM *form, int page, FIELD *field)
       FIELD *last_field, *field_on_page;
 
       werase(Get_Form_Window(form));
-      form->curpage = page;
+      form->curpage = (short)page;
       last_field = field_on_page = form->field[form->page[page].smin];
       do
        {
-         if (field_on_page->opts & O_VISIBLE)
+         if ((unsigned)field_on_page->opts & O_VISIBLE)
            if ((res = Display_Field(field_on_page)) != E_OK)
              return (res);
          field_on_page = field_on_page->snext;
@@ -3999,13 +4000,13 @@ Data_Entry(FORM *form, int c)
   int result = E_REQUEST_DENIED;
 
   T((T_CALLED("Data_Entry(%p,%s)"), (void *)form, _tracechtype((chtype)c)));
-  if ((field->opts & O_EDIT)
+  if (((unsigned)field->opts & O_EDIT)
 #if FIX_FORM_INACTIVE_BUG
-      && (field->opts & O_ACTIVE)
+      && ((unsigned)field->opts & O_ACTIVE)
 #endif
     )
     {
-      if ((field->opts & O_BLANK) &&
+      if (((unsigned)field->opts & O_BLANK) &&
          First_Position_In_Current_Field(form) &&
          !(form->status & _FCHECK_REQUIRED) &&
          !(form->status & _WINDOW_MODIFIED))
@@ -4035,8 +4036,8 @@ Data_Entry(FORM *form, int c)
          bool End_Of_Field = (((field->drows - 1) == form->currow) &&
                               ((field->dcols - 1) == form->curcol));
 
-         form->status |= _WINDOW_MODIFIED;
-         if (End_Of_Field && !Growable(field) && (field->opts & O_AUTOSKIP))
+         SetStatus(form, _WINDOW_MODIFIED);
+         if (End_Of_Field && !Growable(field) && ((unsigned)field->opts & O_AUTOSKIP))
            result = Inter_Field_Navigation(FN_Next_Field, form);
          else
            {
@@ -4228,7 +4229,10 @@ form_driver(FORM *form, int c)
 
   if ((c >= MIN_FORM_COMMAND && c <= MAX_FORM_COMMAND) &&
       ((bindings[c - MIN_FORM_COMMAND].keycode & Key_Mask) == c))
-    BI = &(bindings[c - MIN_FORM_COMMAND]);
+    {
+      TR(TRACE_CALLS, ("form_request %s", form_request_name(c)));
+      BI = &(bindings[c - MIN_FORM_COMMAND]);
+    }
 
   if (BI)
     {
@@ -4246,7 +4250,7 @@ form_driver(FORM *form, int c)
        NULL                    /* Choice Request is generic           */
       };
       size_t nMethods = (sizeof(Generic_Methods) / sizeof(Generic_Methods[0]));
-      size_t method = (BI->keycode >> ID_Shft) & 0xffff;       /* see ID_Mask */
+      size_t method = (size_t) ((BI->keycode >> ID_Shft) & 0xffff);    /* see ID_Mask */
 
       if ((method >= nMethods) || !(BI->cmd))
        res = E_SYSTEM_ERROR;
@@ -4255,9 +4259,13 @@ form_driver(FORM *form, int c)
          Generic_Method fct = Generic_Methods[method];
 
          if (fct)
-           res = fct(BI->cmd, form);
+           {
+             res = fct(BI->cmd, form);
+           }
          else
-           res = (BI->cmd) (form);
+           {
+             res = (BI->cmd) (form);
+           }
        }
     }
 #ifdef NCURSES_MOUSE_VERSION
@@ -4401,14 +4409,14 @@ set_field_buffer(FIELD *field, int buffer, const char *value)
   if (!field || !value || ((buffer < 0) || (buffer > field->nbuf)))
     RETURN(E_BAD_ARGUMENT);
 
-  len = Buffer_Length(field);
+  len = (unsigned)Buffer_Length(field);
 
   if (Growable(field))
     {
       /* for a growable field we must assume zero terminated strings, because
          somehow we have to detect the length of what should be copied.
        */
-      unsigned int vlen = strlen(value);
+      unsigned vlen = (unsigned)strlen(value);
 
       if (vlen > len)
        {
@@ -4438,7 +4446,7 @@ set_field_buffer(FIELD *field, int buffer, const char *value)
       delwin(field->working);
       field->working = newpad(1, Buffer_Length(field) + 1);
     }
-  len = Buffer_Length(field);
+  len = (unsigned)Buffer_Length(field);
   wclear(field->working);
   (void)mvwaddstr(field->working, 0, 0, value);
 
@@ -4450,8 +4458,8 @@ set_field_buffer(FIELD *field, int buffer, const char *value)
     {
       for (i = 0; i < (unsigned)field->drows; ++i)
        {
-         (void)mvwin_wchnstr(field->working, 0, i * field->dcols,
-                             widevalue + (i * field->dcols),
+         (void)mvwin_wchnstr(field->working, 0, (int)i * field->dcols,
+                             widevalue + ((int)i * field->dcols),
                              field->dcols);
        }
       for (i = 0; i < len; ++i)
@@ -4512,7 +4520,7 @@ field_buffer(const FIELD *field, int buffer)
     {
 #if USE_WIDEC_SUPPORT
       FIELD_CELL *data = Address_Of_Nth_Buffer(field, buffer);
-      unsigned need = 0;
+      size_t need = 0;
       int size = Buffer_Length(field);
       int n;
 
@@ -4613,7 +4621,7 @@ _nc_Widen_String(char *source, int *lengthp)
                {
                  result[need] = wch;
                }
-             passed += status;
+             passed += (size_t) status;
              ++need;
            }
          else
@@ -4633,7 +4641,7 @@ _nc_Widen_String(char *source, int *lengthp)
            break;
          result = typeCalloc(wchar_t, need);
 
-         *lengthp = need;
+         *lengthp = (int)need;
          if (result == 0)
            break;
        }