X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl.git;a=blobdiff_plain;f=hbytes%2Fparse.c;h=c384eb43336d38c2d1a988073ae8659bcac18d66;hp=e5e3465c93c450eea9357c55e35718663ed58f03;hb=86cd7fbb005bf50d81314393745c08d7885246fa;hpb=2cf1bfc63e73a424f9f3899c204025a8346b38e0 diff --git a/hbytes/parse.c b/hbytes/parse.c index e5e3465..c384eb4 100644 --- a/hbytes/parse.c +++ b/hbytes/parse.c @@ -1,85 +1,42 @@ /* + * hbytes - hex-stringrep efficient byteblocks for Tcl + * Copyright 2006-2012 Ian Jackson + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this library; if not, see . */ -#include "tables.h" +#include "chiark_tcl_hbytes.h" -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 cht_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; - - rc= Tcl_ConvertToType(ip,val,&hbytes_type); + rc= cht_pat_somethingv(ip,var,&agg->sth,&cht_hbytes_type); if (rc) return rc; - - agg->hb= OBJ_HBYTES(val); + agg->hb= OBJ_HBYTES(agg->sth.obj); return TCL_OK; } - -void fini_hbv(Tcl_Interp *ip, int rc, HBytes_Var *agg) { - Tcl_Obj *ro; - - 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 cht_pat_hb(Tcl_Interp *ip, Tcl_Obj *obj, HBytes_Value *val) { int rc; - rc= Tcl_ConvertToType(ip,obj,&hbytes_type); if (rc) return rc; + rc= Tcl_ConvertToType(ip,obj,&cht_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 *cht_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; + obj->typePtr= &cht_hbytes_type; return obj; } - -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); -}