chiark / gitweb /
911cadd3eb71e34d2bbb2dcbef206dc343480e33
[chiark-tcl.git] / hbytes / parse.c
1 /*
2  */
3
4 #include "tables.h"
5
6 int pat_charfrom(Tcl_Interp *ip, Tcl_Obj *obj, int *val,
7                  const char *opts, const char *what) {
8   *val= enum1_lookup_cached_func(ip,obj,opts,what);
9   if (*val==-1) return TCL_ERROR;
10   return TCL_OK;
11 }
12
13 int pat_int(Tcl_Interp *ip, Tcl_Obj *obj, int *val) {
14   return Tcl_GetIntFromObj(ip, obj, val);
15 }
16   
17 int pat_long(Tcl_Interp *ip, Tcl_Obj *obj, long *val) {
18   return Tcl_GetLongFromObj(ip, obj, val);
19 }
20   
21 int pat_string(Tcl_Interp *ip, Tcl_Obj *obj, const char **val) {
22   *val= Tcl_GetString(obj);
23   return TCL_OK;
24 }
25   
26 int pat_hbv(Tcl_Interp *ip, Tcl_Obj *var, HBytes_Var *agg) {
27   int rc;
28   Tcl_Obj *val;
29
30   agg->var= var;
31
32   val= Tcl_ObjGetVar2(ip,var,0,TCL_LEAVE_ERR_MSG);
33   if (!val) return TCL_ERROR;
34
35   rc= Tcl_ConvertToType(ip,val,&hbytes_type);
36   if (rc) return rc;
37
38   if (Tcl_IsShared(val)) {
39     val= Tcl_DuplicateObj(val);
40     agg->copied= 1;
41   }
42   Tcl_InvalidateStringRep(val);
43   agg->obj= val;
44
45   agg->hb= OBJ_HBYTES(val);
46   return TCL_OK;
47 }
48
49 void fini_hbv(Tcl_Interp *ip, int rc, HBytes_Var *agg) {
50   Tcl_Obj *ro;
51   
52   if (!rc) {
53     assert(agg->obj);
54     ro= Tcl_ObjSetVar2(ip,agg->var,0,agg->obj,TCL_LEAVE_ERR_MSG);
55     if (!ro) rc= TCL_ERROR;
56   }
57   if (rc && agg->copied)
58     Tcl_DecrRefCount(agg->obj);
59 }
60
61 int pat_hb(Tcl_Interp *ip, Tcl_Obj *obj, HBytes_Value *val) {
62   int rc;
63   rc= Tcl_ConvertToType(ip,obj,&hbytes_type);  if (rc) return rc;
64   *val= *OBJ_HBYTES(obj);
65   return TCL_OK;
66 }
67
68 Tcl_Obj *ret_hb(Tcl_Interp *ip, HBytes_Value val) {
69   Tcl_Obj *obj;
70   obj= Tcl_NewObj();
71   Tcl_InvalidateStringRep(obj);
72   *OBJ_HBYTES(obj)= val;
73   obj->typePtr= &hbytes_type;
74   return obj;
75 }
76
77 Tcl_Obj *ret_long(Tcl_Interp *ip, long val) {
78   return Tcl_NewLongObj(val);
79 }
80
81 Tcl_Obj *ret_string(Tcl_Interp *ip, const char *val) {
82   return Tcl_NewStringObj(val,-1);
83 }