+void trdestroycb(struct dc_transfer *tr)
+{
+ free(tr->udata);
+}
+
+void addtrdata(struct dc_transfer *tr)
+{
+ struct trdata *data;
+
+ if(tr->udata != NULL)
+ return;
+ tr->destroycb = trdestroycb;
+ data = smalloc(sizeof(*data));
+ memset(data, 0, sizeof(*data));
+ tr->udata = data;
+}
+
+void updatetrdata(struct dc_transfer *tr)
+{
+ int i;
+ struct trdata *data;
+
+ data = tr->udata;
+ if(data->hc < TRHISTSIZE)
+ {
+ data->poshist[data->hc] = tr->curpos;
+ data->timehist[data->hc] = ntime();
+ data->hc++;
+ } else {
+ for(i = 0; i < TRHISTSIZE - 1; i++)
+ {
+ data->poshist[i] = data->poshist[i + 1];
+ data->timehist[i] = data->timehist[i + 1];
+ }
+ data->poshist[i] = tr->curpos;
+ data->timehist[i] = ntime();
+ }
+}
+