You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tellico/src/isbnvalidator.h

149 lines
5.4 KiB

/***************************************************************************
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