/ ;+ ; fields - returns fields delimitted by lots of things ; ; input string and address of pointer array, returns n pointers and value n ; ; fields are separated by: ; whitespace ; comma ; slash ; back slash ; colon ; fields can be quoted as follows: ; {...} ; ^x...x ; "..." ; '...' ; ; the separators can be equated to garbage (-1 is ok) to cancel their ; meanings. ;- PROGRAM fields setlab fld ; slash='/ ; comma=', ; colon=': ; bslash='\ ; space=40 ; tab=11 ; lbrace='{ ; rbrace='} ; uparrow='^ ; dquote='" ; squote='' AUTO n ;buf[100.] e%s r0 10 FUNCTION fields[in,out] clr n(r5) mov in(r5),r4 mov out(r5),r3 DO FOREVER call skip IF r0 = #0 RET n FI call field inc n(r5) OD skip: DO FOREVER call getc IF r0 = #0 rts pc FI BREAK IF r0 NE #space AND r0 NE #tab OD rts pc getc: movb (r4)+,r0 IF EQ dec r4 FI rts pc field: SELECT CASE r0 of CASE #uparrow call arrow BREAK CASE #LBRACE call brace BREAK CASE #dquote OR CASE #squote call quote BREAK DEFAULT call fld ESAC rts pc arrow: call getc IF r0 = #0 mov r4,(r3)+ rts pc FI quote: mov r0,r1 mov r4,(r3)+ DO FOREVER call getc BREAK IF r0 = #0 IF r0 = r1 clrb -1(r4) BREAK FI OD call skipt rts pc brace: mov r4,(r3)+ mov #1,r2 DO FOREVER call getc SELECT CASE r0 of CASE #lbrace inc r2 BREAK CASE #rbrace dec r2 IF r2 LE #0 clrb -1(r4) jmp brace1 FI CASE #0 jmp brace1 ESAC OD brace1: call skipt rts pc fld: dec r4 mov r4,(r3)+ DO FOREVER call getc SELECT CASE r0 of CASE #comma OR CASE #colon OR CASE #slash OR CASE #bslash clrb -1(r4) rts pc CASE #space OR CASE #tab clrb -1(r4) call skipt dec r4 rts pc CASE #0 rts pc ESAC OD skipt: call skip SELECT case r0 of CASE #comma OR CASE #colon OR CASE #slash OR CASE #bslash OR CASE #0 BREAK DEFAULT dec r4 ESAC rts pc .end