nx_profile_contract.nx source
↩ module page · 45 lines · 1791 B
1// Profile measurement qualification contract v2. S rows remain raw measurements.
2// Q y part_a part_b reason runs points declares ambiguous region assignment.
3// reason=1: projected union cannot isolate the requested anatomical regions.
4// Return 0 qualified, 1 ambiguous, -1 malformed/unsupported, -2 legacy unqualified.
5// Caller supplies info[5]. This validator does not validate mesh or numeric S rows.
6func profile_contract_scan(b:*u8,len:i64,info:*i64)->i64 {
7 var z:i64=0;while z<5{info[z]=0;z=z+1}
8 var i:i64=0;var seen:i64=0
9 while i<len {
10 var e:i64=i;while e<len{if b[e]==(10 as u8){break}e=e+1}
11 var j:i64=i;while j<e{if b[j]!=(32 as u8){if b[j]!=(9 as u8){break}}j=j+1}
12 if j<e{
13 let tag:i64=b[j] as i64
14 if tag==86 {if seen!=0{return 0-1}seen=1
15 j=j+1;while j<e{if b[j]!=(32 as u8){if b[j]!=(9 as u8){break}}j=j+1}
16 if j>=e{return 0-1}if b[j]!=(50 as u8){return 0-1}j=j+1
17 while j<e{if b[j]!=(32 as u8){if b[j]!=(9 as u8){if b[j]!=(13 as u8){return 0-1}}}j=j+1}
18 info[0]=2
19 }
20 if tag==81 {
21 var field:i64=0;var val:i64=0;var digits:i64=0;j=j+1
22 var y:i64=0;var a:i64=0;var c:i64=0
23 while j<=e{
24 var ch:i64=32;if j<e{ch=b[j] as i64}
25 if ch>=48{if ch<=57{if val>922337203685477580{return 0-1}if val==922337203685477580{if ch>55{return 0-1}}val=val*10+ch-48;digits=digits+1}else{return 0-1}}
26 else{if ch!=32{if ch!=9{if ch!=13{return 0-1}}}
27 if digits>0{
28 if field==0{y=val}if field==1{a=val}if field==2{c=val}
29 if field==3{if val!=1{return 0-1}}
30 field=field+1;val=0;digits=0
31 }
32 }
33 j=j+1
34 }
35 if field!=6{return 0-1}
36 if info[1]==0{info[2]=y;info[3]=a;info[4]=c}
37 info[1]=info[1]+1
38 }
39 }
40 i=e+1
41 }
42 if seen==0{if info[1]>0{return 0-1}return 0-2}
43 if info[1]>0{return 1}
44 return 0
45}