chiark / gitweb /
Merge and end branch-hostside-wip-2008-01-25 PROPERLY; cvs up -j branch-hostside...
[trains.git] / hostside / trackloc.c
1 /*
2  */
3
4 #include <assert.h>
5
6 #include "realtime.h"
7
8 const SegPosCombInfo *trackloc_segposcomb(const TrackLocation *tloc) {
9   Segment *seg= tloc->seg;
10
11   assert(seg->movposcomb < seg->i->n_poscombs);
12   return &seg->i->poscombs[seg->movposcomb];
13 }
14
15 const SegmentLinkInfo *trackloc_segmentlink(const TrackLocation *tloc,
16                                             const SegPosCombInfo *pci,
17                                             unsigned far) {
18   return (tloc->backwards ^ far) ? &pci->backwards : &pci->forwards;
19 }
20   
21 long trackloc_remaininseg(const TrackLocation *tloc) {
22   const SegPosCombInfo *pci;
23   long segment_len;
24
25   pci= trackloc_segposcomb(tloc);
26   segment_len= pci->dist;
27   assert(tloc->into <= segment_len);
28   return segment_len - tloc->into;
29 }  
30
31 void trackloc_further(TrackLocation *tloc, long *remain_io) {
32   const SegPosCombInfo *pci;
33   const SegmentLinkInfo *lnki_far;
34   long segment_remain;
35
36   segment_remain= trackloc_remaininseg(tloc);
37
38   if (*remain_io <= segment_remain) {
39     tloc->into += *remain_io;
40     *remain_io= 0;
41   } else {
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];
46     tloc->into= 0;
47     tloc->backwards ^= lnki_far->next_backwards;
48   }
49 }
50
51 void trackloc_reverse(TrackLocation *tloc) {
52   tloc->into= trackloc_remaininseg(tloc);
53   tloc->backwards ^= 1;
54 }
55