nx_release_recent_candidate_t205.nx source
↩ module page · 182 lines · 7197 B
1// Latest release selection across all contributing boards; history remains in the plans.
2import "nx_release_delta_lib.nx"
3const RR_FIELDS: i64=8
4const RR_PLAN: i64=0
5const RR_DOMAIN: i64=1
6const RR_EPOCH: i64=2
7const RR_RUNG: i64=3
8const RR_RUNG_LEN: i64=4
9const RR_TEXT: i64=5
10const RR_END: i64=6
11const RR_ORDER: i64=7
12struct ReleaseRecent { rows: *i64, count: i64, sequence: i64, capacity: i64 }
13func rr_new() -> *ReleaseRecent {
14 let r: *ReleaseRecent=sys_mmap_try(__size_of(ReleaseRecent)) as *ReleaseRecent
15 if (r as i64)<=0 { return 0 as *ReleaseRecent }
16 r.rows=0 as *i64;r.count=0;r.sequence=0;r.capacity=0
17 return r
18}
19func rr_reserve(r: *ReleaseRecent,needed: i64) -> i64 {
20 if needed<=r.capacity { return 1 }
21 if needed>9223372036854775807/(RR_FIELDS*8) { return 0 }
22 let rows: *i64=sys_mmap_try(needed*RR_FIELDS*8) as *i64
23 if (rows as i64)<=0 { return 0 }
24 var i: i64=0
25 while i<r.count*RR_FIELDS { rows[i]=r.rows[i];i=i+1 }
26 if r.capacity>0 { sys_munmap_direct(r.rows as *u8,r.capacity*RR_FIELDS*8) }
27 r.rows=rows;r.capacity=needed
28 return 1
29}
30func rr_offer(r: *ReleaseRecent,plan: *u8,dom: *u8,epoch: i64,rung: i64,rn: i64,text: i64,end: i64) -> i64 {
31 if r.count>=r.capacity { return 0 }
32 let row: i64=r.count*RR_FIELDS
33 r.sequence=r.sequence+1
34 r.rows[row+RR_PLAN]=plan as i64;r.rows[row+RR_DOMAIN]=dom as i64
35 r.rows[row+RR_EPOCH]=epoch;r.rows[row+RR_RUNG]=rung;r.rows[row+RR_RUNG_LEN]=rn
36 r.rows[row+RR_TEXT]=text;r.rows[row+RR_END]=end;r.rows[row+RR_ORDER]=r.sequence
37 r.count=r.count+1
38 return 1
39}
40func rr_sort(r: *ReleaseRecent) -> i64 {
41 if r.count<2 { return 1 }
42 let temp: *i64=sys_mmap_try(r.count*RR_FIELDS*8) as *i64
43 if (temp as i64)<=0 { return 0 }
44 var width: i64=1
45 while width<r.count {
46 var base: i64=0
47 while base<r.count {
48 var mid: i64=base+width
49 if mid>r.count { mid=r.count }
50 var end: i64=mid+width
51 if end>r.count { end=r.count }
52 var a: i64=base
53 var b: i64=mid
54 var dst: i64=base
55 while dst<end {
56 var take_a: i64=0
57 if a<mid {
58 if b>=end { take_a=1 } else {
59 let ae: i64=r.rows[a*RR_FIELDS+RR_EPOCH]
60 let be: i64=r.rows[b*RR_FIELDS+RR_EPOCH]
61 if ae>be { take_a=1 }
62 if ae==be && r.rows[a*RR_FIELDS+RR_ORDER]>r.rows[b*RR_FIELDS+RR_ORDER] { take_a=1 }
63 }
64 }
65 var from: i64=b
66 if take_a==1 { from=a;a=a+1 } else { b=b+1 }
67 var k: i64=0
68 while k<RR_FIELDS { temp[dst*RR_FIELDS+k]=r.rows[from*RR_FIELDS+k];k=k+1 }
69 dst=dst+1
70 }
71 base=end
72 }
73 var k: i64=0
74 while k<r.count*RR_FIELDS { r.rows[k]=temp[k];k=k+1 }
75 width=width*2
76 }
77 sys_munmap_direct(temp as *u8,r.count*RR_FIELDS*8)
78 return 1
79}
80func rr_collect(r: *ReleaseRecent,plan: *u8,n: i64,since: *u8,dom: *u8,counts: *i64) -> i64 {
81 if (r as i64)<=0 || n<0 { return -1 }
82 var lines: i64=1
83 var scan: i64=0
84 while scan<n { if rd_byte(plan,scan)==RD_NL { lines=lines+1 };scan=scan+1 }
85 if rr_reserve(r,r.count+lines)!=1 { return -1 }
86 let date: *u8=sys_mmap_try(RD_W_DATE)
87 if (date as i64)<=0 { return -1 }
88 var p: i64=0
89 while p<n {
90 let e: i64=rd_line_end(plan,n,p)
91 if e-p>RD_LOG_PFX_LEN && rd_slice_eq(plan,p,RD_LOG_PFX_LEN,RD_LOG_PFX)==1 {
92 var q: i64=p+RD_LOG_PFX_LEN
93 var epoch: i64=0
94 let start: i64=q
95 var valid: i64=1
96 while q<e {
97 let digit: i64=rd_byte(plan,q)-RD_D0
98 if digit<0 || digit>=RD_BASE10 { break }
99 if epoch>(9223372036854775807-digit)/RD_BASE10 { valid=0;break }
100 epoch=epoch*RD_BASE10+digit;q=q+1
101 }
102 if valid==1 && q>start && q<e && rd_byte(plan,q)==RD_PIPE {
103 q=q+1
104 let rs: i64=q
105 while q<e { if rd_byte(plan,q)==RD_PIPE { break };q=q+1 }
106 let rn: i64=q-rs
107 if rn>0 && q<e {
108 q=q+1
109 let ks: i64=q
110 while q<e { if rd_byte(plan,q)==RD_PIPE { break };q=q+1 }
111 let kn: i64=q-ks
112 if q<e {
113 al_civil_date(epoch,date)
114 if rd_cmp_slice(date,0,RD_DATE_W,since)>0 {
115 if rd_slice_eq(plan,ks,kn,RD_KIND_LAND)==1 {
116 counts[RD_C_LAND]=counts[RD_C_LAND]+1
117 rr_offer(r,plan,dom,epoch,rs,rn,q+1,e)
118 }
119 if rd_slice_eq(plan,ks,kn,RD_KIND_MEASURE)==1 { counts[RD_C_MEASURE]=counts[RD_C_MEASURE]+1 }
120 if rd_slice_eq(plan,ks,kn,RD_KIND_RETRACT)==1 { counts[RD_C_RETRACT]=counts[RD_C_RETRACT]+1 }
121 }
122 }
123 }
124 }
125 }
126 p=e+1
127 }
128 sys_munmap_direct(date,RD_W_DATE)
129 return r.count
130}
131func rr_required(r: *ReleaseRecent) -> i64 {
132 var bytes: i64=1
133 var i: i64=0
134 while i<r.count {
135 let row: i64=i*RR_FIELDS
136 let text: i64=r.rows[row+RR_END]-r.rows[row+RR_TEXT]
137 let dom: i64=al_slen(r.rows[row+RR_DOMAIN] as *u8)
138 let add: i64=(text+dom+r.rows[row+RR_RUNG_LEN])*RD_ENT_MAX+RD_DATE_W+al_slen("<li><b> </b> : </li>" as *u8)
139 if add<0 || bytes>9223372036854775807-add { return -1 }
140 bytes=bytes+add;i=i+1
141 }
142 return bytes
143}
144func rr_render(r: *ReleaseRecent,out: *u8,cap: i64,counts: *i64) -> i64 {
145 let required: i64=rr_required(r)
146 if required<0 || cap<required || (out as i64)<=0 { return -1 }
147 if rr_sort(r)!=1 { return -1 }
148 var o: i64=0
149 var i: i64=0
150 let date: *u8=sys_mmap_try(RD_W_DATE)
151 if (date as i64)<=0 { return -1 }
152 counts[RD_C_LISTED]=0
153 while i<r.count {
154 let row: i64=i*RR_FIELDS
155 let plan: *u8=r.rows[row+RR_PLAN] as *u8
156 o=al_cat(out,o,"<li><b>" as *u8)
157 o=rd_esc_z(out,o,r.rows[row+RR_DOMAIN] as *u8)
158 o=al_cat(out,o," " as *u8)
159 o=rd_esc_html(out,o,plan,r.rows[row+RR_RUNG],r.rows[row+RR_RUNG_LEN])
160 o=al_cat(out,o,"</b> " as *u8)
161 al_civil_date(r.rows[row+RR_EPOCH],date);o=al_cat(out,o,date)
162 o=al_cat(out,o,": " as *u8)
163 let text: i64=r.rows[row+RR_TEXT]
164 var n: i64=r.rows[row+RR_END]-text
165 o=rd_esc_html(out,o,plan,text,n)
166 o=al_cat(out,o,"</li>" as *u8)
167 counts[RD_C_LISTED]=counts[RD_C_LISTED]+1;i=i+1
168 }
169 if cap>o { out[o]=0 as u8 }
170 sys_munmap_direct(date,RD_W_DATE)
171 return o
172}
173
174// Ownership belongs to this collector; every allocation uses direct fallible mappings.
175func rr_destroy(r:*ReleaseRecent)->i64 {
176 if (r as i64)<=0 { return 0 }
177 if r.capacity>0 {
178 let rc:i64=sys_munmap_direct(r.rows as *u8,r.capacity*RR_FIELDS*8)
179 if rc!=0 { return rc }
180 }
181 return sys_munmap_direct(r as *u8,__size_of(ReleaseRecent))
182}