8 const SegPosCombInfo *trackloc_segposcomb(const TrackLocation *tloc) {
9 State *s= &safety_state;
10 SegmentState *seg= &s->segments[tloc->segn];
11 const SegmentInfo *segi= &info_segments[tloc->segn];
13 assert(seg->movposcomb < segi->n_poscombs);
14 return &segi->poscombs[seg->movposcomb];
17 const SegmentLinkInfo *trackloc_segmentlink(const TrackLocation *tloc,
18 const SegPosCombInfo *pci,
20 return (tloc->backwards ^ far) ? &pci->backwards : &pci->forwards;
23 long trackloc_remaininseg(const TrackLocation *tloc) {
24 const SegPosCombInfo *pci;
27 pci= trackloc_segposcomb(tloc);
28 segment_len= pci->dist;
29 assert(tloc->into <= segment_len);
30 return segment_len - tloc->into;
33 void trackloc_further(TrackLocation *tloc, long *remain_io) {
34 const SegPosCombInfo *pci;
35 const SegmentLinkInfo *lnki_far;
38 segment_remain= trackloc_remaininseg(tloc);
40 if (*remain_io <= segment_remain) {
41 tloc->into += *remain_io;
44 pci= trackloc_segposcomb(tloc);
45 lnki_far= trackloc_segmentlink(tloc, pci, 1);
46 *remain_io -= segment_remain;
47 tloc->segn= lnki_far->next;
49 tloc->backwards ^= lnki_far->next_backwards;
53 void trackloc_reverse(TrackLocation *tloc) {
54 tloc->into= trackloc_remaininseg(tloc);