ncurses 6.2 - patch 20200912
[ncurses.git] / form / fld_max.c
index 6f72a388d266521aebdb5ceb28f594d1b7f60cec..bfeadf9b7fa8d1a7f3326a1c469a8f547d083cd6 100644 (file)
@@ -1,5 +1,6 @@
 /****************************************************************************
- * Copyright (c) 1998-2010,2012 Free Software Foundation, Inc.              *
+ * Copyright 2019,2020 Thomas E. Dickey                                     *
+ * Copyright 1998-2012,2013 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 +33,7 @@
 
 #include "form.priv.h"
 
-MODULE_ID("$Id: fld_max.c,v 1.11 2012/03/11 00:37:16 tom Exp $")
+MODULE_ID("$Id: fld_max.c,v 1.17 2020/05/24 01:40:20 anonymous.maarten Exp $")
 
 /*---------------------------------------------------------------------------
 |   Facility      :  libnform  
@@ -44,7 +45,7 @@ MODULE_ID("$Id: fld_max.c,v 1.11 2012/03/11 00:37:16 tom Exp $")
 |   Return Values :  E_OK           - success
 |                    E_BAD_ARGUMENT - invalid argument
 +--------------------------------------------------------------------------*/
-NCURSES_EXPORT(int)
+FORM_EXPORT(int)
 set_max_field(FIELD *field, int maxgrow)
 {
   T((T_CALLED("set_max_field(%p,%d)"), (void *)field, maxgrow));
@@ -57,18 +58,23 @@ set_max_field(FIELD *field, int maxgrow)
 
       if (maxgrow > 0)
        {
-         if ((single_line_field && (maxgrow < field->dcols)) ||
-             (!single_line_field && (maxgrow < field->drows)))
+         if (((single_line_field && (maxgrow < field->dcols)) ||
+              (!single_line_field && (maxgrow < field->drows))) &&
+             !Field_Has_Option(field, O_INPUT_LIMIT))
            RETURN(E_BAD_ARGUMENT);
        }
       field->maxgrow = maxgrow;
-      field->status &= (unsigned short) (~_MAY_GROW);
-      if (!(field->opts & O_STATIC))
+      /* shrink */
+      if (maxgrow > 0 && Field_Has_Option(field, O_INPUT_LIMIT) &&
+         field->dcols > maxgrow)
+       field->dcols = maxgrow;
+      ClrStatus(field, _MAY_GROW);
+      if (!((unsigned)field->opts & O_STATIC))
        {
          if ((maxgrow == 0) ||
              (single_line_field && (field->dcols < maxgrow)) ||
              (!single_line_field && (field->drows < maxgrow)))
-           field->status |= _MAY_GROW;
+           SetStatus(field, _MAY_GROW);
        }
     }
   RETURN(E_OK);