;;; R7RS-PNM --- Library for reading and writing PNM (Portable Any Map) files for R7RS ;;; Copyright © 2024 Masaya Tojo <masaya@tojo.tokyo> ;;; ;;; This file is part of R7RS-PNM. ;;; ;;; R7RS-PNM is free software: you can redistribute it and/or modify it ;;; under the terms of the GNU Lesser General Public License as published ;;; by the Free Software Foundation, either version 3 of the License, or ;;; (at your option) any later version. ;;; ;;; R7RS-PNM is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU Lesser General Public License for more details. ;;; ;;; You should have received a copy of the GNU Lesser General Public License ;;; along with R7RS-PNM. If not, see <https://www.gnu.org/licenses/>. (define-library (image-format pnm private checker) (export make-xy-checker make-value-checker make-boolean-value-checker) (import (scheme base) (scheme case-lambda) (image-format pnm image)) (begin (define (make-xy-checker width height) (lambda (x y) (when (or (not (exact-integer? x)) (< x 0) (<= width x)) (error (string-append "`x` must be an integer such that 0 <= `x` < " (number->string width)) x)) (when (and (not (exact-integer? y)) (< y 0) (<= height y)) (error (string-append "`y` must be an integer such that 0 <= `y` < " (number->string width)) y)))) (define (make-value-checker maxval sym) (define message (string-append "`" (symbol->string sym) "`" " must be an integer such that 0 < " "`" (symbol->string sym) "`" " < " (number->string maxval))) (lambda (v) (when (or (not (exact-integer? v)) (< v 0) (< maxval v)) (error message v)))) (define (make-boolean-value-checker) (lambda (v) (when (not (boolean? v)) (error "`v` must be a boolean value" v)))) (define (split-value v) (values (modulo (quotient v 256) 256) (modulo v 256))) (define (combine-values l r) (+ (* 256 l) r))))