GET "DK1:[100,10]BCPLIB.GET" LET MAKESTREAM(OPEN, T, STRING) = VALOF $( LET S = HEAP(STREAMSIZE) LET C = ANALYZE(STRING) LET DATASET = PARSEOUTPUT(C,0) LET LINE = HEAP(BUFFERSIZE) S%FILE := OPEN(DATASET,0,BUFFERSIZE) S%BUFFER := LINE S%ENDED := FALSE S%POINTER := 0 S%TRANSFER := T S%ENDOF := ENDOFFILE UNHEAP(C) RESULTIS S $) AND FINDINPUT(STRING) = MAKESTREAM(OPENINPUT, READREC, STRING) AND CREATEOUTPUT(STRING) = MAKESTREAM(OPENOUTPUT, WRITEREC, STRING) AND READC() = VALOF $( LET LINE = INPUT%BUFFER AND NEXT = INPUT%POINTER+1 IF NEXT=1 $( LET F = INPUT%FILE IF INPUT%ENDED RESULTIS EOFCH (INPUT%TRANSFER)(F, LINE) UNPACKSTRING(LINE,LINE) IF (ENDOF%INPUT)(F) $( INPUT%ENDED := TRUE; RESULTIS EOFCH $) UNPACKSTRING(LINE, LINE) $) INPUT%POINTER := NEXT IF NEXT > LINE%0 $( INPUT%POINTER := 0; RESULTIS '*N' $) RESULTIS LINE%NEXT $) AND WRITEC(CH) BE $( LET LINE = OUTPUT%BUFFER AND NEXT = OUTPUT%POINTER+1 TEST CH = '*N' THEN $( LINE%0 := OUTPUT%POINTER PACKSTRING(LINE, LINE) (OUTPUT%TRANSFER)(OUTPUT%FILE, LINE) OUTPUT%POINTER := 0 $) OR $( IF NEXT > BUFFERSIZE $( WRITEC('*N'); NEXT := 1 $) OUTPUT%POINTER := NEXT LINE%NEXT := CH $) $) AND ENDREAD(STREAM) BE $( CLOSE(STREAM%FILE) UNHEAP(STREAM%BUFFER) UNHEAP(STREAM) $) AND ENDWRITE(STREAM) BE $( UNLESS STREAM%POINTER = 0 $( LET O = OUTPUT OUTPUT := STREAM WRITEC('*N') OUTPUT := O $) ENDREAD(STREAM) $) AND READN() = VALOF $( LET S, N, C = 1, 0, 0 UNTIL '0' LE C LE '9' $( C := READC(); IF C='-' S := -S $) WHILE '0' LE C LE '9' $( N := 10*N+C-'0'; C := READC() $) RESULTIS S*N $) AND READO() = VALOF $( LET N, C = 0, 0 UNTIL '0' LE C LE '7' C := READC() WHILE '0' LE C LE '7' $( N := 8*N+C-'0'; C := READC() $) RESULTIS N $) AND WRITED(N, D) BE $( STATIC $( NEGATIVE=0 $) LET W(N, D) BE TEST N > 9 THEN $( W(N/10, D-1); WRITEC(N REM 10+'0') $) OR $( FOR I=2 TO D WRITEC('*S') IF NEGATIVE WRITEC('-') WRITEC(N+'0') $) NEGATIVE := N<0 TEST NEGATIVE THEN TEST N=-N THEN $( FOR I=7 TO D WRITEC('*S'); WRITES("-32768") $) OR W(-N, D-1) OR W(N, D) $) AND WRITES(S) BE $( LET V = VEC 128 UNPACKSTRING(S, V) FOR I=1 TO V%0 WRITEC(V%I) $) AND WRITEN(N) BE WRITED(N, 0) AND WRITEOCT(N,D) BE TEST 0 <= N <= 7 THEN $( FOR I=2 TO D WRITEC('0') WRITEC(N+'0') $) OR $( WRITEOCT(N>>3,D-1) WRITEC((N&7)+'0') $) AND WRITEO(N) BE WRITEOCT(N,0) AND NEWLINE() BE WRITEC('*N') AND WRITEF(S,A,B,C,D,E,F,G,H,I,J) BE $( LET V = VEC 128 LET PARAM, J = LV S, 1 UNPACKSTRING(S, V) FOR I=1 TO V%0 $( LET C = V%I TEST C = '%' THEN $( LET VAL = PARAM%J I, J := I+1, J+1 SWITCHON V%I INTO $( CASE 'C': WRITEC(VAL); ENDCASE CASE 'N': WRITEN(VAL); ENDCASE CASE 'O': WRITEO(VAL); ENDCASE CASE 'S': WRITES(VAL); ENDCASE CASE 'D': I := I+1; WRITED(VAL, V%I-'0'); ENDCASE DEFAULT: J := J-1; WRITEC(V%I) $) $) OR WRITEC(C) $) $) AND BACKSPACE() = VALOF $( LET P = INPUT%POINTER AND LINE = INPUT%BUFFER IF INPUT%ENDED RESULTIS EOFCH IF P = 0 $( INPUT%POINTER := LINE%0; RESULTIS '*N' $) INPUT%POINTER := P-1 RESULTIS LINE%P $) INPUT: OUTPUT: .