IMPLEMENTATION MODULE SDLUtils ; FROM SYSTEM IMPORT ADDRESS, ADR; FROM SDL2 IMPORT SDL_GetError; FROM SDLEvents IMPORT SDL_PollEvent, EventQuit, EventBufferBytes; FROM libc IMPORT strlen, strncpy; PROCEDURE CStrToM2 (src: ADDRESS; VAR dst: ARRAY OF CHAR); VAR n: CARDINAL; BEGIN IF HIGH(dst) < 0 THEN RETURN END; IF src = NIL THEN dst[0] := 0C; RETURN END; (* strlen returns CSIZE_T; VAL converts without range check. *) n := VAL(CARDINAL, strlen(src)); IF n > HIGH(dst) THEN n := HIGH(dst) END; strncpy(ADR(dst), src, n); IF n <= HIGH(dst) THEN dst[n] := 0C END END CStrToM2; PROCEDURE GetErrorString (VAR buf: ARRAY OF CHAR); BEGIN CStrToM2(SDL_GetError(), buf) END GetErrorString; PROCEDURE DrainEvents (VAR quit: BOOLEAN); VAR buf: ARRAY [0..EventBufferBytes-1] OF CHAR; t: CARDINAL; BEGIN WHILE SDL_PollEvent(ADR(buf)) # 0 DO t := VAL(CARDINAL, ORD(buf[0])) + VAL(CARDINAL, ORD(buf[1])) * 256 + VAL(CARDINAL, ORD(buf[2])) * 65536 + VAL(CARDINAL, ORD(buf[3])) * 16777216; IF t = EventQuit THEN quit := TRUE END END END DrainEvents; END SDLUtils.