8 DO_SIZE(ulong, 4, 0xffffffffUL, \
13 DO_SIZE(ushort, 2, 0x0000ffffUL, \
17 #define DO_BYTE(index,shift) (data[index] << shift) |
18 #define DO_SIZE(ulongint, len, max, bytes) \
19 int do_hbytes_h2##ulongint(ClientData cd, Tcl_Interp *ip, \
20 HBytes_Value hex, unsigned long *result) { \
22 if (hbytes_len(&hex) != len) \
23 return staticerr(ip, #ulongint " must be " #len " bytes"); \
24 data= hbytes_data(&hex); \
32 #define DO_BYTE(index,shift) data[index]= (value >> shift);
33 #define DO_SIZE(ulongint, len, max, bytes) \
34 int do_hbytes_##ulongint##2h(ClientData cd, Tcl_Interp *ip, \
35 unsigned long value, HBytes_Value *result) { \
37 if (value > max) return staticerr(ip, #ulongint " too big"); \
38 data= hbytes_arrayspace(result,len); \
46 int pat_ulong(Tcl_Interp *ip, Tcl_Obj *obj, unsigned long *val) {
49 str= Tcl_GetString(obj);
51 *val= strtoul(str,&ep,0);
52 if (*ep || errno) return staticerr(ip, "bad unsigned value");
56 Tcl_Obj *ret_ulong(Tcl_Interp *ip, unsigned long val) {
58 assert(val <= 0xffffffffUL);
59 snprintf(buf,sizeof(buf), "0x%08lx", val);
60 return Tcl_NewStringObj(buf,sizeof(buf)-1);