diff options
Diffstat (limited to 'xpdf/GlobalParams.h')
-rw-r--r-- | xpdf/GlobalParams.h | 623 |
1 files changed, 623 insertions, 0 deletions
diff --git a/xpdf/GlobalParams.h b/xpdf/GlobalParams.h new file mode 100644 index 0000000..b8299fc --- /dev/null +++ b/xpdf/GlobalParams.h @@ -0,0 +1,623 @@ +//======================================================================== +// +// GlobalParams.h +// +// Copyright 2001-2003 Glyph & Cog, LLC +// +//======================================================================== + +#ifndef GLOBALPARAMS_H +#define GLOBALPARAMS_H + +#include <aconf.h> + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include <stdio.h> +#ifdef _WIN32 +# include <windows.h> +#endif +#include "gtypes.h" +#include "CharTypes.h" + +#if MULTITHREADED +#include "GMutex.h" +#endif + +class GString; +class GList; +class GHash; +class NameToCharCode; +class CharCodeToUnicode; +class CharCodeToUnicodeCache; +class UnicodeMap; +class UnicodeMapCache; +class UnicodeRemapping; +class CMap; +class CMapCache; +struct XpdfSecurityHandler; +class GlobalParams; +class SysFontList; + +//------------------------------------------------------------------------ + +// The global parameters object. +extern GlobalParams *globalParams; + +//------------------------------------------------------------------------ + +enum SysFontType { + sysFontPFA, + sysFontPFB, + sysFontTTF, + sysFontTTC, + sysFontOTF +}; + +//------------------------------------------------------------------------ + +class PSFontParam16 { +public: + + GString *name; // PDF font name for psResidentFont16; + // char collection name for psResidentFontCC + int wMode; // writing mode (0=horiz, 1=vert) + GString *psFontName; // PostScript font name + GString *encoding; // encoding + + PSFontParam16(GString *nameA, int wModeA, + GString *psFontNameA, GString *encodingA); + ~PSFontParam16(); +}; + +//------------------------------------------------------------------------ + +enum PSLevel { + psLevel1, + psLevel1Sep, + psLevel2, + psLevel2Gray, + psLevel2Sep, + psLevel3, + psLevel3Gray, + psLevel3Sep, +}; + +//------------------------------------------------------------------------ + +enum EndOfLineKind { + eolUnix, // LF + eolDOS, // CR+LF + eolMac // CR +}; + +//------------------------------------------------------------------------ + +enum StrokeAdjustMode { + strokeAdjustOff, + strokeAdjustNormal, + strokeAdjustCAD +}; + +//------------------------------------------------------------------------ + +enum ScreenType { + screenUnset, + screenDispersed, + screenClustered, + screenStochasticClustered +}; + +//------------------------------------------------------------------------ + +class KeyBinding { +public: + + int code; // 0x20 .. 0xfe = ASCII, + // >=0x10000 = special keys, mouse buttons, + // etc. (xpdfKeyCode* symbols) + int mods; // modifiers (xpdfKeyMod* symbols, or-ed + // together) + int context; // context (xpdfKeyContext* symbols, or-ed + // together) + GList *cmds; // list of commands [GString] + + KeyBinding(int codeA, int modsA, int contextA, const char *cmd0); + KeyBinding(int codeA, int modsA, int contextA, + const char *cmd0, const char *cmd1); + KeyBinding(int codeA, int modsA, int contextA, GList *cmdsA); + ~KeyBinding(); +}; + +#define xpdfKeyCodeTab 0x1000 +#define xpdfKeyCodeReturn 0x1001 +#define xpdfKeyCodeEnter 0x1002 +#define xpdfKeyCodeBackspace 0x1003 +#define xpdfKeyCodeEsc 0x1004 +#define xpdfKeyCodeInsert 0x1005 +#define xpdfKeyCodeDelete 0x1006 +#define xpdfKeyCodeHome 0x1007 +#define xpdfKeyCodeEnd 0x1008 +#define xpdfKeyCodePgUp 0x1009 +#define xpdfKeyCodePgDn 0x100a +#define xpdfKeyCodeLeft 0x100b +#define xpdfKeyCodeRight 0x100c +#define xpdfKeyCodeUp 0x100d +#define xpdfKeyCodeDown 0x100e +#define xpdfKeyCodeF1 0x1100 +#define xpdfKeyCodeF35 0x1122 +#define xpdfKeyCodeMousePress1 0x2001 +#define xpdfKeyCodeMousePress2 0x2002 +#define xpdfKeyCodeMousePress3 0x2003 +#define xpdfKeyCodeMousePress4 0x2004 +#define xpdfKeyCodeMousePress5 0x2005 +#define xpdfKeyCodeMousePress6 0x2006 +#define xpdfKeyCodeMousePress7 0x2007 +// ... +#define xpdfKeyCodeMousePress32 0x2020 +#define xpdfKeyCodeMouseRelease1 0x2101 +#define xpdfKeyCodeMouseRelease2 0x2102 +#define xpdfKeyCodeMouseRelease3 0x2103 +#define xpdfKeyCodeMouseRelease4 0x2104 +#define xpdfKeyCodeMouseRelease5 0x2105 +#define xpdfKeyCodeMouseRelease6 0x2106 +#define xpdfKeyCodeMouseRelease7 0x2107 +// ... +#define xpdfKeyCodeMouseRelease32 0x2120 +#define xpdfKeyCodeMouseClick1 0x2201 +#define xpdfKeyCodeMouseClick2 0x2202 +#define xpdfKeyCodeMouseClick3 0x2203 +#define xpdfKeyCodeMouseClick4 0x2204 +#define xpdfKeyCodeMouseClick5 0x2205 +#define xpdfKeyCodeMouseClick6 0x2206 +#define xpdfKeyCodeMouseClick7 0x2207 +// ... +#define xpdfKeyCodeMouseClick32 0x2220 +#define xpdfKeyCodeMouseDoubleClick1 0x2301 +#define xpdfKeyCodeMouseDoubleClick2 0x2302 +#define xpdfKeyCodeMouseDoubleClick3 0x2303 +#define xpdfKeyCodeMouseDoubleClick4 0x2304 +#define xpdfKeyCodeMouseDoubleClick5 0x2305 +#define xpdfKeyCodeMouseDoubleClick6 0x2306 +#define xpdfKeyCodeMouseDoubleClick7 0x2307 +// ... +#define xpdfKeyCodeMouseDoubleClick32 0x2320 +#define xpdfKeyCodeMouseTripleClick1 0x2401 +#define xpdfKeyCodeMouseTripleClick2 0x2402 +#define xpdfKeyCodeMouseTripleClick3 0x2403 +#define xpdfKeyCodeMouseTripleClick4 0x2404 +#define xpdfKeyCodeMouseTripleClick5 0x2405 +#define xpdfKeyCodeMouseTripleClick6 0x2406 +#define xpdfKeyCodeMouseTripleClick7 0x2407 +// ... +#define xpdfKeyCodeMouseTripleClick32 0x2420 +#define xpdfKeyModNone 0 +#define xpdfKeyModShift (1 << 0) +#define xpdfKeyModCtrl (1 << 1) +#define xpdfKeyModAlt (1 << 2) +#define xpdfKeyContextAny 0 +#define xpdfKeyContextFullScreen (1 << 0) +#define xpdfKeyContextWindow (2 << 0) +#define xpdfKeyContextContinuous (1 << 2) +#define xpdfKeyContextSinglePage (2 << 2) +#define xpdfKeyContextOverLink (1 << 4) +#define xpdfKeyContextOffLink (2 << 4) +#define xpdfKeyContextOutline (1 << 6) +#define xpdfKeyContextMainWin (2 << 6) +#define xpdfKeyContextScrLockOn (1 << 8) +#define xpdfKeyContextScrLockOff (2 << 8) + +//------------------------------------------------------------------------ + +class PopupMenuCmd { +public: + + GString *label; // label for display in the menu + GList *cmds; // list of commands [GString] + + PopupMenuCmd(GString *labelA, GList *cmdsA); + ~PopupMenuCmd(); +}; + +//------------------------------------------------------------------------ + +#ifdef _WIN32 +struct XpdfWin32ErrorInfo { + const char *func; // last Win32 API function call to fail + DWORD code; // error code returned by that function +}; +#endif + +//------------------------------------------------------------------------ + +class GlobalParams { +public: + + // Initialize the global parameters by attempting to read a config + // file. + GlobalParams(const char *cfgFileName); + + ~GlobalParams(); + + void setBaseDir(const char *dir); + void setupBaseFonts(const char *dir); + + void parseLine(char *buf, GString *fileName, int line); + + //----- accessors + + CharCode getMacRomanCharCode(char *charName); + + GString *getBaseDir(); + Unicode mapNameToUnicode(const char *charName); + UnicodeMap *getResidentUnicodeMap(GString *encodingName); + FILE *getUnicodeMapFile(GString *encodingName); + FILE *findCMapFile(GString *collection, GString *cMapName); + FILE *findToUnicodeFile(GString *name); + UnicodeRemapping *getUnicodeRemapping(); + GString *findFontFile(GString *fontName); + GString *findBase14FontFile(GString *fontName, int *fontNum, + double *oblique); + GString *findSystemFontFile(GString *fontName, SysFontType *type, + int *fontNum); + GString *findCCFontFile(GString *collection); + int getPSPaperWidth(); + int getPSPaperHeight(); + void getPSImageableArea(int *llx, int *lly, int *urx, int *ury); + GBool getPSDuplex(); + GBool getPSCrop(); + GBool getPSUseCropBoxAsPage(); + GBool getPSExpandSmaller(); + GBool getPSShrinkLarger(); + GBool getPSCenter(); + PSLevel getPSLevel(); + GString *getPSResidentFont(GString *fontName); + GList *getPSResidentFonts(); + PSFontParam16 *getPSResidentFont16(GString *fontName, int wMode); + PSFontParam16 *getPSResidentFontCC(GString *collection, int wMode); + GBool getPSEmbedType1(); + GBool getPSEmbedTrueType(); + GBool getPSEmbedCIDPostScript(); + GBool getPSEmbedCIDTrueType(); + GBool getPSFontPassthrough(); + GBool getPSPreload(); + GBool getPSOPI(); + GBool getPSASCIIHex(); + GBool getPSLZW(); + GBool getPSUncompressPreloadedImages(); + double getPSMinLineWidth(); + double getPSRasterResolution(); + GBool getPSRasterMono(); + int getPSRasterSliceSize(); + GBool getPSAlwaysRasterize(); + GBool getPSNeverRasterize(); + GString *getTextEncodingName(); + GList *getAvailableTextEncodings(); + EndOfLineKind getTextEOL(); + GBool getTextPageBreaks(); + GBool getTextKeepTinyChars(); + GString *getInitialZoom(); + int getDefaultFitZoom(); + GString *getInitialDisplayMode(); + GBool getInitialToolbarState(); + GBool getInitialSidebarState(); + int getInitialSidebarWidth(); + GString *getInitialSelectMode(); + int getMaxTileWidth(); + int getMaxTileHeight(); + int getTileCacheSize(); + int getWorkerThreads(); + GBool getEnableFreeType(); + GBool getDisableFreeTypeHinting(); + GBool getAntialias(); + GBool getVectorAntialias(); + GBool getImageMaskAntialias(); + GBool getAntialiasPrinting(); + StrokeAdjustMode getStrokeAdjust(); + ScreenType getScreenType(); + int getScreenSize(); + int getScreenDotRadius(); + double getScreenGamma(); + double getScreenBlackThreshold(); + double getScreenWhiteThreshold(); + double getMinLineWidth(); + GBool getEnablePathSimplification(); + GBool getDrawAnnotations(); + GBool getDrawFormFields(); + GBool getEnableXFA(); + GBool getOverprintPreview() { return overprintPreview; } + GString *getPaperColor(); + GString *getMatteColor(); + GString *getFullScreenMatteColor(); + GString *getSelectionColor(); + GBool getReverseVideoInvertImages(); + GString *getLaunchCommand() { return launchCommand; } + GString *getMovieCommand() { return movieCommand; } + GString *getDefaultPrinter(); + GBool getMapNumericCharNames(); + GBool getMapUnknownCharNames(); + GBool getMapExtTrueTypeFontsViaUnicode(); + GBool getUseTrueTypeUnicodeMapping(); + GBool isDroppedFont(const char *fontName); + GList *getKeyBinding(int code, int mods, int context); + GList *getAllKeyBindings(); + int getNumPopupMenuCmds(); + PopupMenuCmd *getPopupMenuCmd(int idx); + GString *getTabStateFile(); + GBool getSavePageNumbers(); + GBool getPrintCommands(); + GBool getPrintStatusInfo(); + GBool getErrQuiet(); + GString *getDebugLogFile(); + void debugLogPrintf(const char *fmt, ...); + + CharCodeToUnicode *getCIDToUnicode(GString *collection); + CharCodeToUnicode *getUnicodeToUnicode(GString *fontName); + UnicodeMap *getUnicodeMap(GString *encodingName); + CMap *getCMap(GString *collection, GString *cMapName); + UnicodeMap *getTextEncoding(); + + //----- functions to set parameters + + void addUnicodeRemapping(Unicode in, Unicode *out, int len); + void addFontFile(GString *fontName, GString *path); + GBool setPSPaperSize(char *size); + void setPSPaperWidth(int width); + void setPSPaperHeight(int height); + void setPSImageableArea(int llx, int lly, int urx, int ury); + void setPSDuplex(GBool duplex); + void setPSCrop(GBool crop); + void setPSUseCropBoxAsPage(GBool crop); + void setPSExpandSmaller(GBool expand); + void setPSShrinkLarger(GBool shrink); + void setPSCenter(GBool center); + void setPSLevel(PSLevel level); + void setPSEmbedType1(GBool embed); + void setPSEmbedTrueType(GBool embed); + void setPSEmbedCIDPostScript(GBool embed); + void setPSEmbedCIDTrueType(GBool embed); + void setPSFontPassthrough(GBool passthrough); + void setPSPreload(GBool preload); + void setPSOPI(GBool opi); + void setPSASCIIHex(GBool hex); + void setTextEncoding(const char *encodingName); + GBool setTextEOL(char *s); + void setTextPageBreaks(GBool pageBreaks); + void setTextKeepTinyChars(GBool keep); + void setInitialZoom(char *s); + GBool setEnableFreeType(char *s); + GBool setAntialias(char *s); + GBool setVectorAntialias(char *s); + void setScreenType(ScreenType t); + void setScreenSize(int size); + void setScreenDotRadius(int r); + void setScreenGamma(double gamma); + void setScreenBlackThreshold(double thresh); + void setScreenWhiteThreshold(double thresh); + void setDrawFormFields(GBool draw); + void setOverprintPreview(GBool preview); + void setMapNumericCharNames(GBool map); + void setMapUnknownCharNames(GBool map); + void setMapExtTrueTypeFontsViaUnicode(GBool map); + void setTabStateFile(char *tabStateFileA); + void setPrintCommands(GBool printCommandsA); + void setPrintStatusInfo(GBool printStatusInfoA); + void setErrQuiet(GBool errQuietA); + +#ifdef _WIN32 + void setWin32ErrorInfo(const char *func, DWORD code); + XpdfWin32ErrorInfo *getWin32ErrorInfo(); +#endif + + static const char *defaultTextEncoding; + +private: + + void setDataDirVar(); + void createDefaultKeyBindings(); + void parseFile(GString *fileName, FILE *f); + GList *parseLineTokens(char *buf, GString *fileName, int line); + void parseNameToUnicode(GList *tokens, GString *fileName, int line); + void parseCIDToUnicode(GList *tokens, GString *fileName, int line); + void parseUnicodeToUnicode(GList *tokens, GString *fileName, int line); + void parseUnicodeMap(GList *tokens, GString *fileName, int line); + void parseCMapDir(GList *tokens, GString *fileName, int line); + void parseToUnicodeDir(GList *tokens, GString *fileName, int line); + void parseUnicodeRemapping(GList *tokens, GString *fileName, int line); + void parseFontFile(GList *tokens, GString *fileName, int line); + void parseFontDir(GList *tokens, GString *fileName, int line); + void parseFontFileCC(GList *tokens, GString *fileName, + int line); + void parsePSPaperSize(GList *tokens, GString *fileName, int line); + void parsePSImageableArea(GList *tokens, GString *fileName, int line); + void parsePSLevel(GList *tokens, GString *fileName, int line); + void parsePSResidentFont(GList *tokens, GString *fileName, int line); + void parsePSResidentFont16(GList *tokens, GString *fileName, int line); + void parsePSResidentFontCC(GList *tokens, GString *fileName, int line); + void parseTextEOL(GList *tokens, GString *fileName, int line); + void parseStrokeAdjust(GList *tokens, GString *fileName, int line); + void parseScreenType(GList *tokens, GString *fileName, int line); + void parseDropFont(GList *tokens, GString *fileName, int line); + void parseBind(GList *tokens, GString *fileName, int line); + void parseUnbind(GList *tokens, GString *fileName, int line); + GBool parseKey(GString *modKeyStr, GString *contextStr, + int *code, int *mods, int *context, + const char *cmdName, + GList *tokens, GString *fileName, int line); + void parsePopupMenuCmd(GList *tokens, GString *fileName, int line); + void parseYesNo(const char *cmdName, GBool *flag, + GList *tokens, GString *fileName, int line); + GBool parseYesNo2(char *token, GBool *flag); + void parseString(const char *cmdName, GString **s, + GList *tokens, GString *fileName, int line); + void parseInteger(const char *cmdName, int *val, + GList *tokens, GString *fileName, int line); + void parseFloat(const char *cmdName, double *val, + GList *tokens, GString *fileName, int line); + UnicodeMap *getUnicodeMap2(GString *encodingName); + + //----- static tables + + NameToCharCode * // mapping from char name to + macRomanReverseMap; // MacRomanEncoding index + + //----- meta settings + + GString *baseDir; // base directory - for plugins, etc. + GHash *configFileVars; // variables for use in the config file + // [GString] + + //----- user-modifiable settings + + NameToCharCode * // mapping from char name to Unicode + nameToUnicode; + GHash *cidToUnicodes; // files for mappings from char collections + // to Unicode, indexed by collection name + // [GString] + GHash *unicodeToUnicodes; // files for Unicode-to-Unicode mappings, + // indexed by font name pattern [GString] + GHash *residentUnicodeMaps; // mappings from Unicode to char codes, + // indexed by encoding name [UnicodeMap] + GHash *unicodeMaps; // files for mappings from Unicode to char + // codes, indexed by encoding name [GString] + GHash *cMapDirs; // list of CMap dirs, indexed by collection + // name [GList[GString]] + GList *toUnicodeDirs; // list of ToUnicode CMap dirs [GString] + UnicodeRemapping * // Unicode remapping for text output + unicodeRemapping; + GHash *fontFiles; // font files: font name mapped to path + // [GString] + GList *fontDirs; // list of font dirs [GString] + GHash *ccFontFiles; // character collection font files: + // collection name mapped to path [GString] + GHash *base14SysFonts; // Base-14 system font files: font name + // mapped to path [Base14FontInfo] + SysFontList *sysFonts; // system fonts + int psPaperWidth; // paper size, in PostScript points, for + int psPaperHeight; // PostScript output + int psImageableLLX, // imageable area, in PostScript points, + psImageableLLY, // for PostScript output + psImageableURX, + psImageableURY; + GBool psCrop; // crop PS output to CropBox + GBool psUseCropBoxAsPage; // use CropBox as page size + GBool psExpandSmaller; // expand smaller pages to fill paper + GBool psShrinkLarger; // shrink larger pages to fit paper + GBool psCenter; // center pages on the paper + GBool psDuplex; // enable duplexing in PostScript? + PSLevel psLevel; // PostScript level to generate + GHash *psResidentFonts; // 8-bit fonts resident in printer: + // PDF font name mapped to PS font name + // [GString] + GList *psResidentFonts16; // 16-bit fonts resident in printer: + // PDF font name mapped to font info + // [PSFontParam16] + GList *psResidentFontsCC; // 16-bit character collection fonts + // resident in printer: collection name + // mapped to font info [PSFontParam16] + GBool psEmbedType1; // embed Type 1 fonts? + GBool psEmbedTrueType; // embed TrueType fonts? + GBool psEmbedCIDPostScript; // embed CID PostScript fonts? + GBool psEmbedCIDTrueType; // embed CID TrueType fonts? + GBool psFontPassthrough; // pass all fonts through as-is? + GBool psPreload; // preload PostScript images and forms into + // memory + GBool psOPI; // generate PostScript OPI comments? + GBool psASCIIHex; // use ASCIIHex instead of ASCII85? + GBool psLZW; // false to use RLE instead of LZW + GBool psUncompressPreloadedImages; // uncompress all preloaded images + double psMinLineWidth; // minimum line width for PostScript output + double psRasterResolution; // PostScript rasterization resolution (dpi) + GBool psRasterMono; // true to do PostScript rasterization + // in monochrome (gray); false to do it + // in color (RGB/CMYK) + int psRasterSliceSize; // maximum size (pixels) of PostScript + // rasterization slice + GBool psAlwaysRasterize; // force PostScript rasterization + GBool psNeverRasterize; // prevent PostScript rasterization + GString *textEncoding; // encoding (unicodeMap) to use for text + // output + EndOfLineKind textEOL; // type of EOL marker to use for text + // output + GBool textPageBreaks; // insert end-of-page markers? + GBool textKeepTinyChars; // keep all characters in text output + GString *initialZoom; // initial zoom level + int defaultFitZoom; // default zoom factor if initialZoom is + // 'page' or 'width'. + GString *initialDisplayMode; // initial display mode (single, + // continuous, etc.) + GBool initialToolbarState; // initial toolbar state - open (true) + // or closed (false) + GBool initialSidebarState; // initial sidebar state - open (true) + // or closed (false) + int initialSidebarWidth; // initial sidebar width + GString *initialSelectMode; // initial selection mode (block or linear) + int maxTileWidth; // maximum rasterization tile width + int maxTileHeight; // maximum rasterization tile height + int tileCacheSize; // number of rasterization tiles in cache + int workerThreads; // number of rasterization worker threads + GBool enableFreeType; // FreeType enable flag + GBool disableFreeTypeHinting; // FreeType hinting disable flag + GBool antialias; // font anti-aliasing enable flag + GBool vectorAntialias; // vector anti-aliasing enable flag + GBool imageMaskAntialias; // image mask anti-aliasing enable flag + GBool antialiasPrinting; // allow anti-aliasing when printing + StrokeAdjustMode strokeAdjust; // stroke adjustment mode + ScreenType screenType; // halftone screen type + int screenSize; // screen matrix size + int screenDotRadius; // screen dot radius + double screenGamma; // screen gamma correction + double screenBlackThreshold; // screen black clamping threshold + double screenWhiteThreshold; // screen white clamping threshold + double minLineWidth; // minimum line width + GBool // enable path simplification + enablePathSimplification; + GBool drawAnnotations; // draw annotations or not + GBool drawFormFields; // draw form fields or not + GBool enableXFA; // enable XFA form parsing + GBool overprintPreview; // enable overprint preview + GString *paperColor; // paper (page background) color + GString *matteColor; // matte (background outside of page) color + GString *fullScreenMatteColor; // matte color in full-screen mode + GString *selectionColor; // selection color + GBool reverseVideoInvertImages; // invert images in reverse video mode + GString *launchCommand; // command executed for 'launch' links + GString *movieCommand; // command executed for movie annotations + GString *defaultPrinter; // default printer (for interactive printing + // from the viewer) + GBool mapNumericCharNames; // map numeric char names (from font subsets)? + GBool mapUnknownCharNames; // map unknown char names? + GBool mapExtTrueTypeFontsViaUnicode; // map char codes to GID via Unicode + // for external TrueType fonts? + GBool useTrueTypeUnicodeMapping; // use the Unicode cmaps in TrueType + // fonts, rather than the PDF + // ToUnicode mapping + GHash *droppedFonts; // dropped fonts [int] + GList *keyBindings; // key & mouse button bindings [KeyBinding] + GList *popupMenuCmds; // popup menu commands [PopupMenuCmd] + GString *tabStateFile; // path for the tab state save file + GBool savePageNumbers; // save page number when file is closed + // and restore page number when opened + GBool printCommands; // print the drawing commands + GBool printStatusInfo; // print status info for each page + GBool errQuiet; // suppress error messages? + GString *debugLogFile; // path for debug log file + + CharCodeToUnicodeCache *cidToUnicodeCache; + CharCodeToUnicodeCache *unicodeToUnicodeCache; + UnicodeMapCache *unicodeMapCache; + CMapCache *cMapCache; + +#if MULTITHREADED + GMutex mutex; + GMutex unicodeMapCacheMutex; + GMutex cMapCacheMutex; +#endif +#ifdef _WIN32 + DWORD tlsWin32ErrorInfo; // TLS index for error info +#endif +}; + +#endif |