X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl.git;a=blobdiff_plain;f=hbytes%2Fparse.c;h=0fa5acdd4705d942ca158f5475e1691b5651e5ac;hp=911cadd3eb71e34d2bbb2dcbef206dc343480e33;hb=c7fc51a4ad6bb6f01266ed5912b062ae98a653b8;hpb=a43cdb5c69224a60f9e87110093e35a0f1f0b468 diff --git a/hbytes/parse.c b/hbytes/parse.c index 911cadd..0fa5acd 100644 --- a/hbytes/parse.c +++ b/hbytes/parse.c @@ -22,40 +22,68 @@ int pat_string(Tcl_Interp *ip, Tcl_Obj *obj, const char **val) { *val= Tcl_GetString(obj); return TCL_OK; } + +int pat_constv(Tcl_Interp *ip, Tcl_Obj *var, + Tcl_Obj **val_r, Tcl_ObjType *type) { + int rc; + Tcl_Obj *val; -int pat_hbv(Tcl_Interp *ip, Tcl_Obj *var, HBytes_Var *agg) { + val= Tcl_ObjGetVar2(ip,var,0,TCL_LEAVE_ERR_MSG); + if (!val) return TCL_ERROR; + + if (type) { + rc= Tcl_ConvertToType(ip,val,type); + if (rc) return rc; + } + + *val_r= val; + return TCL_OK; +} + +void init_somethingv(Something_Var *sth) { + sth->obj=0; sth->var=0; sth->copied=0; +} + +int pat_somethingv(Tcl_Interp *ip, Tcl_Obj *var, + Something_Var *sth, Tcl_ObjType *type) { int rc; Tcl_Obj *val; - agg->var= var; + sth->var= var; val= Tcl_ObjGetVar2(ip,var,0,TCL_LEAVE_ERR_MSG); if (!val) return TCL_ERROR; - rc= Tcl_ConvertToType(ip,val,&hbytes_type); + rc= Tcl_ConvertToType(ip,val,type); if (rc) return rc; if (Tcl_IsShared(val)) { val= Tcl_DuplicateObj(val); - agg->copied= 1; + sth->copied= 1; } Tcl_InvalidateStringRep(val); - agg->obj= val; + sth->obj= val; - agg->hb= OBJ_HBYTES(val); return TCL_OK; } -void fini_hbv(Tcl_Interp *ip, int rc, HBytes_Var *agg) { +int pat_hbv(Tcl_Interp *ip, Tcl_Obj *var, HBytes_Var *agg) { + int rc; + rc= pat_somethingv(ip,var,&agg->sth,&hbytes_type); if (rc) return rc; + agg->hb= OBJ_HBYTES(agg->sth.obj); + return TCL_OK; +} + +void fini_somethingv(Tcl_Interp *ip, int rc, Something_Var *sth) { Tcl_Obj *ro; if (!rc) { - assert(agg->obj); - ro= Tcl_ObjSetVar2(ip,agg->var,0,agg->obj,TCL_LEAVE_ERR_MSG); + assert(sth->obj); + ro= Tcl_ObjSetVar2(ip,sth->var,0,sth->obj,TCL_LEAVE_ERR_MSG); if (!ro) rc= TCL_ERROR; } - if (rc && agg->copied) - Tcl_DecrRefCount(agg->obj); + if (rc && sth->copied) + Tcl_DecrRefCount(sth->obj); } int pat_hb(Tcl_Interp *ip, Tcl_Obj *obj, HBytes_Value *val) {