72 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Scheme
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Scheme
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env ikarus --script
 | 
						|
(define get-comments
 | 
						|
  (lambda (file-name)
 | 
						|
    (define comments '())
 | 
						|
    (parameterize ([comment-handler
 | 
						|
                    (lambda (str)
 | 
						|
                      (set! comments (cons str comments)))])
 | 
						|
      (load file-name (lambda (x) (void))))
 | 
						|
    (reverse comments)))
 | 
						|
 | 
						|
(define filter
 | 
						|
  (lambda (f ls)
 | 
						|
    (cond
 | 
						|
      [(null? ls) '()]
 | 
						|
      [(f (car ls)) (cons (car ls) (filter f (cdr ls)))]
 | 
						|
      [else (filter f (cdr ls))])))
 | 
						|
 | 
						|
(define find-end
 | 
						|
  (lambda (str i)
 | 
						|
    (cond
 | 
						|
      [(fx= i (string-length str)) i]
 | 
						|
      [(memv (string-ref str i) '(#\newline #\space #\tab)) i]
 | 
						|
      [(char=? (string-ref str i) #\:) i]
 | 
						|
      [else (find-end str (fxadd1 i))])))
 | 
						|
 | 
						|
(define matcher
 | 
						|
  (lambda (tok)
 | 
						|
    (let ([n (string-length tok)])
 | 
						|
      (lambda (str)
 | 
						|
        (let f ([i 0]) 
 | 
						|
          (let ([j (find-end str i)])
 | 
						|
            (or (string=? tok (substring str i j))
 | 
						|
                (and (fx< j (string-length str))
 | 
						|
                     (char=? (string-ref str j) #\:)
 | 
						|
                     (f (fxadd1 j))))))))))
 | 
						|
 | 
						|
(define get-matching
 | 
						|
  (lambda (token file-name)
 | 
						|
    (filter (matcher token) (get-comments file-name))))
 | 
						|
 | 
						|
#|Usage:
 | 
						|
    find.ss token files ...
 | 
						|
  Prints all the comments matching Hash-Bar-token that are found 
 | 
						|
  in the files.  |#
 | 
						|
(define usage
 | 
						|
  (lambda ()
 | 
						|
    (printf "Usage: ikarusdoc token files ...\n")
 | 
						|
    (printf " Prints all multiline comments matching #|token<comment>|# from the files\n")
 | 
						|
    (exit 0)))
 | 
						|
 | 
						|
(define print-comments
 | 
						|
  (lambda (file ls)
 | 
						|
    (unless (null? ls)
 | 
						|
      (printf "From ~a:\n" file)
 | 
						|
      (for-each 
 | 
						|
        (lambda (x)
 | 
						|
          (display x)
 | 
						|
          (newline))
 | 
						|
        ls))))
 | 
						|
 | 
						|
(let ([args (command-line-arguments)])
 | 
						|
  (when (null? args) (usage))
 | 
						|
  (let ([me (car args)] [args (cdr args)])
 | 
						|
    (when (null? args) (usage))
 | 
						|
    (let ([tok (car args)] [files (cdr args)])
 | 
						|
      (for-each
 | 
						|
        (lambda (file)
 | 
						|
          (print-comments file (get-matching tok file)))
 | 
						|
        files))))
 | 
						|
 | 
						|
;;; vim:syntax=scheme
 |