/ ;+ ; 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 fld .title fields .ident /11oct/ ; slash='/ ; comma=', ; colon=': ; bslash='\ ; space=40 ; tab=11 ; lbrace='{ ; rbrace='} ; uparrow='^ ; dquote='" ; squote='' ; AUTO f[20.] buf[100.] ; FUNCTION main[argc,argv] ; LET r4 = fields[.argv[#1],&f] ; DEC r4 ; LOOP for r3 = #0 TO r4 ; PRINTF &buf "fld %d = -%s-" r3 .f[r3] ; NEXT r3 ; RET AUTO n ;buf[100.] FUNCTION fields[in,out] clr n(r5) ; PRINTF &buf "enter with -%s-" in mov in(r5),r4 mov out(r5),r3 DO FOREVER call skip IF r0 = #0 RET n FI call field call skipt 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 ; PRINTF &buf "getc=%c (%o)" r0 r0 rts pc field: ; PRINTF &buf "field with %c %o" r0 r0 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: ; TTY call getc IF r0 = #0 mov r4,(r3)+ rts pc FI quote: mov r0,r1 ; PRINTF &buf "quote with %c %o" r1 r1 mov r4,(r3)+ DO FOREVER call getc BREAK IF r0 = #0 IF r0 = r1 clrb -1(r4) BREAK FI OD rts pc brace: ; TTY 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) rts pc FI CASE #0 rts pc ESAC OD fld: ; TTY 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) 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