ncurses 5.3
[ncurses.git] / form / fty_enum.c
index 0e128083689a7847a2a351946d0fe911ab60f289..ab256db1ef14cba7c8e290b4401258860925a207 100644 (file)
@@ -7,13 +7,14 @@
  */
 /***************************************************************************
 *                                                                          *
-*  Author : Juergen Pfeifer, Juergen.Pfeifer@T-Online.de                   *
+*  Author : Juergen Pfeifer                                                *
+*  Contact: http://www.familiepfeifer.de/Contact.aspx?Lang=en              *
 *                                                                          *
 ***************************************************************************/
 
 #include "form.priv.h"
 
-MODULE_ID("$Id: fty_enum.c,v 1.5 1997/02/15 17:33:59 tom Exp $")
+MODULE_ID("$Id: fty_enum.c,v 1.16 2002/07/13 11:35:08 juergen Exp $")
 
 typedef struct {
   char **kwds;
@@ -33,20 +34,21 @@ typedef struct {
 static void *Make_Enum_Type(va_list * ap)
 {
   enumARG *argp = (enumARG *)malloc(sizeof(enumARG));
-  char **kp;
-  int cnt=0;
 
   if (argp)
     {
+      int cnt = 0;
+      char **kp = (char **)0;
       int ccase, cunique;
+
       argp->kwds        = va_arg(*ap,char **);
       ccase             = va_arg(*ap,int);
       cunique           = va_arg(*ap,int);
       argp->checkcase   = ccase   ? TRUE : FALSE;
       argp->checkunique = cunique ? TRUE : FALSE;
-    
+
       kp = argp->kwds;
-      while( (*kp++) ) cnt++;
+      while( kp && (*kp++) ) cnt++;
       argp->count = cnt;
     }
   return (void *)argp;
@@ -62,16 +64,17 @@ static void *Make_Enum_Type(va_list * ap)
 +--------------------------------------------------------------------------*/
 static void *Copy_Enum_Type(const void * argp)
 {
-  const enumARG *ap = (const enumARG *)argp;
-  enumARG *new = (enumARG *)0;
+  enumARG *result = (enumARG *)0;
 
   if (argp)
     {
-      new = (enumARG *)malloc(sizeof(enumARG));
-      if (new)
-       *new = *ap;
+      const enumARG *ap = (const enumARG *)argp;
+
+      result = (enumARG *)malloc(sizeof(enumARG));
+      if (result)
+       *result = *ap;
     }
-  return (void *)new;
+  return (void *)result;
 }
 
 /*---------------------------------------------------------------------------
@@ -127,9 +130,8 @@ static int Compare(const unsigned char *s, const unsigned char *buf,
        } 
       else 
        {
-         while(toupper(*s)==toupper(*buf))
+         while(toupper(*s++)==toupper(*buf))
            {
-             s++;
              if (*buf++=='\0') return EXACT;
            }
        }
@@ -166,14 +168,14 @@ static bool Check_Enum_Field(FIELD * field, const void  * argp)
   char *s, *t, *p;
   int res;
   
-  while( (s=(*kwds++)) )
+  while( kwds && (s=(*kwds++)) )
     {
       if ((res=Compare((unsigned char *)s,bp,ccase))!=NOMATCH)
        {
-         t=s;
+         p=t=s; /* t is at least a partial match */
          if ((unique && res!=EXACT)) 
            {
-             while( (p = *kwds++) )
+             while( kwds && (p = *kwds++) )
                {
                  if ((res=Compare((unsigned char *)p,bp,ccase))!=NOMATCH)
                    {
@@ -181,16 +183,19 @@ static bool Check_Enum_Field(FIELD * field, const void  * argp)
                        {
                          t = p;
                          break;
-                       }       
-                     t = (char *)0;
+                       }
+                     else
+                       t = (char *)0;
                    }
                }
-           }
+           }     
          if (t)
            {
              set_field_buffer(field,0,t);
              return TRUE;
            }
+         if (!p)
+           break;
        }
     }
   return FALSE;
@@ -216,18 +221,20 @@ static bool Next_Enum(FIELD * field, const void * argp)
   int cnt           = args->count;
   unsigned char *bp = (unsigned char *)field_buffer(field,0);
 
-  while(cnt--)
-    {
-      if (Compare((unsigned char *)(*kwds++),bp,ccase)==EXACT) 
-       break;
-    }
-  if (cnt<=0)
-    kwds = args->kwds;
-  if ((cnt>=0) || (Compare((unsigned char *)dummy,bp,ccase)==EXACT))
-    {
-      set_field_buffer(field,0,*kwds);
-      return TRUE;
-    }
+  if (kwds) {
+    while(cnt--)
+      {
+       if (Compare((unsigned char *)(*kwds++),bp,ccase)==EXACT) 
+         break;
+      }
+    if (cnt<=0)
+      kwds = args->kwds;
+    if ((cnt>=0) || (Compare((const unsigned char *)dummy,bp,ccase)==EXACT))
+      {
+       set_field_buffer(field,0,*kwds);
+       return TRUE;
+      }
+  }
   return FALSE;
 }
 
@@ -250,20 +257,22 @@ static bool Previous_Enum(FIELD * field, const void * argp)
   bool ccase    = args->checkcase;
   unsigned char *bp = (unsigned char *)field_buffer(field,0);
 
-  while(cnt--)
-    {
-      if (Compare((unsigned char *)(*kwds--),bp,ccase)==EXACT) 
-       break;
-    }
-
-  if (cnt<=0)
-    kwds  = &args->kwds[args->count-1];
-
-  if ((cnt>=0) || (Compare((unsigned char *)dummy,bp,ccase)==EXACT))
-    {
-      set_field_buffer(field,0,*kwds);
-      return TRUE;
-    }
+  if (kwds) {
+    while(cnt--)
+      {
+       if (Compare((unsigned char *)(*kwds--),bp,ccase)==EXACT) 
+         break;
+      }
+    
+    if (cnt<=0)
+      kwds  = &args->kwds[args->count-1];
+    
+    if ((cnt>=0) || (Compare((const unsigned char *)dummy,bp,ccase)==EXACT))
+      {
+       set_field_buffer(field,0,*kwds);
+       return TRUE;
+      }
+  }
   return FALSE;
 }
 
@@ -282,6 +291,6 @@ static FIELDTYPE typeENUM = {
   Previous_Enum
 };
 
-FIELDTYPE* TYPE_ENUM = &typeENUM;
+NCURSES_EXPORT_VAR(FIELDTYPE*) TYPE_ENUM = &typeENUM;
 
 /* fty_enum.c ends here */