X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=form%2Ffty_enum.c;h=ab256db1ef14cba7c8e290b4401258860925a207;hp=0e128083689a7847a2a351946d0fe911ab60f289;hb=46722468f47c2b77b3987729b4bcf2321cccfd01;hpb=3a9b6a3bf0269231bef7de74757a910dedd04e0c diff --git a/form/fty_enum.c b/form/fty_enum.c index 0e128083..ab256db1 100644 --- a/form/fty_enum.c +++ b/form/fty_enum.c @@ -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 */