michael@0: /* GRAPHITE2 LICENSING michael@0: michael@0: Copyright 2013, SIL International michael@0: All rights reserved. michael@0: michael@0: This library is free software; you can redistribute it and/or modify michael@0: it under the terms of the GNU Lesser General Public License as published michael@0: by the Free Software Foundation; either version 2.1 of License, or michael@0: (at your option) any later version. michael@0: michael@0: This program is distributed in the hope that it will be useful, michael@0: but WITHOUT ANY WARRANTY; without even the implied warranty of michael@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU michael@0: Lesser General Public License for more details. michael@0: michael@0: You should also have received a copy of the GNU Lesser General Public michael@0: License along with this library in the file named "LICENSE". michael@0: If not, write to the Free Software Foundation, 51 Franklin Street, michael@0: Suite 500, Boston, MA 02110-1335, USA or visit their web page on the michael@0: internet at http://www.fsf.org/licenses/lgpl.html. michael@0: michael@0: Alternatively, the contents of this file may be used under the terms of the michael@0: Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public michael@0: License, as published by the Free Software Foundation, either version 2 michael@0: of the License or (at your option) any later version. michael@0: */ michael@0: #pragma once michael@0: michael@0: // numbers are explicitly assigned for future proofing michael@0: michael@0: namespace graphite2 michael@0: { michael@0: michael@0: class Error michael@0: { michael@0: public: michael@0: Error() : _e(0) {}; michael@0: operator bool() { return (_e != 0); } michael@0: int error() { return _e; } michael@0: void error(int e) { _e = e; } michael@0: bool test(bool pr, int err) { return (_e = int(pr) * err); } michael@0: michael@0: private: michael@0: int _e; michael@0: }; michael@0: michael@0: enum errcontext { michael@0: EC_READGLYPHS = 1, // while reading glyphs michael@0: EC_READSILF = 2, // in Silf table michael@0: EC_ASILF = 3, // in Silf %d michael@0: EC_APASS = 4, // in Silf %d, pass %d michael@0: EC_PASSCCODE = 5, // in pass constraint code for Silf %d, pass %d michael@0: EC_ARULE = 6, // in Silf %d, pass %d, rule %d michael@0: EC_ASTARTS = 7, // in Silf %d, pass %d, start state %d michael@0: EC_ATRANS = 8, // in Silf %d, pass %d, fsm state %d michael@0: EC_ARULEMAP = 9 // in Silf %d, pass %d, state %d michael@0: }; michael@0: michael@0: enum errors { michael@0: E_OUTOFMEM = 1, // Out of memory michael@0: E_NOGLYPHS = 2, // There are no glyphs in the font michael@0: E_BADUPEM = 3, // The units per em for the font is bad (0) michael@0: E_BADCMAP = 4, // The font does not contain any useful cmaps michael@0: E_NOSILF = 5, // Missing Silf table michael@0: E_TOOOLD = 6, // Silf table version is too old michael@0: E_BADSIZE = 7, // context object has the wrong structural size michael@0: // Silf Subtable Errors take a Silf subtable number * 256 in the context michael@0: E_BADMAXGLYPH = 8, // Silf max glyph id is too high michael@0: E_BADNUMJUSTS = 9, // Number of Silf justification blocks is too high michael@0: E_BADENDJUSTS = 10, // Silf justification blocks take too much of the Silf table space michael@0: E_BADCRITFEATURES = 11, // Critical features section in a Silf table is too big michael@0: E_BADSCRIPTTAGS = 12, // Silf script tags area is too big michael@0: E_BADAPSEUDO = 13, // The pseudo glyph attribute number is too high michael@0: E_BADABREAK = 14, // The linebreak glyph attribute number is too high michael@0: E_BADABIDI = 15, // The bidi glyph attribute number is too high michael@0: E_BADAMIRROR = 16, // The mirrored glyph attribute number is too high michael@0: E_BADNUMPASSES = 17, // The number of passes is > 128 michael@0: E_BADPASSESSTART = 18, // The Silf table is too small to hold any passes michael@0: E_BADPASSBOUND = 19, // The positioning pass number is too low or the substitution pass number is too high michael@0: E_BADPPASS = 20, // The positioning pass number is too high michael@0: E_BADSPASS = 21, // the substitution pass number is too high michael@0: E_BADJPASSBOUND = 22, // the justification pass must be higher than the positioning pass michael@0: E_BADJPASS = 23, // the justification pass is too high michael@0: E_BADALIG = 24, // the number of initial ligature component glyph attributes is too high michael@0: E_BADBPASS = 25, // the bidi pass number is specified and is either too high or too low michael@0: E_BADNUMPSEUDO = 26, // The number of pseudo glyphs is too high michael@0: E_BADCLASSSIZE = 27, // The size of the classes block is bad michael@0: E_TOOMANYLINEAR = 28, // The number of linear classes in the silf table is too high michael@0: E_CLASSESTOOBIG = 29, // There are too many classes for the space allocated in the Silf subtable michael@0: E_MISALIGNEDCLASSES = 30, // The class offsets in the class table don't line up with the number of classes michael@0: E_HIGHCLASSOFFSET = 31, // The class offsets point out of the class table michael@0: E_BADCLASSOFFSET = 32, // A class offset is less than one following it michael@0: E_BADCLASSLOOKUPINFO = 33, // The search header info for a non-linear class has wrong values in it michael@0: // Pass subtable errors. Context has pass number * 65536 michael@0: E_BADPASSSTART = 34, // The start offset for a particular pass is bad michael@0: E_BADPASSEND = 35, // The end offset for a particular pass is bad michael@0: E_BADPASSLENGTH = 36, // The length of the pass is too small michael@0: E_BADNUMTRANS = 37, // The number of transition states in the fsm is bad michael@0: E_BADNUMSUCCESS = 38, // The number of success states in the fsm is bad michael@0: E_BADNUMSTATES = 39, // The number of states in the fsm is bad michael@0: E_NORANGES = 40, // There are no columns in the fsm michael@0: E_BADRULEMAPLEN = 41, // The size of the success state to rule mapping is bad michael@0: E_BADCTXTLENBOUNDS = 42, // The precontext maximum is greater than its minimum michael@0: E_BADCTXTLENS = 43, // The lists of rule lengths or pre context lengths is bad michael@0: E_BADPASSCCODEPTR = 44, // The pass constraint code position does not align with where the forward reference says it should be michael@0: E_BADRULECCODEPTR = 45, // The rule constraint code position does not align with where the forward reference says it should be michael@0: E_BADCCODELEN = 46, // Bad rule/pass constraint code length michael@0: E_BADACTIONCODEPTR = 47, // The action code position does not align with where the forward reference says it should be michael@0: E_MUTABLECCODE = 48, // Constraint code edits slots. It shouldn't. michael@0: E_BADSTATE = 49, // Bad state transition referencing an illegal state michael@0: E_BADRULEMAPPING = 50, // The structure of the rule mapping is bad michael@0: E_BADRANGE = 51, // Bad column range structure including a glyph in more than one column michael@0: E_BADRULENUM = 52, // A reference to a rule is out of range (too high) michael@0: // Code errors michael@0: E_CODEFAILURE = 60, // Base code error. The following subcodes must align with Machine::Code::status_t in Code.h michael@0: E_CODEALLOC = 61, // Out of memory michael@0: E_INVALIDOPCODE = 62, // Invalid op code michael@0: E_UNIMPOPCODE = 63, // Unimplemented op code encountered michael@0: E_OUTOFRANGECODE = 64, // Code argument out of range michael@0: E_BADJUMPCODE = 65, // Code jumps past end of op codes michael@0: E_CODEBADARGS = 66, // Code arguments exhausted michael@0: E_CODENORETURN = 67, // Missing return type op code at end of code michael@0: E_CODENESTEDCTXT = 68 // Nested context encountered in code michael@0: }; michael@0: michael@0: } michael@0: