BEGIN BOOL g keep going := TRUE, g fis number entering := FALSE; STRING g display str := ""; LONG REAL g ax := 0.0, g bx := 0.0; INT g binop := -1; []STRING kbd str = ("Off"," C "," 0 THEN g display str := g display str[1 : UPB g display str - 1]; ds(0, (UPB g display str = 0 | "0" | g display str), rgb(92,92,127)) FI) OUT IF rc = 3 OR rc = 7 OR rc = 11 OR rc = 15 THEN g binop := rc; IF UPB g display str > 0 THEN associate(f_handle, g display str); get(f_handle, g ax); close(f_handle) FI; g fis number entering := FALSE ELIF rc = 19 THEN IF g fis number entering THEN IF UPB g display str > 0 THEN associate(f_handle, g display str); get(f_handle, g bx); close(f_handle) FI; g fis number entering := FALSE FI; # Safety Check for Division by Zero # IF g binop = 7 AND g bx = 0.0 THEN g ax := 9.99999999999999e99 ELSE IF g binop = 3 THEN g ax *:= g bx ELIF g binop = 7 THEN g ax /:= g bx ELIF g binop = 11 THEN g ax +:= g bx ELIF g binop = 15 THEN g ax -:= g bx FI FI; LONG REAL abs ax = (g ax < 0 | -g ax | g ax); STRING res; IF abs ax = 0 THEN res := "0" ELIF abs ax >= 1e15 OR abs ax <= 1e-4 THEN res := float(g ax, -24, 14, 2) ELSE res := fixed(g ax, -24, 14) FI; INT first := 1; WHILE (first < UPB res AND (res[first] = " ")) DO first +:= 1 OD; STRING trimmed := res[first:]; INT dot pos, e pos; IF char in string(".", dot pos, trimmed) THEN IF NOT char in string("e", e pos, trimmed) THEN INT last := UPB trimmed; WHILE (last > 1 AND (trimmed[last] = "0")) DO last -:= 1 OD; IF trimmed[last] = "." THEN last -:= 1 FI; trimmed := trimmed[1:last] FI FI; g display str := trimmed; ds(0, g display str, rgb(92,92,127)) ELSE STRING raw = kbd str[rc+1]; STRING ch := ""; FOR i TO UPB raw DO IF raw[i] /= " " THEN ch +:= raw[i] FI OD; IF NOT g fis number entering THEN g display str := ch; g fis number entering := TRUE ELIF UPB g display str < 23 THEN g display str +:= ch FI; ds(0, g display str, rgb(92,92,127)) FI ESAC ); PROC draw app = VOID: ( pl("Fo 0 611 3"); pl("Fo 2 140 3"); pl("F 0 16777215"); pl("FR 0" + s(0) + s(0) + s(10000) + s(10000)); pl("F 0 12632256"); FOR rc FROM 0 TO 19 DO pl("FR 0" + s((rc MOD 4)*2000+190) + s((rc OVER 4)*1200+1190) + s(((rc MOD 4)+1)*2000+110) + s(((rc OVER 4)+1)*1200+1110)) OD; pl("F 0 986895"); FOR rc FROM 0 TO 19 DO pl("R 0" + s((rc MOD 4)*2000+200) + s((rc OVER 4)*1200+1200) + s(((rc MOD 4)+1)*2000+100) + s(((rc OVER 4)+1)*1200+1100)) OD; pl("B 0 12632256"); []STRING lyr = ("00986895", "02628095", "01015567"); FOR i TO 3 DO pl("F 0 " + lyr[i]); FOR rc FROM 0 TO 19 DO IF kbd clr[rc+1] = lyr[i] THEN pl("C$ 0" + s((rc MOD 4)*2000+1100) + s((rc OVER 4)*1200+1700) + """" + kbd str[rc+1] + """") FI OD OD; pl("F 0 255"); pl("C$ 0 5000 800""Algol cloud app"""); pl("F 2 255"); pl("C$ 2 5000 7200""Corrie Zucker Technologies LLC."""); pl("C$ 2 5000 7340""d/b/a CZ Technologies"""); pl("Z "); ds(0, (UPB g display str = 0 | "0" | g display str), rgb(92, 92, 127)) ); on logical file end (stand in, (REF FILE f) BOOL: (g keep going := FALSE; TRUE)); WHILE g keep going DO STRING buf; IF NOT (read((buf, newline)); TRUE) THEN g keep going := FALSE ELSE IF buf = "drawapp" THEN draw app ELIF buf = "QUERY_REMOTE" THEN pl("Rz 1200 900"); flush ELSE FILE input_s; INT b, x, y; associate(input_s, buf); get(input_s, (b, x, y)); close(input_s); IF x >= 0 AND b = 1 THEN INT row := (y - 1200) OVER 1200, col := (x - 200) OVER 2000; IF row >= 0 AND row < 5 AND col >= 0 AND col < 4 THEN key to exe(row * 4 + col) FI ELIF x = -2 THEN CASE b IN SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, key to exe(2), SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, key to exe(3), key to exe(11), SKIP, key to exe(15), key to exe(17), key to exe(7), key to exe(16), key to exe(12), key to exe(13), key to exe(14), key to exe(8), key to exe(9), key to exe(10), key to exe(4), key to exe(5), key to exe(6), SKIP, SKIP, SKIP, key to exe(19), SKIP, SKIP, SKIP, SKIP, SKIP, key to exe(1) OUT IF b = 79 OR b = 111 THEN key to exe(0) ELIF b = 73 OR b = 105 THEN key to exe(18) FI ESAC ELIF x = -4 THEN pl("Rz "+whole(b,0)+" "+whole(y,0)) ELIF x = -5 THEN pl("Mv "+whole(b,0)+" "+whole(y,0)) ELIF buf = "QUERY_REMOTE" THEN pl("Rz 1200 900"); flush FI FI FI OD END