--- /dev/null
+#!/bin/sh
+exec guile -q -s "$0" "$@"
+!#
+
+;; The use of certain identifiers as variable or parameter names has
+;; been found to cause build problems on particular platforms. The
+;; aim of this test is to cause "make check" to fail (on GNU/Linux,
+;; which most Guile developers use) if we accidentally add new code
+;; that uses those identifiers.
+
+(define bad-identifiers
+ '(
+ ;; On AIX 5.2 and 5.3, /usr/include/sys/timer.h includes:
+ ;; #ifndef _LINUX_SOURCE_COMPAT
+ ;; #define func_data t_union.data
+ ;; #endif
+ ;; So we want to avoid using func_data in Guile source code.
+ "func_data"
+
+ ;; More troublesome identifiers can be added into the list here.
+ ))
+
+(use-modules (ice-9 regex) (ice-9 rdelim))
+
+(define bad-id-regexp
+ (make-regexp (string-append "\\<("
+ (string-join (map regexp-quote bad-identifiers) "|")
+ ")\\>")))
+
+(define exit-status 0)
+
+;; Non-exported code from (ice-9 ftw).
+(define (directory-files dir)
+ (let ((dir-stream (opendir dir)))
+ (let loop ((new (readdir dir-stream))
+ (acc '()))
+ (if (eof-object? new)
+ (begin
+ (closedir dir-stream)
+ acc)
+ (loop (readdir dir-stream)
+ (if (or (string=? "." new) ;;; ignore
+ (string=? ".." new)) ;;; ignore
+ acc
+ (cons (in-vicinity dir new) acc)))))))
+
+(define (directory-files-matching dir pattern)
+ (let ((file-name-regexp (make-regexp pattern)))
+ (filter (lambda (fn)
+ (regexp-exec file-name-regexp fn))
+ (directory-files dir))))
+
+(let loop ((file-names (directory-files-matching "../../libguile"
+ "\\.[ch]$")))
+ (or (null? file-names)
+ (begin
+ (with-input-from-file (car file-names)
+ (lambda ()
+ (let loop ((linenum 1) (line (read-line)))
+ (or (eof-object? line)
+ (begin
+ (if (regexp-exec bad-id-regexp line)
+ (begin
+ (set! exit-status 1)
+ (format (current-error-port)
+ "~a:~a: ~a\n"
+ (car file-names)
+ linenum
+ line)))
+ (loop (+ linenum 1) (read-line)))))))
+ (loop (cdr file-names)))))
+
+(exit exit-status)
+
+;; Local Variables:
+;; mode: scheme
+;; End: