/*************************************************************************** copyright : (C) 2002-2006 by Robby Stephenson email : robby@periapsis.org ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of version 2 of the GNU General Public License as * * published by the Free Software Foundation; * * * ***************************************************************************/ #ifndef ISBNVALIDATOR_H #define ISBNVALIDATOR_H #include <tqvalidator.h> namespace Tellico { /** * @author Robby Stephenson * * @see http://www.isbn.org/standards/home/isbn/international/hyphenation-instructions.asp * @see http://www.eblong.com/zarf/bookscan/ * @see http://doc.trolltech.com/qq/qq01-seriously-weird-qregexp.html */ class ISBNValidator : public TQValidator { public: ISBNValidator(TQObject* parent, const char* name=0); /** * Certain conditions are checked. Character, length and position * restrictions are checked. Certain cases where the user is deleting * characters are caught and compensated for. The string is then passed to * @ref fixup. Finally, the text is @ref Valid if it is a certain length and * @ref Intermediate if not. * * @param input The text to validate * @param pos The position of the cursor * @return The condition of the text */ virtual TQValidator::State validate(TQString& input, int& pos) const; /** * The input string is examined. Hyphens are inserted appropriately, * and the checksum is calculated. * * For correct presentation, the 10 digits of an ISBN must * be divided, by hyphens, into four parts: * @li Part 1: The country or group of countries identifier * @li Part 2: The publisher identifier * @li Part 3: The title identifier * @li Part 4: The check digit * For details * @see http://www.isbn.org/standards/home/isbn/international/hyphenation-instructions.asp * For info on group codes * @see http://www.isbn.spk-berlin.de/html/prefix/allpref.htm * For info on French language publisher codes * @see http://www.afnil.org * <pre> * Group Identifiers First Hyphen After * ----------------------------------------- * 0........7 1st digit * 80.......94 2nd " * 950......993 3rd " * 9940.....9989 4th " * 99900....99999 5th " * * Group Insert Hyphens * Identifier "0" After * ----------------------------------------- * 00.......19 1st 3rd 9th digit * 200......699 " 4th " * 7000.....8499 " 5th " * 85000....89999 " 6th " * 900000...949999 " 7th " * 9500000..9999999 " 8th " * * * Group Insert Hyphens * Identifier "1" After * ---------------------------------------- * 0........54999 illegal * 55000....86979 1st 6th 9th digit * 869800...998999 " 7th " * 9990000..9999999 " 8th " * * * Group Insert Hyphens * Identifier "2" After * ----------------------------------------- * 00.......19 1st 3rd 9th digit * 200......349 " 4th " * 34000....39999 " 6th " * 400......699 " 4th " * 7000.....8399 " 5th " * 84000....89999 " 6th " * 900000...949999 " 7th " * 9500000..9999999 " 8th " * * The position of the hyphens are determined by the publisher * prefix range established by each national agency in accordance * with the industry needs. The knowledge of the prefix ranges for * each country or group of countries is necessary to develop the * hyphenation output program. For groups 3 through 99999, the hyphenation * rules are currently unknown. So just leave out the hyphen between * the publisher and title for now, but allow it if the user inserts it. * </pre> * * @param input The raw string, hyphens included */ virtual void fixup(TQString& input) const; static void staticFixup(TQString& input); static TQString isbn10(TQString isbn13); static TQString isbn13(TQString isbn10); static TQString cleanValue(TQString isbn); private: static struct isbn_band { unsigned long MaxValue; unsigned int First; unsigned int Mid; unsigned int Last; } bands[]; TQValidator::State validate10(TQString& input, int& pos) const; TQValidator::State validate13(TQString& input, int& pos) const; static void fixup10(TQString& input); static void fixup13(TQString& input); /** * This function calculates and returns the ISBN checksum. The * algorithm is based on some code by Andrew Plotkin, available at * http://www.eblong.com/zarf/bookscan/ * * @see http://www.eblong.com/zarf/bookscan/ * * @param input The raw string, with no hyphens */ static TQChar checkSum10(const TQString& input); static TQChar checkSum13(const TQString& input); }; } // end namespace #endif