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.
tdeedu/kiten/dict.h

207 lines
5.0 KiB

/**
This file is part of Kiten, a KDE Japanese Reference Tool...
Copyright (C) 2001 Jason Katz-Brown <jason@katzbrown.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
**/
#ifndef DICT_H
#define DICT_H
#include <qfile.h>
#include <qmemarray.h>
#include <qptrlist.h>
#include <qregexp.h>
#include <qstringlist.h>
#include <sys/types.h>
#ifdef __osf__
typedef unsigned int uint32_t;
typedef int int32_t;
#else
#include <inttypes.h>
#endif
namespace Dict
{
enum TextType { Text_Kanji, Text_Kana, Text_Latin };
// returns the TextType of the first part of the text
KDE_EXPORT TextType textType(const QString &text);
// File needs to be able to give out Arrays based on its mmap'd data.
// But, we don't want the users of the arrays to have to remember to
// resetRawData() after using them, since that's bound to fail sooner or later.
//
// This class handles it for us.
template<class T> class Array : public QMemArray<T>
{
public:
Array(T *, int);
virtual ~Array();
private:
T *data;
int dataSize;
};
template<class T> Array<T>::Array(T *d, int s)
: QMemArray<T>()
, data(d)
, dataSize(s)
{
setRawData(data, dataSize / sizeof(T));
}
template<class T> Array<T>::~Array()
{
resetRawData(data, dataSize / sizeof(T));
}
// File manages all the files, pointers, and memory management associated
// with a single dictionary.
class File
{
public:
File(QString path, QString name);
~File();
QString name(void);
Array<const unsigned char> dict(void);
Array<const uint32_t> index(void);
int dictLength(void);
int indexLength(void);
// replacement for exceptions thrown in the constructor
bool isValid(void);
unsigned char lookup(unsigned i, int offset);
QCString lookup(unsigned i);
private:
QString myName;
QFile dictFile;
const unsigned char * dictPtr;
QFile indexFile;
const uint32_t * indexPtr;
bool valid;
};
class KDE_EXPORT Entry
{
public:
// EDict ctor
Entry(const QString &, const QString &, const QStringList &);
// Kanjidict ctor
Entry(const QString &, QStringList &, QStringList &, unsigned int grade, unsigned int freq, unsigned int strokes, unsigned int miscount);
// default (for containers)
Entry(const QString & = QString::null);
// for a heading
Entry(const QString &, bool header);
QString dictName();
QString header();
QStringList meanings();
QStringList readings();
QString firstReading();
bool kanaOnly();
QString kanji();
bool extendedKanjiInfo();
unsigned int grade();
unsigned int strokes();
unsigned int miscount();
unsigned int freq();
protected:
QString DictName;
QString Header;
QStringList Meanings;
QString Kanji;
bool KanaOnly;
QStringList Readings;
bool ExtendedKanjiInfo;
unsigned int Grade;
unsigned int Strokes;
unsigned int Miscount;
unsigned int Freq;
};
struct SearchResult
{
QValueList<Entry> list;
QStringList results;
int count, outOf;
bool common;
QString text;
};
enum SearchType { Search_Beginning, Search_FullWord, Search_Anywhere };
enum DictionaryType { Edict, Kanjidict };
class KDE_EXPORT Index : public QObject
{
Q_OBJECT
public:
Index();
virtual ~Index();
void setDictList(const QStringList &files, const QStringList &names);
void setKanjiDictList(const QStringList &files, const QStringList &names);
SearchResult search(QRegExp, const QString &, bool common);
SearchResult searchKanji(QRegExp, const QString &, bool common);
SearchResult searchPrevious(QRegExp, const QString &, SearchResult, bool common);
// convenience function to create suitable regexps
static QRegExp createRegExp(SearchType type, const QString &text, DictionaryType dictionaryType, bool caseSensitive = false);
private:
QPtrList<File> dictFiles;
QPtrList<File> kanjiDictFiles;
void loadDictList(QPtrList<File> &fileList, const QStringList &dictList, const QStringList &dictNameList);
QStringList doSearch(File &, const QString &);
SearchResult scanResults(QRegExp regexp, QStringList results, bool common);
SearchResult scanKanjiResults(QRegExp regexp, QStringList results, bool common);
int stringCompare(File &, int index, QCString);
};
// lotsa helper functions
KDE_EXPORT QString prettyKanjiReading(QStringList);
KDE_EXPORT QString prettyMeaning(QStringList);
KDE_EXPORT Entry parse(const QString &);
KDE_EXPORT Entry kanjiParse(const QString &);
KDE_EXPORT Dict::Entry firstEntry(Dict::SearchResult);
KDE_EXPORT QString firstEntryText(Dict::SearchResult);
int eucStringCompare(const char *str1, const char *str2);
bool isEUC(unsigned char c);
}
#endif