X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl.git;a=blobdiff_plain;f=base%2Fparse.c;h=b81511cc827e0c45d1cb53bfe318c74cb1a34cfe;hp=125dd61eb9e182a2fbfd36f46ac824f38a9f006e;hb=07876950ceee6d28473f347ad2f0c4422c266e32;hpb=310a482133795d0bee9621003c0a0b3813a47037 diff --git a/base/parse.c b/base/parse.c index 125dd61..b81511c 100644 --- a/base/parse.c +++ b/base/parse.c @@ -1,16 +1,87 @@ - sc= enum_lookup_cached(ip,objv[1],subcommands,"hbytes subcommand"); +/* + */ +#include "tables.h" -static Tcl_Obj *hb_getvar(Tcl_Interp *ip, Tcl_Obj *varname) { - int ec; - Tcl_Obj *value; +int pat_charfrom(Tcl_Interp *ip, Tcl_Obj *obj, int *val, + const char *opts, const char *what) { + *val= enum1_lookup_cached_func(ip,obj,opts,what); + if (*val==-1) return TCL_ERROR; + return TCL_OK; +} + +int pat_enum(Tcl_Interp *ip, Tcl_Obj *obj, const void **val, + const void *opts, size_t sz, const char *what) { + *val= enum_lookup_cached_func(ip,obj,opts,sz,what); + if (!*val) return TCL_ERROR; + return TCL_OK; +} + +int pat_obj(Tcl_Interp *ip, Tcl_Obj *obj, Tcl_Obj **val) { + *val= obj; + return TCL_OK; +} + +int pat_int(Tcl_Interp *ip, Tcl_Obj *obj, int *val) { + return Tcl_GetIntFromObj(ip, obj, val); +} + +int pat_hbv(Tcl_Interp *ip, Tcl_Obj *var, HBytes_Var *agg) { + int rc; + Tcl_Obj *val; + + Tcl_IncrRefCount(var); + agg->var= var; + + val= Tcl_ObjGetVar2(ip,var,0,TCL_LEAVE_ERR_MSG); + if (!val) return TCL_ERROR; + if (Tcl_IsShared(val)) val= Tcl_DuplicateObj(val); + Tcl_IncrRefCount(val); + agg->obj= val; - value= Tcl_ObjGetVar2(ip,varname,0,TCL_LEAVE_ERR_MSG); - if (!value) return 0; + rc= Tcl_ConvertToType(ip,val,&hbytes_type); + if (rc) return rc; - ec= Tcl_ConvertToType(ip,value,&hbytes_type); - if (ec) return 0; + agg->hb= OBJ_HBYTES(val); return TCL_OK; } - return value; +void fini_hbv(Tcl_Interp *ip, int rc, HBytes_Var *agg) { + Tcl_Obj *ro; + + if (agg->obj) Tcl_InvalidateStringRep(agg->obj); + if (!rc) { + assert(agg->obj); + ro= Tcl_ObjSetVar2(ip,agg->var,0,agg->obj,TCL_LEAVE_ERR_MSG); + if (!ro) rc= TCL_ERROR; + } + if (agg->obj) Tcl_DecrRefCount(agg->obj); + if (agg->var) Tcl_DecrRefCount(agg->var); +} + +int pat_hb(Tcl_Interp *ip, Tcl_Obj *obj, HBytes_Value *val) { + int rc; + rc= Tcl_ConvertToType(ip,obj,&hbytes_type); if (rc) return rc; + *val= *OBJ_HBYTES(obj); + return TCL_OK; +} + +Tcl_Obj *ret_hb(Tcl_Interp *ip, HBytes_Value val) { + Tcl_Obj *obj; + obj= Tcl_NewObj(); + Tcl_InvalidateStringRep(obj); + *OBJ_HBYTES(obj)= val; + obj->typePtr= &hbytes_type; + return obj; } +Tcl_Obj *ret_int(Tcl_Interp *ip, int val) { + return Tcl_NewIntObj(val); +} + +Tcl_Obj *ret_obj(Tcl_Interp *ip, Tcl_Obj *val) { + return val; +} + +void setstringresult(Tcl_Interp *ip, const char *m) { + Tcl_ResetResult(ip); + Tcl_AppendResult(ip, m, (char*)0); +}