#LyX 1.1 created this file. For more info see http://www.lyx.org/
\lyxformat 218
\textclass article
\begin_preamble
\usepackage[T1]{fontenc}
\usepackage{xspace}
\newcommand{\nach}{$\to$\xspace}
\newcommand{\hoch}{\texttt{$^\wedge$}}
\usepackage{html}
\newcommand{\doubledash}{-\hspace{0.1em}-}
\newcommand{\doubledashb}{-\/-}
\newcommand{\dlt}{{\footnotesize$\ll$}}
\newcommand{\dgt}{{\footnotesize$\gg$}}
\begin{htmlonly}
\renewenvironment{lyxcode}
{\begin{list}{}{
\setlength{\rightmargin}{\leftmargin}
\raggedright
\setlength{\itemsep}{0pt}
\setlength{\parsep}{0pt}
\ttfamily}%
\item[]
\begin{ttfamily}}
{\end{ttfamily}
\end{list} }
\newenvironment{LyXParagraphIndent}[1]%
{\begin{quote}}
{\end{quote}}
\renewcommand{\LyX}{LyX}
\renewcommand{\doubledash}{\rawhtml --\endrawhtml}
\renewcommand{\doubledashb}{\rawhtml --\endrawhtml}
\renewcommand{\dlt}{«}
\renewcommand{\dgt}{»}
\renewcommand{\nach}{\rawhtml to \endrawhtml}
\renewcommand{\hoch}{\rawhtml ^\endrawhtml}
\end{htmlonly}
\end_preamble
\language english
\inputencoding auto
\fontscheme default
\graphics default
\paperfontsize 11
\spacing single
\papersize Default
\paperpackage a4
\use_geometry 0
\use_amsmath 0
\paperorientation portrait
\secnumdepth 3
\tocdepth 3
\paragraph_separation skip
\defskip medskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle default
\layout Title
Aspell Devel Docs
\layout Author
Copyright (c) 2002
\newline
Kevin Atkinson
\newline
kevina@gnu.org
\layout Standard
\begin_inset LatexCommand \tableofcontents{}
\end_inset
\layout Section*
Notes
\layout Standard
This manual is designed for those who which to developer Aspell.
It is currently very sketchy.
However, it should improve over time.
The latest version of this document can be found at
\begin_inset LatexCommand \url{http://savannah.gnu.org/download/aspell/manual/devel/devel.html}
\end_inset
.
\layout Standard
The eventual goal is to convert this manual into Texinfo.
However, since I do not have the time to learn Texinfo right now, I decided
to use something I am already conferable with.
Once someone goes through the trouble of converting it into Texinfo I will
maintain the Texinfo version.
\layout Section*
Copyright
\layout Standard
Copyright (c) 2002 Kevin Atkinson.
Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation License, Version 1.1 or any later
version published by the Free Software Foundation; with no Invariant Sections,
no Front-Cover Texts.
and no Back-Cover Texts.
A copy of the license is included in the section entitled "GNU Free Documentati
on License".
\layout Section
Style Guidelines
\layout Standard
As far as coding styles go I am really not that picky.
The important thing is to stay consistent.
However, please what ever you do, do not indent with more than 4 characters
as I find indenting with more than that extremely difficult to read as
most of the code ends up on the right side of the window.
\layout Section
C++ Standard Library
\layout Standard
The C++ Standard library is not used directly except under very specific
circumstances.
The string class and the STL is used indirectly though wrapper classes
and all I/O is done using the standard C library with light right helper
classes to make using C I/O a bit more C++ like.
\layout Standard
However the new, new[], delete and delete[] operates are used to allocated
memory when appropriate.
\layout Section
Templates
\layout Standard
Templates are used in Aspell when there is a clear advantage to doing so.
When ever you use templates please use them carefully and try very hard
not to create code bloat by generating a lot of unnecessary, and duplicate
code.
\layout Section
Error Handling
\layout Standard
Exceptions are not used in Aspell as I find them more trouble than they
are worth.
Instead an alternate method of error handling is used which is based around
the PosibErr class.
PosibErr is a special Error handling device that will make sure that an
error is properly handled.
It is defined in
\begin_inset Quotes eld
\end_inset
posib_err.hpp
\begin_inset Quotes erd
\end_inset
.
PosibErr is expected to be used as the return type of the function It will
automatically convert to the "normal" return type however if the normal
returned type is accessed and there is an "unhandled" error condition it
will abort It will also abort if the object is destroyed with an "unhandled"
error condition.
This includes ignoring the return type of a function returning an error
condition.
An error condition is handled by simply checking for the presence of an
error, calling ignore, or taking ownership of the error.
\layout Standard
The PosibErr class is used extensively though out Aspell.
Please refer to the Aspell source for examples of using PosibErr until
better documentation is written.
\layout Section
Source Code Layout
\layout Description
common/ Common code used by all parts of Aspell
\layout Description
lib/ Library code used only by the actual Aspell library
\layout Description
data/ Data files used by Aspell
\layout Description
modules/ Aspell modules which are eventually meant to be pluggable
\begin_deeper
\layout Description
speller/
\begin_deeper
\layout Description
default/ Main speller Module.
\end_deeper
\layout Description
filter/
\layout Description
tokenizer/
\end_deeper
\layout Description
auto/ Scripts and data files to automatically generate code used by Aspell
\layout Description
interface/ Header files and such that external programs should use when
in order to use the Aspell library.
\begin_deeper
\layout Description
cc/ The external
\begin_inset Quotes eld
\end_inset
C
\begin_inset Quotes erd
\end_inset
interface that programs should be using when they wish to use Aspell.
\end_deeper
\layout Description
prog/ Actual programs based on the Aspell library.
The main
\begin_inset Quotes eld
\end_inset
aspell
\begin_inset Quotes erd
\end_inset
utility is included here.
\layout Description
scripts/ Misc.
scripts used by Aspell
\layout Description
manual/
\layout Description
examples/ Example programs demonstrating the use of the Aspell library
\layout Section
Strings
\layout Subsection
String
\layout Standard
The String class provided the same functionally of the C++ string except
for fewer constructors.
It also inherits OStream so that you can write to it with the
\begin_inset Quotes eld
\end_inset
<
\latex latex
\backslash
/
\latex default
<
\begin_inset Quotes erd
\end_inset
operator.
It is defined in
\begin_inset Quotes eld
\end_inset
string.hpp
\begin_inset Quotes erd
\end_inset
.
\layout Subsection
ParmString
\layout Standard
ParmString is a special string class that is designed to be used as a parameter
for a function that is expecting a string.
It is defined in
\begin_inset Quotes eld
\end_inset
parm_sting.hpp
\begin_inset Quotes erd
\end_inset
.
It will allow either a "const char *" or "String" class to be passed in.
It will automatically convert to a "const char *".
The string can also be accesses via the "str" method.
Usage example:
\layout LyX-Code
void foo(ParmString s1, ParmString s2) {
\newline
const char * str0 = s1;
\newline
unsigned int size0 = s2.size()
\newline
if (s1 == s2 || s2 == "bar") {
\newline
...
\newline
}
\newline
}
\newline
...
\newline
String s1 = "...";
\newline
foo(s1);
\newline
const char * s2 = "...";
\newline
foo(s2);
\layout Standard
This class should be used when a string is being passed in as a parameter.
It is faster than using
\begin_inset Quotes eld
\end_inset
const String &
\begin_inset Quotes erd
\end_inset
(as that will create an unnecessary temporary when a const char * is passed
in), and is less annoying than using
\begin_inset Quotes eld
\end_inset
const char *
\begin_inset Quotes erd
\end_inset
(as it doesn't require the c_str() method to be used when a String is passed
in).
\layout Subsection
CharVector
\layout Standard
A character vector is basically a Vector but it has a few additional
methods for dealing with strings which Vector does not provide.
It, like String, is also inherits OStream so that you can write to it with
the
\begin_inset Quotes eld
\end_inset
<
\latex latex
\backslash
/
\latex default
<
\begin_inset Quotes erd
\end_inset
operator.
It is defined in
\begin_inset Quotes eld
\end_inset
char_vector.hpp
\begin_inset Quotes erd
\end_inset
.
Use it when ever you need a string which is guaranteed to be in a continuous
block of memory which you can write to.
\layout Section
Smart Pointers
\layout Standard
Smart pointers are used extensively in Aspell to avoid simplify memory managemen
t tasks and to avoid memory leaks.
\layout Subsection
CopyPtr
\layout Standard
The CopyPtr class makes a deep copy of an object when ever it is copied.
The CopyPtr class is defined in
\begin_inset Quotes eld
\end_inset
copy_ptr.hpp
\begin_inset Quotes erd
\end_inset
.
This header should be included where ever CopyPtr is used.
The complete definition of the object CopyPtr is pointing to does not need
to be defined at this point.
The implementation is defined in
\begin_inset Quotes eld
\end_inset
copy_ptr-t.hpp
\begin_inset Quotes erd
\end_inset
.
The implementation header file should be included at a point in your code
where the class CopyPtr is pointing to is completely defined.
\layout Subsection
ClonePtr
\layout Standard
ClonePtr is like copy pointer except the clone() method is used instead
of the copy constructor to make copies of an object.
If is defined in
\begin_inset Quotes eld
\end_inset
clone_ptr.hpp
\begin_inset Quotes erd
\end_inset
and implemented in
\begin_inset Quotes eld
\end_inset
clone_ptr-t.hpp
\begin_inset Quotes erd
\end_inset
.
\layout Subsection
StackPtr
\layout Standard
A StackPtr is designed to be used when ever the only pointer to a new object
allocated with
\series bold
new
\series default
is on the stack.
It is similar to the standard C++ auto_ptr but the semantics are a bit
different.
It is defined in
\begin_inset Quotes eld
\end_inset
stack_ptr.hpp
\begin_inset Quotes erd
\end_inset
unlike CopyPtr of ClonePtr it is defined and implemented in this header
file.
\layout Subsection
GenericCopyPtr
\layout Standard
A generalized version of CopyPtr and ClonePtr which the two are based on.
It is defined in
\begin_inset Quotes eld
\end_inset
generic_copy_ptr.hpp
\begin_inset Quotes erd
\end_inset
and implemented in
\begin_inset Quotes eld
\end_inset
generic_copy_ptr-t.hpp
\begin_inset Quotes erd
\end_inset
.
\layout Section
I/O
\layout Standard
Aspell does not use C++ I/O classes and function in any way since they do
not provide a way to get at the underlying file number and can often be
slower than the highly tuned C I/O functions found in the standard C library.
However, some light weight wrapper classes are provided so that standard
C I/O can be used in a more C++ like way.
\layout Subsection
IStream/OStream
\layout Standard
These two base classes mimic some of the functionally of the C++ functionally
of the corresponding classes.
They are defined in
\begin_inset Quotes eld
\end_inset
istream.hpp
\begin_inset Quotes erd
\end_inset
and
\begin_inset Quotes eld
\end_inset
ostream.hpp
\begin_inset Quotes erd
\end_inset
respectfully.
They are however based on standard C I/O and are not proper C++ streams.
\layout Subsection
FStream
\layout Standard
Defined in
\begin_inset Quotes eld
\end_inset
fstream.hpp
\begin_inset Quotes erd
\end_inset
\layout Subsection
Standard Streams
\layout Standard
CIN/COUT/CERR.
Defined in
\begin_inset Quotes eld
\end_inset
iostream.hpp
\begin_inset Quotes erd
\end_inset
.
\layout Section
Config Class
\layout Standard
The Config class is used to hold configuration information.
It has a set of keys which it will except.
Inserting or even trying to look at a key that it does not know will produce
an error.
It is defined in
\begin_inset Quotes eld
\end_inset
common/config.hpp
\begin_inset Quotes erd
\end_inset
\layout Section
Filter Interface
\layout Subsection
Overview
\layout Standard
In Aspell there are 5 types of filters:
\layout Enumerate
\series bold
Decoders
\series default
which take input in some standard format such as iso8859-1 or UTF-8 and
convert it into a string of FilterChars.
\layout Enumerate
\series bold
Decoding filters
\series default
which manipulates a string of FilterChars by decoding the text is some
way such as converting SGML character into its Unicode value.
\layout Enumerate
\series bold
True filters
\series default
which manipulates a string of FilterChars to make it more suitable for
spell checking.
These filers generally blank out text which should not be spell checked
\layout Enumerate
\series bold
Encoding filters
\series default
which manipulates a string of FilterChars by encoding the text is some
way such as converting certain Unicode characters to SGML characters.
\layout Enumerate
\series bold
Encoders
\series default
which take a string of FilterChars and convert into a standard format such
as iso8859-1 or UTF-8
\layout Standard
Which types of filters are used depends on the situation
\layout Enumerate
When
\series bold
decoding words
\series default
for spell checking:
\begin_deeper
\layout Itemize
The
\series bold
decoder
\series default
to convert from a standard format
\layout Itemize
The
\series bold
decoding filter
\series default
to perform high level decoding if necessary
\layout Itemize
The
\series bold
encoder
\series default
to convert into an internal format used by the speller module
\end_deeper
\layout Itemize
When
\series bold
checking a document
\begin_deeper
\layout Itemize
The
\series bold
decoder
\series default
to convert from a standard format
\layout Itemize
The
\series bold
decoding filter
\series default
to perform high level decoding if necessary
\layout Itemize
A
\series bold
true filter
\series default
to filter out parts of the document which should not be spell checked
\layout Itemize
The
\series bold
encoder
\series default
to convert into an internal format used by the speller module
\end_deeper
\layout Enumerate
When
\series bold
encoding words
\series default
such as those returned for suggestions:
\begin_deeper
\layout Itemize
The
\series bold
decoder
\series default
to convert from the internal format used by the speller module
\layout Itemize
The
\series bold
encoding filter
\series default
to perform high level encodings if necessary
\layout Itemize
The
\series bold
encoder
\series default
to convert into a standard format
\end_deeper
\layout Standard
A FilterChar is a struct defined in
\begin_inset Quotes eld
\end_inset
common/filter_char.hpp
\begin_inset Quotes erd
\end_inset
which contains two members, a character, and a width.
Its purpose is to keep track of the width of the character in the original
format.
This is important because when a misspelled word is found the exact location
of the word needs to be returned to the application so that it can highlight
it for the user.
For example if the filters translated this:
\layout LyX-Code
Mr.
foo said "I hate my namme".
\layout Standard
to this
\layout LyX-Code
Mr.
foo said "I hate my namme".
\layout Standard
without keeping track of the original width of the characters the application
will likely highlight
\begin_inset Quotes eld
\end_inset
e my
\begin_inset Quotes erd
\end_inset
as the misspelling because the spell checker will return 25 as the offset
instead of 30.
However with keeping track of the width using FilterChar the spell checker
will now that the real position it 30 since the quote is really 6 characters
wide.
In particular the text will be annotated something like the following:
\layout LyX-Code
1111111111111611111111111111161
\newline
Mr.
foo said "I hate my namme".
\layout Standard
The standard
\series bold
encoder
\series default
and
\series bold
decoder
\series default
filters are defined in
\begin_inset Quotes eld
\end_inset
common/convert.cpp
\begin_inset Quotes erd
\end_inset
.
There should generally not be any need to deal with them so they will not
be discussed here.
The other three filters, the
\series bold
encoding filter
\series default
, the
\series bold
true filter
\series default
, and the
\series bold
decoding filter
\series default
, are all defined the exact same way; they are inherited from the IndividualFilt
er class.
\layout Subsection
Adding a New Filter
\layout Standard
To add a new filter create a new file in the modules/filter directory, the
file should be a C++ file and end in
\begin_inset Quotes eld
\end_inset
.cpp
\begin_inset Quotes erd
\end_inset
.
The file should contain a new filter class inherited from IndividualFilter,
a function to return a new filter, and an optional KeyInfo array for adding
options to control the behavior of the filter.
The file then needs to be added to Makefile.am so that the build system
knows about the filter and lib/new_filter.cpp must be modified so that Aspell
knows about the filter.
\layout Subsection
IndividualFilter class
\layout Standard
All filters are required to inherit from the IndividualFilter class found
in
\begin_inset Quotes eld
\end_inset
indiv_filter.hpp
\begin_inset Quotes erd
\end_inset
.
See that file for more details and the other filter modules for examples
of how it is used.
\layout Subsection
Constructor Function
\layout Standard
After the class is created a function must to created which will return
a new filter allocated with
\series bold
new
\series default
.
The function must have the following prototype:
\layout LyX-Code
IndividualFilter * new_<>
\layout Standard
Filters are defined in groups where each group contains an
\series bold
encoding filter
\series default
, a
\series bold
true filter
\series default
, and a
\series bold
decoding filter
\series default
.
Only one of them is required to be defined, however they all need a separate
constructor function.
\layout Subsection
Config Options
\layout Standard
A filter group may have any number of options associated with it as long
as they all start with the filter name.
See the TeX and SGML filter for examples of what to do and
\begin_inset Quotes eld
\end_inset
config.hpp
\begin_inset Quotes erd
\end_inset
for the definition of the KeyInfo struct.
\layout Subsection
Makefile Modifications
\layout Standard
After the new file is created simply add the file to the
\begin_inset Quotes eld
\end_inset
libaspell_filter_standard_la_SOURCES
\begin_inset Quotes erd
\end_inset
line in
\begin_inset Quotes eld
\end_inset
modules/filter/Makefile.am
\begin_inset Quotes erd
\end_inset
so that the build system knows about it.
\layout Subsection
New_filter Modifications
\layout Standard
Finally modify
\begin_inset Quotes eld
\end_inset
lib/new_filter.cpp
\begin_inset Quotes erd
\end_inset
so that Aspell knows about the new filter.
Follow the example there for the other filter modules.
The filter_modules array should only be modified if there your filter has
config options.
\layout Section
Data Structures
\layout Standard
When ever possible you should try to use on of the data structures available.
If the data structures do not provide enough functionally for your needs
you should consider enhancing them rather than written something from scratch.
\layout Subsection
Vector
\layout Standard
The vector class is defined in
\begin_inset Quotes eld
\end_inset
vector.hpp
\begin_inset Quotes erd
\end_inset
and works the same way as the standard STL vector does except that it doesn't
have as many constructors.
\layout Subsection
BasicList
\layout Standard
BasicList is a simple list structure which can either be implemented as
a singly or doubly linked list.
It is defined in
\begin_inset Quotes eld
\end_inset
basic_list.hpp
\begin_inset Quotes erd
\end_inset
.
\layout Subsection
StringMap
\layout Standard
StringMap is a associative array for strings.
You should try to use this when ever possible to avoid code bloat.
It is defined in
\begin_inset Quotes eld
\end_inset
string_map.hpp
\begin_inset Quotes erd
\end_inset
\layout Subsection
Hash Tables
\layout Standard
Several hash tables are provided when StringMap is not appropriate.
These hash tables provide a hash_set, hash_multiset, hash_map and hash_multimap
which are very similar to SGI STL's implementation with a few exceptions.
It is defined in
\begin_inset Quotes eld
\end_inset
hash.hpp
\begin_inset Quotes erd
\end_inset
\layout Subsection
BlockSList
\layout Standard
BlockSList provided a pool of nodes which can be used for singly linked
lists.
It is defined in
\begin_inset Quotes eld
\end_inset
block_slist.hpp
\begin_inset Quotes erd
\end_inset
.
\layout Section
Mk-Src Script
\layout Standard
A good deal of interface code is automatically generated by the
\begin_inset Quotes eld
\end_inset
mk-src.pl
\begin_inset Quotes erd
\end_inset
Perl script.
I am doing it this way to avoid having to write a lot of relative code
for the C++ interface.
This should also make adding interface for other languages a lot less tedious
and will allow the interface to automatically take advantage of new Aspell
functionality as it is made available.
The
\begin_inset Quotes eld
\end_inset
mk-src.pl
\begin_inset Quotes erd
\end_inset
script uses
\begin_inset Quotes eld
\end_inset
mk-src.in
\begin_inset Quotes erd
\end_inset
as its input.
\layout Standard
((MKSRC))
\layout Standard
((FDL))
\the_end