chiark / gitweb /
idtable better documented and sorted
authorian <ian>
Wed, 1 Dec 2004 00:21:45 +0000 (00:21 +0000)
committerian <ian>
Wed, 1 Dec 2004 00:21:45 +0000 (00:21 +0000)
base/chiark-tcl.h
base/idtable.c
dgram/dgram.c
hbytes/hbytes.h

index 4b4f4e8..2b03287 100644 (file)
 
 #include <tcl8.3/tcl.h>
 
+#include <adns.h>
+
 typedef unsigned char Byte;
 
 /* from hbytes.c */
@@ -218,8 +220,25 @@ typedef struct {
   void **a;
 } IdDataTable;
 
+/* The stored struct must start with a single int, conventionally
+ * named `ix'.  When the struct is returned for the first time ix must
+ * be -1; on subsequent occasions it must be >=0.  ix will be -1 iff
+ * the struct is registered by the iddatatable machinery. */
+
 extern Tcl_ObjType tabledataid_nearlytype;
 int tabledataid_parse(Tcl_Interp *ip, Tcl_Obj *o, IdDataTable *tab);
+void tabledataid_disposing(void *val, IdDataTable *tab);
+  /* call this when you destroy the struct, to remove its name;
+   * _disposing is idempotent*/
+
+/* from adns.c */
+
+typedef struct {
+  const char *name;
+  adns_rrtype number;
+} AdnsTclRRTypeInfo;
+
+extern IdDataTable adnstcl_queries, adnstcl_resolvers;
 
 /* from dgram.c */
 
index ed5e5e6..f64a101 100644 (file)
@@ -1,13 +1,5 @@
 /*
  */
-/*
- * dgram-socket create <local>                        => <sockid>
- * dgram-socket close <sockid>
- * dgram-socket transmit <sockid> <data> <remote>
- * dgram-socket on-receive <sockid> [<script>]
- *    calls, effectively,  eval <script> [list <data> <remote-addr> <socket>]
- *    if script not supplied, cancel
- */
 
 #include "tables.h"
 #include "hbytes.h"
@@ -45,6 +37,16 @@ int tabledataid_parse(Tcl_Interp *ip, Tcl_Obj *o, IdDataTable *tab) {
   return TCL_OK;
 }
 
+void tabledataid_disposing(void *val, IdDataTable *tab) {
+  int ix;
+
+  ix= *(int*)val;
+  if (ix==-1) return;
+  assert(tab->a[ix] == val);
+  tab->a[ix]= 0;
+  *(int*)val= -1;
+}
+
 int pat_iddata(Tcl_Interp *ip, Tcl_Obj *o, void **rv, IdDataTable *tab) {
   int rc, ix;
   void *r;
index b2661a4..08f5f45 100644 (file)
@@ -154,13 +154,12 @@ int do_dgram_socket_on_receive(ClientData cd, Tcl_Interp *ip,
 
 int do_dgram_socket_close(ClientData cd, Tcl_Interp *ip, void *sock_v) {
   DgramSocket *sock= sock_v;
-  int sockix;
+
   cancel(sock);
   close(sock->fd); /* nothing useful to be done with errors */
-  sockix= sock->ix;
+  tabledataid_disposing(sock,&dgram_socks);
   TFREE(sock->addr_buf);
   TFREE(sock->msg_buf);
   TFREE(sock);
-  dgram_socks.a[sockix]= 0;
   return TCL_OK;
 }
index 4b4f4e8..2b03287 100644 (file)
 
 #include <tcl8.3/tcl.h>
 
+#include <adns.h>
+
 typedef unsigned char Byte;
 
 /* from hbytes.c */
@@ -218,8 +220,25 @@ typedef struct {
   void **a;
 } IdDataTable;
 
+/* The stored struct must start with a single int, conventionally
+ * named `ix'.  When the struct is returned for the first time ix must
+ * be -1; on subsequent occasions it must be >=0.  ix will be -1 iff
+ * the struct is registered by the iddatatable machinery. */
+
 extern Tcl_ObjType tabledataid_nearlytype;
 int tabledataid_parse(Tcl_Interp *ip, Tcl_Obj *o, IdDataTable *tab);
+void tabledataid_disposing(void *val, IdDataTable *tab);
+  /* call this when you destroy the struct, to remove its name;
+   * _disposing is idempotent*/
+
+/* from adns.c */
+
+typedef struct {
+  const char *name;
+  adns_rrtype number;
+} AdnsTclRRTypeInfo;
+
+extern IdDataTable adnstcl_queries, adnstcl_resolvers;
 
 /* from dgram.c */