+static const struct input_absinfo *evdev_getabsinfo(Device *d, uint16_t code) {
+ struct input_absinfo **aip, *ai;
+ int i, r;
+
+ if (code >= 0x80) return 0; /* absurd ioctl scheme! */
+
+ if (code >= d->forkind.evdev.nabsinfos) {
+ int newsize= code+10;
+ d->forkind.evdev.absinfos= mrealloc(d->forkind.evdev.absinfos,
+ newsize * sizeof(*d->forkind.evdev.absinfos));
+ for (i=d->forkind.evdev.nabsinfos; i<newsize; i++)
+ d->forkind.evdev.absinfos[i]= 0;
+ }
+ aip= &d->forkind.evdev.absinfos[code];
+ ai= *aip;
+ if (ai) return ai;
+
+ *aip= ai= mmalloc(sizeof(*ai));
+ r= ioctl(d->fd, EVIOCGABS(code), ai);
+ ai->value= r ? errno : 0;
+ return ai;
+}
+