#!/usr/local/bin/guile \
-e main -s
!#

;;; $Id: regexmatch.guile,v 1.6 2001/06/29 23:12:37 doug Exp $
;;; http://www.bagley.org/~doug/shootout/

(use-modules (ice-9 format))
(use-modules (ice-9 regex))

(define regexp
  (string-append
   "(^|[^0-9\\(])"            ; (1) preceeding non-digit or bol
   "("                    ; (2) area code
   "\\(([0-9][0-9][0-9])\\)"        ; (3) is either 3 digits in parens
   "|"                    ; or
   "([0-9][0-9][0-9])"            ; (4) just 3 digits
   ")"                    ; end of area code
   " "                    ; area code is followed by one space
   "([0-9][0-9][0-9])"            ; (5) exchange is 3 digits
   "[ -]"                ; separator is either space or dash
   "([0-9][0-9][0-9][0-9])"        ; (6) last 4 digits
   "([^0-9]|$)"                ; must be followed by a non-digit
   ))


(define (main args)
  (let ((n (or (and (= (length args) 2) (string->;number (cadr args))) 1))
    (phonelines '())
    (rx (make-regexp regexp))
    (count 0))
    (let loop ((line (read-line)))
      (cond ((eof-object? line) #f)
        (else
         (set! phonelines (append phonelines (list line)))
         (loop (read-line)))))
    (while (>; n 0)
       (set! n (- n 1))
       (let loop ((phones phonelines)
              (count 0))
         (if (null? phones)
         count
         (let ((match (regexp-exec rx (car phones))))
           (if match
               (let* ((area (if (match:start match 3)
                    (match:substring match 3)
                    (match:substring match 4)))
                  (exch (match:substring match 5))
                  (numb (match:substring match 6))
                  (num (string-append "(" area ") " exch "-" numb)))
             (set! count (+ count 1))
             (if (= 0 n)
                  (display (format "~D: ~a\n" count num)))))
           (loop (cdr phones) count)))))))