X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl.git;a=blobdiff_plain;f=base%2Fenum.c;h=8041cd378a5b05f1c486f2f4049700299f91c631;hp=1a66aa34629961b696d084d2bef9784de694be78;hb=29d695bbfb0f42019af456fc8a7a3137e9745806;hpb=b30fd7b756a0664c4e1fef3e936d9aab13c0d6fe diff --git a/base/enum.c b/base/enum.c index 1a66aa3..8041cd3 100644 --- a/base/enum.c +++ b/base/enum.c @@ -2,6 +2,8 @@ * */ +#include + #include "hbytes.h" static void enum_nt_dup(Tcl_Obj *src, Tcl_Obj *dup) { @@ -21,8 +23,42 @@ Tcl_ObjType enum_nearlytype = { 0, enum_nt_dup, enum_nt_ustr, enum_nt_sfa }; +Tcl_ObjType enum1_nearlytype = { + "enum1-nearly", + 0, enum_nt_dup, enum_nt_ustr, enum_nt_sfa +}; + +static void report_bad(Tcl_Interp *ip, const char *what, const char *supplied, + const void *first, size_t each, + int (*isvalid)(const void *entry), + void (*appres)(Tcl_Interp *ip, const void *entry)) { + int count, i; + const Byte *entry; + + for (entry=first; isvalid(entry); entry+=each); + count= (entry - (const Byte*)first) / each; + + Tcl_ResetResult(ip); + Tcl_AppendResult(ip, "bad ",what," \"",supplied,"\": must be",(char*)0); + + for (i=0, entry=first; itypePtr != &enum1_nearlytype || + o->internalRep.twoPtrValue.ptr1 != opts) { + + supplied= Tcl_GetStringFromObj(o,0); assert(supplied); + + if (!(strlen(supplied) == 1 && + (fp= strchr(opts, supplied[0])))) { + report_bad(ip,what,supplied, opts,1, isvalid_enum1,appres_enum1); + return -1; + } + + objfreeir(o); + o->typePtr= &enum1_nearlytype; + o->internalRep.twoPtrValue.ptr1= (void*)opts; + o->internalRep.twoPtrValue.ptr2= (void*)fp; + } + return (const char*)o->internalRep.twoPtrValue.ptr2 - opts; +}