SDLUtils.mod 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. IMPLEMENTATION MODULE SDLUtils ;
  2. FROM SYSTEM IMPORT ADDRESS, ADR;
  3. FROM SDL2 IMPORT SDL_GetError;
  4. FROM SDLEvents IMPORT SDL_PollEvent, EventQuit, EventBufferBytes;
  5. FROM libc IMPORT strlen, strncpy;
  6. PROCEDURE CStrToM2 (src: ADDRESS; VAR dst: ARRAY OF CHAR);
  7. VAR n: CARDINAL;
  8. BEGIN
  9. IF HIGH(dst) < 0 THEN RETURN END;
  10. IF src = NIL THEN dst[0] := 0C; RETURN END;
  11. (* strlen returns CSIZE_T; VAL converts without range check. *)
  12. n := VAL(CARDINAL, strlen(src));
  13. IF n > HIGH(dst) THEN n := HIGH(dst) END;
  14. strncpy(ADR(dst), src, n);
  15. IF n <= HIGH(dst) THEN dst[n] := 0C END
  16. END CStrToM2;
  17. PROCEDURE GetErrorString (VAR buf: ARRAY OF CHAR);
  18. BEGIN
  19. CStrToM2(SDL_GetError(), buf)
  20. END GetErrorString;
  21. PROCEDURE DrainEvents (VAR quit: BOOLEAN);
  22. VAR
  23. buf: ARRAY [0..EventBufferBytes-1] OF CHAR;
  24. t: CARDINAL;
  25. BEGIN
  26. WHILE SDL_PollEvent(ADR(buf)) # 0 DO
  27. t := VAL(CARDINAL, ORD(buf[0]))
  28. + VAL(CARDINAL, ORD(buf[1])) * 256
  29. + VAL(CARDINAL, ORD(buf[2])) * 65536
  30. + VAL(CARDINAL, ORD(buf[3])) * 16777216;
  31. IF t = EventQuit THEN quit := TRUE END
  32. END
  33. END DrainEvents;
  34. END SDLUtils.