def rec.go

bend-kit-csv@0.3.0.0 · csv.bend:61

import bend-kit-csv@0.3.0.0/csv.bend as Csv
import Base

61# r holds byte i. s is where the open field starts. Every step but the last reads one byte.
62def rec.go(f: Nat, st: St, r: Array<U32> & U32, +len: U32, +i: U32, +s: U32, +esc: Bool, +sp: List<&2, Span>) -> Array<U32> & Scan:
63  match f:
64    case 0n:
65      (a, c) = r
66      (a, SBad{i})
67    case 1n+p:
68      match st:
69        case SStart{}:
70          (a, +c) = r
71          match c:
72            case 34:
73              rec.go(p, SQ{}, pk(a, len, (i + 1 : U32)), len, (i + 1 : U32), (i + 1 : U32), False{}, sp)
74            case 44:
75              rec.go(p, SStart{}, pk(a, len, (i + 1 : U32)), len, (i + 1 : U32), (i + 1 : U32), False{}, Span{i, i, False{}} <> sp)
76            case 10:
77              (a, SRow{start.sp(sp, i), (i + 1 : U32)})
78            case 13:
79              rec.go(p, SCR{}, pk(a, len, (i + 1 : U32)), len, (i + 1 : U32), (i + 1 : U32), False{}, start.sp(sp, i))
80            case 256:
81              (a, SRow{start.sp(sp, i), i})
82            case _:
83              rec.go(p, SUnq{}, pk(a, len, (i + 1 : U32)), len, (i + 1 : U32), i, False{}, sp)
84        case SUnq{}:
85          (a, +c) = r
86          match c:
87            case 44:
88              rec.go(p, SStart{}, pk(a, len, (i + 1 : U32)), len, (i + 1 : U32), (i + 1 : U32), False{}, Span{s, i, False{}} <> sp)
89            case 10:
90              (a, SRow{Span{s, i, False{}} <> sp, (i + 1 : U32)})
91            case 13:
92              rec.go(p, SCR{}, pk(a, len, (i + 1 : U32)), len, (i + 1 : U32), (i + 1 : U32), False{}, Span{s, i, False{}} <> sp)
93            case 256:
94              (a, SRow{Span{s, i, False{}} <> sp, i})
95            case 34:
96              (a, SBad{i})
97            case _:
98              rec.go(p, SUnq{}, pk(a, len, (i + 1 : U32)), len, (i + 1 : U32), s, False{}, sp)
99        case SQ{}:
100          (a, +c) = r
101          match c:
102            case 34:
103              rec.go(p, SQQ{}, pk(a, len, (i + 1 : U32)), len, (i + 1 : U32), s, esc, sp)
104            case 256:
105              (a, SBad{i})
106            case _:
107              rec.go(p, SQ{}, pk(a, len, (i + 1 : U32)), len, (i + 1 : U32), s, esc, sp)
108        case SQQ{}:
109          (a, +c) = r
110          match c:
111            case 34:
112              rec.go(p, SQ{}, pk(a, len, (i + 1 : U32)), len, (i + 1 : U32), s, True{}, sp)
113            case 44:
114              rec.go(p, SStart{}, pk(a, len, (i + 1 : U32)), len, (i + 1 : U32), (i + 1 : U32), False{}, Span{s, (i - 1 : U32), esc} <> sp)
115            case 10:
116              (a, SRow{Span{s, (i - 1 : U32), esc} <> sp, (i + 1 : U32)})
117            case 13:
118              rec.go(p, SCR{}, pk(a, len, (i + 1 : U32)), len, (i + 1 : U32), (i + 1 : U32), False{}, Span{s, (i - 1 : U32), esc} <> sp)
119            case 256:
120              (a, SRow{Span{s, (i - 1 : U32), esc} <> sp, i})
121            case _:
122              (a, SBad{i})
123        case SCR{}:
124          (a, +c) = r
125          match c:
126            case 10:
127              (a, SRow{sp, (i + 1 : U32)})
128            case _:
129              (a, SRow{sp, i})

Uses (16)

Used by (1)