(define (valid-utf8? s) (or (let ((len (string-length s))) ; Try to validate as an ascii string first. Its essentially ; free, doesn't generate garbage and is many, many times ; faster than the general purpose validator. (define-external ws_utlen int len) (define-external ws_uts scheme-pointer s) (= 1 ((foreign-lambda* int () " size_t i; for (i = ws_utlen; i != 0; --i) { if (*((unsigned char*)ws_uts++) > 127) { C_return(0); } } C_return(1); ")))) (parse utf8-string (->parser-input s))))