
(in-package #:isbn)

(defvar *isbn-group-ranges*
  (let ((ht (make-hash-table :test #'equal)))
    (setf (gethash "978" ht) '(("0" 1) ("6" nil) ("7" 1) ("80" 2) ("950" 3)
			       ("9900" 4) ("99900" 5)))
    ht)
  "Hash table containing a group range specification for each prefix.")

(defparameter *groups-without-x* "82"
  "Areas (countries) for which the control digit X is not used.")

(defvar *isbn-registrant-ranges* 
  (let ((ht (make-hash-table :test #'equal))
	(registrant-ranges 
'(("0" ("00" "200" "7000" "85000" "900000" "9500000"))
  ("1" ("00" "100" "4000" "55000" "869800" "9990000"))
  ("2" ("00" "200" "35000" "400" "700" "84000" "900000" "9500000"))
  ("3" ("00" "030" "0340" "03700" "04" "200" "7000" "85000" "900000" "9500000"))
  ("4" ("00" "200" "7000" "85000" "900000" "9500000"))
  ("5" ("00" "200" "7000" "85000" "900000" "91000" "9200" "93000" "9500" "98000" "9900000" "9910"))
  ("7" ("00" "100" "5000" "80000" "900000"))
  ("80" ("00" "200" "7000" "85000" "900000"))
  ("81" ("00" "200" "7000" "85000" "900000"))
  ("82" ("00" "200" "7000" "90000" "990000"))
  ("83" ("00" "200" "60000" "7000" "85000" "900000"))
  ("84" ("00" "200" "7000" "85000" "9000" "920000" "92400" "930000" "95000" "9700"))
  ("85" ("00" "200" "60000" "7000" "85000" "900000" "98000"))
  ("86" ("00" "300" "7000" "80000" "900000"))
  ("87" ("00" "400" "7000" "85000" "970000"))
  ("88" ("00" "200" "6000" "85000" "900000"))
  ("89" ("00" "250" "5500" "85000" "950000"))
  ("90" ("00" "200" "5000" "70000" "800000" "8500" "900000" "940000"))
  ("91" ("0" "20" "500" "7000" "85000" "970000"))
  ("92" ("0" "60" "800" "9000" "95000" "990000"))
  ("950" ("00" "500" "9000" "99000"))
  ("951" ("0" "20" "550" "8900" "95000"))
  ("952" ("00" "200" "5000" "60" "6600" "67000" "7000" "89" "9500" "99000"))
  ("953" ("0" "10" "150" "6000" "95000"))
  ("954" ("00" "300" "8000" "90000" "9300"))
  ("955" ("0" "1000" "20" "550" "8000" "95000"))
  ("956" ("00" "200" "7000"))
  ("957" ("00" "0300" "05" "2000" "21" "28000" "31" "440" "8200" "97000"))
  ("958" ("00" "600" "8000" "95000"))
  ("959" ("00" "200" "7000"))
  ("960" ("00" "200" "6600" "690" "7000" "85000"))
  ("961" ("00" "200" "6000" "90000"))
  ("962" ("00" "200" "7000" "85000" "8700" "900"))
  ("963" ("00" "200" "7000" "85000" "9000"))
  ("964" ("00" "300" "5500" "90000" "970" "9900"))
  ("965" ("00" "200" "7000" "90000"))
  ("966" ("00" "300" "7000" "90000"))
  ("967" ("0" "60" "900" "9900" "99900"))
  ("968" ("01" "400" "5000" "800"))
  ("969" ("0" "20" "400" "8000"))
  ("970" ("01" "600" "9000" "91000" "9700"))
  ("971" ("000" "02" "0300" "06" "10" "500" "8500" "91000"))
  ("972" ("0" "20" "550" "8000" "95000"))
  ("973" ("0" "20" "550" "7600" "85000" "9000" "95000"))
  ("974" ("00" "200" "7000" "85000" "90000" "9500"))
  ("975" ("00000" "01" "250" "6000" "92000" "990"))
  ("976" ("0" "40" "600" "8000" "95000"))
  ("977" ("00" "200" "5000" "700"))
  ("978" ("000" "2000" "30000" "8000" "900"))
  ("979" ("0" "20" "3000" "400" "8000" "95000"))
  ("980" ("00" "200" "6000"))
  ("981" ("00" "200" "3000"))
  ("982" ("00" "100" "70" "9000"))
  ("983" ("00" "020" "2000" "40000" "50" "800" "9000" "99000"))
  ("984" ("00" "400" "8000" "90000"))
  ("985" ("00" "400" "6000" "90000"))
  ("986" ("00" "120" "5600" "80000"))
  ("987" ("00" "1000" "20000" "30" "500" "9000" "95000"))
  ("988" ("00" "200" "8000" "97000"))
  ("989" ("0" "20" "550" "8000" "95000"))
  ("9945" ("00" "400" "8500"))
  ("9946" ("0" "20" "400" "9000"))
  ("9947" ("0" "20" "800"))
  ("9948" ("00" "400" "8500"))
  ("9949" ("0" "10" "400" "9000"))
  ("9950" ("00" "300" "8500"))
  ("9951" ("00" "400" "8500"))
  ("9952" ("0" "20" "400" "8000"))
  ("9953" ("0" "10" "400" "60" "9000"))
  ("9954" ("0" "20" "400" "8000"))
  ("9955" ("00" "400" "9300"))
  ("9956" ("0" "10" "400" "9000"))
  ("9957" ("00" "400" "8500"))
  ("9958" ("0" "10" "500" "9000"))
  ("9959" ("0" "20" "800" "9500"))
  ("9960" ("00" "600" "9000"))
  ("9961" ("0" "30" "70009500"))
  ("9962" ("00" "5500" "56" "600" "8500"))
  ("9963" ("0" "30" "550" "7500"))
  ("9964" ("0" "70" "950"))
  ("9965" ("00" "400" "9000"))
  ("9966" ("00" "7000" "750" "9600"))
  ("9967" ("00" "400" "9000"))
  ("9968" ("00" "500" "9400"))
  ("9970" ("00" "400" "9000"))
  ("9971" ("0" "60" "900" "9900"))
  ("9972" ("00" "1" "200" "2500" "30" "600" "9000"))
  ("9973" ("0" "10" "700" "9700"))
  ("9974" ("0" "30" "550" "7500" "95"))
  ("9975" ("0" "50" "900" "9500"))
  ("9976" ("0" "60" "900" "9990"))
  ("9977" ("00" "900" "9900"))
  ("9978" ("00" "300" "40" "950" "9900"))
  ("9979" ("0" "50" "760" "9000"))
  ("9980" ("0" "40" "900" "9900"))
  ("9981" ("00" "100" "1600" "20" "800" "9500"))
  ("9982" ("00" "800" "9900" "80" "950" "9900"))
  ("9984" ("00" "500" "9000"))
  ("9985" ("0" "50" "800" "9000"))
  ("9986" ("00" "400" "9000" "940" "97"))
  ("9987" ("00" "400" "8800"))
  ("9988" ("0" "30" "550" "7500"))
  ("9989" ("0" "100" "2000" "30" "600" "9500"))
  ("99901" ("00" "500" "80"))
  ("99903" ("0" "20" "900"))
  ("99904" ("0" "60" "900"))
  ("99905" ("0" "40" "800"))
  ("99906" ("0" "30" "600" "70" "9"))
  ("99908" ("0" "10" "900"))
  ("99909" ("0" "40" "950"))
  ("99910" ("0" "30" "900"))
  ("99911" ("00" "600"))
  ("99912" ("0" "500" "60" "900"))
  ("99913" ("0" "30" "600"))
  ("99914" ("0" "50" "900"))
  ("99915" ("0" "50" "800"))
  ("99916" ("0" "30" "700"))
  ("99917" ("0" "30" "900"))
  ("99918" ("0" "40" "800"))
  ("99919" ("0" "40" "900"))
  ("99920" ("0" "50" "900"))
  ("99921" ("0" "20" "700"))
  ("99921" ("8" "90"))
  ("99922" ("0" "40" "700"))
  ("99923" ("0" "20" "800"))
  ("99924" ("0" "30" "800"))
  ("99925" ("0" "40" "800"))
  ("99926" ("0" "10" "600"))
  ("99927" ("0" "30" "600"))
  ("99928" ("0" "10" "800"))
  ("99930" ("0" "50" "800"))
  ("99931" ("0" "50" "800"))
  ("99932" ("0" "10" "600" "7" "80"))
  ("99933" ("0" "30" "600"))
  ("99934" ("0" "20" "800"))
  ("99935" ("0" "30" "600" "8" "90"))
  ("99936" ("0" "10" "600"))
  ("99937" ("0" "20" "600"))
  ("99938" ("0" "30" "600"))
  ("99939" ("0" "60" "900"))
  ("99940" ("0" "10" "700"))
  ("99941" ("0" "30" "900"))
  ("99942" ("0" "50" "800"))
  ("99943" ("0" "30" "600"))
  ("99944" ("0" "50" "800"))
  ("99945" ("0" "60" "900"))
  ("99946" ("0" "30" "600"))
  ("99947" nil)
  ("99948" ("0" "50" "800"))
  ("99949" ("0" "20" "900")))))
    (loop
     for (area ranges) in registrant-ranges
     do (setf (gethash area ht)
	      (mapcar (lambda (range-start)
			(list range-start (length range-start)))
		      ranges)))
    ht)
  "Hash table containing a registrant range specification for each group.")

