8 const SegPosCombInfo *trackloc_segposcomb(const TrackLocation *tloc) {
9 Segment *seg= tloc->seg;
11 assert(seg->movposcomb < seg->i->n_poscombs);
12 return &seg->i->poscombs[seg->movposcomb];
15 const SegmentLinkInfo *trackloc_segmentlink(const TrackLocation *tloc,
16 const SegPosCombInfo *pci,
18 return (tloc->backwards ^ far) ? &pci->backwards : &pci->forwards;
21 long trackloc_remaininseg(const TrackLocation *tloc) {
22 const SegPosCombInfo *pci;
25 pci= trackloc_segposcomb(tloc);
26 segment_len= pci->dist;
27 assert(tloc->into <= segment_len);
28 return segment_len - tloc->into;
31 void trackloc_further(TrackLocation *tloc, long *remain_io) {
32 const SegPosCombInfo *pci;
33 const SegmentLinkInfo *lnki_far;
36 segment_remain= trackloc_remaininseg(tloc);
38 if (*remain_io <= segment_remain) {
39 tloc->into += *remain_io;
42 pci= trackloc_segposcomb(tloc);
43 lnki_far= trackloc_segmentlink(tloc, pci, 1);
44 *remain_io -= segment_remain;
45 tloc->seg= &segments[lnki_far->next];
47 tloc->backwards ^= lnki_far->next_backwards;
51 void trackloc_reverse(TrackLocation *tloc) {
52 tloc->into= trackloc_remaininseg(tloc);